Merge "Adds the basic Serbian files to LatinIME."
diff --git a/Android.mk b/Android.mk
old mode 100755
new mode 100644
index ee1a82a..8f1acc5
--- a/Android.mk
+++ b/Android.mk
@@ -1,21 +1,17 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
+# Copyright (C) 2010 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
-LOCAL_MODULE_TAGS := optional
+LOCAL_PATH := $(call my-dir)
 
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_PACKAGE_NAME := LatinIME
-
-LOCAL_CERTIFICATE := shared
-
-LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime
-
-LOCAL_STATIC_JAVA_LIBRARIES := android-common
-
-#LOCAL_AAPT_FLAGS := -0 .dict
-
-#LOCAL_SDK_VERSION := current
-
-include $(BUILD_PACKAGE)
-include $(LOCAL_PATH)/dictionary/Android.mk
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 0000000..7cdf69a
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,52 @@
+# Copyright (C) 2007 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.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list.  These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list.  E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/LatinIME*)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/LatinIME.apk)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
diff --git a/java/Android.mk b/java/Android.mk
new file mode 100755
index 0000000..4bb8986
--- /dev/null
+++ b/java/Android.mk
@@ -0,0 +1,22 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := LatinIME
+
+LOCAL_CERTIFICATE := shared
+
+LOCAL_JNI_SHARED_LIBRARIES := libjni_latinime
+
+LOCAL_STATIC_JAVA_LIBRARIES := android-common
+
+#LOCAL_AAPT_FLAGS := -0 .dict
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags
+
+include $(BUILD_PACKAGE)
diff --git a/AndroidManifest.xml b/java/AndroidManifest.xml
similarity index 83%
rename from AndroidManifest.xml
rename to java/AndroidManifest.xml
index c42ad42..e229bc7 100755
--- a/AndroidManifest.xml
+++ b/java/AndroidManifest.xml
@@ -1,6 +1,5 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.inputmethod.latin"
-        android:sharedUserId="android.uid.shared">
+        package="com.android.inputmethod.latin">
 
     <original-package android:name="com.android.inputmethod.latin" />
 
@@ -8,6 +7,7 @@
     <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
     <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
+    <uses-permission android:name="android.permission.READ_CONTACTS" />
 
     <application android:label="@string/english_ime_name"
             android:backupAgent="LatinIMEBackupAgent"
@@ -32,6 +32,8 @@
                 android:label="@string/language_selection_title">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
+                <action android:name="com.android.inputmethod.latin.INPUT_LANGUAGE_SELECTION"/>
+                <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
     </application>
diff --git a/java/MODULE_LICENSE_APACHE2 b/java/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/java/MODULE_LICENSE_APACHE2
diff --git a/java/NOTICE b/java/NOTICE
new file mode 100644
index 0000000..7340b9e
--- /dev/null
+++ b/java/NOTICE
@@ -0,0 +1,190 @@
+
+   Copyright (c) 2008, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   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.
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
diff --git a/java/proguard.flags b/java/proguard.flags
new file mode 100644
index 0000000..0a5d2dd
--- /dev/null
+++ b/java/proguard.flags
@@ -0,0 +1,3 @@
+-keep class com.android.inputmethod.latin.BinaryDictionary {
+  int mDictLength;
+}
diff --git a/res/drawable-en-hdpi/sym_keyboard_delete.png b/java/res/drawable-en-hdpi/sym_keyboard_delete.png
similarity index 100%
rename from res/drawable-en-hdpi/sym_keyboard_delete.png
rename to java/res/drawable-en-hdpi/sym_keyboard_delete.png
Binary files differ
diff --git a/res/drawable-en-hdpi/sym_keyboard_feedback_delete.png b/java/res/drawable-en-hdpi/sym_keyboard_feedback_delete.png
similarity index 100%
rename from res/drawable-en-hdpi/sym_keyboard_feedback_delete.png
rename to java/res/drawable-en-hdpi/sym_keyboard_feedback_delete.png
Binary files differ
diff --git a/res/drawable-en-mdpi/sym_keyboard_delete.png b/java/res/drawable-en-mdpi/sym_keyboard_delete.png
similarity index 100%
rename from res/drawable-en-mdpi/sym_keyboard_delete.png
rename to java/res/drawable-en-mdpi/sym_keyboard_delete.png
Binary files differ
diff --git a/res/drawable-en-mdpi/sym_keyboard_feedback_delete.png b/java/res/drawable-en-mdpi/sym_keyboard_feedback_delete.png
similarity index 100%
rename from res/drawable-en-mdpi/sym_keyboard_feedback_delete.png
rename to java/res/drawable-en-mdpi/sym_keyboard_feedback_delete.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png
similarity index 100%
rename from res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png
rename to java/res/drawable-hdpi/btn_keyboard_key_fulltrans_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png
similarity index 100%
rename from res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png
rename to java/res/drawable-hdpi/btn_keyboard_key_fulltrans_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png
similarity index 100%
rename from res/drawable-hdpi/btn_keyboard_key_normal.9.png
rename to java/res/drawable-hdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png
similarity index 100%
rename from res/drawable-hdpi/btn_keyboard_key_normal_off.9.png
rename to java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png
similarity index 100%
rename from res/drawable-hdpi/btn_keyboard_key_normal_on.9.png
rename to java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png
similarity index 100%
rename from res/drawable-hdpi/btn_keyboard_key_pressed.9.png
rename to java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png
similarity index 100%
rename from res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png
rename to java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png
Binary files differ
diff --git a/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png
similarity index 100%
rename from res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png
rename to java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cancel.png b/java/res/drawable-hdpi/cancel.png
similarity index 100%
rename from res/drawable-hdpi/cancel.png
rename to java/res/drawable-hdpi/cancel.png
Binary files differ
diff --git a/res/drawable-hdpi/candidate_feedback_background.9.png b/java/res/drawable-hdpi/candidate_feedback_background.9.png
similarity index 100%
rename from res/drawable-hdpi/candidate_feedback_background.9.png
rename to java/res/drawable-hdpi/candidate_feedback_background.9.png
Binary files differ
diff --git a/res/drawable-hdpi/caution.png b/java/res/drawable-hdpi/caution.png
similarity index 100%
rename from res/drawable-hdpi/caution.png
rename to java/res/drawable-hdpi/caution.png
Binary files differ
diff --git a/res/drawable-hdpi/dialog_bubble_step02.9.png b/java/res/drawable-hdpi/dialog_bubble_step02.9.png
similarity index 100%
rename from res/drawable-hdpi/dialog_bubble_step02.9.png
rename to java/res/drawable-hdpi/dialog_bubble_step02.9.png
Binary files differ
diff --git a/res/drawable-hdpi/dialog_bubble_step07.9.png b/java/res/drawable-hdpi/dialog_bubble_step07.9.png
similarity index 100%
rename from res/drawable-hdpi/dialog_bubble_step07.9.png
rename to java/res/drawable-hdpi/dialog_bubble_step07.9.png
Binary files differ
diff --git a/res/drawable-hdpi/dialog_top_dark_bottom_medium.png b/java/res/drawable-hdpi/dialog_top_dark_bottom_medium.png
similarity index 100%
rename from res/drawable-hdpi/dialog_top_dark_bottom_medium.png
rename to java/res/drawable-hdpi/dialog_top_dark_bottom_medium.png
Binary files differ
diff --git a/res/drawable-hdpi/highlight_pressed.png b/java/res/drawable-hdpi/highlight_pressed.png
similarity index 100%
rename from res/drawable-hdpi/highlight_pressed.png
rename to java/res/drawable-hdpi/highlight_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_dialog_alert_large.png b/java/res/drawable-hdpi/ic_dialog_alert_large.png
similarity index 100%
rename from res/drawable-hdpi/ic_dialog_alert_large.png
rename to java/res/drawable-hdpi/ic_dialog_alert_large.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_dialog_keyboard.png b/java/res/drawable-hdpi/ic_dialog_keyboard.png
similarity index 100%
rename from res/drawable-hdpi/ic_dialog_keyboard.png
rename to java/res/drawable-hdpi/ic_dialog_keyboard.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_dialog_voice_input.png b/java/res/drawable-hdpi/ic_dialog_voice_input.png
similarity index 100%
rename from res/drawable-hdpi/ic_dialog_voice_input.png
rename to java/res/drawable-hdpi/ic_dialog_voice_input.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_dialog_wave_0_0.png b/java/res/drawable-hdpi/ic_dialog_wave_0_0.png
similarity index 100%
rename from res/drawable-hdpi/ic_dialog_wave_0_0.png
rename to java/res/drawable-hdpi/ic_dialog_wave_0_0.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_dialog_wave_1_3.png b/java/res/drawable-hdpi/ic_dialog_wave_1_3.png
similarity index 100%
rename from res/drawable-hdpi/ic_dialog_wave_1_3.png
rename to java/res/drawable-hdpi/ic_dialog_wave_1_3.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_dialog_wave_2_3.png b/java/res/drawable-hdpi/ic_dialog_wave_2_3.png
similarity index 100%
rename from res/drawable-hdpi/ic_dialog_wave_2_3.png
rename to java/res/drawable-hdpi/ic_dialog_wave_2_3.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_dialog_wave_3_3.png b/java/res/drawable-hdpi/ic_dialog_wave_3_3.png
similarity index 100%
rename from res/drawable-hdpi/ic_dialog_wave_3_3.png
rename to java/res/drawable-hdpi/ic_dialog_wave_3_3.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_dialog_wave_4_3.png b/java/res/drawable-hdpi/ic_dialog_wave_4_3.png
similarity index 100%
rename from res/drawable-hdpi/ic_dialog_wave_4_3.png
rename to java/res/drawable-hdpi/ic_dialog_wave_4_3.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_mic_dialog.png b/java/res/drawable-hdpi/ic_mic_dialog.png
similarity index 100%
rename from res/drawable-hdpi/ic_mic_dialog.png
rename to java/res/drawable-hdpi/ic_mic_dialog.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_suggest_strip_microphone.png b/java/res/drawable-hdpi/ic_suggest_strip_microphone.png
similarity index 100%
rename from res/drawable-hdpi/ic_suggest_strip_microphone.png
rename to java/res/drawable-hdpi/ic_suggest_strip_microphone.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png b/java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png
similarity index 100%
rename from res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png
rename to java/res/drawable-hdpi/ic_suggest_strip_microphone_swipe.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_suggest_strip_scroll_left_arrow.png b/java/res/drawable-hdpi/ic_suggest_strip_scroll_left_arrow.png
similarity index 100%
rename from res/drawable-hdpi/ic_suggest_strip_scroll_left_arrow.png
rename to java/res/drawable-hdpi/ic_suggest_strip_scroll_left_arrow.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_suggest_strip_scroll_right_arrow.png b/java/res/drawable-hdpi/ic_suggest_strip_scroll_right_arrow.png
similarity index 100%
rename from res/drawable-hdpi/ic_suggest_strip_scroll_right_arrow.png
rename to java/res/drawable-hdpi/ic_suggest_strip_scroll_right_arrow.png
Binary files differ
diff --git a/res/drawable-hdpi/keyboard_background.9.png b/java/res/drawable-hdpi/keyboard_background.9.png
similarity index 100%
rename from res/drawable-hdpi/keyboard_background.9.png
rename to java/res/drawable-hdpi/keyboard_background.9.png
Binary files differ
diff --git a/res/drawable-hdpi/keyboard_suggest_strip.9.png b/java/res/drawable-hdpi/keyboard_suggest_strip.9.png
similarity index 100%
rename from res/drawable-hdpi/keyboard_suggest_strip.9.png
rename to java/res/drawable-hdpi/keyboard_suggest_strip.9.png
Binary files differ
diff --git a/res/drawable-hdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-hdpi/keyboard_suggest_strip_divider.png
similarity index 100%
rename from res/drawable-hdpi/keyboard_suggest_strip_divider.png
rename to java/res/drawable-hdpi/keyboard_suggest_strip_divider.png
Binary files differ
diff --git a/res/drawable-hdpi/list_selector_background_pressed.9.png b/java/res/drawable-hdpi/list_selector_background_pressed.9.png
similarity index 100%
rename from res/drawable-hdpi/list_selector_background_pressed.9.png
rename to java/res/drawable-hdpi/list_selector_background_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/mic_slash.png b/java/res/drawable-hdpi/mic_slash.png
similarity index 100%
rename from res/drawable-hdpi/mic_slash.png
rename to java/res/drawable-hdpi/mic_slash.png
Binary files differ
diff --git a/res/drawable-hdpi/ok_cancel.png b/java/res/drawable-hdpi/ok_cancel.png
similarity index 100%
rename from res/drawable-hdpi/ok_cancel.png
rename to java/res/drawable-hdpi/ok_cancel.png
Binary files differ
diff --git a/res/drawable-hdpi/speak_now_level0.png b/java/res/drawable-hdpi/speak_now_level0.png
similarity index 100%
rename from res/drawable-hdpi/speak_now_level0.png
rename to java/res/drawable-hdpi/speak_now_level0.png
Binary files differ
diff --git a/res/drawable-hdpi/speak_now_level1.png b/java/res/drawable-hdpi/speak_now_level1.png
similarity index 100%
rename from res/drawable-hdpi/speak_now_level1.png
rename to java/res/drawable-hdpi/speak_now_level1.png
Binary files differ
diff --git a/res/drawable-hdpi/speak_now_level2.png b/java/res/drawable-hdpi/speak_now_level2.png
similarity index 100%
rename from res/drawable-hdpi/speak_now_level2.png
rename to java/res/drawable-hdpi/speak_now_level2.png
Binary files differ
diff --git a/res/drawable-hdpi/speak_now_level3.png b/java/res/drawable-hdpi/speak_now_level3.png
similarity index 100%
rename from res/drawable-hdpi/speak_now_level3.png
rename to java/res/drawable-hdpi/speak_now_level3.png
Binary files differ
diff --git a/res/drawable-hdpi/speak_now_level4.png b/java/res/drawable-hdpi/speak_now_level4.png
similarity index 100%
rename from res/drawable-hdpi/speak_now_level4.png
rename to java/res/drawable-hdpi/speak_now_level4.png
Binary files differ
diff --git a/res/drawable-hdpi/speak_now_level5.png b/java/res/drawable-hdpi/speak_now_level5.png
similarity index 100%
rename from res/drawable-hdpi/speak_now_level5.png
rename to java/res/drawable-hdpi/speak_now_level5.png
Binary files differ
diff --git a/res/drawable-hdpi/speak_now_level6.png b/java/res/drawable-hdpi/speak_now_level6.png
similarity index 100%
rename from res/drawable-hdpi/speak_now_level6.png
rename to java/res/drawable-hdpi/speak_now_level6.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_123_mic.png b/java/res/drawable-hdpi/sym_keyboard_123_mic.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_123_mic.png
rename to java/res/drawable-hdpi/sym_keyboard_123_mic.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_delete.png b/java/res/drawable-hdpi/sym_keyboard_delete.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_delete.png
rename to java/res/drawable-hdpi/sym_keyboard_delete.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_done.png b/java/res/drawable-hdpi/sym_keyboard_done.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_done.png
rename to java/res/drawable-hdpi/sym_keyboard_done.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png b/java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_123_mic.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_123_mic.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_delete.png b/java/res/drawable-hdpi/sym_keyboard_feedback_delete.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_delete.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_delete.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_done.png b/java/res/drawable-hdpi/sym_keyboard_feedback_done.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_done.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_done.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_left.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png b/java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_language_arrows_right.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_mic.png b/java/res/drawable-hdpi/sym_keyboard_feedback_mic.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_mic.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_mic.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_numalt.png b/java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_numalt.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_numalt.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_return.png b/java/res/drawable-hdpi/sym_keyboard_feedback_return.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_return.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_return.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_search.png b/java/res/drawable-hdpi/sym_keyboard_feedback_search.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_search.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_search.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_shift.png b/java/res/drawable-hdpi/sym_keyboard_feedback_shift.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_shift.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_shift.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png b/java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_shift_locked.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_space.png b/java/res/drawable-hdpi/sym_keyboard_feedback_space.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_space.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_space.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_tab.png b/java/res/drawable-hdpi/sym_keyboard_feedback_tab.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_tab.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_tab.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_feedback_tabprev.png b/java/res/drawable-hdpi/sym_keyboard_feedback_tabprev.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_feedback_tabprev.png
rename to java/res/drawable-hdpi/sym_keyboard_feedback_tabprev.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_globe.png b/java/res/drawable-hdpi/sym_keyboard_globe.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_globe.png
rename to java/res/drawable-hdpi/sym_keyboard_globe.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_language_arrows_left.png b/java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_language_arrows_left.png
rename to java/res/drawable-hdpi/sym_keyboard_language_arrows_left.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_language_arrows_right.png b/java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_language_arrows_right.png
rename to java/res/drawable-hdpi/sym_keyboard_language_arrows_right.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_mic.png b/java/res/drawable-hdpi/sym_keyboard_mic.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_mic.png
rename to java/res/drawable-hdpi/sym_keyboard_mic.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num0.png b/java/res/drawable-hdpi/sym_keyboard_num0.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num0.png
rename to java/res/drawable-hdpi/sym_keyboard_num0.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num1.png b/java/res/drawable-hdpi/sym_keyboard_num1.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num1.png
rename to java/res/drawable-hdpi/sym_keyboard_num1.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num2.png b/java/res/drawable-hdpi/sym_keyboard_num2.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num2.png
rename to java/res/drawable-hdpi/sym_keyboard_num2.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num3.png b/java/res/drawable-hdpi/sym_keyboard_num3.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num3.png
rename to java/res/drawable-hdpi/sym_keyboard_num3.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num4.png b/java/res/drawable-hdpi/sym_keyboard_num4.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num4.png
rename to java/res/drawable-hdpi/sym_keyboard_num4.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num5.png b/java/res/drawable-hdpi/sym_keyboard_num5.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num5.png
rename to java/res/drawable-hdpi/sym_keyboard_num5.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num6.png b/java/res/drawable-hdpi/sym_keyboard_num6.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num6.png
rename to java/res/drawable-hdpi/sym_keyboard_num6.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num7.png b/java/res/drawable-hdpi/sym_keyboard_num7.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num7.png
rename to java/res/drawable-hdpi/sym_keyboard_num7.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num8.png b/java/res/drawable-hdpi/sym_keyboard_num8.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num8.png
rename to java/res/drawable-hdpi/sym_keyboard_num8.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_num9.png b/java/res/drawable-hdpi/sym_keyboard_num9.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_num9.png
rename to java/res/drawable-hdpi/sym_keyboard_num9.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_numalt.png b/java/res/drawable-hdpi/sym_keyboard_numalt.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_numalt.png
rename to java/res/drawable-hdpi/sym_keyboard_numalt.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_numpound.png b/java/res/drawable-hdpi/sym_keyboard_numpound.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_numpound.png
rename to java/res/drawable-hdpi/sym_keyboard_numpound.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_numstar.png b/java/res/drawable-hdpi/sym_keyboard_numstar.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_numstar.png
rename to java/res/drawable-hdpi/sym_keyboard_numstar.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_return.png b/java/res/drawable-hdpi/sym_keyboard_return.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_return.png
rename to java/res/drawable-hdpi/sym_keyboard_return.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_search.png b/java/res/drawable-hdpi/sym_keyboard_search.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_search.png
rename to java/res/drawable-hdpi/sym_keyboard_search.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_shift.png b/java/res/drawable-hdpi/sym_keyboard_shift.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_shift.png
rename to java/res/drawable-hdpi/sym_keyboard_shift.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_shift_locked.png b/java/res/drawable-hdpi/sym_keyboard_shift_locked.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_shift_locked.png
rename to java/res/drawable-hdpi/sym_keyboard_shift_locked.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_space.png b/java/res/drawable-hdpi/sym_keyboard_space.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_space.png
rename to java/res/drawable-hdpi/sym_keyboard_space.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_tab.png b/java/res/drawable-hdpi/sym_keyboard_tab.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_tab.png
rename to java/res/drawable-hdpi/sym_keyboard_tab.png
Binary files differ
diff --git a/res/drawable-hdpi/sym_keyboard_tabprev.png b/java/res/drawable-hdpi/sym_keyboard_tabprev.png
similarity index 100%
rename from res/drawable-hdpi/sym_keyboard_tabprev.png
rename to java/res/drawable-hdpi/sym_keyboard_tabprev.png
Binary files differ
diff --git a/res/drawable-hdpi/voice_ime_background.9.png b/java/res/drawable-hdpi/voice_ime_background.9.png
similarity index 100%
rename from res/drawable-hdpi/voice_ime_background.9.png
rename to java/res/drawable-hdpi/voice_ime_background.9.png
Binary files differ
diff --git a/res/drawable-hdpi/working.png b/java/res/drawable-hdpi/working.png
similarity index 100%
rename from res/drawable-hdpi/working.png
rename to java/res/drawable-hdpi/working.png
Binary files differ
diff --git a/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png
similarity index 100%
rename from res/drawable-land-hdpi/btn_keyboard_key_normal.9.png
rename to java/res/drawable-land-hdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png
similarity index 100%
rename from res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png
rename to java/res/drawable-land-hdpi/btn_keyboard_key_normal_off.9.png
Binary files differ
diff --git a/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png
similarity index 100%
rename from res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png
rename to java/res/drawable-land-hdpi/btn_keyboard_key_normal_on.9.png
Binary files differ
diff --git a/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png
similarity index 100%
rename from res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png
rename to java/res/drawable-land-hdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png
similarity index 100%
rename from res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png
rename to java/res/drawable-land-hdpi/btn_keyboard_key_pressed_off.9.png
Binary files differ
diff --git a/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png
similarity index 100%
rename from res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png
rename to java/res/drawable-land-hdpi/btn_keyboard_key_pressed_on.9.png
Binary files differ
diff --git a/res/drawable-land-hdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-land-hdpi/keyboard_suggest_strip_divider.png
similarity index 100%
rename from res/drawable-land-hdpi/keyboard_suggest_strip_divider.png
rename to java/res/drawable-land-hdpi/keyboard_suggest_strip_divider.png
Binary files differ
diff --git a/res/drawable-land-mdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-land-mdpi/btn_keyboard_key_normal.9.png
similarity index 100%
rename from res/drawable-land-mdpi/btn_keyboard_key_normal.9.png
rename to java/res/drawable-land-mdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/res/drawable-land-mdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-land-mdpi/btn_keyboard_key_normal_off.9.png
similarity index 100%
rename from res/drawable-land-mdpi/btn_keyboard_key_normal_off.9.png
rename to java/res/drawable-land-mdpi/btn_keyboard_key_normal_off.9.png
Binary files differ
diff --git a/res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png
similarity index 100%
rename from res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png
rename to java/res/drawable-land-mdpi/btn_keyboard_key_normal_on.9.png
Binary files differ
diff --git a/res/drawable-land-mdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-land-mdpi/btn_keyboard_key_pressed.9.png
similarity index 100%
rename from res/drawable-land-mdpi/btn_keyboard_key_pressed.9.png
rename to java/res/drawable-land-mdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/res/drawable-land-mdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-land-mdpi/btn_keyboard_key_pressed_off.9.png
similarity index 100%
rename from res/drawable-land-mdpi/btn_keyboard_key_pressed_off.9.png
rename to java/res/drawable-land-mdpi/btn_keyboard_key_pressed_off.9.png
Binary files differ
diff --git a/res/drawable-land-mdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-land-mdpi/btn_keyboard_key_pressed_on.9.png
similarity index 100%
rename from res/drawable-land-mdpi/btn_keyboard_key_pressed_on.9.png
rename to java/res/drawable-land-mdpi/btn_keyboard_key_pressed_on.9.png
Binary files differ
diff --git a/res/drawable-land-mdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-land-mdpi/keyboard_suggest_strip_divider.png
similarity index 100%
rename from res/drawable-land-mdpi/keyboard_suggest_strip_divider.png
rename to java/res/drawable-land-mdpi/keyboard_suggest_strip_divider.png
Binary files differ
diff --git a/res/drawable-land/btn_keyboard_key.xml b/java/res/drawable-land/btn_keyboard_key.xml
similarity index 100%
rename from res/drawable-land/btn_keyboard_key.xml
rename to java/res/drawable-land/btn_keyboard_key.xml
diff --git a/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal.9.png
similarity index 100%
rename from res/drawable-mdpi/btn_keyboard_key_fulltrans_normal.9.png
rename to java/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed.9.png b/java/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed.9.png
similarity index 100%
rename from res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed.9.png
rename to java/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal.9.png
similarity index 100%
rename from res/drawable-mdpi/btn_keyboard_key_normal.9.png
rename to java/res/drawable-mdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_off.9.png
similarity index 100%
rename from res/drawable-mdpi/btn_keyboard_key_normal_off.9.png
rename to java/res/drawable-mdpi/btn_keyboard_key_normal_off.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png
similarity index 100%
rename from res/drawable-mdpi/btn_keyboard_key_normal_on.9.png
rename to java/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed.9.png
similarity index 100%
rename from res/drawable-mdpi/btn_keyboard_key_pressed.9.png
rename to java/res/drawable-mdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png
similarity index 100%
rename from res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png
rename to java/res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png
Binary files differ
diff --git a/res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png
similarity index 100%
rename from res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png
rename to java/res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png
Binary files differ
diff --git a/res/drawable-mdpi/candidate_feedback_background.9.png b/java/res/drawable-mdpi/candidate_feedback_background.9.png
similarity index 100%
rename from res/drawable-mdpi/candidate_feedback_background.9.png
rename to java/res/drawable-mdpi/candidate_feedback_background.9.png
Binary files differ
diff --git a/res/drawable-mdpi/dialog_bubble_step02.9.png b/java/res/drawable-mdpi/dialog_bubble_step02.9.png
similarity index 100%
rename from res/drawable-mdpi/dialog_bubble_step02.9.png
rename to java/res/drawable-mdpi/dialog_bubble_step02.9.png
Binary files differ
diff --git a/res/drawable-mdpi/dialog_bubble_step07.9.png b/java/res/drawable-mdpi/dialog_bubble_step07.9.png
similarity index 100%
rename from res/drawable-mdpi/dialog_bubble_step07.9.png
rename to java/res/drawable-mdpi/dialog_bubble_step07.9.png
Binary files differ
diff --git a/res/drawable-mdpi/highlight_pressed.png b/java/res/drawable-mdpi/highlight_pressed.png
similarity index 100%
rename from res/drawable-mdpi/highlight_pressed.png
rename to java/res/drawable-mdpi/highlight_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_dialog_keyboard.png b/java/res/drawable-mdpi/ic_dialog_keyboard.png
similarity index 100%
rename from res/drawable-mdpi/ic_dialog_keyboard.png
rename to java/res/drawable-mdpi/ic_dialog_keyboard.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_mic_dialog.png b/java/res/drawable-mdpi/ic_mic_dialog.png
similarity index 100%
rename from res/drawable-mdpi/ic_mic_dialog.png
rename to java/res/drawable-mdpi/ic_mic_dialog.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_suggest_strip_microphone.png b/java/res/drawable-mdpi/ic_suggest_strip_microphone.png
similarity index 100%
rename from res/drawable-mdpi/ic_suggest_strip_microphone.png
rename to java/res/drawable-mdpi/ic_suggest_strip_microphone.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_suggest_strip_microphone_swipe.png b/java/res/drawable-mdpi/ic_suggest_strip_microphone_swipe.png
similarity index 100%
rename from res/drawable-mdpi/ic_suggest_strip_microphone_swipe.png
rename to java/res/drawable-mdpi/ic_suggest_strip_microphone_swipe.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_suggest_strip_scroll_left_arrow.png b/java/res/drawable-mdpi/ic_suggest_strip_scroll_left_arrow.png
similarity index 100%
rename from res/drawable-mdpi/ic_suggest_strip_scroll_left_arrow.png
rename to java/res/drawable-mdpi/ic_suggest_strip_scroll_left_arrow.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_suggest_strip_scroll_right_arrow.png b/java/res/drawable-mdpi/ic_suggest_strip_scroll_right_arrow.png
similarity index 100%
rename from res/drawable-mdpi/ic_suggest_strip_scroll_right_arrow.png
rename to java/res/drawable-mdpi/ic_suggest_strip_scroll_right_arrow.png
Binary files differ
diff --git a/res/drawable-mdpi/keyboard_background.9.png b/java/res/drawable-mdpi/keyboard_background.9.png
similarity index 100%
rename from res/drawable-mdpi/keyboard_background.9.png
rename to java/res/drawable-mdpi/keyboard_background.9.png
Binary files differ
diff --git a/res/drawable-mdpi/keyboard_suggest_strip.9.png b/java/res/drawable-mdpi/keyboard_suggest_strip.9.png
similarity index 100%
rename from res/drawable-mdpi/keyboard_suggest_strip.9.png
rename to java/res/drawable-mdpi/keyboard_suggest_strip.9.png
Binary files differ
diff --git a/res/drawable-mdpi/keyboard_suggest_strip_divider.png b/java/res/drawable-mdpi/keyboard_suggest_strip_divider.png
similarity index 100%
rename from res/drawable-mdpi/keyboard_suggest_strip_divider.png
rename to java/res/drawable-mdpi/keyboard_suggest_strip_divider.png
Binary files differ
diff --git a/res/drawable-mdpi/list_selector_background_pressed.9.png b/java/res/drawable-mdpi/list_selector_background_pressed.9.png
similarity index 100%
rename from res/drawable-mdpi/list_selector_background_pressed.9.png
rename to java/res/drawable-mdpi/list_selector_background_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_123_mic.png b/java/res/drawable-mdpi/sym_keyboard_123_mic.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_123_mic.png
rename to java/res/drawable-mdpi/sym_keyboard_123_mic.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_delete.png b/java/res/drawable-mdpi/sym_keyboard_delete.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_delete.png
rename to java/res/drawable-mdpi/sym_keyboard_delete.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_done.png b/java/res/drawable-mdpi/sym_keyboard_done.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_done.png
rename to java/res/drawable-mdpi/sym_keyboard_done.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_123_mic.png b/java/res/drawable-mdpi/sym_keyboard_feedback_123_mic.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_123_mic.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_123_mic.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_delete.png b/java/res/drawable-mdpi/sym_keyboard_feedback_delete.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_delete.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_delete.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_done.png b/java/res/drawable-mdpi/sym_keyboard_feedback_done.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_done.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_done.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_language_arrows_left.png b/java/res/drawable-mdpi/sym_keyboard_feedback_language_arrows_left.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_language_arrows_left.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_language_arrows_left.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_language_arrows_right.png b/java/res/drawable-mdpi/sym_keyboard_feedback_language_arrows_right.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_language_arrows_right.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_language_arrows_right.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_mic.png b/java/res/drawable-mdpi/sym_keyboard_feedback_mic.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_mic.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_mic.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_numalt.png b/java/res/drawable-mdpi/sym_keyboard_feedback_numalt.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_numalt.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_numalt.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_return.png b/java/res/drawable-mdpi/sym_keyboard_feedback_return.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_return.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_return.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_search.png b/java/res/drawable-mdpi/sym_keyboard_feedback_search.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_search.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_search.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_shift.png b/java/res/drawable-mdpi/sym_keyboard_feedback_shift.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_shift.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_shift.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png b/java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_shift_locked.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_space.png b/java/res/drawable-mdpi/sym_keyboard_feedback_space.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_space.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_space.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_tab.png b/java/res/drawable-mdpi/sym_keyboard_feedback_tab.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_tab.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_tab.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_feedback_tabprev.png b/java/res/drawable-mdpi/sym_keyboard_feedback_tabprev.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_feedback_tabprev.png
rename to java/res/drawable-mdpi/sym_keyboard_feedback_tabprev.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_globe.png b/java/res/drawable-mdpi/sym_keyboard_globe.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_globe.png
rename to java/res/drawable-mdpi/sym_keyboard_globe.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_language_arrows_left.png b/java/res/drawable-mdpi/sym_keyboard_language_arrows_left.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_language_arrows_left.png
rename to java/res/drawable-mdpi/sym_keyboard_language_arrows_left.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_language_arrows_right.png b/java/res/drawable-mdpi/sym_keyboard_language_arrows_right.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_language_arrows_right.png
rename to java/res/drawable-mdpi/sym_keyboard_language_arrows_right.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_mic.png b/java/res/drawable-mdpi/sym_keyboard_mic.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_mic.png
rename to java/res/drawable-mdpi/sym_keyboard_mic.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num0.png b/java/res/drawable-mdpi/sym_keyboard_num0.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num0.png
rename to java/res/drawable-mdpi/sym_keyboard_num0.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num1.png b/java/res/drawable-mdpi/sym_keyboard_num1.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num1.png
rename to java/res/drawable-mdpi/sym_keyboard_num1.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num2.png b/java/res/drawable-mdpi/sym_keyboard_num2.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num2.png
rename to java/res/drawable-mdpi/sym_keyboard_num2.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num3.png b/java/res/drawable-mdpi/sym_keyboard_num3.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num3.png
rename to java/res/drawable-mdpi/sym_keyboard_num3.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num4.png b/java/res/drawable-mdpi/sym_keyboard_num4.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num4.png
rename to java/res/drawable-mdpi/sym_keyboard_num4.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num5.png b/java/res/drawable-mdpi/sym_keyboard_num5.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num5.png
rename to java/res/drawable-mdpi/sym_keyboard_num5.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num6.png b/java/res/drawable-mdpi/sym_keyboard_num6.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num6.png
rename to java/res/drawable-mdpi/sym_keyboard_num6.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num7.png b/java/res/drawable-mdpi/sym_keyboard_num7.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num7.png
rename to java/res/drawable-mdpi/sym_keyboard_num7.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num8.png b/java/res/drawable-mdpi/sym_keyboard_num8.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num8.png
rename to java/res/drawable-mdpi/sym_keyboard_num8.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_num9.png b/java/res/drawable-mdpi/sym_keyboard_num9.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_num9.png
rename to java/res/drawable-mdpi/sym_keyboard_num9.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_numalt.png b/java/res/drawable-mdpi/sym_keyboard_numalt.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_numalt.png
rename to java/res/drawable-mdpi/sym_keyboard_numalt.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_numpound.png b/java/res/drawable-mdpi/sym_keyboard_numpound.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_numpound.png
rename to java/res/drawable-mdpi/sym_keyboard_numpound.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_numstar.png b/java/res/drawable-mdpi/sym_keyboard_numstar.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_numstar.png
rename to java/res/drawable-mdpi/sym_keyboard_numstar.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_return.png b/java/res/drawable-mdpi/sym_keyboard_return.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_return.png
rename to java/res/drawable-mdpi/sym_keyboard_return.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_search.png b/java/res/drawable-mdpi/sym_keyboard_search.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_search.png
rename to java/res/drawable-mdpi/sym_keyboard_search.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_shift.png b/java/res/drawable-mdpi/sym_keyboard_shift.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_shift.png
rename to java/res/drawable-mdpi/sym_keyboard_shift.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_shift_locked.png b/java/res/drawable-mdpi/sym_keyboard_shift_locked.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_shift_locked.png
rename to java/res/drawable-mdpi/sym_keyboard_shift_locked.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_space.png b/java/res/drawable-mdpi/sym_keyboard_space.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_space.png
rename to java/res/drawable-mdpi/sym_keyboard_space.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_tab.png b/java/res/drawable-mdpi/sym_keyboard_tab.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_tab.png
rename to java/res/drawable-mdpi/sym_keyboard_tab.png
Binary files differ
diff --git a/res/drawable-mdpi/sym_keyboard_tabprev.png b/java/res/drawable-mdpi/sym_keyboard_tabprev.png
similarity index 100%
rename from res/drawable-mdpi/sym_keyboard_tabprev.png
rename to java/res/drawable-mdpi/sym_keyboard_tabprev.png
Binary files differ
diff --git a/res/drawable/btn_keyboard_key.xml b/java/res/drawable/btn_keyboard_key.xml
similarity index 100%
rename from res/drawable/btn_keyboard_key.xml
rename to java/res/drawable/btn_keyboard_key.xml
diff --git a/res/drawable/btn_keyboard_key_fulltrans.xml b/java/res/drawable/btn_keyboard_key_fulltrans.xml
similarity index 100%
rename from res/drawable/btn_keyboard_key_fulltrans.xml
rename to java/res/drawable/btn_keyboard_key_fulltrans.xml
diff --git a/res/drawable/cancel.png b/java/res/drawable/cancel.png
similarity index 100%
rename from res/drawable/cancel.png
rename to java/res/drawable/cancel.png
Binary files differ
diff --git a/res/drawable/caution.png b/java/res/drawable/caution.png
similarity index 100%
rename from res/drawable/caution.png
rename to java/res/drawable/caution.png
Binary files differ
diff --git a/res/drawable/dialog_top_dark_bottom_medium.9.png b/java/res/drawable/dialog_top_dark_bottom_medium.9.png
similarity index 100%
rename from res/drawable/dialog_top_dark_bottom_medium.9.png
rename to java/res/drawable/dialog_top_dark_bottom_medium.9.png
Binary files differ
diff --git a/res/drawable/ic_dialog_alert_large.png b/java/res/drawable/ic_dialog_alert_large.png
similarity index 100%
rename from res/drawable/ic_dialog_alert_large.png
rename to java/res/drawable/ic_dialog_alert_large.png
Binary files differ
diff --git a/res/drawable/ic_dialog_voice_input.png b/java/res/drawable/ic_dialog_voice_input.png
similarity index 100%
rename from res/drawable/ic_dialog_voice_input.png
rename to java/res/drawable/ic_dialog_voice_input.png
Binary files differ
diff --git a/res/drawable/ic_dialog_wave_0_0.png b/java/res/drawable/ic_dialog_wave_0_0.png
similarity index 100%
rename from res/drawable/ic_dialog_wave_0_0.png
rename to java/res/drawable/ic_dialog_wave_0_0.png
Binary files differ
diff --git a/res/drawable/ic_dialog_wave_1_3.png b/java/res/drawable/ic_dialog_wave_1_3.png
similarity index 100%
rename from res/drawable/ic_dialog_wave_1_3.png
rename to java/res/drawable/ic_dialog_wave_1_3.png
Binary files differ
diff --git a/res/drawable/ic_dialog_wave_2_3.png b/java/res/drawable/ic_dialog_wave_2_3.png
similarity index 100%
rename from res/drawable/ic_dialog_wave_2_3.png
rename to java/res/drawable/ic_dialog_wave_2_3.png
Binary files differ
diff --git a/res/drawable/ic_dialog_wave_3_3.png b/java/res/drawable/ic_dialog_wave_3_3.png
similarity index 100%
rename from res/drawable/ic_dialog_wave_3_3.png
rename to java/res/drawable/ic_dialog_wave_3_3.png
Binary files differ
diff --git a/res/drawable/ic_dialog_wave_4_3.png b/java/res/drawable/ic_dialog_wave_4_3.png
similarity index 100%
rename from res/drawable/ic_dialog_wave_4_3.png
rename to java/res/drawable/ic_dialog_wave_4_3.png
Binary files differ
diff --git a/res/drawable/ic_suggest_scroll_background.xml b/java/res/drawable/ic_suggest_scroll_background.xml
similarity index 100%
rename from res/drawable/ic_suggest_scroll_background.xml
rename to java/res/drawable/ic_suggest_scroll_background.xml
diff --git a/res/drawable/mic_slash.png b/java/res/drawable/mic_slash.png
similarity index 100%
rename from res/drawable/mic_slash.png
rename to java/res/drawable/mic_slash.png
Binary files differ
diff --git a/res/drawable/ok_cancel.png b/java/res/drawable/ok_cancel.png
similarity index 100%
rename from res/drawable/ok_cancel.png
rename to java/res/drawable/ok_cancel.png
Binary files differ
diff --git a/res/drawable/speak_now_level0.png b/java/res/drawable/speak_now_level0.png
similarity index 100%
rename from res/drawable/speak_now_level0.png
rename to java/res/drawable/speak_now_level0.png
Binary files differ
diff --git a/res/drawable/speak_now_level1.png b/java/res/drawable/speak_now_level1.png
similarity index 100%
rename from res/drawable/speak_now_level1.png
rename to java/res/drawable/speak_now_level1.png
Binary files differ
diff --git a/res/drawable/speak_now_level2.png b/java/res/drawable/speak_now_level2.png
similarity index 100%
rename from res/drawable/speak_now_level2.png
rename to java/res/drawable/speak_now_level2.png
Binary files differ
diff --git a/res/drawable/speak_now_level3.png b/java/res/drawable/speak_now_level3.png
similarity index 100%
rename from res/drawable/speak_now_level3.png
rename to java/res/drawable/speak_now_level3.png
Binary files differ
diff --git a/res/drawable/speak_now_level4.png b/java/res/drawable/speak_now_level4.png
similarity index 100%
rename from res/drawable/speak_now_level4.png
rename to java/res/drawable/speak_now_level4.png
Binary files differ
diff --git a/res/drawable/speak_now_level5.png b/java/res/drawable/speak_now_level5.png
similarity index 100%
rename from res/drawable/speak_now_level5.png
rename to java/res/drawable/speak_now_level5.png
Binary files differ
diff --git a/res/drawable/speak_now_level6.png b/java/res/drawable/speak_now_level6.png
similarity index 100%
rename from res/drawable/speak_now_level6.png
rename to java/res/drawable/speak_now_level6.png
Binary files differ
diff --git a/res/drawable/voice_ime_background.9.png b/java/res/drawable/voice_ime_background.9.png
similarity index 100%
rename from res/drawable/voice_ime_background.9.png
rename to java/res/drawable/voice_ime_background.9.png
Binary files differ
diff --git a/res/drawable/voice_swipe_hint.png b/java/res/drawable/voice_swipe_hint.png
similarity index 100%
rename from res/drawable/voice_swipe_hint.png
rename to java/res/drawable/voice_swipe_hint.png
Binary files differ
diff --git a/res/drawable/working.png b/java/res/drawable/working.png
similarity index 100%
rename from res/drawable/working.png
rename to java/res/drawable/working.png
Binary files differ
diff --git a/res/layout/bubble_text.xml b/java/res/layout/bubble_text.xml
similarity index 100%
rename from res/layout/bubble_text.xml
rename to java/res/layout/bubble_text.xml
diff --git a/res/layout/candidate_preview.xml b/java/res/layout/candidate_preview.xml
similarity index 100%
rename from res/layout/candidate_preview.xml
rename to java/res/layout/candidate_preview.xml
diff --git a/res/layout/candidates.xml b/java/res/layout/candidates.xml
similarity index 100%
rename from res/layout/candidates.xml
rename to java/res/layout/candidates.xml
diff --git a/res/layout/input.xml b/java/res/layout/input.xml
similarity index 100%
rename from res/layout/input.xml
rename to java/res/layout/input.xml
diff --git a/res/layout/input_trans.xml b/java/res/layout/input_trans.xml
similarity index 96%
rename from res/layout/input_trans.xml
rename to java/res/layout/input_trans.xml
index a988bcc..94806f7 100755
--- a/res/layout/input_trans.xml
+++ b/java/res/layout/input_trans.xml
@@ -25,5 +25,6 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:background="#A0000000"
+        android:verticalCorrection="0dip"
         android:keyBackground="@drawable/btn_keyboard_key_fulltrans"
         />
diff --git a/res/layout/recognition_status.xml b/java/res/layout/recognition_status.xml
similarity index 96%
rename from res/layout/recognition_status.xml
rename to java/res/layout/recognition_status.xml
index ea23824..49af773 100644
--- a/res/layout/recognition_status.xml
+++ b/java/res/layout/recognition_status.xml
@@ -63,10 +63,10 @@
     <ProgressBar android:id="@+id/progress"
         android:layout_height="60dip"
         android:layout_width="60dip"
-        android:layout_marginTop="20dip"
-        android:layout_gravity="center_horizontal"
+        android:layout_gravity="center"
         android:visibility="gone"
         android:indeterminate="true"
+        android:indeterminateOnly="false"
     />
 
 
diff --git a/res/layout/voice_punctuation_hint.xml b/java/res/layout/voice_punctuation_hint.xml
similarity index 100%
rename from res/layout/voice_punctuation_hint.xml
rename to java/res/layout/voice_punctuation_hint.xml
diff --git a/res/layout/voice_swipe_hint.xml b/java/res/layout/voice_swipe_hint.xml
similarity index 100%
rename from res/layout/voice_swipe_hint.xml
rename to java/res/layout/voice_swipe_hint.xml
diff --git a/res/raw/main.dict b/java/res/raw/main.dict
similarity index 100%
rename from res/raw/main.dict
rename to java/res/raw/main.dict
Binary files differ
diff --git a/res/raw/type3.ogg b/java/res/raw/type3.ogg
similarity index 100%
rename from res/raw/type3.ogg
rename to java/res/raw/type3.ogg
Binary files differ
diff --git a/res/values-cs/bools.xml b/java/res/values-cs/bools.xml
similarity index 100%
rename from res/values-cs/bools.xml
rename to java/res/values-cs/bools.xml
diff --git a/res/values-cs/donottranslate.xml b/java/res/values-cs/donottranslate.xml
similarity index 100%
rename from res/values-cs/donottranslate.xml
rename to java/res/values-cs/donottranslate.xml
diff --git a/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
similarity index 82%
rename from res/values-cs/strings.xml
rename to java/res/values-cs/strings.xml
index 02361e1..4bc1f55 100644
--- a/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Klávesnice Android"</string>
@@ -37,17 +42,17 @@
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
     <skip />
     <string name="quick_fixes" msgid="5353213327680897927">"Rychlé opravy"</string>
-    <string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje běžné překlepy"</string>
-    <string name="show_suggestions" msgid="507074425254289133">"Zobrazovat návrhy"</string>
-    <string name="show_suggestions_summary" msgid="1989672863935759654">"Při psaní zobrazovat návrhy slov"</string>
+    <string name="quick_fixes_summary" msgid="3405028402510332373">"Opravuje nejčastější chyby při psaní"</string>
+    <string name="show_suggestions" msgid="507074425254289133">"Zobrazit návrhy"</string>
+    <string name="show_suggestions_summary" msgid="1989672863935759654">"Zobrazovat navržená slova během psaní"</string>
     <string name="auto_complete" msgid="1103196318775486023">"Automatické dokončování"</string>
-    <string name="auto_complete_summary" msgid="6113149638718274624">"Stisknutí mezerníku nebo interpunkce automaticky vloží zvýrazněné slovo"</string>
+    <string name="auto_complete_summary" msgid="6113149638718274624">"Stisknutím mezerníku nebo interpunkčního znaménka automaticky vložíte zvýrazněné slovo."</string>
   <string-array name="prediction_modes">
-    <item msgid="4870266572388153286">"Není"</item>
+    <item msgid="4870266572388153286">"Žádný"</item>
     <item msgid="1669461741568287396">"Základní"</item>
     <item msgid="4894328801530136615">"Pokročilé"</item>
   </string-array>
-    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Uloženo"</string>
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Uloženo"</string>
     <string name="alternates_for_a" msgid="2566516493365324765">"áàâãäåæ"</string>
     <string name="alternates_for_e" msgid="3900510936875547555">"éěèêë"</string>
     <string name="alternates_for_i" msgid="7097915268629342242">"íìîï"</string>
@@ -57,18 +62,18 @@
     <string name="alternates_for_n" msgid="6257322556221886400">"ňñ"</string>
     <string name="alternates_for_c" msgid="151699780720639892">"čç"</string>
     <string name="alternates_for_y" msgid="1722776806607271199">"ýÿ"</string>
-    <string name="tip_long_press" msgid="6101270866284343344">"Podržením klávesy zobrazíte diakritiku (ž, á atd.)"</string>
-    <string name="tip_dismiss" msgid="7585579046862204381">"Stisknutím klávesy Zpět ↶ můžete klávesnici kdykoli zavřít"</string>
+    <string name="tip_long_press" msgid="6101270866284343344">"Podržením klávesy zobrazíte diakritiku (á, ž apod.)"</string>
+    <string name="tip_dismiss" msgid="7585579046862204381">"Stisknutím klávesy Zpět ↶ můžete klávesnici kdykoli zavřít."</string>
     <string name="tip_access_symbols" msgid="6344098517525531652">"Přístup k číslům a symbolům"</string>
-    <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Stisknutím a podržením slova zcela vlevo toto slovo přidáte do slovníku"</string>
-    <string name="touch_to_continue" msgid="7869803257948414531">"Chcete-li pokračovat, dotkněte se této rady »"</string>
-    <string name="touch_to_finish" msgid="7990196086480585789">"Chcete-li tuto radu zavřít a začít psát, dotkněte se zde."</string>
-    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klávesnice se zobrazí, kdykoli se dotknete textového pole."</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Stisknutím a podržením klávesy zobrazíte diakritiku"\n"(ó, ø, ö, ô atd.)"</b></string>
-    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Stisknutím této klávesy přejdete do režimu číslic a symbolů"</b></string>
-    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Opětovným stisknutím této klávesy se vrátíte zpět do režimu písmen"</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Chcete-li změnit nastavení klávesnice, jako například automatické dokončování, stiskněte tuto klávesu a podržte ji."</b></string>
-    <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Zkuste to."</b></string>
+    <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Stisknutím a podržením slova zcela vlevo toto slovo přidáte do slovníku."</string>
+    <string name="touch_to_continue" msgid="7869803257948414531">"Chcete-li pokračovat, dotkněte se tohoto tipu »"</string>
+    <string name="touch_to_finish" msgid="7990196086480585789">"Chcete-li tento tip zavřít a začít psát, dotkněte se zde."</string>
+    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Klávesnice se otevře vždy, když se dotknete textového pole."</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Přidržením klávesy zobrazíte diakritiku"\n"(ó, ø, ö, ô apod.)"</b></string>
+    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Chcete-li přepnout na režim zadávání číslic a symbolů, dotkněte se této klávesy."</b></string>
+    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Chcete-li přejít zpět k zadávání písmen, dotkněte se této klávesy znovu."</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Přidržením této klávesy změníte nastavení klávesnice (např. automatické dokončování)."</b></string>
+    <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Vyzkoušejte si to."</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"Přejít"</string>
     <string name="label_next_key" msgid="362972844525672568">"Další"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Hotovo"</string>
@@ -111,9 +116,9 @@
   </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Po hlasovém vstupu automaticky odeslat"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Při vyhledávání nebo přechodu na další pole automaticky stisknout Enter."</string>
-    <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otevřete klávesnici"\n</b></font><font size="3">\n</font>"Dotkněte se jakéhokoli textového pole."</string>
-    <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zavřete klávesnici"\n</b></font><font size="3">\n</font>"Stiskněte klávesu Zpět."</string>
-    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Přidržením klávesy zobrazte možnosti"\n</b></font><font size="3">\n</font>"Použijte interpunkční znaménka a diakritiku."</string>
+    <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Otevřete klávesnici"\n</b></font><font size="3">\n</font>"Dotkněte se libovolného textového pole."</string>
+    <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Zavřete klávesnici"\n</b></font><font size="3">\n</font>"Stiskněte tlačítko Zpět."</string>
+    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Přidržením klávesy zobrazte možnosti"\n</b></font><font size="3">\n</font>"Přístup k interpunkčním znaménkům a diakritice."</string>
     <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Nastavení klávesnice"\n</b></font><font size="3">\n</font>"Dotkněte se klávesy "<b>"?123"</b>" a přidržte ji."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".cz"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Jazyk můžete změnit posunutím prstu po mezerníku."</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Uložte slovo opětovným klepnutím"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"K dispozici je slovník"</string>
 </resources>
diff --git a/res/values-da/strings.xml b/java/res/values-da/strings.xml
similarity index 86%
rename from res/values-da/strings.xml
rename to java/res/values-da/strings.xml
index 15f6b1c..750d67b 100644
--- a/res/values-da/strings.xml
+++ b/java/res/values-da/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Android-tastatur"</string>
@@ -58,16 +63,16 @@
     <string name="alternates_for_c" msgid="151699780720639892">"ç"</string>
     <string name="alternates_for_y" msgid="1722776806607271199">"ýÿ"</string>
     <string name="tip_long_press" msgid="6101270866284343344">"Hold en tast nede for at se accenter (ø, ö osv.)"</string>
-    <string name="tip_dismiss" msgid="7585579046862204381">"Tryk på tilbagetasten ↶ for når som helst at lukke for tastaturet"</string>
+    <string name="tip_dismiss" msgid="7585579046862204381">"Tryk på knappen Tilbage ↶ for når som helst at lukke for tastaturet"</string>
     <string name="tip_access_symbols" msgid="6344098517525531652">"Få adgang til tal og symboler"</string>
     <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Tryk og hold på ordet længst til venstre for at føje det til ordbogen"</string>
     <string name="touch_to_continue" msgid="7869803257948414531">"Berør dette tip for at fortsætte »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"Berør her for at lukke dette tip og begynde at indtaste!"</string>
-    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastaturet åbnes, når du berører et tekstfelt"</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Berør og hold en tast nede for at vise accenter"\n"(ø, ö, ô, ó osv.)"</b></string>
+    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tastaturet åbner når som helst, du berører et tekstfelt"</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tryk på en tast, og hold den nede for a vise accenter"\n"(ø, ö, ô, ó osv.)"</b></string>
     <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Skift til tal og symboler ved at røre denne tast"</b></string>
-    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Gå tilbage til bogstaverne ved at berøre denne tast igen"</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Berør og hold denne tast nede for at ændre indstillingerne for tastaturet, som f.eks. automatisk udfyldelse"</b></string>
+    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Gå tilbage til bogstaver ved at berøre denne tast igen"</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tryk på denne tast, og hold den nede for at ændre tastaturindstillingerne, som f.eks. automatisk udfyldelse"</b></string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prøv det!"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"Gå"</string>
     <string name="label_next_key" msgid="362972844525672568">"Næste"</string>
@@ -112,9 +117,9 @@
     <string name="auto_submit" msgid="9151008027068358518">"Send automatisk efter stemme"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Tryk automatisk på enter, når du søger eller går til det næste felt."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Åbn tastaturet"\n</b></font><font size="3">\n</font>"Tryk på et hvilket som helst tekstfelt."</string>
-    <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Luk tastaturet"\n</b></font><font size="3">\n</font>"Tryk på Tilbagetasten."</string>
-    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tryk på og hold en tast nede for valgmuligheder"\n</b></font><font size="3">\n</font>"Få adgang til tegnsætning og accenter."</string>
-    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Indstillinger for tastatur"\n</b></font><font size="3">\n</font>"Tryk på og hold tasten "<b>"?123"</b>" nede."</string>
+    <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Luk tastaturet"\n</b></font><font size="3">\n</font>"Tryk på knappen Tilbage."</string>
+    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tryk på en tast, og hold den nede for valgmuligheder"\n</b></font><font size="3">\n</font>"Få adgang til tegnsætning og accenter."</string>
+    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastaturindstillinger"\n</b></font><font size="3">\n</font>"Tryk på tasten "<b>"?123"</b>", og hold den nede."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Træk fingeren på mellemrumstasten for at skifte sprog"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Tast igen for at gemme"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Ordbog er tilgængelig"</string>
 </resources>
diff --git a/res/values-de/bools.xml b/java/res/values-de/bools.xml
similarity index 100%
rename from res/values-de/bools.xml
rename to java/res/values-de/bools.xml
diff --git a/res/values-de/strings.xml b/java/res/values-de/strings.xml
similarity index 89%
rename from res/values-de/strings.xml
rename to java/res/values-de/strings.xml
index e203fb3..7d3d53c 100644
--- a/res/values-de/strings.xml
+++ b/java/res/values-de/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Android-Tastatur"</string>
@@ -31,7 +36,7 @@
     <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autom. vervollständigen"</string>
     <string name="prediction_landscape" msgid="4874601565593216183">"Textfeld vergrößern"</string>
     <string name="prediction_landscape_summary" msgid="6736551095997839472">"Wortvorschläge in Querformat ausblenden"</string>
-    <string name="auto_cap" msgid="1719746674854628252">"Autom. Groß-/Kleinschreibung"</string>
+    <string name="auto_cap" msgid="1719746674854628252">"Autom. Groß-/Kleinschr."</string>
     <string name="auto_cap_summary" msgid="3260681697600786825">"Sätze mit Großbuchstaben beginnen"</string>
     <string name="auto_punctuate" msgid="7276672334264521751">"Autom. Zeichensetzung"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
@@ -43,11 +48,11 @@
     <string name="auto_complete" msgid="1103196318775486023">"Autom. vervollständigen"</string>
     <string name="auto_complete_summary" msgid="6113149638718274624">"Leertaste und Interpunktion fügen autom. ein markiertes Wort ein"</string>
   <string-array name="prediction_modes">
-    <item msgid="4870266572388153286">"Keine"</item>
+    <item msgid="4870266572388153286">"Kein"</item>
     <item msgid="1669461741568287396">"Standard"</item>
     <item msgid="4894328801530136615">"Erweitert"</item>
   </string-array>
-    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Gespeichert"</string>
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: gespeichert"</string>
     <string name="alternates_for_a" msgid="2566516493365324765">"ä"</string>
     <string name="alternates_for_e" msgid="3900510936875547555">"èéêë"</string>
     <string name="alternates_for_i" msgid="7097915268629342242">"ìíîï"</string>
@@ -64,11 +69,11 @@
     <string name="touch_to_continue" msgid="7869803257948414531">"Diesen Hinweis berühren, um fortzufahren »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"Hier berühren, um diesen Hinweis zu schließen und mit dem Tippen zu beginnen!"</string>
     <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Die Tastatur wird immer dann geöffnet, wenn Sie ein Textfeld berühren."</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Halten Sie eine Taste gedrückt, um Sonderzeichen anzuzeigen"\n"(ø, ö, ô, ó usw.)."</b></string>
-    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Wechseln Sie zu Nummern und Symbolen, indem Sie diese Taste berühren."</b></string>
-    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Gehen Sie zurück zu Buchstaben, indem Sie diese Taste erneut drücken."</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Halten Sie eine Taste gedrückt, um Akzente anzuzeigen"\n"(ø, ö, ô, ó usw.)."</b></string>
+    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Wechseln Sie zu Ziffern und Symbolen, indem Sie diese Taste berühren."</b></string>
+    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Durch erneutes Drücken dieser Taste gelangen Sie zurück zu den Buchstaben."</b></string>
     <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Halten Sie diese Taste gedrückt, um die Tastatureinstellungen, wie beispielsweise die automatische Vervollständigung, zu ändern."</b></string>
-    <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Probieren Sie es!"</b></string>
+    <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Probieren Sie es aus!"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"Los"</string>
     <string name="label_next_key" msgid="362972844525672568">"Weiter"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Fertig"</string>
@@ -112,8 +117,8 @@
     <string name="auto_submit" msgid="9151008027068358518">"Nach Sprachaufnahme automatisch senden"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Drücken Sie auf die Eingabetaste, wenn Sie einen Suchvorgang durchführen oder zum nächsten Feld wechseln."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Tastatur öffnen"\n</b></font><font size="3">\n</font>"Berühren Sie ein beliebiges Textfeld."</string>
-    <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tastatur schließen"\n</b></font><font size="3">\n</font>"Drücken Sie die Taste \"Zurück\"."</string>
-    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Eine Taste für Optionen berühren und gedrückt halten"\n</b></font><font size="3">\n</font>"Greifen Sie auf Satzzeichen und Akzente zu."</string>
+    <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Tastatur schließen"\n</b></font><font size="3">\n</font>"Drücken Sie die Zurück-Taste."</string>
+    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Für Optionen eine Taste berühren und gedrückt halten"\n</b></font><font size="3">\n</font>"Greifen Sie auf Satzzeichen und Akzente zu."</string>
     <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tastatureinstellungen"\n</b></font><font size="3">\n</font>"Berühren und halten Sie die Taste "<b>"?123"</b>" gedrückt."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Finger über die Leertaste bewegen, um die Sprache zu ändern"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Zum Speichern erneut tippen"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Wörterbuch verfügbar"</string>
 </resources>
diff --git a/res/values-el/strings.xml b/java/res/values-el/strings.xml
similarity index 93%
rename from res/values-el/strings.xml
rename to java/res/values-el/strings.xml
index 85c18df..c4a5077 100644
--- a/res/values-el/strings.xml
+++ b/java/res/values-el/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Πληκτρολόγιο Android"</string>
@@ -67,7 +72,7 @@
     <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Αγγίξτε και κρατήστε κάποιο πλήκτρο για να προβάλετε τους τονισμένους χαρακτήρες"\n"(ø, ö, ô, ó κ.τ.λ.)"</b></string>
     <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Αλλαγή σε αριθμούς και σύμβολα με το πάτημα αυτού του πλήκτρου"</b></string>
     <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Επιστρέψτε στα γράμματα αγγίζοντας ξανά αυτό το πλήκτρο"</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Αγγίξτε &amp; κρατήστε πατημένο αυτό το πλήκτρο για να αλλάξετε τις ρυθμίσεις πληκτρολογίου, όπως η αυτόματη συμπλήρωση"</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Αγγίξτε και κρατήστε πατημένο αυτό το πληκτρολόγιο για να αλλάξετε τις ρυθμίσεις πληκτρολογίου, όπως η αυτόματη συμπλήρωση"</b></string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Δοκιμάστε το!"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"Μετάβαση"</string>
     <string name="label_next_key" msgid="362972844525672568">"Επόμενο"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Σύρετε το δάχτυλο στο πλήκτρο διαστήματος για να αλλάξετε γλώσσα"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Πατήστε ξανά για αποθήκευση"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Λεξικό διαθέσιμο"</string>
 </resources>
diff --git a/res/values-en/bools.xml b/java/res/values-en/bools.xml
similarity index 100%
rename from res/values-en/bools.xml
rename to java/res/values-en/bools.xml
diff --git a/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
similarity index 92%
rename from res/values-es-rUS/strings.xml
rename to java/res/values-es-rUS/strings.xml
index 541e153..cd17dba 100644
--- a/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Teclado de Android"</string>
@@ -67,7 +72,7 @@
     <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Toca y mantén presionada una tecla para ver los acentos"\n"(ø, ö, ô, ó, y así sucesivamente)."</b></string>
     <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Cambia de números a símbolos tocando esta tecla."</b></string>
     <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Vuelve a letras tocando esta tecla nuevamente."</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Toca &amp;amp y mantén presionada esta tecla para cambiar la configuración del teclado, como completar automáticamente."</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Toca y mantén presionada esta tecla para cambiar la configuración del teclado, como completar automáticamente."</b></string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"¡Pruébalo!"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
     <string name="label_next_key" msgid="362972844525672568">"Siguiente"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Deslizarse manualmente por la barra espaciadora para cambiar el idioma"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Presionar nuevamente para guardar"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Diccionario disponible"</string>
 </resources>
diff --git a/res/values-es/bools.xml b/java/res/values-es/bools.xml
similarity index 100%
rename from res/values-es/bools.xml
rename to java/res/values-es/bools.xml
diff --git a/res/values-es/strings.xml b/java/res/values-es/strings.xml
similarity index 88%
rename from res/values-es/strings.xml
rename to java/res/values-es/strings.xml
index fbc597e..fbe3ad3 100644
--- a/res/values-es/strings.xml
+++ b/java/res/values-es/strings.xml
@@ -1,22 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Teclado de Android"</string>
-    <string name="english_ime_settings" msgid="6661589557206947774">"Configuración del teclado de Android"</string>
+    <string name="english_ime_settings" msgid="6661589557206947774">"Ajustes del teclado de Android"</string>
     <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrar al pulsar tecla"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"Sonido al pulsar tecla"</string>
     <string name="hit_correction" msgid="4855351009261318389">"Corregir errores de escritura"</string>
@@ -26,7 +31,7 @@
     <string name="auto_correction" msgid="7911639788808958255">"Sugerencias de palabras"</string>
     <string name="auto_correction_summary" msgid="6881047311475758267">"Corregir automáticamente la palabra anterior"</string>
     <string name="prediction" msgid="466220283138359837">"Sugerencias de palabras"</string>
-    <string name="prediction_category" msgid="7027100625580696660">"Configuración de sugerencia de palabras"</string>
+    <string name="prediction_category" msgid="7027100625580696660">"Ajustes de sugerencia de palabras"</string>
     <string name="prediction_summary" msgid="459788228830873110">"Habilitar Autocompletar al escribir"</string>
     <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autocompletar"</string>
     <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar el tamaño del campo de texto"</string>
@@ -47,7 +52,7 @@
     <item msgid="1669461741568287396">"Básico"</item>
     <item msgid="4894328801530136615">"Avanzado"</item>
   </string-array>
-    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Guardada"</string>
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
     <string name="alternates_for_a" msgid="2566516493365324765">"á"</string>
     <string name="alternates_for_e" msgid="3900510936875547555">"é"</string>
     <string name="alternates_for_i" msgid="7097915268629342242">"ìíîï"</string>
@@ -64,14 +69,14 @@
     <string name="touch_to_continue" msgid="7869803257948414531">"Toca esta sugerencia para continuar »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"Toca aquí para cerrar la sugerencia y comenzar a escribir."</string>
     <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"El teclado se abre cada vez que tocas un campo de texto"</b>"."</string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Mantén pulsada una tecla para ver los caracteres acentuados "\n"(ø, ö, ô, ó, etc.)"</b></string>
-    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Toca esta tecla para cambiar al teclado de números y símbolos"</b>"."</string>
-    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Toca esta tecla de nuevo para volver a las letras"</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Mantén pulsada esta tecla para cambiar la configuración del teclado como, por ejemplo, la opción de autocompletar"</b>"."</string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Mantén pulsada una tecla para ver los caracteres acentuados"\n"(ø, ö, ô, ó, etc.)."</b></string>
+    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Cambiar a números y a símbolos tocando esta tecla"</b></string>
+    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Volver a las letras tocando esta tecla de nuevo"</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Mantén pulsada esta tecla para cambiar la configuración de teclado a, por ejemplo, autocompletar"</b>"."</string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"¡Pruébalo!"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
     <string name="label_next_key" msgid="362972844525672568">"Sig."</string>
-    <string name="label_done_key" msgid="2441578748772529288">"Hecho"</string>
+    <string name="label_done_key" msgid="2441578748772529288">"Listo"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Enviar"</string>
     <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
     <string name="label_phone_key" msgid="4275497665515080551">"123"</string>
@@ -111,17 +116,18 @@
   </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Enviar automáticamente después de la introducción de voz"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Pulsar Intro automáticamente al buscar o al pasar al siguiente campo"</string>
-    <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Pulsa cualquier campo de texto."</string>
+    <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abrir el teclado"\n</b></font><font size="3">\n</font>"Toca cualquier campo de texto."</string>
     <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Cerrar el teclado"\n</b></font><font size="3">\n</font>"Pulsa la tecla \"Atrás\"."</string>
     <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Mantén pulsada una tecla para acceder a las opciones."\n</b></font><font size="3">\n</font>"Accede a los signos de puntuación y a los acentos."</string>
-    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configuración del teclado"\n</b></font><font size="3">\n</font>"Mantén pulsada la tecla "<b>"?123"</b>"."</string>
+    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Ajustes del teclado"\n</b></font><font size="3">\n</font>"Mantén pulsada la tecla "<b>"?123"</b>"."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
     <string name="inputMethod" msgid="7854532062009028116">"Método de introducción de texto"</string>
-    <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
+    <string name="language_selection_title" msgid="1651299598555326750">"Idiomas"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Deslizar el dedo por la barra espaciadora para cambiar el idioma"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Volver a tocar para guardar"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Hay un diccionario disponible."</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml
similarity index 100%
rename from res/values-fr-rCA/strings.xml
rename to java/res/values-fr-rCA/strings.xml
diff --git a/res/values-fr/bools.xml b/java/res/values-fr/bools.xml
similarity index 100%
rename from res/values-fr/bools.xml
rename to java/res/values-fr/bools.xml
diff --git a/res/values-fr/donottranslate.xml b/java/res/values-fr/donottranslate.xml
similarity index 100%
rename from res/values-fr/donottranslate.xml
rename to java/res/values-fr/donottranslate.xml
diff --git a/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
similarity index 92%
rename from res/values-fr/strings.xml
rename to java/res/values-fr/strings.xml
index 0859414..2cabe40 100644
--- a/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Clavier Android"</string>
@@ -64,9 +69,9 @@
     <string name="touch_to_continue" msgid="7869803257948414531">"Touchez ce conseil pour continuer »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"Touchez ici pour fermer ce conseil et commencer à saisir votre texte."</string>
     <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Le clavier s\'affiche à chaque fois que vous touchez une zone de texte."</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Maintenez une touche enfoncée pour afficher les accents"\n"(ø, ö, ô, ó, etc.)"</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Maintenez une touche enfoncée pour afficher les accents"\n"(ø, ö, ô, ó, etc.)"</b>"."</string>
     <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Appuyez sur cette touche pour basculer vers les chiffres et les symboles."</b></string>
-    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Retourner au clavier en appuyant de nouveau sur cette touche"</b></string>
+    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Appuyez de nouveau sur cette touche pour retourner aux lettres."</b></string>
     <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Maintenez cette touche enfoncée afin de modifier les paramètres du clavier, tels que la saisie semi-automatique."</b></string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Essayez !"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"OK"</string>
@@ -113,7 +118,7 @@
     <string name="auto_submit_summary" msgid="4961875269610384226">"Appuyez automatiquement sur Entrée pour effectuer une recherche ou accéder au champ suivant."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Ouvrir le clavier"\n</b></font><font size="3">\n</font>"Appuyez sur un champ de texte."</string>
     <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Fermer le clavier"\n</b></font><font size="3">\n</font>"Appuyez sur la touche Retour."</string>
-    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Appuyer sur une touche de manière prolongée pour accéder aux options"\n</b></font><font size="3">\n</font>"Accédez aux signes de ponctuation et aux accents."</string>
+    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Appuyez sur une touche de manière prolongée pour accéder aux options"\n</b></font><font size="3">\n</font>"Accédez aux signes de ponctuation et aux accents."</string>
     <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Paramètres du clavier"\n</b></font><font size="3">\n</font>"Appuyez sur la touche "<b>"?123"</b>" de manière prolongée."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Faites glisser votre doigt sur la barre d\'espacement pour changer la langue."</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Appuyer de nouveau pour enregistrer"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Dictionnaire disponible"</string>
 </resources>
diff --git a/res/values-it/bools.xml b/java/res/values-it/bools.xml
similarity index 100%
rename from res/values-it/bools.xml
rename to java/res/values-it/bools.xml
diff --git a/res/values-it/donottranslate.xml b/java/res/values-it/donottranslate.xml
similarity index 100%
rename from res/values-it/donottranslate.xml
rename to java/res/values-it/donottranslate.xml
diff --git a/res/values-it/strings.xml b/java/res/values-it/strings.xml
similarity index 87%
rename from res/values-it/strings.xml
rename to java/res/values-it/strings.xml
index 1135dd0..3844aea 100644
--- a/res/values-it/strings.xml
+++ b/java/res/values-it/strings.xml
@@ -1,24 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Tastiera Android"</string>
     <string name="english_ime_settings" msgid="6661589557206947774">"Impostazioni tastiera Android"</string>
-    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibra se premi un tasto"</string>
-    <string name="sound_on_keypress" msgid="6093592297198243644">"Suona se premi un tasto"</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibra alla pressione di un tasto"</string>
+    <string name="sound_on_keypress" msgid="6093592297198243644">"Suona alla pressione di un tasto"</string>
     <string name="hit_correction" msgid="4855351009261318389">"Correggi errori di digitazione"</string>
     <string name="hit_correction_summary" msgid="8761701873008070796">"Attiva la correzione degli errori di inserimento"</string>
     <string name="hit_correction_land" msgid="2567691684825205448">"Errori di inserimento in visualizzazione orizzontale"</string>
@@ -64,11 +69,11 @@
     <string name="touch_to_continue" msgid="7869803257948414531">"Tocca questo suggerimento per continuare »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"Tocca qui per chiudere questo suggerimento e iniziare a digitare."</string>
     <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"La tastiera si apre ogni volta che tocchi un campo di testo"</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocca e tieni premuto un tasto per visualizzare le lettere con segni diacritici"\n"(ø, ö, ô, ó e così via)"</b></string>
-    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Passa a numeri e simboli toccando questo tasto"</b></string>
-    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Torna all\'alfabeto toccando di nuovo questo tasto"</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tocca e tieni premuto questo tasto per modificare le impostazioni della tastiera, come il completamento automatico"</b></string>
-    <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prova."</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocca e tieni premuto un pulsante per visualizzare le lettere con segni diacritici"\n"(ø, ö, ô, ó e così via)"</b></string>
+    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Passa a numeri e simboli toccando questo pulsante"</b></string>
+    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Torna alle lettere toccando di nuovo questo pulsante"</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tocca e tieni premuto questo pulsante per modificare le impostazioni della tastiera, come il completamento automatico"</b></string>
+    <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Prova!"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"Vai"</string>
     <string name="label_next_key" msgid="362972844525672568">"Avanti"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Fine"</string>
@@ -113,8 +118,8 @@
     <string name="auto_submit_summary" msgid="4961875269610384226">"Premi automaticamente \"Invio\" durante una ricerca o un passaggio al campo successivo."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Apertura tastiera"\n</b></font><font size="3">\n</font>"Tocca qualsiasi campo di testo."</string>
     <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Chiusura tastiera"\n</b></font><font size="3">\n</font>"Premi il tasto Indietro."</string>
-    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tocca e tieni premuto un tasto per le opzioni"\n</b></font><font size="3">\n</font>"Accesso a punteggiatura e accenti."</string>
-    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Impostazioni tastiera"\n</b></font><font size="3">\n</font>"Tocca e tieni premuto il tasto "<b>"?123"</b>"."</string>
+    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tocca e tieni premuto un pulsante per le opzioni"\n</b></font><font size="3">\n</font>"Accesso a punteggiatura e accenti."</string>
+    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Impostazioni tastiera"\n</b></font><font size="3">\n</font>"Tocca e tieni premuto il pulsante "<b>"?123"</b>"."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Scorri il dito sulla barra spaziatrice per cambiare la lingua"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Tocca di nuovo per salvare"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Dizionario disponibile"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
similarity index 93%
rename from res/values-ja/strings.xml
rename to java/res/values-ja/strings.xml
index 9097bd9..7867684 100644
--- a/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Androidキーボード"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"スペースバーで指をスライドさせて言語を変更する"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"←保存するにはもう一度タップ"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"辞書を利用できます"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
similarity index 85%
rename from res/values-ko/strings.xml
rename to java/res/values-ko/strings.xml
index 15000e6..3509579 100644
--- a/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Android 키보드"</string>
@@ -30,7 +35,7 @@
     <string name="prediction_summary" msgid="459788228830873110">"입력할 때 자동 완성 사용"</string>
     <string name="auto_complete_dialog_title" msgid="2172048590607201920">"자동 완성"</string>
     <string name="prediction_landscape" msgid="4874601565593216183">"입력란 크기 늘리기"</string>
-    <string name="prediction_landscape_summary" msgid="6736551095997839472">"가로 보기에서 단어 추천 숨기기"</string>
+    <string name="prediction_landscape_summary" msgid="6736551095997839472">"가로 보기에서 추천 단어 숨기기"</string>
     <string name="auto_cap" msgid="1719746674854628252">"자동 대문자화"</string>
     <string name="auto_cap_summary" msgid="3260681697600786825">"문장의 첫 글자를 대문자로 표시"</string>
     <string name="auto_punctuate" msgid="7276672334264521751">"자동 구두점 입력"</string>
@@ -47,7 +52,7 @@
     <item msgid="1669461741568287396">"기본"</item>
     <item msgid="4894328801530136615">"고급"</item>
   </string-array>
-    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : 저장됨"</string>
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: 저장됨"</string>
     <string name="alternates_for_a" msgid="2566516493365324765">"àáâãäåæ"</string>
     <string name="alternates_for_e" msgid="3900510936875547555">"èéêë"</string>
     <string name="alternates_for_i" msgid="7097915268629342242">"ìíîï"</string>
@@ -59,16 +64,16 @@
     <string name="alternates_for_y" msgid="1722776806607271199">"ýÿ"</string>
     <string name="tip_long_press" msgid="6101270866284343344">"키를 길게 누르면 악센트(ø, ö 등)가 표시됩니다."</string>
     <string name="tip_dismiss" msgid="7585579046862204381">"키보드를 닫으려면 언제든지 뒤로 키(↶)를 누르세요."</string>
-    <string name="tip_access_symbols" msgid="6344098517525531652">"숫자 및 기호 액세스"</string>
+    <string name="tip_access_symbols" msgid="6344098517525531652">"숫자 및 기호 사용"</string>
     <string name="tip_add_to_dictionary" msgid="1487293888469227817">"맨 왼쪽에 있는 단어를 길게 누르면 사전에 추가됩니다."</string>
     <string name="touch_to_continue" msgid="7869803257948414531">"계속하려면 힌트를 터치하세요. »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"힌트를 닫고 입력을 시작하려면 여기를 터치하세요."</string>
-    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"입력란을 터치하면 키보드가 열립니다."</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"키를 길게 누르면 악센트"\n"(ø, ö, ô, ó 등)를 볼 수 있습니다."</b></string>
-    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"이 키를 터치하면 숫자 및 기호 자판으로 변경됩니다."</b></string>
-    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"이 키를 다시 터치하면 키보드가 표시됩니다."</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"자동 완성과 같은 키보드 설정을 변경하려면 이 키를 길게 누르세요."</b></string>
-    <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"이제 직접 사용해 보세요!"</b></string>
+    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"언제든지 입력란을 터치하면 키보드가 열립니다."</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"키를 길게 터치하면 악센트"\n"(ø, ö, ô, ó 등)가 표시됩니다."</b></string>
+    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"이 키를 터치하면 숫자 및 기호 키보드로 전환됩니다."</b></string>
+    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"이 키를 다시 터치하면 문자 키보드로 돌아갑니다."</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"자동 완성과 같은 키보드 설정을 변경하려면 이 키를 길게 터치하세요."</b></string>
+    <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"이제 사용해 보세요."</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"이동"</string>
     <string name="label_next_key" msgid="362972844525672568">"다음"</string>
     <string name="label_done_key" msgid="2441578748772529288">"완료"</string>
@@ -94,7 +99,7 @@
     <string name="voice_speech_timeout" msgid="8461817525075498795">"음성이 인식되지 않았습니다."</string>
     <string name="voice_no_match" msgid="4285117547030179174">"일치하는 항목 없음"</string>
     <string name="voice_not_installed" msgid="5552450909753842415">"음성 검색이 설치되지 않았습니다."</string>
-    <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"도움말:"</b>" 키보드를 스와이프하고 말하세요."</string>
+    <string name="voice_swipe_hint" msgid="6943546180310682021"><b>"도움말:"</b>" 키보드 위로 손가락을 미끄러지듯 움직이고 나서 말하세요."</string>
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"도움말:"</b>" 다음 번에는 \'마침표\', \'쉼표\', \'물음표\'와 같은 구두점을 말해 보세요."</string>
     <string name="cancel" msgid="6830980399865683324">"취소"</string>
     <string name="ok" msgid="7898366843681727667">"확인"</string>
@@ -113,8 +118,8 @@
     <string name="auto_submit_summary" msgid="4961875269610384226">"검색하거나 다음 입력란으로 이동할 때 자동으로 Enter 키를 누릅니다."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"키보드 열기"\n</b></font><font size="3">\n</font>"아무 텍스트 입력란이나 터치하세요."</string>
     <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"키보드 닫기"\n</b></font><font size="3">\n</font>"\'뒤로\' 키를 누르세요."</string>
-    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"키를 길게 터치하여 옵션 보기"\n</b></font><font size="3">\n</font>"문장 부호 및 악센트 기호에 액세스하세요."</string>
-    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"키보드 설정"\n</b></font><font size="3">\n</font><b>"?123"</b>" 키를 길게 터치하세요."</string>
+    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"키를 길게 눌러 옵션 보기"\n</b></font><font size="3">\n</font>"문장 부호 및 악센트 기호 입력창이 열립니다."</string>
+    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"키보드 설정"\n</b></font><font size="3">\n</font><b>"?123"</b>" 키를 길게 누르세요."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"입력 언어"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"손가락을 스페이스바에서 미끄러지듯 움직여 언어 변경"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← 저장하려면 다시 누르세요."</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"사전 사용 가능"</string>
 </resources>
diff --git a/res/values-land/dimens.xml b/java/res/values-land/dimens.xml
similarity index 100%
rename from res/values-land/dimens.xml
rename to java/res/values-land/dimens.xml
diff --git a/res/values-nb/strings.xml b/java/res/values-nb/strings.xml
similarity index 92%
rename from res/values-nb/strings.xml
rename to java/res/values-nb/strings.xml
index a7ddc75..041d07e 100644
--- a/res/values-nb/strings.xml
+++ b/java/res/values-nb/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Skjermtastatur"</string>
@@ -40,7 +45,7 @@
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Retter vanlige stavefeil"</string>
     <string name="show_suggestions" msgid="507074425254289133">"Vis forslag"</string>
     <string name="show_suggestions_summary" msgid="1989672863935759654">"Vis foreslåtte ord under skriving"</string>
-    <string name="auto_complete" msgid="1103196318775486023">"Autokomplettering"</string>
+    <string name="auto_complete" msgid="1103196318775486023">"Autofullføring"</string>
     <string name="auto_complete_summary" msgid="6113149638718274624">"Mellomrom og punktum setter automatisk inn valgt ord"</string>
   <string-array name="prediction_modes">
     <item msgid="4870266572388153286">"Ingen"</item>
@@ -105,8 +110,8 @@
     <item msgid="7283103513488381103">"Av"</item>
   </string-array>
   <string-array name="voice_input_modes_summary">
-    <item msgid="554248625705084903">"Mikronfon på hovedtastatur"</item>
-    <item msgid="6907837061058876770">"Mikronfon på talltastatur"</item>
+    <item msgid="554248625705084903">"Mikrofon på hovedtastatur"</item>
+    <item msgid="6907837061058876770">"Mikrofon på talltastatur"</item>
     <item msgid="3664304608587798036">"Talekommando er deaktivert"</item>
   </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Send inn automatisk etter tale"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Dra fingeren på mellomromstasten for å endre språk"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Trykk på nytt for å lagre"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Ordbok tilgjengelig"</string>
 </resources>
diff --git a/res/values-nl/bools.xml b/java/res/values-nl/bools.xml
similarity index 100%
rename from res/values-nl/bools.xml
rename to java/res/values-nl/bools.xml
diff --git a/res/values-nl/strings.xml b/java/res/values-nl/strings.xml
similarity index 91%
rename from res/values-nl/strings.xml
rename to java/res/values-nl/strings.xml
index 9a69c12..00b197b 100644
--- a/res/values-nl/strings.xml
+++ b/java/res/values-nl/strings.xml
@@ -1,23 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Android-toetsenbord"</string>
     <string name="english_ime_settings" msgid="6661589557206947774">"Instellingen voor Android-toetsenbord"</string>
-    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Trillen bij druk op een toets"</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Trillen bij druk op toets"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"Geluid bij druk op een toets"</string>
     <string name="hit_correction" msgid="4855351009261318389">"Typefouten corrigeren"</string>
     <string name="hit_correction_summary" msgid="8761701873008070796">"Foutcorrectie tijdens invoer inschakelen"</string>
@@ -31,7 +36,7 @@
     <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Automatisch voltooien"</string>
     <string name="prediction_landscape" msgid="4874601565593216183">"Tekstveld vergroten"</string>
     <string name="prediction_landscape_summary" msgid="6736551095997839472">"Woordsuggesties verbergen in liggende weergave"</string>
-    <string name="auto_cap" msgid="1719746674854628252">"Automatisch hoofdlettergebruik"</string>
+    <string name="auto_cap" msgid="1719746674854628252">"Auto-hoofdlettergebruik"</string>
     <string name="auto_cap_summary" msgid="3260681697600786825">"Hoofdletter gebruiken aan het begin van een zin"</string>
     <string name="auto_punctuate" msgid="7276672334264521751">"Automatische interpunctie"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
@@ -47,7 +52,7 @@
     <item msgid="1669461741568287396">"Basis"</item>
     <item msgid="4894328801530136615">"Geavanceerd"</item>
   </string-array>
-    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Opgeslagen"</string>
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: opgeslagen"</string>
     <string name="alternates_for_a" msgid="2566516493365324765">"àáâãäåæ"</string>
     <string name="alternates_for_e" msgid="3900510936875547555">"èéêë"</string>
     <string name="alternates_for_i" msgid="7097915268629342242">"ìíîï"</string>
@@ -114,7 +119,7 @@
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Het toetsenbord openen"\n</b></font><font size="3">\n</font>"Raak een tekstveld aan."</string>
     <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Het toetsenbord sluiten"\n</b></font><font size="3">\n</font>"Druk op de terugtoets."</string>
     <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Een toets blijven aanraken voor opties"\n</b></font><font size="3">\n</font>"Toegang tot interpunctie en diakritische tekens."</string>
-    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Toetsenbordinstellingen"\n</b></font><font size="3">\n</font>"Blijf de toets "<b>"?123"</b>" aanraken."</string>
+    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Toetsenbordinstellingen"\n</b></font><font size="3">\n</font>"Blijf de toets \'"<b>"?123"</b>"\' aanraken."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Schuif uw vinger over de spatiebalk om de taal te wijzigen"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Tik nogmaals om op te slaan"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Woordenboek beschikbaar"</string>
 </resources>
diff --git a/res/values-pl/bools.xml b/java/res/values-pl/bools.xml
similarity index 100%
rename from res/values-pl/bools.xml
rename to java/res/values-pl/bools.xml
diff --git a/res/values-pl/donottranslate.xml b/java/res/values-pl/donottranslate.xml
similarity index 100%
rename from res/values-pl/donottranslate.xml
rename to java/res/values-pl/donottranslate.xml
diff --git a/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
similarity index 91%
rename from res/values-pl/strings.xml
rename to java/res/values-pl/strings.xml
index a411cc2..0c72727 100644
--- a/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Klawiatura Android"</string>
@@ -23,14 +28,14 @@
     <string name="hit_correction_summary" msgid="8761701873008070796">"Włącz poprawianie błędów wprowadzania"</string>
     <string name="hit_correction_land" msgid="2567691684825205448">"Błędy wprowadzania w orientacji poziomej"</string>
     <string name="hit_correction_land_summary" msgid="4076803842198368328">"Włącz poprawianie błędów wprowadzania"</string>
-    <string name="auto_correction" msgid="7911639788808958255">"Propozycje słów"</string>
+    <string name="auto_correction" msgid="7911639788808958255">"Sugestie słów"</string>
     <string name="auto_correction_summary" msgid="6881047311475758267">"Automatycznie poprawiaj poprzednie słowo"</string>
-    <string name="prediction" msgid="466220283138359837">"Propozycje słów"</string>
+    <string name="prediction" msgid="466220283138359837">"Sugestie słów"</string>
     <string name="prediction_category" msgid="7027100625580696660">"Ustawienia propozycji słów"</string>
     <string name="prediction_summary" msgid="459788228830873110">"Włącz autouzupełnianie podczas wpisywania"</string>
     <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Autouzupełnianie"</string>
     <string name="prediction_landscape" msgid="4874601565593216183">"Zwiększ rozmiar pola tekstowego"</string>
-    <string name="prediction_landscape_summary" msgid="6736551095997839472">"Wyłącz propozycje słów w orientacji poziomej"</string>
+    <string name="prediction_landscape_summary" msgid="6736551095997839472">"Wyłącz sugestie słów w orientacji poziomej"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Wstawiaj wielkie litery"</string>
     <string name="auto_cap_summary" msgid="3260681697600786825">"Zamieniaj na wielką pierwszą literę zdania"</string>
     <string name="auto_punctuate" msgid="7276672334264521751">"Automatyczna interpunkcja"</string>
@@ -69,7 +74,7 @@
     <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Wróć do trybu liter, dotykając ponownie tego klawisza."</b></string>
     <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Dotknij i przytrzymaj ten klawisz, aby zmienić ustawienia klawiatury, takie jak autouzupełnianie."</b></string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Wypróbuj!"</b></string>
-    <string name="label_go_key" msgid="1635148082137219148">"Przejdź"</string>
+    <string name="label_go_key" msgid="1635148082137219148">"OK"</string>
     <string name="label_next_key" msgid="362972844525672568">"Dalej"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Gotowe"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Wyślij"</string>
@@ -83,7 +88,7 @@
     <string name="voice_warning_how_to_turn_off" msgid="5652369578498701761">"Aby wyłączyć wprowadzanie głosowe, przejdź do ustawień klawiatury."</string>
     <string name="voice_hint_dialog_message" msgid="6892342981545727994">"Aby skorzystać z wprowadzania głosowego, naciśnij przycisk mikrofonu lub przesuń palcem po klawiaturze ekranowej."</string>
     <string name="voice_listening" msgid="467518160751321844">"Mów teraz"</string>
-    <string name="voice_working" msgid="6666937792815731889">"Działa"</string>
+    <string name="voice_working" msgid="6666937792815731889">"W toku"</string>
     <!-- no translation found for voice_initializing (661962047129906646) -->
     <skip />
     <string name="voice_error" msgid="5140896300312186162">"Błąd. Spróbuj ponownie."</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Przesuń palcem po spacji, aby zmienić język"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Dotknij ponownie, aby zapisać"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Słownik dostępny"</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
similarity index 90%
rename from res/values-pt-rPT/strings.xml
rename to java/res/values-pt-rPT/strings.xml
index 399975d8..35a9cb7 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Teclado do Android"</string>
@@ -31,7 +36,7 @@
     <string name="auto_complete_dialog_title" msgid="2172048590607201920">"Conclusão automática"</string>
     <string name="prediction_landscape" msgid="4874601565593216183">"Aumentar o tamanho do campo de texto"</string>
     <string name="prediction_landscape_summary" msgid="6736551095997839472">"Ocultar sugestões de palavras na vista horizontal"</string>
-    <string name="auto_cap" msgid="1719746674854628252">"Maiúsculas automáticas"</string>
+    <string name="auto_cap" msgid="1719746674854628252">"Letras maiúsculas automáticas"</string>
     <string name="auto_cap_summary" msgid="3260681697600786825">"Colocar inicial maiúscula no início de uma frase"</string>
     <string name="auto_punctuate" msgid="7276672334264521751">"Pontuação automática"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
@@ -39,7 +44,7 @@
     <string name="quick_fixes" msgid="5353213327680897927">"Correcções rápidas"</string>
     <string name="quick_fixes_summary" msgid="3405028402510332373">"Corrige os erros de escrita comuns"</string>
     <string name="show_suggestions" msgid="507074425254289133">"Mostrar sugestões"</string>
-    <string name="show_suggestions_summary" msgid="1989672863935759654">"Apresentar palavras sugeridas durante a escrita"</string>
+    <string name="show_suggestions_summary" msgid="1989672863935759654">"Apresentar sugestões de palavras ao escrever"</string>
     <string name="auto_complete" msgid="1103196318775486023">"Conclusão automática"</string>
     <string name="auto_complete_summary" msgid="6113149638718274624">"A barra de espaços e a pontuação inserem automaticamente uma palavra realçada"</string>
   <string-array name="prediction_modes">
@@ -47,7 +52,7 @@
     <item msgid="1669461741568287396">"Básico"</item>
     <item msgid="4894328801530136615">"Avançados"</item>
   </string-array>
-    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: Guardada"</string>
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: guardada"</string>
     <string name="alternates_for_a" msgid="2566516493365324765">"àáâãäåæ"</string>
     <string name="alternates_for_e" msgid="3900510936875547555">"èéêë"</string>
     <string name="alternates_for_i" msgid="7097915268629342242">"ìíîï"</string>
@@ -64,10 +69,10 @@
     <string name="touch_to_continue" msgid="7869803257948414531">"Toque nesta sugestão para continuar »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"Toque aqui para fechar esta sugestão e começar a escrever!"</string>
     <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"O teclado abre quando tocar num campo de texto"</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Toque e mantenha premida uma tecla para ver os acentos"\n"(ø, ö, ô, ó, etc.)"</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Mantenha premida uma tecla para ver os acentos"\n"(ø, ö, ô, ó, etc.)"</b></string>
     <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Mude para números e símbolos tocando nesta tecla"</b></string>
     <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Regresse às letras tocando novamente nesta tecla"</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Toque e mantenha premida esta tecla para alterar definições do teclado, como a conclusão automática."</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Mantenha premida esta tecla para alterar definições do teclado, tais como a conclusão automática"</b></string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Experimente!"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"Ir"</string>
     <string name="label_next_key" msgid="362972844525672568">"Seguinte"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo pela barra de espaço para alterar o idioma"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Toque novamente para guardar"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
similarity index 91%
rename from res/values-pt/strings.xml
rename to java/res/values-pt/strings.xml
index 18ffdf0..235fd65 100644
--- a/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Teclado Android"</string>
@@ -63,8 +68,8 @@
     <string name="tip_add_to_dictionary" msgid="1487293888469227817">"Pressione e segure a palavra mais à esquerda para adicioná-la ao dicionário"</string>
     <string name="touch_to_continue" msgid="7869803257948414531">"Toque nesta dica para continuar »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"Toque aqui para fechar esta dica e começar a digitar!"</string>
-    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"O teclado abre toda vez que você tocar em um arquivo de texto"</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocar e segurar a tecla para visualizar acentos"\n"(ø, ö, ô, ó e assim por diante)"</b></string>
+    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"O teclado abre toda vez que você tocar em um campo de texto"</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tocar e segurar uma tecla para visualizar acentos"\n"(ø, ö, ô, ó e assim por diante)"</b></string>
     <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Alternar para números e símbolos tocando nessa tecla"</b></string>
     <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Voltar às letras tocando novamente nessa tecla"</b></string>
     <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tocar e segurar esta tecla para alterar as configurações do teclado, como a conclusão automática"</b></string>
@@ -113,7 +118,7 @@
     <string name="auto_submit_summary" msgid="4961875269610384226">"Pressione Enter automaticamente ao pesquisar ou ir para o próximo campo."</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Abra o teclado"\n</b></font><font size="3">\n</font>"Toque em qualquer campo de texto."</string>
     <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Feche o teclado"\n</b></font><font size="3">\n</font>"Pressione a tecla Voltar."</string>
-    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Toque e mantenha pressionada uma tecla para ver as opções"\n</b></font><font size="3">\n</font>"Acesse a pontuação e os acentos."</string>
+    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Toque e mantenha pressionada uma tecla para ver as opções"\n</b></font><font size="3">\n</font>"Acesse a pontuação e as pronúncias."</string>
     <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Configurações de teclado"\n</b></font><font size="3">\n</font>"Toque e mantenha pressionada a tecla "<b>"?123"</b>"."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Deslize o dedo na barra de espaços para alterar o idioma"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Toque novamente para salvar"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
similarity index 88%
rename from res/values-ru/strings.xml
rename to java/res/values-ru/strings.xml
index d4ebc6d..e27402c 100644
--- a/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Клавиатура Android"</string>
@@ -33,7 +38,7 @@
     <string name="prediction_landscape_summary" msgid="6736551095997839472">"Скрывать предложение слов в горизонтальной ориентации"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Автоподст. заглавных"</string>
     <string name="auto_cap_summary" msgid="3260681697600786825">"Делать заглавной первую букву предложения"</string>
-    <string name="auto_punctuate" msgid="7276672334264521751">"Автоматическая пунктуация"</string>
+    <string name="auto_punctuate" msgid="7276672334264521751">"Автопунктуация"</string>
     <!-- no translation found for auto_punctuate_summary (6589441565817502132) -->
     <skip />
     <string name="quick_fixes" msgid="5353213327680897927">"Быстрое исправление"</string>
@@ -41,13 +46,13 @@
     <string name="show_suggestions" msgid="507074425254289133">"Предлагать варианты"</string>
     <string name="show_suggestions_summary" msgid="1989672863935759654">"Предлагать варианты слов во время ввода"</string>
     <string name="auto_complete" msgid="1103196318775486023">"Автозавершение"</string>
-    <string name="auto_complete_summary" msgid="6113149638718274624">"При нажатии пробела или знака препинания вставлять предложенное слово"</string>
+    <string name="auto_complete_summary" msgid="6113149638718274624">"При нажатии пробела вставлять предложенное слово"</string>
   <string-array name="prediction_modes">
     <item msgid="4870266572388153286">"Нет"</item>
     <item msgid="1669461741568287396">"Основной"</item>
-    <item msgid="4894328801530136615">"Расширенный"</item>
+    <item msgid="4894328801530136615">"Дополнительно"</item>
   </string-array>
-    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : сохранено"</string>
+    <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: сохранено"</string>
     <string name="alternates_for_a" msgid="2566516493365324765">"àáâãäåæ"</string>
     <string name="alternates_for_e" msgid="3900510936875547555">"èéêë"</string>
     <string name="alternates_for_i" msgid="7097915268629342242">"ìíîï"</string>
@@ -64,12 +69,12 @@
     <string name="touch_to_continue" msgid="7869803257948414531">"Чтобы продолжить, нажмите на эту подсказку »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"Нажмите здесь, чтобы закрыть подсказку и начать вводить текст."</string>
     <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Клавиатура появляется автоматически при касании текстового поля"</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Нажмите и удерживайте клавишу, чтобы появились спецсимволы "\n"(ø, ö, ô, ó и т. п.)"</b></string>
-    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Чтобы переключаться между вводом цифр и символов, используйте эту клавишу"</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Нажмите и удерживайте клавишу для отображения вариантов с диакритическими знаками "\n"(ø, ö, ô, ó и т. п.)"</b></string>
+    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Для переключения между вводом цифр и символов используйте эту клавишу"</b></string>
     <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Чтобы вернуться к буквенной клавиатуре, снова нажмите на эту клавишу"</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Чтобы сменить настройки клавиатуры (такие как автозавершение), нажмите и удерживайте эту клавишу"</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Чтобы изменить настройки клавиатуры (такие как автозавершение), нажмите и удерживайте эту клавишу"</b></string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"Попробуйте!"</b></string>
-    <string name="label_go_key" msgid="1635148082137219148">"Перейти"</string>
+    <string name="label_go_key" msgid="1635148082137219148">"Поиск"</string>
     <string name="label_next_key" msgid="362972844525672568">"Далее"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Готово"</string>
     <string name="label_send_key" msgid="2815056534433717444">"Отправить"</string>
@@ -111,7 +116,7 @@
   </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"Автоматически отправлять по окончании голосового ввода"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"Автоматически нажимать \"Ввод\" при поиске или переходе к следующему полю."</string>
-    <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Откройте клавиатуру"\n</b></font><font size="3">\n</font>"Нажмите на любое текстовое поле."</string>
+    <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Открытие клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите на любое текстовое поле."</string>
     <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Закрытие клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите клавишу \"Назад\"."</string>
     <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Нажмите и удерживайте клавишу для вызова параметров"\n</b></font><font size="3">\n</font>"Доступ к пунктуационным и диакритическим знакам."</string>
     <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Настройки клавиатуры"\n</b></font><font size="3">\n</font>"Нажмите и удерживайте клавишу "<b>"?123"</b>"."</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Для изменения языка проведите пальцем по пробелу"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Нажмите повторно, чтобы сохранить"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Доступен словарь"</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
similarity index 92%
rename from res/values-sv/strings.xml
rename to java/res/values-sv/strings.xml
index 2d07a07..9c6c221 100644
--- a/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Androids tangentbord"</string>
@@ -64,7 +69,7 @@
     <string name="touch_to_continue" msgid="7869803257948414531">"Tryck på tipset för att fortsätta »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"Tryck här om du vill stänga tipset och börja skriva!"</string>
     <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"Tangentbordet öppnas när du trycker på ett textfält"</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tryck och håll ned en tangent om du vill visa accenter"\n"(ø, ö, ô, ó och så vidare)"</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"Tryck och håll nere en tangent om du vill visa accenter"\n"(ø, ö, ô, ó och så vidare)"</b></string>
     <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"Växla till siffror och symboler med den här tangenten"</b></string>
     <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"Återgå till bokstäver genom att trycka på tangenten en gång till"</b></string>
     <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"Tryck och håll ned tangenten om du vill ändra inställningarna för tangentbordet, till exempel Komplettera automatiskt"</b></string>
@@ -114,7 +119,7 @@
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"Öppna tangentbordet"\n</b></font><font size="3">\n</font>"Tryck på ett textfält."</string>
     <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"Stäng tangentbordet"\n</b></font><font size="3">\n</font>"Tryck på Tillbaka."</string>
     <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"Tryck länge på en tangent om du vill se alternativ"\n</b></font><font size="3">\n</font>"Använda skiljetecken och accenter."</string>
-    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tangentbordsinställningar"\n</b></font><font size="3">\n</font>"Tryck länge på tangenten "<b>"?123"</b>"."</string>
+    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"Tangentbordsinställningar"\n</b></font><font size="3">\n</font>"Tryck länge på tangenten"<b>"?123"</b>"."</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Dra med fingret på blanksteg om du vill ändra språk"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Peka igen för att spara"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"En ordlista är tillgänglig"</string>
 </resources>
diff --git a/res/values-tr/donottranslate.xml b/java/res/values-tr/donottranslate.xml
similarity index 100%
rename from res/values-tr/donottranslate.xml
rename to java/res/values-tr/donottranslate.xml
diff --git a/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
similarity index 93%
rename from res/values-tr/strings.xml
rename to java/res/values-tr/strings.xml
index e150a5e..0fbdc7d 100644
--- a/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Android klavyesi"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"Dili değiştirmek için parmağınızı boşluk çubuğu üzerinde kaydırın"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← Kaydetmek için tekrar dokunun"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"Sözlük kullanılabilir"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml
similarity index 85%
rename from res/values-zh-rCN/strings.xml
rename to java/res/values-zh-rCN/strings.xml
index f372991..9c9b257 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/java/res/values-zh-rCN/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Android 键盘"</string>
@@ -20,16 +25,16 @@
     <string name="vibrate_on_keypress" msgid="5258079494276955460">"按键时振动"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"按键时播放音效"</string>
     <string name="hit_correction" msgid="4855351009261318389">"纠正输入错误"</string>
-    <string name="hit_correction_summary" msgid="8761701873008070796">"启用输入错误纠正"</string>
+    <string name="hit_correction_summary" msgid="8761701873008070796">"启用输入错误纠正功能"</string>
     <string name="hit_correction_land" msgid="2567691684825205448">"横向输入错误"</string>
-    <string name="hit_correction_land_summary" msgid="4076803842198368328">"启用输入错误纠正"</string>
+    <string name="hit_correction_land_summary" msgid="4076803842198368328">"启用输入错误纠正功能"</string>
     <string name="auto_correction" msgid="7911639788808958255">"字词建议"</string>
-    <string name="auto_correction_summary" msgid="6881047311475758267">"自动纠正之前的字词"</string>
+    <string name="auto_correction_summary" msgid="6881047311475758267">"自动纠正前面的字词"</string>
     <string name="prediction" msgid="466220283138359837">"字词建议"</string>
     <string name="prediction_category" msgid="7027100625580696660">"字词建议设置"</string>
     <string name="prediction_summary" msgid="459788228830873110">"输入时启用自动填写功能"</string>
     <string name="auto_complete_dialog_title" msgid="2172048590607201920">"自动完成"</string>
-    <string name="prediction_landscape" msgid="4874601565593216183">"增加文本域的大小"</string>
+    <string name="prediction_landscape" msgid="4874601565593216183">"扩大文字字段"</string>
     <string name="prediction_landscape_summary" msgid="6736551095997839472">"在横向视图中隐藏字词建议"</string>
     <string name="auto_cap" msgid="1719746674854628252">"自动大写"</string>
     <string name="auto_cap_summary" msgid="3260681697600786825">"句首字母大写"</string>
@@ -45,7 +50,7 @@
   <string-array name="prediction_modes">
     <item msgid="4870266572388153286">"无"</item>
     <item msgid="1669461741568287396">"基本模式"</item>
-    <item msgid="4894328801530136615">"高级模式"</item>
+    <item msgid="4894328801530136615">"高级"</item>
   </string-array>
     <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>:已保存"</string>
     <string name="alternates_for_a" msgid="2566516493365324765">"àáâãäåæ"</string>
@@ -63,11 +68,11 @@
     <string name="tip_add_to_dictionary" msgid="1487293888469227817">"长按最左侧的字可将其添加到词典中"</string>
     <string name="touch_to_continue" msgid="7869803257948414531">"轻触此提示继续 »"</string>
     <string name="touch_to_finish" msgid="7990196086480585789">"轻触此处可关闭该提示,然后便可开始输入内容!"</string>
-    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"轻触文本字段即可打开键盘"</b></string>
-    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"按住某个键可看到重音符号"\n"(例如 ø、ö、ô、ó 等)"</b></string>
-    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"轻触该键可切换到数字和符号输入模式"</b></string>
-    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"再次轻触该键可返回字母输入模式"</b></string>
-    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"长按该键可更改键盘设置,例如自动填写"</b></string>
+    <string name="tip_to_open_keyboard" msgid="6821200275486950452"><b>"您可以随时通过触摸文字字段打开键盘"</b></string>
+    <string name="tip_to_view_accents" msgid="5433158573693308501"><b>"轻触并按住某个键可以查看重音符号"\n"(ø、ö、ô、ó 等)"</b></string>
+    <string name="tip_to_open_symbols" msgid="7345139325622444880"><b>"轻触该键即可切换到数字和符号键盘"</b></string>
+    <string name="tip_to_close_symbols" msgid="5227724217206927185"><b>"再次轻触该键即可返回字母键盘"</b></string>
+    <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"触摸并按住该键可更改键盘设置,例如自动完成"</b></string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"试试吧!"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"开始"</string>
     <string name="label_next_key" msgid="362972844525672568">"下一步"</string>
@@ -111,10 +116,10 @@
   </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"语音结束后自动提交"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"搜索或转到下一字段时自动按 Enter。"</string>
-    <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"打开键盘"\n</b></font><font size="3">\n</font>"轻触任意文本字段。"</string>
+    <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"打开键盘"\n</b></font><font size="3">\n</font>"触摸任意文本字段。"</string>
     <string name="close_the_keyboard" msgid="6251022259044940103"><font size="17"><b>"关闭键盘"\n</b></font><font size="3">\n</font>"按“返回”键。"</string>
-    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"按住某个键可开启其他字符选项"\n</b></font><font size="3">\n</font>"访问标点和重音符号。"</string>
-    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"键盘设置"\n</b></font><font size="3">\n</font>"长按 "<b>"?123"</b>" 键。"</string>
+    <string name="touch_and_hold" msgid="6154166367273010534"><font size="17"><b>"触摸并按住选项键"\n</b></font><font size="3">\n</font>"进入标点/重音符号界面。"</string>
+    <string name="keyboard_settings" msgid="4585753477617374032"><font size="17"><b>"键盘设置"\n</b></font><font size="3">\n</font>"触摸并按住 "<b>"?123"</b>" 键。"</string>
     <string name="popular_domain_0" msgid="3745279225122472969">".com"</string>
     <string name="popular_domain_1" msgid="1370572248164278467">".net"</string>
     <string name="popular_domain_2" msgid="3036812463748402878">".org"</string>
@@ -124,4 +129,5 @@
     <string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string>
     <string name="language_selection_summary" msgid="187110938289512256">"在空格键上滑动手指可更改语言"</string>
     <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← 再次点按即可保存"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"提供字典"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml
similarity index 84%
rename from res/values-zh-rTW/strings.xml
rename to java/res/values-zh-rTW/strings.xml
index c4efd00..4f83be4 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/java/res/values-zh-rTW/strings.xml
@@ -1,18 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- 
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Android 鍵盤"</string>
@@ -70,7 +75,7 @@
     <string name="tip_to_launch_settings" msgid="8402961128983196128"><b>"輕觸並按住此鍵即可變更鍵盤設定,例如自動完成"</b></string>
     <string name="tip_to_start_typing" msgid="7213843601369174313"><b>"試試看!"</b></string>
     <string name="label_go_key" msgid="1635148082137219148">"開始"</string>
-    <string name="label_next_key" msgid="362972844525672568">"下一步"</string>
+    <string name="label_next_key" msgid="362972844525672568">"繼續"</string>
     <string name="label_done_key" msgid="2441578748772529288">"完成"</string>
     <string name="label_send_key" msgid="2815056534433717444">"傳送"</string>
     <string name="label_symbol_key" msgid="6175820506864489453">"?123"</string>
@@ -98,14 +103,17 @@
     <string name="voice_punctuation_hint" msgid="1611389463237317754"><b>"提示:"</b>"下次可嘗試說出標點符號,例如「句號」、「逗號」或「問號」。"</string>
     <string name="cancel" msgid="6830980399865683324">"取消"</string>
     <string name="ok" msgid="7898366843681727667">"確定"</string>
-    <!-- no translation found for voice_input (2466640768843347841) -->
-    <skip />
-    <!-- no translation found for voice_input_modes:0 (1349082139076086774) -->
-    <!-- no translation found for voice_input_modes:1 (8529385602829095903) -->
-    <!-- no translation found for voice_input_modes:2 (7283103513488381103) -->
-    <!-- no translation found for voice_input_modes_summary:0 (554248625705084903) -->
-    <!-- no translation found for voice_input_modes_summary:1 (6907837061058876770) -->
-    <!-- no translation found for voice_input_modes_summary:2 (3664304608587798036) -->
+    <string name="voice_input" msgid="2466640768843347841">"語音輸入"</string>
+  <string-array name="voice_input_modes">
+    <item msgid="1349082139076086774">"於主鍵盤"</item>
+    <item msgid="8529385602829095903">"於符號鍵盤"</item>
+    <item msgid="7283103513488381103">"關閉"</item>
+  </string-array>
+  <string-array name="voice_input_modes_summary">
+    <item msgid="554248625705084903">"主鍵盤上的麥克風"</item>
+    <item msgid="6907837061058876770">"符號鍵盤上的麥克風"</item>
+    <item msgid="3664304608587798036">"已停用語音輸入"</item>
+  </string-array>
     <string name="auto_submit" msgid="9151008027068358518">"說話後自動提交"</string>
     <string name="auto_submit_summary" msgid="4961875269610384226">"搜尋或前往下一個欄位時自動按下輸入。"</string>
     <string name="open_the_keyboard" msgid="2215920976029260466"><font size="17"><b>"開啟鍵盤"\n</b></font><font size="3">\n</font>"輕觸任何文字欄位。"</string>
@@ -118,10 +126,8 @@
     <string name="popular_domain_3" msgid="8718639560809452028">".gov"</string>
     <string name="popular_domain_4" msgid="35359437471311470">".edu"</string>
     <string name="inputMethod" msgid="7854532062009028116">"輸入方式"</string>
-    <!-- no translation found for language_selection_title (1651299598555326750) -->
-    <skip />
-    <!-- no translation found for language_selection_summary (187110938289512256) -->
-    <skip />
-    <!-- no translation found for hint_add_to_dictionary (8058519710062071085) -->
-    <skip />
+    <string name="language_selection_title" msgid="1651299598555326750">"輸入語言"</string>
+    <string name="language_selection_summary" msgid="187110938289512256">"以手指在空白鍵上滑動可變更語言"</string>
+    <string name="hint_add_to_dictionary" msgid="8058519710062071085">"← 再次輕按可儲存"</string>
+    <string name="has_dictionary" msgid="6071847973466625007">"可使用字典"</string>
 </resources>
diff --git a/res/values/bools.xml b/java/res/values/bools.xml
similarity index 100%
rename from res/values/bools.xml
rename to java/res/values/bools.xml
diff --git a/res/values/colors.xml b/java/res/values/colors.xml
similarity index 100%
rename from res/values/colors.xml
rename to java/res/values/colors.xml
diff --git a/res/values/dimens.xml b/java/res/values/dimens.xml
similarity index 100%
rename from res/values/dimens.xml
rename to java/res/values/dimens.xml
diff --git a/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
similarity index 94%
rename from res/values/donottranslate.xml
rename to java/res/values/donottranslate.xml
index 87c28ae..d501735 100644
--- a/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -34,4 +34,6 @@
     <string name="alternates_for_z"></string>
     <!-- Accented characters related to "l" -->
     <string name="alternates_for_l"></string>
+    <!-- Accented characters related to "g" -->
+    <string name="alternates_for_g"></string>
 </resources>
diff --git a/res/values/durations.xml b/java/res/values/durations.xml
similarity index 100%
rename from res/values/durations.xml
rename to java/res/values/durations.xml
diff --git a/res/values/keycodes.xml b/java/res/values/keycodes.xml
similarity index 100%
rename from res/values/keycodes.xml
rename to java/res/values/keycodes.xml
diff --git a/res/values/strings.xml b/java/res/values/strings.xml
similarity index 98%
rename from res/values/strings.xml
rename to java/res/values/strings.xml
index 9025ca0..35dd3e0 100644
--- a/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -319,4 +319,7 @@
     
     <!-- Add to dictionary hint -->
     <string name="hint_add_to_dictionary">\u2190 Tap again to save</string>
+    
+    <!-- Inform the user that a particular language has an available dictionary -->
+    <string name="has_dictionary">Dictionary available</string>
 </resources>
diff --git a/res/xml-de/kbd_qwerty.xml b/java/res/xml-de/kbd_qwerty.xml
similarity index 96%
rename from res/xml-de/kbd_qwerty.xml
rename to java/res/xml-de/kbd_qwerty.xml
index 4e57c60..da833b2 100755
--- a/res/xml-de/kbd_qwerty.xml
+++ b/java/res/xml-de/kbd_qwerty.xml
@@ -120,11 +120,11 @@
         <Key android:keyLabel="/" android:keyWidth="10%p"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
                 android:keyWidth="10%p"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
@@ -140,11 +140,11 @@
         <Key android:keyLabel="\@"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
                 android:iconPreview="@drawable/sym_keyboard_feedback_return"
diff --git a/res/xml-fr/kbd_qwerty.xml b/java/res/xml-fr/kbd_qwerty.xml
similarity index 96%
rename from res/xml-fr/kbd_qwerty.xml
rename to java/res/xml-fr/kbd_qwerty.xml
index 1b20c04..77076fd 100644
--- a/res/xml-fr/kbd_qwerty.xml
+++ b/java/res/xml-fr/kbd_qwerty.xml
@@ -122,11 +122,11 @@
         <Key android:keyLabel="/" android:keyWidth="10%p"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
                 android:keyWidth="10%p"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
@@ -142,11 +142,11 @@
         <Key android:keyLabel="\@"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
                 android:iconPreview="@drawable/sym_keyboard_feedback_return"
diff --git a/res/xml-ru/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml
similarity index 75%
copy from res/xml-ru/kbd_qwerty.xml
copy to java/res/xml-iw/kbd_qwerty.xml
index 45d355b..3cec7cd 100755
--- a/res/xml-ru/kbd_qwerty.xml
+++ b/java/res/xml-iw/kbd_qwerty.xml
@@ -2,7 +2,7 @@
 <!--
 /* 
 **
-** Copyright 2008, The Android Open Source Project
+** Copyright 2010, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License"); 
 ** you may not use this file except in compliance with the License. 
@@ -19,64 +19,54 @@
 -->
 
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-    android:keyWidth="9.09%p"
+    android:keyWidth="10%p"
     android:horizontalGap="0px"
     android:verticalGap="0px"
     android:keyHeight="@dimen/key_height"
     >
 
     <Row>
-        <Key android:keyLabel="й"
-                android:keyEdgeFlags="left"/>
-        <Key android:keyLabel="ц"/>
-        <Key android:keyLabel="у"/>
-        <Key android:keyLabel="к"/>
-        <Key android:keyLabel="е"
-                android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="ё" />
-        <Key android:keyLabel="н"/>
-        <Key android:keyLabel="г"/>
-        <Key android:keyLabel="ш"/>
-        <Key android:keyLabel="щ"/>
-        <Key android:keyLabel="з"/>
-        <Key android:keyLabel="х"
-                android:keyEdgeFlags="right"/>
+        <Key android:keyLabel="ק" 
+	     android:horizontalGap="5%p"
+	     android:keyEdgeFlags="left"/>
+        <Key android:keyLabel="ר"/>
+        <Key android:keyLabel="א"/>
+        <Key android:keyLabel="ט"/>
+        <Key android:keyLabel="ו"/>
+        <Key android:keyLabel="ן"/>
+        <Key android:keyLabel="ם"/>
+        <Key android:keyLabel="פ"/>
+        <Key android:codes="-5" 
+	     android:horizontalGap="1.25%p"
+	     android:keyIcon="@drawable/sym_keyboard_delete"
+            android:keyWidth="13.75%p" android:keyEdgeFlags="right"
+            android:iconPreview="@drawable/sym_keyboard_feedback_delete"
+            android:isRepeatable="true"/>
     </Row>
 
     <Row>
-        <Key android:keyLabel="ф"
-                android:keyEdgeFlags="left"/>
-        <Key android:keyLabel="ы"/>
-        <Key android:keyLabel="в"/>
-        <Key android:keyLabel="а"/>
-        <Key android:keyLabel="п"/>
-        <Key android:keyLabel="р"/>
-        <Key android:keyLabel="о"/>
-        <Key android:keyLabel="л"/>
-        <Key android:keyLabel="д"/>
-        <Key android:keyLabel="ж"/>
-        <Key android:keyLabel="э"
-                android:keyEdgeFlags="right"/>
+        <Key android:keyLabel="ש" android:keyEdgeFlags="left"/>
+        <Key android:keyLabel="ד"/>
+        <Key android:keyLabel="ג"/>
+        <Key android:keyLabel="כ"/>
+        <Key android:keyLabel="ע"/>
+        <Key android:keyLabel="י"/>
+        <Key android:keyLabel="ח"/>
+        <Key android:keyLabel="ל"/>
+        <Key android:keyLabel="ך"/>
+        <Key android:keyLabel="ף" android:keyEdgeFlags="right"/>
     </Row>
     
-    <Row android:keyWidth="8.5%p">
-        <Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift" 
-                android:keyWidth="11.75%p" android:isModifier="true"
-                android:iconPreview="@drawable/sym_keyboard_feedback_shift"
-                android:isSticky="true" android:keyEdgeFlags="left"/>
-        <Key android:keyLabel="я"/>
-        <Key android:keyLabel="ч"/>
-        <Key android:keyLabel="с"/>
-        <Key android:keyLabel="м"/>
-        <Key android:keyLabel="и"/>
-        <Key android:keyLabel="т"/>
-        <Key android:keyLabel="ь"/>
-        <Key android:keyLabel="б"/>
-        <Key android:keyLabel="ю"/>
-        <Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
-                android:keyWidth="11.75%p" android:keyEdgeFlags="right"
-                android:iconPreview="@drawable/sym_keyboard_feedback_delete"
-                android:isRepeatable="true"/>
+    <Row>
+        <Key android:keyLabel="ז" android:horizontalGap="5%p" android:keyEdgeFlags="left"/>
+        <Key android:keyLabel="ס"/>
+        <Key android:keyLabel="ב"/>
+        <Key android:keyLabel="ה"/>
+        <Key android:keyLabel="נ"/>
+        <Key android:keyLabel="מ"/>
+        <Key android:keyLabel="צ"/>
+        <Key android:keyLabel="ת"/>
+        <Key android:keyLabel="ץ" android:keyEdgeFlags="right"/>
     </Row>
 
     <Row android:keyboardMode="@+id/mode_normal" android:rowEdgeFlags="bottom">
diff --git a/res/xml-ru/kbd_qwerty.xml b/java/res/xml-ru/kbd_qwerty.xml
similarity index 93%
rename from res/xml-ru/kbd_qwerty.xml
rename to java/res/xml-ru/kbd_qwerty.xml
index 45d355b..cbb518f 100755
--- a/res/xml-ru/kbd_qwerty.xml
+++ b/java/res/xml-ru/kbd_qwerty.xml
@@ -26,7 +26,7 @@
     >
 
     <Row>
-        <Key android:keyLabel="й"
+        <Key android:keyLabel="й" android:keyWidth="8.75%p"
                 android:keyEdgeFlags="left"/>
         <Key android:keyLabel="ц"/>
         <Key android:keyLabel="у"/>
@@ -39,12 +39,12 @@
         <Key android:keyLabel="ш"/>
         <Key android:keyLabel="щ"/>
         <Key android:keyLabel="з"/>
-        <Key android:keyLabel="х"
+        <Key android:keyLabel="х" android:keyWidth="8.75%p"
                 android:keyEdgeFlags="right"/>
     </Row>
 
     <Row>
-        <Key android:keyLabel="ф"
+        <Key android:keyLabel="ф" android:keyWidth="8.75%p"
                 android:keyEdgeFlags="left"/>
         <Key android:keyLabel="ы"/>
         <Key android:keyLabel="в"/>
@@ -55,7 +55,7 @@
         <Key android:keyLabel="л"/>
         <Key android:keyLabel="д"/>
         <Key android:keyLabel="ж"/>
-        <Key android:keyLabel="э"
+        <Key android:keyLabel="э" android:keyWidth="8.75%p"
                 android:keyEdgeFlags="right"/>
     </Row>
     
@@ -104,11 +104,11 @@
         <Key android:keyLabel="/" android:keyWidth="10%p"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
                 android:keyWidth="10%p"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
@@ -124,11 +124,11 @@
         <Key android:keyLabel="\@" android:keyWidth="10%p"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
                 android:iconPreview="@drawable/sym_keyboard_feedback_return"
diff --git a/res/xml/kbd_qwerty.xml b/java/res/xml-sv/kbd_qwerty.xml
old mode 100755
new mode 100644
similarity index 77%
copy from res/xml/kbd_qwerty.xml
copy to java/res/xml-sv/kbd_qwerty.xml
index 4aa4761..d4ffa4d
--- a/res/xml/kbd_qwerty.xml
+++ b/java/res/xml-sv/kbd_qwerty.xml
@@ -1,74 +1,79 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/* 
+/*
 **
 ** Copyright 2008, The Android Open Source Project
 **
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
+** 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 
+**     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 
+** 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.
 */
 -->
 
+<!--
+    Swedish Keyboard Layout
+
+    Key positioning: Svensk standard SS 66 22 41
+    Foreign letters: Svenska skrivregler (2:a uppl.) §302
+    Local additions: ۧ
+-->
+
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
-    android:keyWidth="10%p"
+    android:keyWidth="9.09%p"
     android:horizontalGap="0px"
     android:verticalGap="0px"
     android:keyHeight="@dimen/key_height"
     >
 
     <Row>
-        <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
+        <Key android:codes="113" android:keyLabel="q"
+                android:keyWidth="8.75%p" android:keyEdgeFlags="left"/>
         <Key android:codes="119" android:keyLabel="w"/>
         <Key android:codes="101" android:keyLabel="e"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_e"
-        />
+                android:popupCharacters="éèêëę€"/>
         <Key android:codes="114" android:keyLabel="r"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_r"/>
+                android:popupCharacters="ř"/>
         <Key android:codes="116" android:keyLabel="t"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_t"/>
+                android:popupCharacters="ťþ"/>
         <Key android:codes="121" android:keyLabel="y"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_y"
-        />
+                android:popupCharacters="ýÿü"/>
         <Key android:codes="117" android:keyLabel="u"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_u"
-        />
+                android:popupCharacters="úùûū"/>
         <Key android:codes="105" android:keyLabel="i"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_i"
-        />
+                android:popupCharacters="íìîï"/>
         <Key android:codes="111" android:keyLabel="o"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_o"
-        />
-        <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
+                android:popupCharacters="óòôõ"/>
+        <Key android:codes="112" android:keyLabel="p"/>
+        <Key android:keyLabel="å"
+                android:keyWidth="8.75%p" android:keyEdgeFlags="right"/>
     </Row>
-    
+
     <Row>
-        <Key android:codes="97" android:keyLabel="a" android:horizontalGap="5%p" 
+        <Key android:codes="97" android:keyLabel="a"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_a"
-                android:keyEdgeFlags="left"/>
+                android:popupCharacters="áàâąã"
+                android:keyWidth="8.75%p" android:keyEdgeFlags="left"/>
         <Key android:codes="115" android:keyLabel="s"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_s"
-        />
+                android:popupCharacters="śšşß"/>
         <Key android:codes="100" android:keyLabel="d"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_d"/>
+                android:popupCharacters="ðď"/>
         <Key android:codes="102" android:keyLabel="f"/>
         <Key android:codes="103" android:keyLabel="g"/>
         <Key android:codes="104" android:keyLabel="h"/>
@@ -76,29 +81,35 @@
         <Key android:codes="107" android:keyLabel="k"/>
         <Key android:codes="108" android:keyLabel="l"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_l"
-                android:keyEdgeFlags="right"/>
+                android:popupCharacters="ł"/>
+        <Key android:keyLabel="ö"
+                android:popupKeyboard="@xml/kbd_popup_template"
+                android:popupCharacters="øœ"/>
+        <Key android:keyLabel="ä"
+                android:popupKeyboard="@xml/kbd_popup_template"
+                android:popupCharacters="æ"
+                android:keyWidth="8.75%p" android:keyEdgeFlags="right"/>
     </Row>
-    
-    <Row>
-        <Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift" 
+
+    <Row android:keyWidth="10%p">
+        <Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift"
                 android:keyWidth="15%p" android:isModifier="true"
                 android:iconPreview="@drawable/sym_keyboard_feedback_shift"
                 android:isSticky="true" android:keyEdgeFlags="left"/>
         <Key android:codes="122" android:keyLabel="z"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_z"/>
+                android:popupCharacters="źžż"/>
         <Key android:codes="120" android:keyLabel="x"/>
         <Key android:codes="99" android:keyLabel="c"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_c"
-        />
-        <Key android:codes="118" android:keyLabel="v"/>
+                android:popupCharacters="çćč"/>
+        <Key android:codes="118" android:keyLabel="v"
+                android:popupKeyboard="@xml/kbd_popup_template"
+                android:popupCharacters="w"/>
         <Key android:codes="98" android:keyLabel="b"/>
         <Key android:codes="110" android:keyLabel="n"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="@string/alternates_for_n"
-        />
+                android:popupCharacters="ńñň"/>
         <Key android:codes="109" android:keyLabel="m"/>
         <Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
                 android:keyWidth="15%p" android:keyEdgeFlags="right"
@@ -107,7 +118,7 @@
     </Row>
 
     <Row android:keyboardMode="@+id/mode_normal" android:rowEdgeFlags="bottom">
-        <Key android:codes="-2" android:keyLabel="@string/label_symbol_key" 
+        <Key android:codes="-2" android:keyLabel="@string/label_symbol_key"
                 android:popupKeyboard="@xml/kbd_popup_template"
                 android:popupCharacters="_"
                 android:keyWidth="20%p" android:keyEdgeFlags="left"/>
@@ -117,7 +128,7 @@
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
                 android:keyWidth="40%p" android:isRepeatable="true"/>
-        <Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation" 
+        <Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
                 android:keyWidth="10%p"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
                 android:iconPreview="@drawable/sym_keyboard_feedback_return"
@@ -132,11 +143,11 @@
         <Key android:keyLabel="/" android:keyWidth="10%p"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
                 android:keyWidth="10%p"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
@@ -152,11 +163,11 @@
         <Key android:keyLabel="\@"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
                 android:iconPreview="@drawable/sym_keyboard_feedback_return"
@@ -174,7 +185,7 @@
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
                 android:keyWidth="40%p" android:isRepeatable="true"/>
-        <Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation" 
+        <Key android:codes="46" android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
                 android:keyWidth="10%p"/>
         <Key android:keyLabel=":-)" android:keyOutputText=":-) "
                 android:popupKeyboard="@xml/popup_smileys"
@@ -202,4 +213,3 @@
     </Row>
 
 </Keyboard>
-
diff --git a/res/xml/azerty.xml b/java/res/xml/azerty.xml
similarity index 100%
rename from res/xml/azerty.xml
rename to java/res/xml/azerty.xml
diff --git a/res/xml/kbd_alpha.xml b/java/res/xml/kbd_alpha.xml
similarity index 100%
rename from res/xml/kbd_alpha.xml
rename to java/res/xml/kbd_alpha.xml
diff --git a/res/xml/kbd_extension.xml b/java/res/xml/kbd_extension.xml
similarity index 100%
rename from res/xml/kbd_extension.xml
rename to java/res/xml/kbd_extension.xml
diff --git a/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
similarity index 100%
rename from res/xml/kbd_phone.xml
rename to java/res/xml/kbd_phone.xml
diff --git a/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml
similarity index 100%
rename from res/xml/kbd_phone_symbols.xml
rename to java/res/xml/kbd_phone_symbols.xml
diff --git a/res/xml/kbd_popup_template.xml b/java/res/xml/kbd_popup_template.xml
similarity index 100%
rename from res/xml/kbd_popup_template.xml
rename to java/res/xml/kbd_popup_template.xml
diff --git a/res/xml/kbd_qwerty.xml b/java/res/xml/kbd_qwerty.xml
similarity index 94%
rename from res/xml/kbd_qwerty.xml
rename to java/res/xml/kbd_qwerty.xml
index 4aa4761..7cb18b0 100755
--- a/res/xml/kbd_qwerty.xml
+++ b/java/res/xml/kbd_qwerty.xml
@@ -70,7 +70,10 @@
                 android:popupKeyboard="@xml/kbd_popup_template"
                 android:popupCharacters="@string/alternates_for_d"/>
         <Key android:codes="102" android:keyLabel="f"/>
-        <Key android:codes="103" android:keyLabel="g"/>
+        <Key android:codes="103" android:keyLabel="g"
+                android:popupKeyboard="@xml/kbd_popup_template"
+                android:popupCharacters="@string/alternates_for_g"
+        />
         <Key android:codes="104" android:keyLabel="h"/>
         <Key android:codes="106" android:keyLabel="j"/>
         <Key android:codes="107" android:keyLabel="k"/>
@@ -132,11 +135,11 @@
         <Key android:keyLabel="/" android:keyWidth="10%p"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"
                 android:keyWidth="10%p"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
@@ -152,11 +155,11 @@
         <Key android:keyLabel="\@"/>
         <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
-                android:keyWidth="20%p" android:isRepeatable="true"/>
-        <Key android:keyLabel="@string/popular_domain_0"
+                android:keyWidth="40%p" android:isRepeatable="true"/>
+        <!--Key android:keyLabel="@string/popular_domain_0"
                 android:keyOutputText="@string/popular_domain_0"
                 android:popupKeyboard="@xml/popup_domains"
-                android:keyWidth="20%p"/>
+                android:keyWidth="20%p"/-->
         <Key android:keyLabel="." android:popupKeyboard="@xml/popup_punctuation"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return"
                 android:iconPreview="@drawable/sym_keyboard_feedback_return"
diff --git a/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml
similarity index 96%
rename from res/xml/kbd_symbols.xml
rename to java/res/xml/kbd_symbols.xml
index 067932b..ab5792f 100755
--- a/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -77,7 +77,7 @@
         />
         <Key android:codes="45" android:keyLabel="-"
                 android:popupKeyboard="@xml/kbd_popup_template"
-                android:popupCharacters="–—"
+                android:popupCharacters="_–—"
         />
         <Key android:keyLabel="+"
                 android:popupKeyboard="@xml/kbd_popup_template"
@@ -131,7 +131,9 @@
                 android:keyWidth="40%p"
                 android:iconPreview="@drawable/sym_keyboard_feedback_space"
                 android:isRepeatable="true"/>
-        <Key android:keyLabel="." android:keyWidth="10%p" />
+        <Key android:codes="46" android:keyLabel="."
+                android:popupKeyboard="@xml/popup_punctuation"
+                android:keyWidth="10%p"/>
         <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return" android:keyWidth="20%p" android:keyEdgeFlags="right"
                 android:iconPreview="@drawable/sym_keyboard_feedback_return"
                 />
diff --git a/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
similarity index 100%
rename from res/xml/kbd_symbols_shift.xml
rename to java/res/xml/kbd_symbols_shift.xml
diff --git a/res/xml/language_prefs.xml b/java/res/xml/language_prefs.xml
similarity index 100%
rename from res/xml/language_prefs.xml
rename to java/res/xml/language_prefs.xml
diff --git a/res/xml/method.xml b/java/res/xml/method.xml
similarity index 100%
rename from res/xml/method.xml
rename to java/res/xml/method.xml
diff --git a/res/xml/popup_domains.xml b/java/res/xml/popup_domains.xml
similarity index 100%
rename from res/xml/popup_domains.xml
rename to java/res/xml/popup_domains.xml
diff --git a/res/xml/popup_punctuation.xml b/java/res/xml/popup_punctuation.xml
similarity index 74%
rename from res/xml/popup_punctuation.xml
rename to java/res/xml/popup_punctuation.xml
index 518e3f1..a29fb52 100644
--- a/res/xml/popup_punctuation.xml
+++ b/java/res/xml/popup_punctuation.xml
@@ -26,8 +26,8 @@
     >
 
     <Row android:rowEdgeFlags="top">
-        <Key android:keyLabel=";" android:keyEdgeFlags="left" />
-        <Key android:keyLabel="," />
+        <Key android:keyLabel=":" android:keyEdgeFlags="left" />
+        <Key android:keyLabel="/" />
         <Key android:keyLabel="&amp;" />
         <Key android:keyLabel="(" />
         <Key android:keyLabel=")" />
@@ -35,12 +35,12 @@
         <Key android:keyLabel="+" android:keyEdgeFlags="right" />
     </Row>
     <Row android:rowEdgeFlags="bottom">
-        <Key android:codes="58" android:keyLabel=":" android:keyEdgeFlags="left" />
-        <Key android:codes="47" android:keyLabel="/" />
-        <Key android:codes="64" android:keyLabel="\@" />
-        <Key android:codes="39" android:keyLabel="\'" />
-        <Key android:codes="34" android:keyLabel="&quot;" />
-        <Key android:codes="63" android:keyLabel="\?" />
-        <Key android:codes="33" android:keyLabel="!" android:keyEdgeFlags="right" />
+        <Key android:keyLabel=";" android:keyEdgeFlags="left" />
+        <Key android:keyLabel="," />
+        <Key android:keyLabel="\@" />
+        <Key android:keyLabel="\'" />
+        <Key android:keyLabel="&quot;" />
+        <Key android:keyLabel="\?" />
+        <Key android:keyLabel="!" android:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/res/xml/popup_smileys.xml b/java/res/xml/popup_smileys.xml
similarity index 100%
rename from res/xml/popup_smileys.xml
rename to java/res/xml/popup_smileys.xml
diff --git a/res/xml/prefs.xml b/java/res/xml/prefs.xml
similarity index 92%
rename from res/xml/prefs.xml
rename to java/res/xml/prefs.xml
index 29c43cb..535b63f 100644
--- a/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -50,9 +50,7 @@
             android:title="@string/language_selection_title"
             android:summary="@string/language_selection_summary">
         <intent
-                android:action="android.intent.action.MAIN"
-                android:targetPackage="com.android.inputmethod.latin"
-                android:targetClass="com.android.inputmethod.latin.InputLanguageSelection" />
+                android:action="com.android.inputmethod.latin.INPUT_LANGUAGE_SELECTION"/>
     </PreferenceScreen>
 
     <PreferenceCategory
diff --git a/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/AutoDictionary.java
similarity index 60%
rename from src/com/android/inputmethod/latin/AutoDictionary.java
rename to java/src/com/android/inputmethod/latin/AutoDictionary.java
index 3d76dc3..93f1985 100644
--- a/src/com/android/inputmethod/latin/AutoDictionary.java
+++ b/java/src/com/android/inputmethod/latin/AutoDictionary.java
@@ -17,6 +17,8 @@
 package com.android.inputmethod.latin;
 
 import java.util.HashMap;
+import java.util.Set;
+import java.util.Map.Entry;
 
 import android.content.ContentValues;
 import android.content.Context;
@@ -24,8 +26,8 @@
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteQueryBuilder;
+import android.os.AsyncTask;
 import android.provider.BaseColumns;
-import android.provider.UserDictionary.Words;
 import android.util.Log;
 
 /**
@@ -51,6 +53,9 @@
     // Locale for which this auto dictionary is storing words
     private String mLocale;
 
+    private HashMap<String,Integer> mPendingWrites = new HashMap<String,Integer>();
+    private final Object mPendingWritesLock = new Object();
+
     private static final String DATABASE_NAME = "auto_dict.db";
     private static final int DATABASE_VERSION = 1;
 
@@ -78,13 +83,15 @@
         sDictProjectionMap.put(COLUMN_LOCALE, COLUMN_LOCALE);
     }
 
-    private DatabaseHelper mOpenHelper;
+    private static DatabaseHelper mOpenHelper = null;
 
     public AutoDictionary(Context context, LatinIME ime, String locale) {
         super(context);
         mIme = ime;
         mLocale = locale;
-        mOpenHelper = new DatabaseHelper(getContext());
+        if (mOpenHelper == null) {
+            mOpenHelper = new DatabaseHelper(getContext());
+        }
         if (mLocale != null && mLocale.length() > 1) {
             loadDictionary();
         }
@@ -96,28 +103,38 @@
         return frequency >= VALIDITY_THRESHOLD;
     }
 
+    @Override
     public void close() {
-        mOpenHelper.close();
+        flushPendingWrites();
+        // Don't close the database as locale changes will require it to be reopened anyway
+        // Also, the database is written to somewhat frequently, so it needs to be kept alive
+        // throughout the life of the process.
+        // mOpenHelper.close();
+        super.close();
     }
 
-    private void loadDictionary() {
+    @Override
+    public void loadDictionaryAsync() {
         // Load the words that correspond to the current input locale
         Cursor cursor = query(COLUMN_LOCALE + "=?", new String[] { mLocale });
-        if (cursor.moveToFirst()) {
-            int wordIndex = cursor.getColumnIndex(COLUMN_WORD);
-            int frequencyIndex = cursor.getColumnIndex(COLUMN_FREQUENCY);
-            while (!cursor.isAfterLast()) {
-                String word = cursor.getString(wordIndex);
-                int frequency = cursor.getInt(frequencyIndex);
-                // Safeguard against adding really long words. Stack may overflow due
-                // to recursive lookup
-                if (word.length() < getMaxWordLength()) {
-                    super.addWord(word, frequency);
+        try {
+            if (cursor.moveToFirst()) {
+                int wordIndex = cursor.getColumnIndex(COLUMN_WORD);
+                int frequencyIndex = cursor.getColumnIndex(COLUMN_FREQUENCY);
+                while (!cursor.isAfterLast()) {
+                    String word = cursor.getString(wordIndex);
+                    int frequency = cursor.getInt(frequencyIndex);
+                    // Safeguard against adding really long words. Stack may overflow due
+                    // to recursive lookup
+                    if (word.length() < getMaxWordLength()) {
+                        super.addWord(word, frequency);
+                    }
+                    cursor.moveToNext();
                 }
-                cursor.moveToNext();
             }
+        } finally {
+            cursor.close();
         }
-        cursor.close();
     }
 
     @Override
@@ -132,14 +149,29 @@
         int freq = getWordFrequency(word);
         freq = freq < 0 ? addFrequency : freq + addFrequency;
         super.addWord(word, freq);
+
         if (freq >= PROMOTION_THRESHOLD) {
             mIme.promoteToUserDictionary(word, FREQUENCY_FOR_AUTO_ADD);
-            // Delete the word (for input locale) from the auto dictionary db, as it
-            // is now in the user dictionary provider.
-            delete(COLUMN_WORD + "=? AND " + COLUMN_LOCALE + "=?",
-                    new String[] { word, mLocale });
-        } else {
-            update(word, freq, mLocale);
+            freq = 0;
+        }
+
+        synchronized (mPendingWritesLock) {
+            // Write a null frequency if it is to be deleted from the db
+            mPendingWrites.put(word, freq == 0 ? null : new Integer(freq));
+        }
+    }
+
+    /**
+     * Schedules a background thread to write any pending words to the database.
+     */
+    public void flushPendingWrites() {
+        synchronized (mPendingWritesLock) {
+            // Nothing pending? Return
+            if (mPendingWrites.isEmpty()) return;
+            // Create a background thread to write the pending entries
+            new UpdateDbTask(getContext(), mOpenHelper, mPendingWrites, mLocale).execute();
+            // Create a new map for writing new entries into while the old one is written to db
+            mPendingWrites = new HashMap<String, Integer>();
         }
     }
 
@@ -183,35 +215,45 @@
         return c;
     }
 
-    private boolean insert(ContentValues values) {
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        long rowId = db.insert(AUTODICT_TABLE_NAME, Words.WORD, values);
-        if (rowId > 0) {
-            return true;
+    /**
+     * Async task to write pending words to the database so that it stays in sync with
+     * the in-memory trie.
+     */
+    private static class UpdateDbTask extends AsyncTask<Void, Void, Void> {
+        private final HashMap<String, Integer> mMap;
+        private final DatabaseHelper mDbHelper;
+        private final String mLocale;
+
+        public UpdateDbTask(Context context, DatabaseHelper openHelper,
+                HashMap<String, Integer> pendingWrites, String locale) {
+            mMap = pendingWrites;
+            mLocale = locale;
+            mDbHelper = openHelper;
         }
-        return false;
-    }
 
-    private int delete(String where, String[] whereArgs) {
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        int count = db.delete(AUTODICT_TABLE_NAME, where, whereArgs);
-        return count;
-    }
+        @Override
+        protected Void doInBackground(Void... v) {
+            SQLiteDatabase db = mDbHelper.getWritableDatabase();
+            // Write all the entries to the db
+            Set<Entry<String,Integer>> mEntries = mMap.entrySet();
+            for (Entry<String,Integer> entry : mEntries) {
+                Integer freq = entry.getValue();
+                db.delete(AUTODICT_TABLE_NAME, COLUMN_WORD + "=? AND " + COLUMN_LOCALE + "=?",
+                        new String[] { entry.getKey(), mLocale });
+                if (freq != null) {
+                    db.insert(AUTODICT_TABLE_NAME, null,
+                            getContentValues(entry.getKey(), freq, mLocale));
+                }
+            }
+            return null;
+        }
 
-    private int update(String word, int frequency, String locale) {
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        long count = db.delete(AUTODICT_TABLE_NAME, COLUMN_WORD + "=? AND " + COLUMN_LOCALE + "=?",
-                new String[] { word, locale });
-        count = db.insert(AUTODICT_TABLE_NAME, null,
-                getContentValues(word, frequency, locale));
-        return (int) count;
-    }
-
-    private ContentValues getContentValues(String word, int frequency, String locale) {
-        ContentValues values = new ContentValues(4);
-        values.put(COLUMN_WORD, word);
-        values.put(COLUMN_FREQUENCY, frequency);
-        values.put(COLUMN_LOCALE, locale);
-        return values;
+        private ContentValues getContentValues(String word, int frequency, String locale) {
+            ContentValues values = new ContentValues(4);
+            values.put(COLUMN_WORD, word);
+            values.put(COLUMN_FREQUENCY, frequency);
+            values.put(COLUMN_LOCALE, locale);
+            return values;
+        }
     }
 }
diff --git a/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
similarity index 77%
rename from src/com/android/inputmethod/latin/BinaryDictionary.java
rename to java/src/com/android/inputmethod/latin/BinaryDictionary.java
index ec467c8..4901b21 100644
--- a/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -16,6 +16,11 @@
 
 package com.android.inputmethod.latin;
 
+import java.io.InputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.channels.Channels;
 import java.util.Arrays;
 
 import android.content.Context;
@@ -27,6 +32,7 @@
  */
 public class BinaryDictionary extends Dictionary {
 
+    private static final String TAG = "BinaryDictionary";
     public static final int MAX_WORD_LENGTH = 48;
     private static final int MAX_ALTERNATIVES = 16;
     private static final int MAX_WORDS = 16;
@@ -35,10 +41,13 @@
     private static final boolean ENABLE_MISSED_CHARACTERS = true;
 
     private int mNativeDict;
-    private int mDictLength; // This value is set from native code, don't change the name!!!!
+    private int mDictLength;
     private int[] mInputCodes = new int[MAX_WORD_LENGTH * MAX_ALTERNATIVES];
     private char[] mOutputChars = new char[MAX_WORD_LENGTH * MAX_WORDS];
     private int[] mFrequencies = new int[MAX_WORDS];
+    // Keep a reference to the native dict direct buffer in Java to avoid
+    // unexpected deallocation of the direct buffer.
+    private ByteBuffer mNativeDictDirectBuffer;
 
     static {
         try {
@@ -59,8 +68,7 @@
         }
     }
 
-    private native int openNative(AssetManager am, String resourcePath, int typedLetterMultiplier,
-            int fullWordMultiplier);
+    private native int openNative(ByteBuffer bb, int typedLetterMultiplier, int fullWordMultiplier);
     private native void closeNative(int dict);
     private native boolean isValidWordNative(int nativeData, char[] word, int wordLength);
     private native int getSuggestionsNative(int dict, int[] inputCodes, int codesSize, 
@@ -69,9 +77,28 @@
             int[] nextLettersFrequencies, int nextLettersSize);
 
     private final void loadDictionary(Context context, int resId) {
-        AssetManager am = context.getResources().getAssets();
-        String assetName = context.getResources().getString(resId);
-        mNativeDict = openNative(am, assetName, TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER);
+        InputStream is = context.getResources().openRawResource(resId);
+        try {
+            int avail = is.available();
+            mNativeDictDirectBuffer =
+                    ByteBuffer.allocateDirect(avail).order(ByteOrder.nativeOrder());
+            int got = Channels.newChannel(is).read(mNativeDictDirectBuffer);
+            if (got != avail) {
+                Log.e(TAG, "Read " + got + " bytes, expected " + avail);
+            } else {
+                mNativeDict = openNative(mNativeDictDirectBuffer,
+                        TYPED_LETTER_MULTIPLIER, FULL_WORD_FREQ_MULTIPLIER);
+                mDictLength = avail;
+            }
+        } catch (IOException e) {
+            Log.w(TAG, "No available size for binary dictionary");
+        } finally {
+            try {
+                is.close();
+            } catch (IOException e) {
+                Log.w(TAG, "Failed to close input stream");
+            }
+        }
     }
 
     @Override
@@ -138,7 +165,6 @@
     @Override
     public synchronized void close() {
         if (mNativeDict != 0) {
-            System.err.println("Closing BinaryDictionary");
             closeNative(mNativeDict);
             mNativeDict = 0;
         }
diff --git a/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
similarity index 99%
rename from src/com/android/inputmethod/latin/CandidateView.java
rename to java/src/com/android/inputmethod/latin/CandidateView.java
index 0c0373b..3a199bb 100755
--- a/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
diff --git a/src/com/android/inputmethod/latin/CandidateViewContainer.java b/java/src/com/android/inputmethod/latin/CandidateViewContainer.java
similarity index 97%
rename from src/com/android/inputmethod/latin/CandidateViewContainer.java
rename to java/src/com/android/inputmethod/latin/CandidateViewContainer.java
index e13f273..e0cb8c3 100644
--- a/src/com/android/inputmethod/latin/CandidateViewContainer.java
+++ b/java/src/com/android/inputmethod/latin/CandidateViewContainer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
diff --git a/src/com/android/inputmethod/latin/ContactsDictionary.java b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
similarity index 63%
rename from src/com/android/inputmethod/latin/ContactsDictionary.java
rename to java/src/com/android/inputmethod/latin/ContactsDictionary.java
index f53ebf3..15edb70 100644
--- a/src/com/android/inputmethod/latin/ContactsDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
@@ -35,15 +35,8 @@
 
     private ContentObserver mObserver;
 
-    private boolean mRequiresReload;
-
     private long mLastLoadedContacts;
 
-    private boolean mUpdatingContacts;
-
-    // Use this lock before touching mUpdatingContacts & mRequiresDownload
-    private Object mUpdatingLock = new Object();
-
     public ContactsDictionary(Context context) {
         super(context);
         // Perform a managed query. The Activity will handle closing and requerying the cursor
@@ -53,15 +46,10 @@
         cres.registerContentObserver(Contacts.CONTENT_URI, true, mObserver = new ContentObserver(null) {
             @Override
             public void onChange(boolean self) {
-                synchronized (mUpdatingLock) {
-                    mRequiresReload = true;
-                }
+                setRequiresReload(true);
             }
         });
-
-        synchronized (mUpdatingLock) {
-            loadDictionaryAsyncLocked();
-        }
+        loadDictionary();
     }
 
     public synchronized void close() {
@@ -69,41 +57,26 @@
             getContext().getContentResolver().unregisterContentObserver(mObserver);
             mObserver = null;
         }
+        super.close();
     }
 
-    private synchronized void loadDictionaryAsyncLocked() {
+    @Override
+    public void startDictionaryLoadingTaskLocked() {
         long now = SystemClock.uptimeMillis();
         if (mLastLoadedContacts == 0
                 || now - mLastLoadedContacts > 30 * 60 * 1000 /* 30 minutes */) {
-            if (!mUpdatingContacts) {
-                mUpdatingContacts = true;
-                mRequiresReload = false;
-                new LoadContactsTask().execute();
-            }
+            super.startDictionaryLoadingTaskLocked();
         }
     }
 
     @Override
-    public synchronized void getWords(final WordComposer codes, final WordCallback callback,
-            int[] nextLettersFrequencies) {
-        synchronized (mUpdatingLock) {
-            // If we need to update, start off a background task
-            if (mRequiresReload) loadDictionaryAsyncLocked();
-            // Currently updating contacts, don't return any results.
-            if (mUpdatingContacts) return;
+    public void loadDictionaryAsync() {
+        Cursor cursor = getContext().getContentResolver()
+                .query(Contacts.CONTENT_URI, PROJECTION, null, null, null);
+        if (cursor != null) {
+            addWords(cursor);
         }
-        super.getWords(codes, callback, nextLettersFrequencies);
-    }
-
-    @Override
-    public synchronized boolean isValidWord(CharSequence word) {
-        synchronized (mUpdatingLock) {
-            // If we need to update, start off a background task
-            if (mRequiresReload) loadDictionaryAsyncLocked();
-            if (mUpdatingContacts) return false;
-        }
-
-        return super.isValidWord(word);
+        mLastLoadedContacts = SystemClock.uptimeMillis();
     }
 
     private void addWords(Cursor cursor) {
@@ -150,27 +123,5 @@
         }
         cursor.close();
     }
-    
-    private class LoadContactsTask extends AsyncTask<Void, Void, Void> {
-        @Override
-        protected Void doInBackground(Void... v) {
-            Cursor cursor = getContext().getContentResolver()
-                    .query(Contacts.CONTENT_URI, PROJECTION, null, null, null);
-            if (cursor != null) {
-                addWords(cursor);
-            }
-            mLastLoadedContacts = SystemClock.uptimeMillis();
-            return null;
-        }
 
-        @Override
-        protected void onPostExecute(Void result) {
-            // TODO Auto-generated method stub
-            synchronized (mUpdatingLock) {
-                mUpdatingContacts = false;
-            }
-            super.onPostExecute(result);
-        }
-        
-    }
 }
diff --git a/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java
similarity index 98%
rename from src/com/android/inputmethod/latin/Dictionary.java
rename to java/src/com/android/inputmethod/latin/Dictionary.java
index b656d04..e7b5266 100644
--- a/src/com/android/inputmethod/latin/Dictionary.java
+++ b/java/src/com/android/inputmethod/latin/Dictionary.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
diff --git a/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
similarity index 91%
rename from src/com/android/inputmethod/latin/ExpandableDictionary.java
rename to java/src/com/android/inputmethod/latin/ExpandableDictionary.java
index 648f577..46bc41c 100644
--- a/src/com/android/inputmethod/latin/ExpandableDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
@@ -16,7 +16,11 @@
 
 package com.android.inputmethod.latin;
 
+import com.android.inputmethod.latin.Dictionary.WordCallback;
+
 import android.content.Context;
+import android.os.AsyncTask;
+import android.os.SystemClock;
 
 /**
  * Base class for an in-memory dictionary that can grow dynamically and can
@@ -32,6 +36,13 @@
     public static final int MAX_WORD_LENGTH = 32;
     private static final char QUOTE = '\'';
 
+    private boolean mRequiresReload;
+
+    private boolean mUpdatingDictionary;
+
+    // Use this lock before touching mUpdatingDictionary & mRequiresDownload
+    private Object mUpdatingLock = new Object();
+
     static class Node {
         char code;
         int frequency;
@@ -70,6 +81,34 @@
         mCodes = new int[MAX_WORD_LENGTH][];
     }
 
+    public void loadDictionary() {
+        synchronized (mUpdatingLock) {
+            startDictionaryLoadingTaskLocked();
+        }
+    }
+
+    public void startDictionaryLoadingTaskLocked() {
+        if (!mUpdatingDictionary) {
+            mUpdatingDictionary = true;
+            mRequiresReload = false;
+            new LoadDictionaryTask().execute();
+        }
+    }
+
+    public void setRequiresReload(boolean reload) {
+        synchronized (mUpdatingLock) {
+            mRequiresReload = reload;
+        }
+    }
+
+    public boolean getRequiresReload() {
+        return mRequiresReload;
+    }
+
+    /** Override to load your dictionary here, on a background thread. */
+    public void loadDictionaryAsync() {
+    }
+
     Context getContext() {
         return mContext;
     }
@@ -119,6 +158,13 @@
     @Override
     public void getWords(final WordComposer codes, final WordCallback callback,
             int[] nextLettersFrequencies) {
+        synchronized (mUpdatingLock) {
+            // If we need to update, start off a background task
+            if (mRequiresReload) startDictionaryLoadingTaskLocked();
+            // Currently updating contacts, don't return any results.
+            if (mUpdatingDictionary) return;
+        }
+
         mInputLength = codes.size();
         mNextLettersFrequencies = nextLettersFrequencies;
         if (mCodes.length < mInputLength) mCodes = new int[mInputLength][];
@@ -135,6 +181,11 @@
 
     @Override
     public synchronized boolean isValidWord(CharSequence word) {
+        synchronized (mUpdatingLock) {
+            // If we need to update, start off a background task
+            if (mRequiresReload) startDictionaryLoadingTaskLocked();
+            if (mUpdatingDictionary) return false;
+        }
         final int freq = getWordFrequencyRec(mRoots, word, 0, word.length());
         return freq > -1;
     }
@@ -248,7 +299,7 @@
                     if (currentChar == lowerC || currentChar == c) {
                         word[depth] = c;
 
-                        if (codeSize == depth + 1) {
+                        if (codeSize == inputIndex + 1) {
                             if (terminal) {
                                 if (INCLUDE_TYPED_WORD_IF_VALID 
                                         || !same(word, depth + 1, codes.getTypedWord())) {
@@ -277,6 +328,24 @@
         mRoots = new NodeArray();
     }
 
+    private class LoadDictionaryTask extends AsyncTask<Void, Void, Void> {
+        @Override
+        protected Void doInBackground(Void... v) {
+            loadDictionaryAsync();
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Void result) {
+            // TODO Auto-generated method stub
+            synchronized (mUpdatingLock) {
+                mUpdatingDictionary = false;
+            }
+            super.onPostExecute(result);
+        }
+        
+    }
+
     static char toLowerCase(char c) {
         if (c < BASE_CHARS.length) {
             c = BASE_CHARS[c];
diff --git a/src/com/android/inputmethod/latin/Hints.java b/java/src/com/android/inputmethod/latin/Hints.java
similarity index 100%
rename from src/com/android/inputmethod/latin/Hints.java
rename to java/src/com/android/inputmethod/latin/Hints.java
diff --git a/src/com/android/inputmethod/latin/InputLanguageSelection.java b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
similarity index 81%
rename from src/com/android/inputmethod/latin/InputLanguageSelection.java
rename to java/src/com/android/inputmethod/latin/InputLanguageSelection.java
index 73298e3..b5a1101 100644
--- a/src/com/android/inputmethod/latin/InputLanguageSelection.java
+++ b/java/src/com/android/inputmethod/latin/InputLanguageSelection.java
@@ -23,6 +23,8 @@
 
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
+import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
 import android.preference.PreferenceActivity;
@@ -34,6 +36,9 @@
 
     private String mSelectedLanguages;
     private ArrayList<Loc> mAvailableLanguages = new ArrayList<Loc>();
+    private static final String[] BLACKLIST_LANGUAGES = {
+        "ko", "ja", "zh", "el"
+    };
 
     private static class Loc implements Comparable {
         static Collator sCollator = Collator.getInstance();
@@ -72,6 +77,9 @@
             pref.setTitle(LanguageSwitcher.toTitleCase(locale.getDisplayName(locale)));
             boolean checked = isLocaleIn(locale, languageList);
             pref.setChecked(checked);
+            if (hasDictionary(locale)) {
+                pref.setSummary(R.string.has_dictionary);
+            }
             parent.addPreference(pref);
         }
     }
@@ -89,6 +97,25 @@
         return false;
     }
 
+    private boolean hasDictionary(Locale locale) {
+        Resources res = getResources();
+        Configuration conf = res.getConfiguration();
+        Locale saveLocale = conf.locale;
+        boolean haveDictionary = false;
+        conf.locale = locale;
+        res.updateConfiguration(conf, res.getDisplayMetrics());
+        BinaryDictionary bd = new BinaryDictionary(this, R.raw.main);
+        // Is the dictionary larger than a placeholder? Arbitrarily chose a lower limit of
+        // 4000-5000 words, whereas the LARGE_DICTIONARY is about 20000+ words.
+        if (bd.getSize() > Suggest.LARGE_DICTIONARY_THRESHOLD / 4) {
+            haveDictionary = true;
+        }
+        bd.close();
+        conf.locale = saveLocale;
+        res.updateConfiguration(conf, res.getDisplayMetrics());
+        return haveDictionary;
+    }
+
     private String get5Code(Locale locale) {
         String country = locale.getCountry();
         return locale.getLanguage()
@@ -137,6 +164,9 @@
                 String country = s.substring(3, 5);
                 Locale l = new Locale(language, country);
 
+                // Exclude languages that are not relevant to LatinIME
+                if (arrayContains(BLACKLIST_LANGUAGES, language)) continue;
+
                 if (finalSize == 0) {
                     preprocess[finalSize++] =
                             new Loc(LanguageSwitcher.toTitleCase(l.getDisplayName(l)), l);
@@ -167,4 +197,11 @@
         }
         return uniqueLocales;
     }
+
+    private boolean arrayContains(String[] array, String value) {
+        for (int i = 0; i < array.length; i++) {
+            if (array[i].equalsIgnoreCase(value)) return true;
+        }
+        return false;
+    }
 }
diff --git a/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
similarity index 99%
rename from src/com/android/inputmethod/latin/KeyboardSwitcher.java
rename to java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index 4322997..1a19644 100644
--- a/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -147,8 +147,7 @@
         public boolean equals(KeyboardId other) {
           return other.mXml == this.mXml
               && other.mKeyboardMode == this.mKeyboardMode
-              && other.mEnableShiftLock == this.mEnableShiftLock
-              && other.mHasVoice == this.mHasVoice;
+              && other.mEnableShiftLock == this.mEnableShiftLock;
         }
 
         public int hashCode() {
diff --git a/src/com/android/inputmethod/latin/LanguageSwitcher.java b/java/src/com/android/inputmethod/latin/LanguageSwitcher.java
similarity index 100%
rename from src/com/android/inputmethod/latin/LanguageSwitcher.java
rename to java/src/com/android/inputmethod/latin/LanguageSwitcher.java
diff --git a/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
similarity index 92%
rename from src/com/android/inputmethod/latin/LatinIME.java
rename to java/src/com/android/inputmethod/latin/LatinIME.java
index 4c81b33..d0baed5 100644
--- a/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
- *
+ * Copyright (C) 2008 The Android Open Source Project
+ * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
@@ -39,7 +39,7 @@
 import android.os.Message;
 import android.os.SystemClock;
 import android.preference.PreferenceManager;
-import android.speech.RecognitionManager;
+import android.speech.SpeechRecognizer;
 import android.text.AutoText;
 import android.text.ClipboardManager;
 import android.text.TextUtils;
@@ -50,6 +50,8 @@
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewParent;
+import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
 import android.view.inputmethod.CompletionInfo;
@@ -156,13 +158,14 @@
 
     private UserDictionary mUserDictionary;
     private ContactsDictionary mContactsDictionary;
-    private ExpandableDictionary mAutoDictionary;
+    private AutoDictionary mAutoDictionary;
 
     private Hints mHints;
 
     Resources mResources;
 
-    private String mLocale;
+    private String mInputLocale;
+    private String mSystemLocale;
     private LanguageSwitcher mLanguageSwitcher;
 
     private StringBuilder mComposing = new StringBuilder();
@@ -221,6 +224,10 @@
     private VoiceInput mVoiceInput;
     private VoiceResults mVoiceResults = new VoiceResults();
     private long mSwipeTriggerTimeMillis;
+    private boolean mConfigurationChanging;
+
+    // Keeps track of most recently inserted text (multi-character key) for reverting
+    private CharSequence mEnteredText;
 
     // For each word, a list of potential replacements, usually from voice.
     private Map<String, List<CharSequence>> mWordToSuggestions =
@@ -230,6 +237,7 @@
         List<String> candidates;
         Map<String, List<CharSequence>> alternatives;
     }
+
     private boolean mRefreshKeyboardRequired;
 
     Handler mHandler = new Handler() {
@@ -274,7 +282,7 @@
         mLanguageSwitcher.loadLocales(prefs);
         mKeyboardSwitcher = new KeyboardSwitcher(this, this);
         mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher);
-        boolean enableMultipleLanguages = mLanguageSwitcher.getLocaleCount() > 0;
+        mSystemLocale = conf.locale.toString();
         String inputLanguage = mLanguageSwitcher.getInputLanguage();
         if (inputLanguage == null) {
             inputLanguage = conf.locale.toString();
@@ -303,7 +311,7 @@
     }
 
     private void initSuggest(String locale) {
-        mLocale = locale;
+        mInputLocale = locale;
 
         Resources orig = getResources();
         Configuration conf = orig.getConfiguration();
@@ -318,14 +326,14 @@
         mSuggest = new Suggest(this, R.raw.main);
         updateAutoTextEnabled(saveLocale);
         if (mUserDictionary != null) mUserDictionary.close();
-        mUserDictionary = new UserDictionary(this, mLocale);
+        mUserDictionary = new UserDictionary(this, mInputLocale);
         if (mContactsDictionary == null) {
             mContactsDictionary = new ContactsDictionary(this);
         }
         if (mAutoDictionary != null) {
             mAutoDictionary.close();
         }
-        mAutoDictionary = new AutoDictionary(this, this, mLocale);
+        mAutoDictionary = new AutoDictionary(this, this, mInputLocale);
         mSuggest.setUserDictionary(mUserDictionary);
         mSuggest.setContactsDictionary(mContactsDictionary);
         mSuggest.setAutoDictionary(mAutoDictionary);
@@ -351,10 +359,12 @@
     @Override
     public void onConfigurationChanged(Configuration conf) {
         // If the system locale changes and is different from the saved
-        // locale (mLocale), then reload the input locale list from the 
+        // locale (mSystemLocale), then reload the input locale list from the
         // latin ime settings (shared prefs) and reset the input locale
         // to the first one.
-        if (!TextUtils.equals(conf.locale.toString(), mLocale)) {
+        final String systemLocale = conf.locale.toString();
+        if (!TextUtils.equals(systemLocale, mSystemLocale)) {
+            mSystemLocale = systemLocale;
             if (mLanguageSwitcher != null) {
                 mLanguageSwitcher.loadLocales(
                         PreferenceManager.getDefaultSharedPreferences(this));
@@ -371,7 +381,12 @@
             mOrientation = conf.orientation;
             reloadKeyboards();
         }
+        mConfigurationChanging = true;
         super.onConfigurationChanged(conf);
+        if (mRecognizing) {
+            switchToRecognitionStatusView();
+        }
+        mConfigurationChanging = false;
     }
 
     @Override
@@ -388,21 +403,6 @@
     }
 
     @Override
-    public void onInitializeInterface() {
-        // Create a new view associated with voice input if the old
-        // view is stuck in another layout (e.g. if switching from
-        // portrait to landscape while speaking)
-        // NOTE: This must be done here because for some reason
-        // onCreateInputView isn't called after an orientation change while
-        // speech rec is in progress.
-        if (mVoiceInput != null && mVoiceInput.getView().getParent() != null) {
-            mVoiceInput.newView();
-        }
-
-        super.onInitializeInterface();
-    }
-
-    @Override
     public View onCreateCandidatesView() {
         mKeyboardSwitcher.makeKeyboards(true);
         mCandidateViewContainer = (CandidateViewContainer) getLayoutInflater().inflate(
@@ -455,6 +455,8 @@
         mCompletions = null;
         mCapsLock = false;
         mEmailText = false;
+        mEnteredText = null;
+
         switch (attribute.inputType & EditorInfo.TYPE_MASK_CLASS) {
             case EditorInfo.TYPE_CLASS_NUMBER:
             case EditorInfo.TYPE_CLASS_DATETIME:
@@ -534,6 +536,7 @@
         mDeleteCount = 0;
         mJustAddedAutoSpace = false;
         loadSettings();
+        updateShiftKeyState(attribute);
 
         setCandidatesViewShown(false);
         setSuggestions(null, false, false, false);
@@ -553,20 +556,18 @@
     public void onFinishInput() {
         super.onFinishInput();
 
-        if (VOICE_INSTALLED && mAfterVoiceInput) {
-            mVoiceInput.logInputEnded();
-        }
-
-        if (VOICE_INSTALLED) {
+        if (VOICE_INSTALLED && !mConfigurationChanging) {
+            if (mAfterVoiceInput) {
+                mVoiceInput.flushAllTextModificationCounters();
+                mVoiceInput.logInputEnded();
+            }
             mVoiceInput.flushLogs();
+            mVoiceInput.cancel();
         }
-
         if (mInputView != null) {
             mInputView.closing();
         }
-        if (VOICE_INSTALLED && mRecognizing) {
-            mVoiceInput.cancel();
-        }
+        if (mAutoDictionary != null) mAutoDictionary.flushPendingWrites();
     }
 
     @Override
@@ -574,8 +575,6 @@
         super.onUpdateExtractedText(token, text);
         InputConnection ic = getCurrentInputConnection();
         if (!mImmediatelyAfterVoiceInput && mAfterVoiceInput && ic != null) {
-            mVoiceInput.logTextModified();
-
             if (mHints.showPunctuationHintIfNecessary(ic)) {
                 mVoiceInput.logPunctuationHintDisplayed();
             }
@@ -599,6 +598,11 @@
                     + ", ce=" + candidatesEnd);
         }
 
+        if (mAfterVoiceInput) {
+            mVoiceInput.setCursorPos(newSelEnd);
+            mVoiceInput.setSelectionSpan(newSelEnd - newSelStart);
+        }
+
         mSuggestionShouldReplaceCurrentWord = false;
         // If the current selection in the text view changes, we should
         // clear whatever candidate text we have.
@@ -653,23 +657,21 @@
 
     @Override
     public void hideWindow() {
-        if (mAfterVoiceInput) mVoiceInput.logInputEnded();
         if (TRACE) Debug.stopMethodTracing();
         if (mOptionsDialog != null && mOptionsDialog.isShowing()) {
             mOptionsDialog.dismiss();
             mOptionsDialog = null;
         }
-        if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) {
-            mVoiceInput.logKeyboardWarningDialogDismissed();
-            mVoiceWarningDialog.dismiss();
-            mVoiceWarningDialog = null;
-        }
-        if (mTutorial != null) {
-            mTutorial.close();
-            mTutorial = null;
-        }
-        if (VOICE_INSTALLED & mRecognizing) {
-            mVoiceInput.cancel();
+        if (!mConfigurationChanging) {
+            if (mAfterVoiceInput) mVoiceInput.logInputEnded();
+            if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) {
+                mVoiceInput.logKeyboardWarningDialogDismissed();
+                mVoiceWarningDialog.dismiss();
+                mVoiceWarningDialog = null;
+            }
+            if (VOICE_INSTALLED & mRecognizing) {
+                mVoiceInput.cancel();
+            }
         }
         super.hideWindow();
         TextEntryState.endSession();
@@ -706,7 +708,8 @@
     public void setCandidatesViewShown(boolean shown) {
         // TODO: Remove this if we support candidates with hard keyboard
         if (onEvaluateInputViewShown()) {
-            super.setCandidatesViewShown(shown);
+            // Show the candidates view only if input view is showing
+            super.setCandidatesViewShown(shown && mInputView != null && mInputView.isShown());
         }
     }
 
@@ -983,6 +986,8 @@
         if (mKeyboardSwitcher.onKey(primaryCode)) {
             changeKeyboardMode();
         }
+        // Reset after any single keystroke
+        mEnteredText = null;
     }
 
     public void onText(CharSequence text) {
@@ -1001,16 +1006,32 @@
         updateShiftKeyState(getCurrentInputEditorInfo());
         mJustRevertedSeparator = null;
         mJustAddedAutoSpace = false;
+        mEnteredText = text;
     }
 
     private void handleBackspace() {
         if (VOICE_INSTALLED && mVoiceInputHighlighted) {
+            mVoiceInput.incrementTextModificationDeleteCount(
+                    mVoiceResults.candidates.get(0).toString().length());
             revertVoiceInput();
             return;
         }
         boolean deleteChar = false;
         InputConnection ic = getCurrentInputConnection();
         if (ic == null) return;
+
+        if (mAfterVoiceInput) {
+            // Don't log delete if the user is pressing delete at
+            // the beginning of the text box (hence not deleting anything)
+            if (mVoiceInput.getCursorPos() > 0) {
+                // If anything was selected before the delete was pressed, increment the
+                // delete count by the length of the selection
+                int deleteLen  =  mVoiceInput.getSelectionSpan() > 0 ?
+                        mVoiceInput.getSelectionSpan() : 1;
+                mVoiceInput.incrementTextModificationDeleteCount(deleteLen);
+            }
+        }
+
         if (mPredicting) {
             final int length = mComposing.length();
             if (length > 0) {
@@ -1032,6 +1053,8 @@
         if (TextEntryState.getState() == TextEntryState.STATE_UNDO_COMMIT) {
             revertLastWord(deleteChar);
             return;
+        } else if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) {
+            ic.deleteSurroundingText(mEnteredText.length(), 0);
         } else if (deleteChar) {
             sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL);
             if (mDeleteCount > DELETE_ACCELERATE_AT) {
@@ -1056,6 +1079,12 @@
         if (VOICE_INSTALLED && mVoiceInputHighlighted) {
             commitVoiceInput();
         }
+
+        if (mAfterVoiceInput) {
+            // Assume input length is 1. This assumption fails for smiley face insertions.
+            mVoiceInput.incrementTextModificationInsertCount(1);
+        }
+
         if (isAlphabet(primaryCode) && isPredictionOn() && !isCursorTouchingWord()) {
             if (!mPredicting) {
                 mPredicting = true;
@@ -1099,6 +1128,12 @@
         if (VOICE_INSTALLED && mVoiceInputHighlighted) {
             commitVoiceInput();
         }
+
+        if (mAfterVoiceInput){
+            // Assume input length is 1. This assumption fails for smiley face insertions.
+            mVoiceInput.incrementTextModificationInsertPunctuationCount(1);
+        }
+
         boolean pickedDefault = false;
         // Handle separator
         InputConnection ic = getCurrentInputConnection();
@@ -1210,12 +1245,21 @@
     }
 
     private void switchToRecognitionStatusView() {
-      mHandler.post(new Runnable() {
-          public void run() {
-              mRecognizing = true;
-              setInputView(mVoiceInput.getView());
-              updateInputViewShown();
-          }});
+        final boolean configChanged = mConfigurationChanging;
+        mHandler.post(new Runnable() {
+            public void run() {
+                mRecognizing = true;
+                View v = mVoiceInput.getView();
+                ViewParent p = v.getParent();
+                if (p != null && p instanceof ViewGroup) {
+                    ((ViewGroup)v.getParent()).removeView(v);
+                }
+                setInputView(v);
+                updateInputViewShown();
+                if (configChanged) {
+                    mVoiceInput.onConfigurationChanged();
+                }
+        }});
     }
 
     private void startListening(boolean swipe) {
@@ -1343,7 +1387,7 @@
 
         String bestResult = nBest.get(0).toString();
 
-        mVoiceInput.logVoiceInputDelivered();
+        mVoiceInput.logVoiceInputDelivered(bestResult.length());
 
         mHints.registerVoiceResult(bestResult);
 
@@ -1404,7 +1448,7 @@
 
         ((LatinKeyboard) mInputView.getKeyboard()).setPreferredLetters(nextLettersFrequencies);
 
-        boolean correctionAvailable = mSuggest.hasMinimalCorrection();
+        boolean correctionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasMinimalCorrection();
         //|| mCorrectionMode == mSuggest.CORRECTION_FULL;
         CharSequence typedWord = mWord.getTypedWord();
         // If we're in basic correct
@@ -1435,7 +1479,7 @@
             mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS);
             updateSuggestions();
         }
-        if (mBestWord != null) {
+        if (mBestWord != null && mBestWord.length() > 0) {
             TextEntryState.acceptedDefault(mWord.getTypedWord(), mBestWord);
             mJustAccepted = true;
             pickSuggestion(mBestWord);
@@ -1447,6 +1491,12 @@
     public void pickSuggestionManually(int index, CharSequence suggestion) {
         if (mAfterVoiceInput && mShowingVoiceSuggestions) mVoiceInput.logNBestChoose(index);
 
+        if (mAfterVoiceInput && !mShowingVoiceSuggestions) {
+            mVoiceInput.flushAllTextModificationCounters();
+            // send this intent AFTER logging any prior aggregated edits.
+            mVoiceInput.logTextModifiedByChooseSuggestion(suggestion.length());
+        }
+
         InputConnection ic = getCurrentInputConnection();
         if (ic != null) {
             ic.beginBatchEdit();
@@ -1479,7 +1529,9 @@
         mJustAccepted = true;
         pickSuggestion(suggestion);
         // Add the word to the auto dictionary if it's not a known word
-        checkAddToDictionary(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED);
+        if (index == 0) {
+            checkAddToDictionary(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED);
+        }
         TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion);
         // Follow it with a space
         if (mAutoSpace) {
@@ -1525,8 +1577,13 @@
     }
 
     private void checkAddToDictionary(CharSequence suggestion, int frequencyDelta) {
+        // Only auto-add to dictionary if auto-correct is ON. Otherwise we'll be
+        // adding words in situations where the user or application really didn't
+        // want corrections enabled or learned.
+        if (!(mCorrectionMode == Suggest.CORRECTION_FULL)) return;
         if (mAutoDictionary.isValidWord(suggestion)
-                || !mSuggest.isValidWord(suggestion.toString().toLowerCase())) {
+                || (!mSuggest.isValidWord(suggestion.toString())
+                    && !mSuggest.isValidWord(suggestion.toString().toLowerCase()))) {
             mAutoDictionary.addWord(suggestion.toString(), frequencyDelta);
         }
     }
@@ -1547,6 +1604,11 @@
         return false;
     }
 
+    private boolean sameAsTextBeforeCursor(InputConnection ic, CharSequence text) {
+        CharSequence beforeText = ic.getTextBeforeCursor(text.length(), 0);
+        return TextUtils.equals(text, beforeText);
+    }
+
     public void revertLastWord(boolean deleteChar) {
         final int length = mComposing.length();
         if (!mPredicting && length > 0) {
@@ -1678,7 +1740,7 @@
         return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext)
                 && !(attribute != null && attribute.privateImeOptions != null
                         && attribute.privateImeOptions.equals(IME_OPTION_NO_MICROPHONE))
-                && RecognitionManager.isRecognitionAvailable(this);
+                && SpeechRecognizer.isRecognitionAvailable(this);
     }
 
     // receive ringer mode changes to detect silent mode
@@ -1736,7 +1798,7 @@
             return;
         }
         if (mInputView != null) {
-            mInputView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
+            mInputView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP,
                     HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
         }
     }
@@ -1785,7 +1847,8 @@
 
     private void updateAutoTextEnabled(Locale systemLocale) {
         if (mSuggest == null) return;
-        boolean different = !systemLocale.getLanguage().equalsIgnoreCase(mLocale.substring(0, 2));
+        boolean different =
+                !systemLocale.getLanguage().equalsIgnoreCase(mInputLocale.substring(0, 2));
         mSuggest.setAutoTextEnabled(!different && mQuickFixes);
     }
 
@@ -1824,7 +1887,7 @@
         ArrayList<String> voiceInputSupportedLocales =
                 newArrayList(supportedLocalesString.split("\\s+"));
 
-        mLocaleSupportedForVoiceInput = voiceInputSupportedLocales.contains(mLocale);
+        mLocaleSupportedForVoiceInput = voiceInputSupportedLocales.contains(mInputLocale);
 
         mShowSuggestions = sp.getBoolean(PREF_SHOW_SUGGESTIONS, true);
 
diff --git a/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java b/java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java
similarity index 79%
rename from src/com/android/inputmethod/latin/LatinIMEBackupAgent.java
rename to java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java
index b6a800e..568b31d 100644
--- a/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java
+++ b/java/src/com/android/inputmethod/latin/LatinIMEBackupAgent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -16,13 +16,13 @@
 
 package com.android.inputmethod.latin;
 
-import android.backup.BackupHelperAgent;
-import android.backup.SharedPreferencesBackupHelper;
+import android.app.backup.BackupAgentHelper;
+import android.app.backup.SharedPreferencesBackupHelper;
 
 /**
  * Backs up the Latin IME shared preferences.
  */
-public class LatinIMEBackupAgent extends BackupHelperAgent {
+public class LatinIMEBackupAgent extends BackupAgentHelper {
 
     public void onCreate() {
         addHelper("shared_pref", new SharedPreferencesBackupHelper(this,
diff --git a/src/com/android/inputmethod/latin/LatinIMESettings.java b/java/src/com/android/inputmethod/latin/LatinIMESettings.java
similarity index 97%
rename from src/com/android/inputmethod/latin/LatinIMESettings.java
rename to java/src/com/android/inputmethod/latin/LatinIMESettings.java
index 82f5d54..21b9674 100644
--- a/src/com/android/inputmethod/latin/LatinIMESettings.java
+++ b/java/src/com/android/inputmethod/latin/LatinIMESettings.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
- *
+ * Copyright (C) 2008 The Android Open Source Project
+ * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
@@ -21,7 +21,7 @@
 
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.backup.BackupManager;
+import android.app.backup.BackupManager;
 import android.content.DialogInterface;
 import android.content.SharedPreferences;
 import android.os.Bundle;
@@ -31,7 +31,7 @@
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceGroup;
 import android.preference.Preference.OnPreferenceClickListener;
-import android.speech.RecognitionManager;
+import android.speech.SpeechRecognizer;
 import android.text.AutoText;
 import android.util.Log;
 
@@ -88,7 +88,7 @@
                     .removePreference(mQuickFixes);
         }
         if (!LatinIME.VOICE_INSTALLED
-                || !RecognitionManager.isRecognitionAvailable(this)) {
+                || !SpeechRecognizer.isRecognitionAvailable(this)) {
             getPreferenceScreen().removePreference(mVoicePreference);
         } else {
             updateVoiceModeSummary();
diff --git a/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
similarity index 99%
rename from src/com/android/inputmethod/latin/LatinKeyboard.java
rename to java/src/com/android/inputmethod/latin/LatinKeyboard.java
index 58e1dc7..32cd8a4 100644
--- a/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
diff --git a/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
similarity index 64%
rename from src/com/android/inputmethod/latin/LatinKeyboardView.java
rename to java/src/com/android/inputmethod/latin/LatinKeyboardView.java
index 2686a93..74fc475 100644
--- a/src/com/android/inputmethod/latin/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -23,6 +23,7 @@
 import android.graphics.Paint;
 import android.inputmethodservice.Keyboard;
 import android.inputmethodservice.KeyboardView;
+import android.inputmethodservice.KeyboardView.OnKeyboardActionListener;
 import android.inputmethodservice.Keyboard.Key;
 import android.os.Handler;
 import android.os.Message;
@@ -43,10 +44,27 @@
 
     private Keyboard mPhoneKeyboard;
 
+    /** Whether the extension of this keyboard is visible */
     private boolean mExtensionVisible;
+    /** The view that is shown as an extension of this keyboard view */
     private LatinKeyboardView mExtension;
+    /** The popup window that contains the extension of this keyboard */
     private PopupWindow mExtensionPopup;
+    /** Whether this view is an extension of another keyboard */
+    private boolean mIsExtensionType;
     private boolean mFirstEvent;
+    /** Whether we've started dropping move events because we found a big jump */
+    private boolean mDroppingEvents;
+    /** 
+     * Whether multi-touch disambiguation needs to be disabled for any reason. There are 2 reasons
+     * for this to happen - (1) if a real multi-touch event has occured and (2) we've opened an 
+     * extension keyboard.
+     */
+    private boolean mDisableDisambiguation;
+    /** The distance threshold at which we start treating the touch session as a multi-touch */
+    private int mJumpThresholdSquare = Integer.MAX_VALUE;
+    /** The y coordinate of the last row */
+    private int mLastRowY;
 
     public LatinKeyboardView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -61,6 +79,17 @@
     }
 
     @Override
+    public void setKeyboard(Keyboard k) {
+        super.setKeyboard(k);
+        // One-seventh of the keyboard width seems like a reasonable threshold
+        mJumpThresholdSquare = k.getMinWidth() / 7;
+        mJumpThresholdSquare *= mJumpThresholdSquare;
+        // Assuming there are 4 rows, this is the coordinate of the last row
+        mLastRowY = (k.getHeight() * 3) / 4;
+        setKeyboardLocal(k);
+    }
+
+    @Override
     protected boolean onLongPress(Key key) {
         if (key.codes[0] == Keyboard.KEYCODE_MODE_CHANGE) {
             getOnKeyboardActionListener().onKey(KEYCODE_OPTIONS, null);
@@ -78,6 +107,83 @@
         }
     }
 
+    /**
+     * This function checks to see if we need to handle any sudden jumps in the pointer location
+     * that could be due to a multi-touch being treated as a move by the firmware or hardware.
+     * Once a sudden jump is detected, all subsequent move events are discarded
+     * until an UP is received.<P>
+     * When a sudden jump is detected, an UP event is simulated at the last position and when 
+     * the sudden moves subside, a DOWN event is simulated for the second key.
+     * @param me the motion event
+     * @return true if the event was consumed, so that it doesn't continue to be handled by 
+     * KeyboardView.
+     */
+    private boolean handleSuddenJump(MotionEvent me) {
+        final int action = me.getAction();
+        final int x = (int) me.getX();
+        final int y = (int) me.getY();
+        boolean result = false;
+
+        // Real multi-touch event? Stop looking for sudden jumps
+        if (me.getPointerCount() > 1) {
+            mDisableDisambiguation = true;
+        }
+        if (mDisableDisambiguation) {
+            // If UP, reset the multi-touch flag
+            if (action == MotionEvent.ACTION_UP) mDisableDisambiguation = false;
+            return false;
+        }
+
+        switch (action) {
+        case MotionEvent.ACTION_DOWN:
+            // Reset the "session"
+            mDroppingEvents = false;
+            mDisableDisambiguation = false;
+            break;
+        case MotionEvent.ACTION_MOVE:
+            // Is this a big jump?
+            final int distanceSquare = (mLastX - x) * (mLastX - x) + (mLastY - y) * (mLastY - y);
+            // Check the distance and also if the move is not entirely within the bottom row
+            // If it's only in the bottom row, it might be an intentional slide gesture
+            // for language switching
+            if (distanceSquare > mJumpThresholdSquare
+                    && (mLastY < mLastRowY || y < mLastRowY)) {
+                // If we're not yet dropping events, start dropping and send an UP event
+                if (!mDroppingEvents) {
+                    mDroppingEvents = true;
+                    // Send an up event
+                    MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
+                            MotionEvent.ACTION_UP,
+                            mLastX, mLastY, me.getMetaState());
+                    super.onTouchEvent(translated);
+                    translated.recycle();
+                }
+                result = true;
+            } else if (mDroppingEvents) {
+                // If moves are small and we're already dropping events, continue dropping
+                result = true;
+            }
+            break;
+        case MotionEvent.ACTION_UP:
+            if (mDroppingEvents) {
+                // Send a down event first, as we dropped a bunch of sudden jumps and assume that
+                // the user is releasing the touch on the second key.
+                MotionEvent translated = MotionEvent.obtain(me.getEventTime(), me.getEventTime(),
+                        MotionEvent.ACTION_DOWN,
+                        x, y, me.getMetaState());
+                super.onTouchEvent(translated);
+                translated.recycle();
+                mDroppingEvents = false;
+                // Let the up event get processed as well, result = false
+            }
+            break;
+        }
+        // Track the previous coordinate
+        mLastX = x;
+        mLastY = y;
+        return result;
+    }
+
     @Override
     public boolean onTouchEvent(MotionEvent me) {
         LatinKeyboard keyboard = (LatinKeyboard) getKeyboard();
@@ -86,6 +192,12 @@
             mLastY = (int) me.getY();
             invalidate();
         }
+
+        // If an extension keyboard is visible or this is an extension keyboard, don't look
+        // for sudden jumps. Otherwise, if there was a sudden jump, return without processing the
+        // actual motion event.
+        if (!mExtensionVisible && !mIsExtensionType
+                && handleSuddenJump(me)) return true;
         // Reset any bounding box controls in the keyboard
         if (me.getAction() == MotionEvent.ACTION_DOWN) {
             keyboard.keyReleased();
@@ -107,7 +219,9 @@
         if (keyboard.getExtension() == 0) {
             return super.onTouchEvent(me);
         }
-        if (me.getY() < 0) {
+        // If the motion event is above the keyboard and it's not an UP event coming
+        // even before the first MOVE event into the extension area
+        if (me.getY() < 0 && (mExtensionVisible || me.getAction() != MotionEvent.ACTION_UP)) {
             if (mExtensionVisible) {
                 int action = me.getAction();
                 if (mFirstEvent) action = MotionEvent.ACTION_DOWN;
@@ -139,6 +253,8 @@
                     } else {
                         mFirstEvent = true;
                     }
+                    // Stop processing multi-touch errors
+                    mDisableDisambiguation  = true;
                 }
                 return true;
             }
@@ -157,7 +273,15 @@
         }
     }
 
+    private void setExtensionType(boolean isExtensionType) {
+        mIsExtensionType = isExtensionType;
+    }
+
     private boolean openExtension() {
+        // If the current keyboard is not visible, don't show the popup
+        if (!isShown()) {
+            return false;
+        }
         if (((LatinKeyboard) getKeyboard()).getExtension() == 0) return false;
         makePopupWindow();
         mExtensionVisible = true;
@@ -172,7 +296,9 @@
             LayoutInflater li = (LayoutInflater) getContext().getSystemService(
                     Context.LAYOUT_INFLATER_SERVICE);
             mExtension = (LatinKeyboardView) li.inflate(R.layout.input_trans, null);
-            mExtension.setOnKeyboardActionListener((LatinIME) getContext());
+            mExtension.setExtensionType(true);
+            mExtension.setOnKeyboardActionListener(
+                    new ExtensionKeyboardListener(getOnKeyboardActionListener()));
             mExtension.setPopupParent(this);
             mExtension.setPopupOffset(0, -windowLocation[1]);
             Keyboard keyboard;
@@ -181,6 +307,7 @@
             mExtensionPopup.setContentView(mExtension);
             mExtensionPopup.setWidth(getWidth());
             mExtensionPopup.setHeight(keyboard.getHeight());
+            mExtensionPopup.setAnimationStyle(-1);
             getLocationInWindow(windowLocation);
             // TODO: Fix the "- 30". 
             mExtension.setPopupOffset(0, -windowLocation[1] - 30);
@@ -201,11 +328,42 @@
     }
 
     private void closeExtension() {
-        mExtension.setVisibility(INVISIBLE);
         mExtension.closing();
+        mExtension.setVisibility(INVISIBLE);
         mExtensionVisible = false;
     }
 
+    private static class ExtensionKeyboardListener implements OnKeyboardActionListener {
+        private OnKeyboardActionListener mTarget;
+        ExtensionKeyboardListener(OnKeyboardActionListener target) {
+            mTarget = target;
+        }
+        public void onKey(int primaryCode, int[] keyCodes) {
+            mTarget.onKey(primaryCode, keyCodes);
+        }
+        public void onPress(int primaryCode) {
+            mTarget.onPress(primaryCode);
+        }
+        public void onRelease(int primaryCode) {
+            mTarget.onRelease(primaryCode);
+        }
+        public void onText(CharSequence text) {
+            mTarget.onText(text);
+        }
+        public void swipeDown() {
+            // Don't pass through
+        }
+        public void swipeLeft() {
+            // Don't pass through
+        }
+        public void swipeRight() {
+            // Don't pass through
+        }
+        public void swipeUp() {
+            // Don't pass through
+        }
+    }
+
     /****************************  INSTRUMENTATION  *******************************/
 
     static final boolean DEBUG_AUTO_PLAY = false;
@@ -224,9 +382,7 @@
     private int mLastY;
     private Paint mPaint;
 
-    @Override
-    public void setKeyboard(Keyboard k) {
-        super.setKeyboard(k);
+    private void setKeyboardLocal(Keyboard k) {
         if (DEBUG_AUTO_PLAY) {
             findKeys();
             if (mHandler2 == null) {
diff --git a/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
similarity index 96%
rename from src/com/android/inputmethod/latin/Suggest.java
rename to java/src/com/android/inputmethod/latin/Suggest.java
index 712b9cf..a70bea0 100755
--- a/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -39,7 +39,7 @@
     public static final int CORRECTION_BASIC = 1;
     public static final int CORRECTION_FULL = 2;
 
-    private static final int LARGE_DICTIONARY_THRESHOLD = 200 * 1000;
+    static final int LARGE_DICTIONARY_THRESHOLD = 200 * 1000;
 
     private BinaryDictionary mMainDict;
 
@@ -346,11 +346,10 @@
         if (word == null || word.length() == 0) {
             return false;
         }
-        return (mCorrectionMode == CORRECTION_FULL && mMainDict.isValidWord(word)) 
-                || (mCorrectionMode > CORRECTION_NONE && 
-                    ((mUserDictionary != null && mUserDictionary.isValidWord(word)))
-                     || (mAutoDictionary != null && mAutoDictionary.isValidWord(word))
-                     || (mContactsDictionary != null && mContactsDictionary.isValidWord(word)));
+        return mMainDict.isValidWord(word)
+                || (mUserDictionary != null && mUserDictionary.isValidWord(word))
+                || (mAutoDictionary != null && mAutoDictionary.isValidWord(word))
+                || (mContactsDictionary != null && mContactsDictionary.isValidWord(word));
     }
     
     private void collectGarbage() {
diff --git a/src/com/android/inputmethod/latin/TextEntryState.java b/java/src/com/android/inputmethod/latin/TextEntryState.java
similarity index 99%
rename from src/com/android/inputmethod/latin/TextEntryState.java
rename to java/src/com/android/inputmethod/latin/TextEntryState.java
index c5e8ad9..d056ceb 100644
--- a/src/com/android/inputmethod/latin/TextEntryState.java
+++ b/java/src/com/android/inputmethod/latin/TextEntryState.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
diff --git a/src/com/android/inputmethod/latin/Tutorial.java b/java/src/com/android/inputmethod/latin/Tutorial.java
similarity index 99%
rename from src/com/android/inputmethod/latin/Tutorial.java
rename to java/src/com/android/inputmethod/latin/Tutorial.java
index 03d4858..a812331 100644
--- a/src/com/android/inputmethod/latin/Tutorial.java
+++ b/java/src/com/android/inputmethod/latin/Tutorial.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
diff --git a/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java
similarity index 90%
rename from src/com/android/inputmethod/latin/UserDictionary.java
rename to java/src/com/android/inputmethod/latin/UserDictionary.java
index 4b98eac..e8ca33a 100644
--- a/src/com/android/inputmethod/latin/UserDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserDictionary.java
@@ -16,16 +16,11 @@
 
 package com.android.inputmethod.latin;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
 import android.database.ContentObserver;
 import android.database.Cursor;
-import android.net.Uri;
 import android.provider.UserDictionary.Words;
 
 public class UserDictionary extends ExpandableDictionary {
@@ -40,8 +35,6 @@
     private static final int INDEX_FREQUENCY = 2;
     
     private ContentObserver mObserver;
-    
-    private boolean mRequiresReload;
     private String mLocale;
 
     public UserDictionary(Context context, String locale) {
@@ -54,26 +47,27 @@
         cres.registerContentObserver(Words.CONTENT_URI, true, mObserver = new ContentObserver(null) {
             @Override
             public void onChange(boolean self) {
-                mRequiresReload = true;
+                setRequiresReload(true);
             }
         });
 
         loadDictionary();
     }
-    
+
     public synchronized void close() {
         if (mObserver != null) {
             getContext().getContentResolver().unregisterContentObserver(mObserver);
             mObserver = null;
         }
+        super.close();
     }
-    
-    private synchronized void loadDictionary() {
+
+    @Override
+    public void loadDictionaryAsync() {
         Cursor cursor = getContext().getContentResolver()
                 .query(Words.CONTENT_URI, PROJECTION, "(locale IS NULL) or (locale=?)", 
                         new String[] { mLocale }, null);
         addWords(cursor);
-        mRequiresReload = false;
     }
 
     /**
@@ -86,7 +80,8 @@
      */
     @Override
     public synchronized void addWord(String word, int frequency) {
-        if (mRequiresReload) loadDictionary();
+        // Force load the dictionary here synchronously
+        if (getRequiresReload()) loadDictionaryAsync();
         // Safeguard against adding long words. Can cause stack overflow.
         if (word.length() >= getMaxWordLength()) return;
 
@@ -101,19 +96,17 @@
 
         getContext().getContentResolver().insert(Words.CONTENT_URI, values);
         // In case the above does a synchronous callback of the change observer
-        mRequiresReload = false;
+        setRequiresReload(false);
     }
 
     @Override
     public synchronized void getWords(final WordComposer codes, final WordCallback callback,
             int[] nextLettersFrequencies) {
-        if (mRequiresReload) loadDictionary();
         super.getWords(codes, callback, nextLettersFrequencies);
     }
 
     @Override
     public synchronized boolean isValidWord(CharSequence word) {
-        if (mRequiresReload) loadDictionary();
         return super.isValidWord(word);
     }
 
diff --git a/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
similarity index 86%
rename from src/com/android/inputmethod/latin/WordComposer.java
rename to java/src/com/android/inputmethod/latin/WordComposer.java
index e97cb24..19f714a 100644
--- a/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 The Android Open Source Project
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -84,11 +84,27 @@
      */
     public void add(int primaryCode, int[] codes) {
         mTypedWord.append((char) primaryCode);
+        correctPrimaryJuxtapos(primaryCode, codes);
         mCodes.add(codes);
         if (Character.isUpperCase((char) primaryCode)) mCapsCount++;
     }
 
     /**
+     * Swaps the first and second values in the codes array if the primary code is not the first
+     * value in the array but the second. This happens when the preferred key is not the key that
+     * the user released the finger on.
+     * @param primaryCode the preferred character
+     * @param codes array of codes based on distance from touch point
+     */
+    private void correctPrimaryJuxtapos(int primaryCode, int[] codes) {
+        if (codes.length < 2) return;
+        if (codes[0] > 0 && codes[1] > 0 && codes[0] != primaryCode && codes[1] == primaryCode) {
+            codes[1] = codes[0];
+            codes[0] = primaryCode;
+        }
+    }
+
+    /**
      * Delete the last keystroke as a result of hitting backspace.
      */
     public void deleteLast() {
diff --git a/src/com/android/inputmethod/voice/EditingUtil.java b/java/src/com/android/inputmethod/voice/EditingUtil.java
similarity index 100%
rename from src/com/android/inputmethod/voice/EditingUtil.java
rename to java/src/com/android/inputmethod/voice/EditingUtil.java
diff --git a/src/com/android/inputmethod/voice/FieldContext.java b/java/src/com/android/inputmethod/voice/FieldContext.java
similarity index 100%
rename from src/com/android/inputmethod/voice/FieldContext.java
rename to java/src/com/android/inputmethod/voice/FieldContext.java
diff --git a/src/com/android/inputmethod/voice/LatinIMEWithVoice.java b/java/src/com/android/inputmethod/voice/LatinIMEWithVoice.java
similarity index 100%
rename from src/com/android/inputmethod/voice/LatinIMEWithVoice.java
rename to java/src/com/android/inputmethod/voice/LatinIMEWithVoice.java
diff --git a/src/com/android/inputmethod/voice/LatinIMEWithVoiceSettings.java b/java/src/com/android/inputmethod/voice/LatinIMEWithVoiceSettings.java
similarity index 100%
rename from src/com/android/inputmethod/voice/LatinIMEWithVoiceSettings.java
rename to java/src/com/android/inputmethod/voice/LatinIMEWithVoiceSettings.java
diff --git a/src/com/android/inputmethod/voice/RecognitionView.java b/java/src/com/android/inputmethod/voice/RecognitionView.java
similarity index 94%
rename from src/com/android/inputmethod/voice/RecognitionView.java
rename to java/src/com/android/inputmethod/voice/RecognitionView.java
index 5d4a0e0..7cec0b0 100644
--- a/src/com/android/inputmethod/voice/RecognitionView.java
+++ b/java/src/com/android/inputmethod/voice/RecognitionView.java
@@ -16,7 +16,12 @@
 
 package com.android.inputmethod.voice;
 
-import com.android.inputmethod.latin.R;
+import java.io.ByteArrayOutputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.ShortBuffer;
+import java.util.ArrayList;
+import java.util.List;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -35,14 +40,10 @@
 import android.view.View.OnClickListener;
 import android.view.ViewGroup.MarginLayoutParams;
 import android.widget.ImageView;
+import android.widget.ProgressBar;
 import android.widget.TextView;
 
-import java.io.ByteArrayOutputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.ShortBuffer;
-import java.util.ArrayList;
-import java.util.List;
+import com.android.inputmethod.latin.R;
 
 /**
  * The user interface for the "Speak now" and "working" states.
@@ -103,7 +104,6 @@
         LayoutInflater inflater = (LayoutInflater) context.getSystemService(
             Context.LAYOUT_INFLATER_SERVICE);
         mView = inflater.inflate(R.layout.recognition_status, null);
-
         ContentResolver cr = context.getContentResolver();
         mMinMicrophoneLevel = SettingsUtil.getSettingsFloat(
                 cr, SettingsUtil.LATIN_IME_MIN_MICROPHONE_LEVEL, 15.f);
@@ -139,6 +139,18 @@
         return mView;
     }
 
+    public void restoreState() {
+        mUiHandler.post(new Runnable() {
+            public void run() {
+                // Restart the spinner
+                if (mState == State.WORKING) {
+                    ((ProgressBar)mProgress).setIndeterminate(false);
+                    ((ProgressBar)mProgress).setIndeterminate(true);
+                }
+            }
+        });
+    }
+
     public void showInitializing() {
         mUiHandler.post(new Runnable() {
             public void run() {
@@ -262,12 +274,11 @@
 
         final int count = (endIndex - startIndex) / numSamplePerWave;
         final float deltaX = 1.0f * w / count;
-        int yMax = h / 2 - 10;
+        int yMax = h / 2 - 8;
         Path path = new Path();
         c.translate(0, yMax);
         float x = 0;
         path.moveTo(x, 0);
-        yMax -= 10;
         for (int i = 0; i < count; i++) {
             final int avabs = getAverageAbs(waveBuffer, startIndex, i , numSamplePerWave);
             int sign = ( (i & 01) == 0) ? -1 : 1;
@@ -285,8 +296,8 @@
         mImage.setImageBitmap(b);
         mImage.setVisibility(View.VISIBLE);
         MarginLayoutParams mProgressParams = (MarginLayoutParams)mProgress.getLayoutParams();
-        mProgressParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
-                -h / 2 - 18, mContext.getResources().getDisplayMetrics());
+        mProgressParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,
+                -h , mContext.getResources().getDisplayMetrics());
 
         // Tweak the padding manually to fill out the whole view horizontally.
         // TODO: Do this in the xml layout instead.
diff --git a/src/com/android/inputmethod/voice/SettingsUtil.java b/java/src/com/android/inputmethod/voice/SettingsUtil.java
similarity index 100%
rename from src/com/android/inputmethod/voice/SettingsUtil.java
rename to java/src/com/android/inputmethod/voice/SettingsUtil.java
diff --git a/src/com/android/inputmethod/voice/VoiceInput.java b/java/src/com/android/inputmethod/voice/VoiceInput.java
similarity index 77%
rename from src/com/android/inputmethod/voice/VoiceInput.java
rename to java/src/com/android/inputmethod/voice/VoiceInput.java
index a2e2105..ac06ab5 100644
--- a/src/com/android/inputmethod/voice/VoiceInput.java
+++ b/java/src/com/android/inputmethod/voice/VoiceInput.java
@@ -26,7 +26,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.speech.RecognitionListener;
-import android.speech.RecognitionManager;
+import android.speech.SpeechRecognizer;
 import android.speech.RecognizerIntent;
 import android.util.Log;
 import android.view.View;
@@ -94,6 +94,12 @@
     public static final int WORKING = 2;
     public static final int ERROR = 3;
 
+    private int mAfterVoiceInputDeleteCount = 0;
+    private int mAfterVoiceInputInsertCount = 0;
+    private int mAfterVoiceInputInsertPunctuationCount = 0;
+    private int mAfterVoiceInputCursorPos = 0;
+    private int mAfterVoiceInputSelectionSpan = 0;
+
     private int mState = DEFAULT;
     
     private final static int MSG_CLOSE_ERROR_DIALOG = 1;
@@ -128,7 +134,7 @@
         public void onCancelVoice();
     }
 
-    private RecognitionManager mRecognitionManager;
+    private SpeechRecognizer mSpeechRecognizer;
     private RecognitionListener mRecognitionListener;
     private RecognitionView mRecognitionView;
     private UiListener mUiListener;
@@ -141,8 +147,8 @@
     public VoiceInput(Context context, UiListener uiHandler) {
         mLogger = VoiceInputLogger.getLogger(context);
         mRecognitionListener = new ImeRecognitionListener();
-        mRecognitionManager = RecognitionManager.createRecognitionManager(context);
-        mRecognitionManager.setRecognitionListener(mRecognitionListener);
+        mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(context);
+        mSpeechRecognizer.setRecognitionListener(mRecognitionListener);
         mUiListener = uiHandler;
         mContext = context;
         newView();
@@ -161,6 +167,95 @@
         mBlacklist.addApp("com.android.setupwizard");
     }
 
+    public void setCursorPos(int pos) {
+        mAfterVoiceInputCursorPos = pos;
+    }
+
+    public int getCursorPos() {
+        return mAfterVoiceInputCursorPos;
+    }
+
+    public void setSelectionSpan(int span) {
+        mAfterVoiceInputSelectionSpan = span;
+    }
+
+    public int getSelectionSpan() {
+        return mAfterVoiceInputSelectionSpan;
+    }
+
+    public void incrementTextModificationDeleteCount(int count){
+        mAfterVoiceInputDeleteCount += count;
+        // Send up intents for other text modification types
+        if (mAfterVoiceInputInsertCount > 0) {
+            logTextModifiedByTypingInsertion(mAfterVoiceInputInsertCount);
+            mAfterVoiceInputInsertCount = 0;
+        }
+        if (mAfterVoiceInputInsertPunctuationCount > 0) {
+            logTextModifiedByTypingInsertionPunctuation(mAfterVoiceInputInsertPunctuationCount);
+            mAfterVoiceInputInsertPunctuationCount = 0;
+        }
+
+    }
+
+    public void incrementTextModificationInsertCount(int count){
+        mAfterVoiceInputInsertCount += count;
+        if (mAfterVoiceInputSelectionSpan > 0) {
+            // If text was highlighted before inserting the char, count this as
+            // a delete.
+            mAfterVoiceInputDeleteCount += mAfterVoiceInputSelectionSpan;
+        }
+        // Send up intents for other text modification types
+        if (mAfterVoiceInputDeleteCount > 0) {
+            logTextModifiedByTypingDeletion(mAfterVoiceInputDeleteCount);
+            mAfterVoiceInputDeleteCount = 0;
+        }
+        if (mAfterVoiceInputInsertPunctuationCount > 0) {
+            logTextModifiedByTypingInsertionPunctuation(mAfterVoiceInputInsertPunctuationCount);
+            mAfterVoiceInputInsertPunctuationCount = 0;
+        }
+    }
+
+    public void incrementTextModificationInsertPunctuationCount(int count){
+        mAfterVoiceInputInsertPunctuationCount += 1;
+        if (mAfterVoiceInputSelectionSpan > 0) {
+            // If text was highlighted before inserting the char, count this as
+            // a delete.
+            mAfterVoiceInputDeleteCount += mAfterVoiceInputSelectionSpan;
+        }
+        // Send up intents for aggregated non-punctuation insertions
+        if (mAfterVoiceInputDeleteCount > 0) {
+            logTextModifiedByTypingDeletion(mAfterVoiceInputDeleteCount);
+            mAfterVoiceInputDeleteCount = 0;
+        }
+        if (mAfterVoiceInputInsertCount > 0) {
+            logTextModifiedByTypingInsertion(mAfterVoiceInputInsertCount);
+            mAfterVoiceInputInsertCount = 0;
+        }
+    }
+
+    public void flushAllTextModificationCounters() {
+        if (mAfterVoiceInputInsertCount > 0) {
+            logTextModifiedByTypingInsertion(mAfterVoiceInputInsertCount);
+            mAfterVoiceInputInsertCount = 0;
+        }
+        if (mAfterVoiceInputDeleteCount > 0) {
+            logTextModifiedByTypingDeletion(mAfterVoiceInputDeleteCount);
+            mAfterVoiceInputDeleteCount = 0;
+        }
+        if (mAfterVoiceInputInsertPunctuationCount > 0) {
+            logTextModifiedByTypingInsertionPunctuation(mAfterVoiceInputInsertPunctuationCount);
+            mAfterVoiceInputInsertPunctuationCount = 0;
+        }
+    }
+
+    /**
+     * The configuration of the IME changed and may have caused the views to be layed out
+     * again. Restore the state of the recognition view.
+     */
+    public void onConfigurationChanged() {
+        mRecognitionView.restoreState();
+    }
+
     /**
      * @return true if field is blacklisted for voice
      */
@@ -239,7 +334,7 @@
                 EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS,
                 null  /* rely on endpointer default */);
 
-        mRecognitionManager.startListening(intent);
+        mSpeechRecognizer.startListening(intent);
     }
 
     /**
@@ -262,7 +357,7 @@
     }
 
     public void destroy() {
-        mRecognitionManager.destroy();
+        mSpeechRecognizer.destroy();
     }
 
     /**
@@ -294,8 +389,20 @@
         }
     }
 
-    public void logTextModified() {
-        mLogger.textModified();
+    public void logTextModifiedByTypingInsertion(int length) {
+        mLogger.textModifiedByTypingInsertion(length);
+    }
+
+    public void logTextModifiedByTypingInsertionPunctuation(int length) {
+        mLogger.textModifiedByTypingInsertionPunctuation(length);
+    }
+
+    public void logTextModifiedByTypingDeletion(int length) {
+        mLogger.textModifiedByTypingDeletion(length);
+    }
+
+    public void logTextModifiedByChooseSuggestion(int length) {
+        mLogger.textModifiedByChooseSuggestion(length);
     }
 
     public void logKeyboardWarningDialogShown() {
@@ -322,8 +429,8 @@
         mLogger.punctuationHintDisplayed();
     }
 
-    public void logVoiceInputDelivered() {
-        mLogger.voiceInputDelivered();
+    public void logVoiceInputDelivered(int length) {
+        mLogger.voiceInputDelivered(length);
     }
 
     public void logNBestChoose(int index) {
@@ -377,7 +484,7 @@
         // Remove all pending tasks (e.g., timers to cancel voice input)
         mHandler.removeMessages(MSG_CLOSE_ERROR_DIALOG);
 
-        mRecognitionManager.cancel();
+        mSpeechRecognizer.cancel();
         mUiListener.onCancelVoice();
         mRecognitionView.finish();
     }
@@ -385,20 +492,20 @@
     private int getErrorStringId(int errorType, boolean endpointed) {
         switch (errorType) {
             // We use CLIENT_ERROR to signify that voice search is not available on the device.
-            case RecognitionManager.ERROR_CLIENT:
+            case SpeechRecognizer.ERROR_CLIENT:
                 return R.string.voice_not_installed;
-            case RecognitionManager.ERROR_NETWORK:
+            case SpeechRecognizer.ERROR_NETWORK:
                 return R.string.voice_network_error;
-            case RecognitionManager.ERROR_NETWORK_TIMEOUT:
+            case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
                 return endpointed ?
                         R.string.voice_network_error : R.string.voice_too_much_speech;
-            case RecognitionManager.ERROR_AUDIO:
+            case SpeechRecognizer.ERROR_AUDIO:
                 return R.string.voice_audio_error;
-            case RecognitionManager.ERROR_SERVER:
+            case SpeechRecognizer.ERROR_SERVER:
                 return R.string.voice_server_error;
-            case RecognitionManager.ERROR_SPEECH_TIMEOUT:
+            case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
                 return R.string.voice_speech_timeout;
-            case RecognitionManager.ERROR_NO_MATCH:
+            case SpeechRecognizer.ERROR_NO_MATCH:
                 return R.string.voice_no_match;
             default: return R.string.voice_error;
         }
@@ -455,7 +562,7 @@
 
         public void onResults(Bundle resultsBundle) {
             List<String> results = resultsBundle
-                    .getStringArrayList(RecognitionManager.RESULTS_RECOGNITION);
+                    .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
             mState = DEFAULT;
 
             final Map<String, List<CharSequence>> alternatives =
diff --git a/src/com/android/inputmethod/voice/VoiceInputLogger.java b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
similarity index 76%
rename from src/com/android/inputmethod/voice/VoiceInputLogger.java
rename to java/src/com/android/inputmethod/voice/VoiceInputLogger.java
index 6590333..9d3a920 100644
--- a/src/com/android/inputmethod/voice/VoiceInputLogger.java
+++ b/java/src/com/android/inputmethod/voice/VoiceInputLogger.java
@@ -147,12 +147,43 @@
         mContext.sendBroadcast(i);
     }
     
-    public void voiceInputDelivered() {
-        mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.VOICE_INPUT_DELIVERED));
+    public void voiceInputDelivered(int length) {
+        Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.VOICE_INPUT_DELIVERED);
+        i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
+        mContext.sendBroadcast(i);
     }
 
-    public void textModified() {
-        mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED));
+    public void textModifiedByTypingInsertion(int length) {
+        Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
+        i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
+        i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
+                LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_TYPING_INSERTION);
+        mContext.sendBroadcast(i);
+    }
+
+    public void textModifiedByTypingInsertionPunctuation(int length) {
+        Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
+        i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
+        i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
+                LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_TYPING_INSERTION_PUNCTUATION);
+        mContext.sendBroadcast(i);
+    }
+
+    public void textModifiedByTypingDeletion(int length) {
+        Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
+        i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
+        i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
+                LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_TYPING_DELETION);
+
+        mContext.sendBroadcast(i);
+    }
+
+    public void textModifiedByChooseSuggestion(int length) {
+        Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
+        i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
+        i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
+                LoggingEvents.VoiceIme.TEXT_MODIFIED_TYPE_CHOOSE_SUGGESTION);
+        mContext.sendBroadcast(i);
     }
 
     public void nBestChoose(int index) {
diff --git a/src/com/android/inputmethod/voice/WaveformImage.java b/java/src/com/android/inputmethod/voice/WaveformImage.java
similarity index 100%
rename from src/com/android/inputmethod/voice/WaveformImage.java
rename to java/src/com/android/inputmethod/voice/WaveformImage.java
diff --git a/src/com/android/inputmethod/voice/Whitelist.java b/java/src/com/android/inputmethod/voice/Whitelist.java
similarity index 100%
rename from src/com/android/inputmethod/voice/Whitelist.java
rename to java/src/com/android/inputmethod/voice/Whitelist.java
diff --git a/src/com/google/android/voicesearch/LatinIMEWithVoice.java b/java/src/com/google/android/voicesearch/LatinIMEWithVoice.java
similarity index 100%
rename from src/com/google/android/voicesearch/LatinIMEWithVoice.java
rename to java/src/com/google/android/voicesearch/LatinIMEWithVoice.java
diff --git a/src/com/google/android/voicesearch/LatinIMEWithVoiceSettings.java b/java/src/com/google/android/voicesearch/LatinIMEWithVoiceSettings.java
similarity index 100%
rename from src/com/google/android/voicesearch/LatinIMEWithVoiceSettings.java
rename to java/src/com/google/android/voicesearch/LatinIMEWithVoiceSettings.java
diff --git a/dictionary/Android.mk b/native/Android.mk
similarity index 66%
rename from dictionary/Android.mk
rename to native/Android.mk
index 9ba9f75..9524484 100644
--- a/dictionary/Android.mk
+++ b/native/Android.mk
@@ -5,22 +5,14 @@
 
 LOCAL_SRC_FILES := \
 	jni/com_android_inputmethod_latin_BinaryDictionary.cpp \
-	src/dictionary.cpp
+	src/dictionary.cpp \
+	src/char_utils.cpp
 
 LOCAL_C_INCLUDES += \
-    external/icu4c/common \
 	$(JNI_H_INCLUDE)
 
-LOCAL_LDLIBS := -lm
-
 LOCAL_PRELINK_MODULE := false
 
-LOCAL_SHARED_LIBRARIES := \
-    libandroid_runtime \
-    libcutils \
-    libutils \
-    libicuuc
-
 LOCAL_MODULE := libjni_latinime
 
 LOCAL_MODULE_TAGS := user
diff --git a/dictionary/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
similarity index 69%
rename from dictionary/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
rename to native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index d068f3f..bb45cb5 100644
--- a/dictionary/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -15,31 +15,18 @@
 ** limitations under the License.
 */
 
-#define LOG_TAG "BinaryDictionary"
-#include "utils/Log.h"
-
 #include <stdio.h>
 #include <assert.h>
 #include <unistd.h>
 #include <fcntl.h>
 
-#include <nativehelper/jni.h>
-#include "utils/AssetManager.h"
-#include "utils/Asset.h"
-
+#include <jni.h>
 #include "dictionary.h"
 
 // ----------------------------------------------------------------------------
 
 using namespace latinime;
 
-using namespace android;
-
-static jfieldID sDescriptorField;
-static jfieldID sAssetManagerNativeField;
-static jmethodID sAddWordMethod;
-static jfieldID sDictLength;
-
 //
 // helper function to throw an exception
 //
@@ -54,35 +41,15 @@
 }
 
 static jint latinime_BinaryDictionary_open
-        (JNIEnv *env, jobject object, jobject assetManager, jstring resourceString,
+        (JNIEnv *env, jobject object, jobject dictDirectBuffer,
          jint typedLetterMultiplier, jint fullWordMultiplier)
 {
-    // Get the native file descriptor from the FileDescriptor object
-    AssetManager *am = (AssetManager*) env->GetIntField(assetManager, sAssetManagerNativeField);
-    if (!am) {
-        LOGE("DICT: Couldn't get AssetManager native peer\n");
-        return 0;
-    }
-    const char *resourcePath = env->GetStringUTFChars(resourceString, NULL);
-
-    Asset *dictAsset = am->openNonAsset(resourcePath, Asset::ACCESS_BUFFER);
-    if (dictAsset == NULL) {
-        LOGE("DICT: Couldn't get asset %s\n", resourcePath);
-        env->ReleaseStringUTFChars(resourceString, resourcePath);
-        return 0;
-    }
-
-    void *dict = (void*) dictAsset->getBuffer(false);
+    void *dict = env->GetDirectBufferAddress(dictDirectBuffer);
     if (dict == NULL) {
-        LOGE("DICT: Dictionary buffer is null\n");
-        env->ReleaseStringUTFChars(resourceString, resourcePath);
+        fprintf(stderr, "DICT: Dictionary buffer is null\n");
         return 0;
     }
     Dictionary *dictionary = new Dictionary(dict, typedLetterMultiplier, fullWordMultiplier);
-    dictionary->setAsset(dictAsset);
-    env->SetIntField(object, sDictLength, (jint) dictAsset->getLength());
-
-    env->ReleaseStringUTFChars(resourceString, resourcePath);
     return (jint) dictionary;
 }
 
@@ -131,14 +98,13 @@
         (JNIEnv *env, jobject object, jint dict)
 {
     Dictionary *dictionary = (Dictionary*) dict;
-    ((Asset*) dictionary->getAsset())->close();
     delete (Dictionary*) dict;
 }
 
 // ----------------------------------------------------------------------------
 
 static JNINativeMethod gMethods[] = {
-    {"openNative",           "(Landroid/content/res/AssetManager;Ljava/lang/String;II)I",
+    {"openNative",           "(Ljava/nio/ByteBuffer;II)I",
                                           (void*)latinime_BinaryDictionary_open},
     {"closeNative",          "(I)V",            (void*)latinime_BinaryDictionary_close},
     {"getSuggestionsNative", "(I[II[C[IIIII[II)I",  (void*)latinime_BinaryDictionary_getSuggestions},
@@ -167,30 +133,6 @@
 static int registerNatives(JNIEnv *env)
 {
     const char* const kClassPathName = "com/android/inputmethod/latin/BinaryDictionary";
-    jclass clazz;
-
-    clazz = env->FindClass("java/io/FileDescriptor");
-    if (clazz == NULL) {
-        LOGE("Can't find %s", "java/io/FileDescriptor");
-        return -1;
-    }
-    sDescriptorField = env->GetFieldID(clazz, "descriptor", "I");
-
-    clazz = env->FindClass("android/content/res/AssetManager");
-    if (clazz == NULL) {
-        LOGE("Can't find %s", "java/io/FileDescriptor");
-        return -1;
-    }
-    sAssetManagerNativeField = env->GetFieldID(clazz, "mObject", "I");
-
-    // Get the field pointer for the dictionary length
-    clazz = env->FindClass(kClassPathName);
-    if (clazz == NULL) {
-        LOGE("Can't find %s", kClassPathName);
-        return -1;
-    }
-    sDictLength = env->GetFieldID(clazz, "mDictLength", "I");
-
     return registerNativeMethods(env,
             kClassPathName, gMethods, sizeof(gMethods) / sizeof(gMethods[0]));
 }
diff --git a/dictionary/src/basechars.h b/native/src/basechars.h
similarity index 100%
rename from dictionary/src/basechars.h
rename to native/src/basechars.h
diff --git a/native/src/char_utils.cpp b/native/src/char_utils.cpp
new file mode 100644
index 0000000..a31a063
--- /dev/null
+++ b/native/src/char_utils.cpp
@@ -0,0 +1,899 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+
+namespace latinime {
+
+struct LatinCapitalSmallPair {
+  unsigned short capital;
+  unsigned short small;
+};
+
+// Generated from http://unicode.org/Public/UNIDATA/UnicodeData.txt
+//
+// 1. Run the following code.  Bascially taken from
+//    Dictionary::toLowerCase(unsigned short c) in dictionary.cpp.
+//    Then, get the list of chars where cc != ccc.
+//
+//    unsigned short c, cc, ccc, ccc2;
+//    for (c = 0; c < 0xFFFF ; c++) {
+//        if (c < sizeof(BASE_CHARS) / sizeof(BASE_CHARS[0])) {
+//            cc = BASE_CHARS[c];
+//        } else {
+//            cc = c;
+//        }
+//
+//        // tolower
+//        int isBase = 0;
+//        if (cc >='A' && cc <= 'Z') {
+//            ccc = (cc | 0x20);
+//            ccc2 = ccc;
+//            isBase = 1;
+//        } else if (cc > 0x7F) {
+//            ccc = u_tolower(cc);
+//            ccc2 = latin_tolower(cc);
+//        } else {
+//            ccc = cc;
+//            ccc2 = ccc;
+//        }
+//        if (!isBase && cc != ccc) {
+//            wprintf(L" 0x%04X => 0x%04X => 0x%04X  %lc => %lc => %lc \n",
+//                    c, cc, ccc, c, cc, ccc);
+//            //assert(ccc == ccc2);
+//        }
+//    }
+//
+//    Initially, started with an empty latin_tolower() as below.
+//
+//    unsigned short latin_tolower(unsigned short c) {
+//        return c;
+//    }
+//
+//
+// 2. Process the list obtained by 1 by the following perl script and apply
+//    'sort -u' as well.  Get the SORTED_CHAR_MAP[].
+//    Note that '$1' in the perl script is 'cc' in the above C code.
+//
+//    while(<>) {
+//        / 0x\w* => 0x(\w*) =/;
+//        open(HDL, "grep -iw ^" . $1 . " UnicodeData.txt | ");
+//        $line = <HDL>;
+//        chomp $line;
+//        @cols = split(/;/, $line);
+//        print "    { 0x$1, 0x$cols[13] },  // $cols[1]\n";
+//    }
+//
+//
+// 3. Update the latin_tolower() function above with SORTED_CHAR_MAP.  Enable
+//    the assert(ccc == ccc2) above and confirm the function exits successfully.
+//
+static const struct LatinCapitalSmallPair SORTED_CHAR_MAP[] = {
+    { 0x00C4, 0x00E4 },  // LATIN CAPITAL LETTER A WITH DIAERESIS
+    { 0x00C5, 0x00E5 },  // LATIN CAPITAL LETTER A WITH RING ABOVE
+    { 0x00C6, 0x00E6 },  // LATIN CAPITAL LETTER AE
+    { 0x00D0, 0x00F0 },  // LATIN CAPITAL LETTER ETH
+    { 0x00D5, 0x00F5 },  // LATIN CAPITAL LETTER O WITH TILDE
+    { 0x00D6, 0x00F6 },  // LATIN CAPITAL LETTER O WITH DIAERESIS
+    { 0x00D8, 0x00F8 },  // LATIN CAPITAL LETTER O WITH STROKE
+    { 0x00DC, 0x00FC },  // LATIN CAPITAL LETTER U WITH DIAERESIS
+    { 0x00DE, 0x00FE },  // LATIN CAPITAL LETTER THORN
+    { 0x0110, 0x0111 },  // LATIN CAPITAL LETTER D WITH STROKE
+    { 0x0126, 0x0127 },  // LATIN CAPITAL LETTER H WITH STROKE
+    { 0x0141, 0x0142 },  // LATIN CAPITAL LETTER L WITH STROKE
+    { 0x014A, 0x014B },  // LATIN CAPITAL LETTER ENG
+    { 0x0152, 0x0153 },  // LATIN CAPITAL LIGATURE OE
+    { 0x0166, 0x0167 },  // LATIN CAPITAL LETTER T WITH STROKE
+    { 0x0181, 0x0253 },  // LATIN CAPITAL LETTER B WITH HOOK
+    { 0x0182, 0x0183 },  // LATIN CAPITAL LETTER B WITH TOPBAR
+    { 0x0184, 0x0185 },  // LATIN CAPITAL LETTER TONE SIX
+    { 0x0186, 0x0254 },  // LATIN CAPITAL LETTER OPEN O
+    { 0x0187, 0x0188 },  // LATIN CAPITAL LETTER C WITH HOOK
+    { 0x0189, 0x0256 },  // LATIN CAPITAL LETTER AFRICAN D
+    { 0x018A, 0x0257 },  // LATIN CAPITAL LETTER D WITH HOOK
+    { 0x018B, 0x018C },  // LATIN CAPITAL LETTER D WITH TOPBAR
+    { 0x018E, 0x01DD },  // LATIN CAPITAL LETTER REVERSED E
+    { 0x018F, 0x0259 },  // LATIN CAPITAL LETTER SCHWA
+    { 0x0190, 0x025B },  // LATIN CAPITAL LETTER OPEN E
+    { 0x0191, 0x0192 },  // LATIN CAPITAL LETTER F WITH HOOK
+    { 0x0193, 0x0260 },  // LATIN CAPITAL LETTER G WITH HOOK
+    { 0x0194, 0x0263 },  // LATIN CAPITAL LETTER GAMMA
+    { 0x0196, 0x0269 },  // LATIN CAPITAL LETTER IOTA
+    { 0x0197, 0x0268 },  // LATIN CAPITAL LETTER I WITH STROKE
+    { 0x0198, 0x0199 },  // LATIN CAPITAL LETTER K WITH HOOK
+    { 0x019C, 0x026F },  // LATIN CAPITAL LETTER TURNED M
+    { 0x019D, 0x0272 },  // LATIN CAPITAL LETTER N WITH LEFT HOOK
+    { 0x019F, 0x0275 },  // LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+    { 0x01A2, 0x01A3 },  // LATIN CAPITAL LETTER OI
+    { 0x01A4, 0x01A5 },  // LATIN CAPITAL LETTER P WITH HOOK
+    { 0x01A6, 0x0280 },  // LATIN LETTER YR
+    { 0x01A7, 0x01A8 },  // LATIN CAPITAL LETTER TONE TWO
+    { 0x01A9, 0x0283 },  // LATIN CAPITAL LETTER ESH
+    { 0x01AC, 0x01AD },  // LATIN CAPITAL LETTER T WITH HOOK
+    { 0x01AE, 0x0288 },  // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+    { 0x01B1, 0x028A },  // LATIN CAPITAL LETTER UPSILON
+    { 0x01B2, 0x028B },  // LATIN CAPITAL LETTER V WITH HOOK
+    { 0x01B3, 0x01B4 },  // LATIN CAPITAL LETTER Y WITH HOOK
+    { 0x01B5, 0x01B6 },  // LATIN CAPITAL LETTER Z WITH STROKE
+    { 0x01B7, 0x0292 },  // LATIN CAPITAL LETTER EZH
+    { 0x01B8, 0x01B9 },  // LATIN CAPITAL LETTER EZH REVERSED
+    { 0x01BC, 0x01BD },  // LATIN CAPITAL LETTER TONE FIVE
+    { 0x01E4, 0x01E5 },  // LATIN CAPITAL LETTER G WITH STROKE
+    { 0x01EA, 0x01EB },  // LATIN CAPITAL LETTER O WITH OGONEK
+    { 0x01F6, 0x0195 },  // LATIN CAPITAL LETTER HWAIR
+    { 0x01F7, 0x01BF },  // LATIN CAPITAL LETTER WYNN
+    { 0x021C, 0x021D },  // LATIN CAPITAL LETTER YOGH
+    { 0x0220, 0x019E },  // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+    { 0x0222, 0x0223 },  // LATIN CAPITAL LETTER OU
+    { 0x0224, 0x0225 },  // LATIN CAPITAL LETTER Z WITH HOOK
+    { 0x0226, 0x0227 },  // LATIN CAPITAL LETTER A WITH DOT ABOVE
+    { 0x022E, 0x022F },  // LATIN CAPITAL LETTER O WITH DOT ABOVE
+    { 0x023A, 0x2C65 },  // LATIN CAPITAL LETTER A WITH STROKE
+    { 0x023B, 0x023C },  // LATIN CAPITAL LETTER C WITH STROKE
+    { 0x023D, 0x019A },  // LATIN CAPITAL LETTER L WITH BAR
+    { 0x023E, 0x2C66 },  // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+    { 0x0241, 0x0242 },  // LATIN CAPITAL LETTER GLOTTAL STOP
+    { 0x0243, 0x0180 },  // LATIN CAPITAL LETTER B WITH STROKE
+    { 0x0244, 0x0289 },  // LATIN CAPITAL LETTER U BAR
+    { 0x0245, 0x028C },  // LATIN CAPITAL LETTER TURNED V
+    { 0x0246, 0x0247 },  // LATIN CAPITAL LETTER E WITH STROKE
+    { 0x0248, 0x0249 },  // LATIN CAPITAL LETTER J WITH STROKE
+    { 0x024A, 0x024B },  // LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+    { 0x024C, 0x024D },  // LATIN CAPITAL LETTER R WITH STROKE
+    { 0x024E, 0x024F },  // LATIN CAPITAL LETTER Y WITH STROKE
+    { 0x0370, 0x0371 },  // GREEK CAPITAL LETTER HETA
+    { 0x0372, 0x0373 },  // GREEK CAPITAL LETTER ARCHAIC SAMPI
+    { 0x0376, 0x0377 },  // GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+    { 0x0391, 0x03B1 },  // GREEK CAPITAL LETTER ALPHA
+    { 0x0392, 0x03B2 },  // GREEK CAPITAL LETTER BETA
+    { 0x0393, 0x03B3 },  // GREEK CAPITAL LETTER GAMMA
+    { 0x0394, 0x03B4 },  // GREEK CAPITAL LETTER DELTA
+    { 0x0395, 0x03B5 },  // GREEK CAPITAL LETTER EPSILON
+    { 0x0396, 0x03B6 },  // GREEK CAPITAL LETTER ZETA
+    { 0x0397, 0x03B7 },  // GREEK CAPITAL LETTER ETA
+    { 0x0398, 0x03B8 },  // GREEK CAPITAL LETTER THETA
+    { 0x0399, 0x03B9 },  // GREEK CAPITAL LETTER IOTA
+    { 0x039A, 0x03BA },  // GREEK CAPITAL LETTER KAPPA
+    { 0x039B, 0x03BB },  // GREEK CAPITAL LETTER LAMDA
+    { 0x039C, 0x03BC },  // GREEK CAPITAL LETTER MU
+    { 0x039D, 0x03BD },  // GREEK CAPITAL LETTER NU
+    { 0x039E, 0x03BE },  // GREEK CAPITAL LETTER XI
+    { 0x039F, 0x03BF },  // GREEK CAPITAL LETTER OMICRON
+    { 0x03A0, 0x03C0 },  // GREEK CAPITAL LETTER PI
+    { 0x03A1, 0x03C1 },  // GREEK CAPITAL LETTER RHO
+    { 0x03A3, 0x03C3 },  // GREEK CAPITAL LETTER SIGMA
+    { 0x03A4, 0x03C4 },  // GREEK CAPITAL LETTER TAU
+    { 0x03A5, 0x03C5 },  // GREEK CAPITAL LETTER UPSILON
+    { 0x03A6, 0x03C6 },  // GREEK CAPITAL LETTER PHI
+    { 0x03A7, 0x03C7 },  // GREEK CAPITAL LETTER CHI
+    { 0x03A8, 0x03C8 },  // GREEK CAPITAL LETTER PSI
+    { 0x03A9, 0x03C9 },  // GREEK CAPITAL LETTER OMEGA
+    { 0x03CF, 0x03D7 },  // GREEK CAPITAL KAI SYMBOL
+    { 0x03D8, 0x03D9 },  // GREEK LETTER ARCHAIC KOPPA
+    { 0x03DA, 0x03DB },  // GREEK LETTER STIGMA
+    { 0x03DC, 0x03DD },  // GREEK LETTER DIGAMMA
+    { 0x03DE, 0x03DF },  // GREEK LETTER KOPPA
+    { 0x03E0, 0x03E1 },  // GREEK LETTER SAMPI
+    { 0x03E2, 0x03E3 },  // COPTIC CAPITAL LETTER SHEI
+    { 0x03E4, 0x03E5 },  // COPTIC CAPITAL LETTER FEI
+    { 0x03E6, 0x03E7 },  // COPTIC CAPITAL LETTER KHEI
+    { 0x03E8, 0x03E9 },  // COPTIC CAPITAL LETTER HORI
+    { 0x03EA, 0x03EB },  // COPTIC CAPITAL LETTER GANGIA
+    { 0x03EC, 0x03ED },  // COPTIC CAPITAL LETTER SHIMA
+    { 0x03EE, 0x03EF },  // COPTIC CAPITAL LETTER DEI
+    { 0x03F7, 0x03F8 },  // GREEK CAPITAL LETTER SHO
+    { 0x03FA, 0x03FB },  // GREEK CAPITAL LETTER SAN
+    { 0x03FD, 0x037B },  // GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+    { 0x03FE, 0x037C },  // GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+    { 0x03FF, 0x037D },  // GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+    { 0x0402, 0x0452 },  // CYRILLIC CAPITAL LETTER DJE
+    { 0x0404, 0x0454 },  // CYRILLIC CAPITAL LETTER UKRAINIAN IE
+    { 0x0405, 0x0455 },  // CYRILLIC CAPITAL LETTER DZE
+    { 0x0406, 0x0456 },  // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+    { 0x0408, 0x0458 },  // CYRILLIC CAPITAL LETTER JE
+    { 0x0409, 0x0459 },  // CYRILLIC CAPITAL LETTER LJE
+    { 0x040A, 0x045A },  // CYRILLIC CAPITAL LETTER NJE
+    { 0x040B, 0x045B },  // CYRILLIC CAPITAL LETTER TSHE
+    { 0x040F, 0x045F },  // CYRILLIC CAPITAL LETTER DZHE
+    { 0x0410, 0x0430 },  // CYRILLIC CAPITAL LETTER A
+    { 0x0411, 0x0431 },  // CYRILLIC CAPITAL LETTER BE
+    { 0x0412, 0x0432 },  // CYRILLIC CAPITAL LETTER VE
+    { 0x0413, 0x0433 },  // CYRILLIC CAPITAL LETTER GHE
+    { 0x0414, 0x0434 },  // CYRILLIC CAPITAL LETTER DE
+    { 0x0415, 0x0435 },  // CYRILLIC CAPITAL LETTER IE
+    { 0x0416, 0x0436 },  // CYRILLIC CAPITAL LETTER ZHE
+    { 0x0417, 0x0437 },  // CYRILLIC CAPITAL LETTER ZE
+    { 0x0418, 0x0438 },  // CYRILLIC CAPITAL LETTER I
+    { 0x041A, 0x043A },  // CYRILLIC CAPITAL LETTER KA
+    { 0x041B, 0x043B },  // CYRILLIC CAPITAL LETTER EL
+    { 0x041C, 0x043C },  // CYRILLIC CAPITAL LETTER EM
+    { 0x041D, 0x043D },  // CYRILLIC CAPITAL LETTER EN
+    { 0x041E, 0x043E },  // CYRILLIC CAPITAL LETTER O
+    { 0x041F, 0x043F },  // CYRILLIC CAPITAL LETTER PE
+    { 0x0420, 0x0440 },  // CYRILLIC CAPITAL LETTER ER
+    { 0x0421, 0x0441 },  // CYRILLIC CAPITAL LETTER ES
+    { 0x0422, 0x0442 },  // CYRILLIC CAPITAL LETTER TE
+    { 0x0423, 0x0443 },  // CYRILLIC CAPITAL LETTER U
+    { 0x0424, 0x0444 },  // CYRILLIC CAPITAL LETTER EF
+    { 0x0425, 0x0445 },  // CYRILLIC CAPITAL LETTER HA
+    { 0x0426, 0x0446 },  // CYRILLIC CAPITAL LETTER TSE
+    { 0x0427, 0x0447 },  // CYRILLIC CAPITAL LETTER CHE
+    { 0x0428, 0x0448 },  // CYRILLIC CAPITAL LETTER SHA
+    { 0x0429, 0x0449 },  // CYRILLIC CAPITAL LETTER SHCHA
+    { 0x042A, 0x044A },  // CYRILLIC CAPITAL LETTER HARD SIGN
+    { 0x042B, 0x044B },  // CYRILLIC CAPITAL LETTER YERU
+    { 0x042C, 0x044C },  // CYRILLIC CAPITAL LETTER SOFT SIGN
+    { 0x042D, 0x044D },  // CYRILLIC CAPITAL LETTER E
+    { 0x042E, 0x044E },  // CYRILLIC CAPITAL LETTER YU
+    { 0x042F, 0x044F },  // CYRILLIC CAPITAL LETTER YA
+    { 0x0460, 0x0461 },  // CYRILLIC CAPITAL LETTER OMEGA
+    { 0x0462, 0x0463 },  // CYRILLIC CAPITAL LETTER YAT
+    { 0x0464, 0x0465 },  // CYRILLIC CAPITAL LETTER IOTIFIED E
+    { 0x0466, 0x0467 },  // CYRILLIC CAPITAL LETTER LITTLE YUS
+    { 0x0468, 0x0469 },  // CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+    { 0x046A, 0x046B },  // CYRILLIC CAPITAL LETTER BIG YUS
+    { 0x046C, 0x046D },  // CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+    { 0x046E, 0x046F },  // CYRILLIC CAPITAL LETTER KSI
+    { 0x0470, 0x0471 },  // CYRILLIC CAPITAL LETTER PSI
+    { 0x0472, 0x0473 },  // CYRILLIC CAPITAL LETTER FITA
+    { 0x0474, 0x0475 },  // CYRILLIC CAPITAL LETTER IZHITSA
+    { 0x0478, 0x0479 },  // CYRILLIC CAPITAL LETTER UK
+    { 0x047A, 0x047B },  // CYRILLIC CAPITAL LETTER ROUND OMEGA
+    { 0x047C, 0x047D },  // CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+    { 0x047E, 0x047F },  // CYRILLIC CAPITAL LETTER OT
+    { 0x0480, 0x0481 },  // CYRILLIC CAPITAL LETTER KOPPA
+    { 0x048A, 0x048B },  // CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+    { 0x048C, 0x048D },  // CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+    { 0x048E, 0x048F },  // CYRILLIC CAPITAL LETTER ER WITH TICK
+    { 0x0490, 0x0491 },  // CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+    { 0x0492, 0x0493 },  // CYRILLIC CAPITAL LETTER GHE WITH STROKE
+    { 0x0494, 0x0495 },  // CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+    { 0x0496, 0x0497 },  // CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+    { 0x0498, 0x0499 },  // CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+    { 0x049A, 0x049B },  // CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+    { 0x049C, 0x049D },  // CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+    { 0x049E, 0x049F },  // CYRILLIC CAPITAL LETTER KA WITH STROKE
+    { 0x04A0, 0x04A1 },  // CYRILLIC CAPITAL LETTER BASHKIR KA
+    { 0x04A2, 0x04A3 },  // CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+    { 0x04A4, 0x04A5 },  // CYRILLIC CAPITAL LIGATURE EN GHE
+    { 0x04A6, 0x04A7 },  // CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+    { 0x04A8, 0x04A9 },  // CYRILLIC CAPITAL LETTER ABKHASIAN HA
+    { 0x04AA, 0x04AB },  // CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+    { 0x04AC, 0x04AD },  // CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+    { 0x04AE, 0x04AF },  // CYRILLIC CAPITAL LETTER STRAIGHT U
+    { 0x04B0, 0x04B1 },  // CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+    { 0x04B2, 0x04B3 },  // CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+    { 0x04B4, 0x04B5 },  // CYRILLIC CAPITAL LIGATURE TE TSE
+    { 0x04B6, 0x04B7 },  // CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+    { 0x04B8, 0x04B9 },  // CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+    { 0x04BA, 0x04BB },  // CYRILLIC CAPITAL LETTER SHHA
+    { 0x04BC, 0x04BD },  // CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+    { 0x04BE, 0x04BF },  // CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+    { 0x04C0, 0x04CF },  // CYRILLIC LETTER PALOCHKA
+    { 0x04C3, 0x04C4 },  // CYRILLIC CAPITAL LETTER KA WITH HOOK
+    { 0x04C5, 0x04C6 },  // CYRILLIC CAPITAL LETTER EL WITH TAIL
+    { 0x04C7, 0x04C8 },  // CYRILLIC CAPITAL LETTER EN WITH HOOK
+    { 0x04C9, 0x04CA },  // CYRILLIC CAPITAL LETTER EN WITH TAIL
+    { 0x04CB, 0x04CC },  // CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+    { 0x04CD, 0x04CE },  // CYRILLIC CAPITAL LETTER EM WITH TAIL
+    { 0x04D4, 0x04D5 },  // CYRILLIC CAPITAL LIGATURE A IE
+    { 0x04D8, 0x04D9 },  // CYRILLIC CAPITAL LETTER SCHWA
+    { 0x04E0, 0x04E1 },  // CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+    { 0x04E8, 0x04E9 },  // CYRILLIC CAPITAL LETTER BARRED O
+    { 0x04F6, 0x04F7 },  // CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+    { 0x04FA, 0x04FB },  // CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+    { 0x04FC, 0x04FD },  // CYRILLIC CAPITAL LETTER HA WITH HOOK
+    { 0x04FE, 0x04FF },  // CYRILLIC CAPITAL LETTER HA WITH STROKE
+    { 0x0500, 0x0501 },  // CYRILLIC CAPITAL LETTER KOMI DE
+    { 0x0502, 0x0503 },  // CYRILLIC CAPITAL LETTER KOMI DJE
+    { 0x0504, 0x0505 },  // CYRILLIC CAPITAL LETTER KOMI ZJE
+    { 0x0506, 0x0507 },  // CYRILLIC CAPITAL LETTER KOMI DZJE
+    { 0x0508, 0x0509 },  // CYRILLIC CAPITAL LETTER KOMI LJE
+    { 0x050A, 0x050B },  // CYRILLIC CAPITAL LETTER KOMI NJE
+    { 0x050C, 0x050D },  // CYRILLIC CAPITAL LETTER KOMI SJE
+    { 0x050E, 0x050F },  // CYRILLIC CAPITAL LETTER KOMI TJE
+    { 0x0510, 0x0511 },  // CYRILLIC CAPITAL LETTER REVERSED ZE
+    { 0x0512, 0x0513 },  // CYRILLIC CAPITAL LETTER EL WITH HOOK
+    { 0x0514, 0x0515 },  // CYRILLIC CAPITAL LETTER LHA
+    { 0x0516, 0x0517 },  // CYRILLIC CAPITAL LETTER RHA
+    { 0x0518, 0x0519 },  // CYRILLIC CAPITAL LETTER YAE
+    { 0x051A, 0x051B },  // CYRILLIC CAPITAL LETTER QA
+    { 0x051C, 0x051D },  // CYRILLIC CAPITAL LETTER WE
+    { 0x051E, 0x051F },  // CYRILLIC CAPITAL LETTER ALEUT KA
+    { 0x0520, 0x0521 },  // CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+    { 0x0522, 0x0523 },  // CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+    { 0x0524, 0x0525 },  // CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+    { 0x0531, 0x0561 },  // ARMENIAN CAPITAL LETTER AYB
+    { 0x0532, 0x0562 },  // ARMENIAN CAPITAL LETTER BEN
+    { 0x0533, 0x0563 },  // ARMENIAN CAPITAL LETTER GIM
+    { 0x0534, 0x0564 },  // ARMENIAN CAPITAL LETTER DA
+    { 0x0535, 0x0565 },  // ARMENIAN CAPITAL LETTER ECH
+    { 0x0536, 0x0566 },  // ARMENIAN CAPITAL LETTER ZA
+    { 0x0537, 0x0567 },  // ARMENIAN CAPITAL LETTER EH
+    { 0x0538, 0x0568 },  // ARMENIAN CAPITAL LETTER ET
+    { 0x0539, 0x0569 },  // ARMENIAN CAPITAL LETTER TO
+    { 0x053A, 0x056A },  // ARMENIAN CAPITAL LETTER ZHE
+    { 0x053B, 0x056B },  // ARMENIAN CAPITAL LETTER INI
+    { 0x053C, 0x056C },  // ARMENIAN CAPITAL LETTER LIWN
+    { 0x053D, 0x056D },  // ARMENIAN CAPITAL LETTER XEH
+    { 0x053E, 0x056E },  // ARMENIAN CAPITAL LETTER CA
+    { 0x053F, 0x056F },  // ARMENIAN CAPITAL LETTER KEN
+    { 0x0540, 0x0570 },  // ARMENIAN CAPITAL LETTER HO
+    { 0x0541, 0x0571 },  // ARMENIAN CAPITAL LETTER JA
+    { 0x0542, 0x0572 },  // ARMENIAN CAPITAL LETTER GHAD
+    { 0x0543, 0x0573 },  // ARMENIAN CAPITAL LETTER CHEH
+    { 0x0544, 0x0574 },  // ARMENIAN CAPITAL LETTER MEN
+    { 0x0545, 0x0575 },  // ARMENIAN CAPITAL LETTER YI
+    { 0x0546, 0x0576 },  // ARMENIAN CAPITAL LETTER NOW
+    { 0x0547, 0x0577 },  // ARMENIAN CAPITAL LETTER SHA
+    { 0x0548, 0x0578 },  // ARMENIAN CAPITAL LETTER VO
+    { 0x0549, 0x0579 },  // ARMENIAN CAPITAL LETTER CHA
+    { 0x054A, 0x057A },  // ARMENIAN CAPITAL LETTER PEH
+    { 0x054B, 0x057B },  // ARMENIAN CAPITAL LETTER JHEH
+    { 0x054C, 0x057C },  // ARMENIAN CAPITAL LETTER RA
+    { 0x054D, 0x057D },  // ARMENIAN CAPITAL LETTER SEH
+    { 0x054E, 0x057E },  // ARMENIAN CAPITAL LETTER VEW
+    { 0x054F, 0x057F },  // ARMENIAN CAPITAL LETTER TIWN
+    { 0x0550, 0x0580 },  // ARMENIAN CAPITAL LETTER REH
+    { 0x0551, 0x0581 },  // ARMENIAN CAPITAL LETTER CO
+    { 0x0552, 0x0582 },  // ARMENIAN CAPITAL LETTER YIWN
+    { 0x0553, 0x0583 },  // ARMENIAN CAPITAL LETTER PIWR
+    { 0x0554, 0x0584 },  // ARMENIAN CAPITAL LETTER KEH
+    { 0x0555, 0x0585 },  // ARMENIAN CAPITAL LETTER OH
+    { 0x0556, 0x0586 },  // ARMENIAN CAPITAL LETTER FEH
+    { 0x10A0, 0x2D00 },  // GEORGIAN CAPITAL LETTER AN
+    { 0x10A1, 0x2D01 },  // GEORGIAN CAPITAL LETTER BAN
+    { 0x10A2, 0x2D02 },  // GEORGIAN CAPITAL LETTER GAN
+    { 0x10A3, 0x2D03 },  // GEORGIAN CAPITAL LETTER DON
+    { 0x10A4, 0x2D04 },  // GEORGIAN CAPITAL LETTER EN
+    { 0x10A5, 0x2D05 },  // GEORGIAN CAPITAL LETTER VIN
+    { 0x10A6, 0x2D06 },  // GEORGIAN CAPITAL LETTER ZEN
+    { 0x10A7, 0x2D07 },  // GEORGIAN CAPITAL LETTER TAN
+    { 0x10A8, 0x2D08 },  // GEORGIAN CAPITAL LETTER IN
+    { 0x10A9, 0x2D09 },  // GEORGIAN CAPITAL LETTER KAN
+    { 0x10AA, 0x2D0A },  // GEORGIAN CAPITAL LETTER LAS
+    { 0x10AB, 0x2D0B },  // GEORGIAN CAPITAL LETTER MAN
+    { 0x10AC, 0x2D0C },  // GEORGIAN CAPITAL LETTER NAR
+    { 0x10AD, 0x2D0D },  // GEORGIAN CAPITAL LETTER ON
+    { 0x10AE, 0x2D0E },  // GEORGIAN CAPITAL LETTER PAR
+    { 0x10AF, 0x2D0F },  // GEORGIAN CAPITAL LETTER ZHAR
+    { 0x10B0, 0x2D10 },  // GEORGIAN CAPITAL LETTER RAE
+    { 0x10B1, 0x2D11 },  // GEORGIAN CAPITAL LETTER SAN
+    { 0x10B2, 0x2D12 },  // GEORGIAN CAPITAL LETTER TAR
+    { 0x10B3, 0x2D13 },  // GEORGIAN CAPITAL LETTER UN
+    { 0x10B4, 0x2D14 },  // GEORGIAN CAPITAL LETTER PHAR
+    { 0x10B5, 0x2D15 },  // GEORGIAN CAPITAL LETTER KHAR
+    { 0x10B6, 0x2D16 },  // GEORGIAN CAPITAL LETTER GHAN
+    { 0x10B7, 0x2D17 },  // GEORGIAN CAPITAL LETTER QAR
+    { 0x10B8, 0x2D18 },  // GEORGIAN CAPITAL LETTER SHIN
+    { 0x10B9, 0x2D19 },  // GEORGIAN CAPITAL LETTER CHIN
+    { 0x10BA, 0x2D1A },  // GEORGIAN CAPITAL LETTER CAN
+    { 0x10BB, 0x2D1B },  // GEORGIAN CAPITAL LETTER JIL
+    { 0x10BC, 0x2D1C },  // GEORGIAN CAPITAL LETTER CIL
+    { 0x10BD, 0x2D1D },  // GEORGIAN CAPITAL LETTER CHAR
+    { 0x10BE, 0x2D1E },  // GEORGIAN CAPITAL LETTER XAN
+    { 0x10BF, 0x2D1F },  // GEORGIAN CAPITAL LETTER JHAN
+    { 0x10C0, 0x2D20 },  // GEORGIAN CAPITAL LETTER HAE
+    { 0x10C1, 0x2D21 },  // GEORGIAN CAPITAL LETTER HE
+    { 0x10C2, 0x2D22 },  // GEORGIAN CAPITAL LETTER HIE
+    { 0x10C3, 0x2D23 },  // GEORGIAN CAPITAL LETTER WE
+    { 0x10C4, 0x2D24 },  // GEORGIAN CAPITAL LETTER HAR
+    { 0x10C5, 0x2D25 },  // GEORGIAN CAPITAL LETTER HOE
+    { 0x1E00, 0x1E01 },  // LATIN CAPITAL LETTER A WITH RING BELOW
+    { 0x1E02, 0x1E03 },  // LATIN CAPITAL LETTER B WITH DOT ABOVE
+    { 0x1E04, 0x1E05 },  // LATIN CAPITAL LETTER B WITH DOT BELOW
+    { 0x1E06, 0x1E07 },  // LATIN CAPITAL LETTER B WITH LINE BELOW
+    { 0x1E08, 0x1E09 },  // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+    { 0x1E0A, 0x1E0B },  // LATIN CAPITAL LETTER D WITH DOT ABOVE
+    { 0x1E0C, 0x1E0D },  // LATIN CAPITAL LETTER D WITH DOT BELOW
+    { 0x1E0E, 0x1E0F },  // LATIN CAPITAL LETTER D WITH LINE BELOW
+    { 0x1E10, 0x1E11 },  // LATIN CAPITAL LETTER D WITH CEDILLA
+    { 0x1E12, 0x1E13 },  // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+    { 0x1E14, 0x1E15 },  // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+    { 0x1E16, 0x1E17 },  // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+    { 0x1E18, 0x1E19 },  // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+    { 0x1E1A, 0x1E1B },  // LATIN CAPITAL LETTER E WITH TILDE BELOW
+    { 0x1E1C, 0x1E1D },  // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+    { 0x1E1E, 0x1E1F },  // LATIN CAPITAL LETTER F WITH DOT ABOVE
+    { 0x1E20, 0x1E21 },  // LATIN CAPITAL LETTER G WITH MACRON
+    { 0x1E22, 0x1E23 },  // LATIN CAPITAL LETTER H WITH DOT ABOVE
+    { 0x1E24, 0x1E25 },  // LATIN CAPITAL LETTER H WITH DOT BELOW
+    { 0x1E26, 0x1E27 },  // LATIN CAPITAL LETTER H WITH DIAERESIS
+    { 0x1E28, 0x1E29 },  // LATIN CAPITAL LETTER H WITH CEDILLA
+    { 0x1E2A, 0x1E2B },  // LATIN CAPITAL LETTER H WITH BREVE BELOW
+    { 0x1E2C, 0x1E2D },  // LATIN CAPITAL LETTER I WITH TILDE BELOW
+    { 0x1E2E, 0x1E2F },  // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+    { 0x1E30, 0x1E31 },  // LATIN CAPITAL LETTER K WITH ACUTE
+    { 0x1E32, 0x1E33 },  // LATIN CAPITAL LETTER K WITH DOT BELOW
+    { 0x1E34, 0x1E35 },  // LATIN CAPITAL LETTER K WITH LINE BELOW
+    { 0x1E36, 0x1E37 },  // LATIN CAPITAL LETTER L WITH DOT BELOW
+    { 0x1E38, 0x1E39 },  // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+    { 0x1E3A, 0x1E3B },  // LATIN CAPITAL LETTER L WITH LINE BELOW
+    { 0x1E3C, 0x1E3D },  // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+    { 0x1E3E, 0x1E3F },  // LATIN CAPITAL LETTER M WITH ACUTE
+    { 0x1E40, 0x1E41 },  // LATIN CAPITAL LETTER M WITH DOT ABOVE
+    { 0x1E42, 0x1E43 },  // LATIN CAPITAL LETTER M WITH DOT BELOW
+    { 0x1E44, 0x1E45 },  // LATIN CAPITAL LETTER N WITH DOT ABOVE
+    { 0x1E46, 0x1E47 },  // LATIN CAPITAL LETTER N WITH DOT BELOW
+    { 0x1E48, 0x1E49 },  // LATIN CAPITAL LETTER N WITH LINE BELOW
+    { 0x1E4A, 0x1E4B },  // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+    { 0x1E4C, 0x1E4D },  // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+    { 0x1E4E, 0x1E4F },  // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+    { 0x1E50, 0x1E51 },  // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+    { 0x1E52, 0x1E53 },  // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+    { 0x1E54, 0x1E55 },  // LATIN CAPITAL LETTER P WITH ACUTE
+    { 0x1E56, 0x1E57 },  // LATIN CAPITAL LETTER P WITH DOT ABOVE
+    { 0x1E58, 0x1E59 },  // LATIN CAPITAL LETTER R WITH DOT ABOVE
+    { 0x1E5A, 0x1E5B },  // LATIN CAPITAL LETTER R WITH DOT BELOW
+    { 0x1E5C, 0x1E5D },  // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+    { 0x1E5E, 0x1E5F },  // LATIN CAPITAL LETTER R WITH LINE BELOW
+    { 0x1E60, 0x1E61 },  // LATIN CAPITAL LETTER S WITH DOT ABOVE
+    { 0x1E62, 0x1E63 },  // LATIN CAPITAL LETTER S WITH DOT BELOW
+    { 0x1E64, 0x1E65 },  // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+    { 0x1E66, 0x1E67 },  // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+    { 0x1E68, 0x1E69 },  // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+    { 0x1E6A, 0x1E6B },  // LATIN CAPITAL LETTER T WITH DOT ABOVE
+    { 0x1E6C, 0x1E6D },  // LATIN CAPITAL LETTER T WITH DOT BELOW
+    { 0x1E6E, 0x1E6F },  // LATIN CAPITAL LETTER T WITH LINE BELOW
+    { 0x1E70, 0x1E71 },  // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+    { 0x1E72, 0x1E73 },  // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+    { 0x1E74, 0x1E75 },  // LATIN CAPITAL LETTER U WITH TILDE BELOW
+    { 0x1E76, 0x1E77 },  // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+    { 0x1E78, 0x1E79 },  // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+    { 0x1E7A, 0x1E7B },  // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+    { 0x1E7C, 0x1E7D },  // LATIN CAPITAL LETTER V WITH TILDE
+    { 0x1E7E, 0x1E7F },  // LATIN CAPITAL LETTER V WITH DOT BELOW
+    { 0x1E80, 0x1E81 },  // LATIN CAPITAL LETTER W WITH GRAVE
+    { 0x1E82, 0x1E83 },  // LATIN CAPITAL LETTER W WITH ACUTE
+    { 0x1E84, 0x1E85 },  // LATIN CAPITAL LETTER W WITH DIAERESIS
+    { 0x1E86, 0x1E87 },  // LATIN CAPITAL LETTER W WITH DOT ABOVE
+    { 0x1E88, 0x1E89 },  // LATIN CAPITAL LETTER W WITH DOT BELOW
+    { 0x1E8A, 0x1E8B },  // LATIN CAPITAL LETTER X WITH DOT ABOVE
+    { 0x1E8C, 0x1E8D },  // LATIN CAPITAL LETTER X WITH DIAERESIS
+    { 0x1E8E, 0x1E8F },  // LATIN CAPITAL LETTER Y WITH DOT ABOVE
+    { 0x1E90, 0x1E91 },  // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+    { 0x1E92, 0x1E93 },  // LATIN CAPITAL LETTER Z WITH DOT BELOW
+    { 0x1E94, 0x1E95 },  // LATIN CAPITAL LETTER Z WITH LINE BELOW
+    { 0x1E9E, 0x00DF },  // LATIN CAPITAL LETTER SHARP S
+    { 0x1EA0, 0x1EA1 },  // LATIN CAPITAL LETTER A WITH DOT BELOW
+    { 0x1EA2, 0x1EA3 },  // LATIN CAPITAL LETTER A WITH HOOK ABOVE
+    { 0x1EA4, 0x1EA5 },  // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+    { 0x1EA6, 0x1EA7 },  // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+    { 0x1EA8, 0x1EA9 },  // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+    { 0x1EAA, 0x1EAB },  // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+    { 0x1EAC, 0x1EAD },  // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+    { 0x1EAE, 0x1EAF },  // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+    { 0x1EB0, 0x1EB1 },  // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+    { 0x1EB2, 0x1EB3 },  // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+    { 0x1EB4, 0x1EB5 },  // LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+    { 0x1EB6, 0x1EB7 },  // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+    { 0x1EB8, 0x1EB9 },  // LATIN CAPITAL LETTER E WITH DOT BELOW
+    { 0x1EBA, 0x1EBB },  // LATIN CAPITAL LETTER E WITH HOOK ABOVE
+    { 0x1EBC, 0x1EBD },  // LATIN CAPITAL LETTER E WITH TILDE
+    { 0x1EBE, 0x1EBF },  // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+    { 0x1EC0, 0x1EC1 },  // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+    { 0x1EC2, 0x1EC3 },  // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+    { 0x1EC4, 0x1EC5 },  // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+    { 0x1EC6, 0x1EC7 },  // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+    { 0x1EC8, 0x1EC9 },  // LATIN CAPITAL LETTER I WITH HOOK ABOVE
+    { 0x1ECA, 0x1ECB },  // LATIN CAPITAL LETTER I WITH DOT BELOW
+    { 0x1ECC, 0x1ECD },  // LATIN CAPITAL LETTER O WITH DOT BELOW
+    { 0x1ECE, 0x1ECF },  // LATIN CAPITAL LETTER O WITH HOOK ABOVE
+    { 0x1ED0, 0x1ED1 },  // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+    { 0x1ED2, 0x1ED3 },  // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+    { 0x1ED4, 0x1ED5 },  // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+    { 0x1ED6, 0x1ED7 },  // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+    { 0x1ED8, 0x1ED9 },  // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+    { 0x1EDA, 0x1EDB },  // LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+    { 0x1EDC, 0x1EDD },  // LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+    { 0x1EDE, 0x1EDF },  // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+    { 0x1EE0, 0x1EE1 },  // LATIN CAPITAL LETTER O WITH HORN AND TILDE
+    { 0x1EE2, 0x1EE3 },  // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+    { 0x1EE4, 0x1EE5 },  // LATIN CAPITAL LETTER U WITH DOT BELOW
+    { 0x1EE6, 0x1EE7 },  // LATIN CAPITAL LETTER U WITH HOOK ABOVE
+    { 0x1EE8, 0x1EE9 },  // LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+    { 0x1EEA, 0x1EEB },  // LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+    { 0x1EEC, 0x1EED },  // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+    { 0x1EEE, 0x1EEF },  // LATIN CAPITAL LETTER U WITH HORN AND TILDE
+    { 0x1EF0, 0x1EF1 },  // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+    { 0x1EF2, 0x1EF3 },  // LATIN CAPITAL LETTER Y WITH GRAVE
+    { 0x1EF4, 0x1EF5 },  // LATIN CAPITAL LETTER Y WITH DOT BELOW
+    { 0x1EF6, 0x1EF7 },  // LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+    { 0x1EF8, 0x1EF9 },  // LATIN CAPITAL LETTER Y WITH TILDE
+    { 0x1EFA, 0x1EFB },  // LATIN CAPITAL LETTER MIDDLE-WELSH LL
+    { 0x1EFC, 0x1EFD },  // LATIN CAPITAL LETTER MIDDLE-WELSH V
+    { 0x1EFE, 0x1EFF },  // LATIN CAPITAL LETTER Y WITH LOOP
+    { 0x1F08, 0x1F00 },  // GREEK CAPITAL LETTER ALPHA WITH PSILI
+    { 0x1F09, 0x1F01 },  // GREEK CAPITAL LETTER ALPHA WITH DASIA
+    { 0x1F0A, 0x1F02 },  // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+    { 0x1F0B, 0x1F03 },  // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+    { 0x1F0C, 0x1F04 },  // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+    { 0x1F0D, 0x1F05 },  // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+    { 0x1F0E, 0x1F06 },  // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+    { 0x1F0F, 0x1F07 },  // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+    { 0x1F18, 0x1F10 },  // GREEK CAPITAL LETTER EPSILON WITH PSILI
+    { 0x1F19, 0x1F11 },  // GREEK CAPITAL LETTER EPSILON WITH DASIA
+    { 0x1F1A, 0x1F12 },  // GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+    { 0x1F1B, 0x1F13 },  // GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+    { 0x1F1C, 0x1F14 },  // GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+    { 0x1F1D, 0x1F15 },  // GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+    { 0x1F28, 0x1F20 },  // GREEK CAPITAL LETTER ETA WITH PSILI
+    { 0x1F29, 0x1F21 },  // GREEK CAPITAL LETTER ETA WITH DASIA
+    { 0x1F2A, 0x1F22 },  // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+    { 0x1F2B, 0x1F23 },  // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+    { 0x1F2C, 0x1F24 },  // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+    { 0x1F2D, 0x1F25 },  // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+    { 0x1F2E, 0x1F26 },  // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+    { 0x1F2F, 0x1F27 },  // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+    { 0x1F38, 0x1F30 },  // GREEK CAPITAL LETTER IOTA WITH PSILI
+    { 0x1F39, 0x1F31 },  // GREEK CAPITAL LETTER IOTA WITH DASIA
+    { 0x1F3A, 0x1F32 },  // GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+    { 0x1F3B, 0x1F33 },  // GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+    { 0x1F3C, 0x1F34 },  // GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+    { 0x1F3D, 0x1F35 },  // GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+    { 0x1F3E, 0x1F36 },  // GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+    { 0x1F3F, 0x1F37 },  // GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+    { 0x1F48, 0x1F40 },  // GREEK CAPITAL LETTER OMICRON WITH PSILI
+    { 0x1F49, 0x1F41 },  // GREEK CAPITAL LETTER OMICRON WITH DASIA
+    { 0x1F4A, 0x1F42 },  // GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+    { 0x1F4B, 0x1F43 },  // GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+    { 0x1F4C, 0x1F44 },  // GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+    { 0x1F4D, 0x1F45 },  // GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+    { 0x1F59, 0x1F51 },  // GREEK CAPITAL LETTER UPSILON WITH DASIA
+    { 0x1F5B, 0x1F53 },  // GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+    { 0x1F5D, 0x1F55 },  // GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+    { 0x1F5F, 0x1F57 },  // GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+    { 0x1F68, 0x1F60 },  // GREEK CAPITAL LETTER OMEGA WITH PSILI
+    { 0x1F69, 0x1F61 },  // GREEK CAPITAL LETTER OMEGA WITH DASIA
+    { 0x1F6A, 0x1F62 },  // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+    { 0x1F6B, 0x1F63 },  // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+    { 0x1F6C, 0x1F64 },  // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+    { 0x1F6D, 0x1F65 },  // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+    { 0x1F6E, 0x1F66 },  // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+    { 0x1F6F, 0x1F67 },  // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+    { 0x1F88, 0x1F80 },  // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+    { 0x1F89, 0x1F81 },  // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+    { 0x1F8A, 0x1F82 },  // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+    { 0x1F8B, 0x1F83 },  // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+    { 0x1F8C, 0x1F84 },  // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+    { 0x1F8D, 0x1F85 },  // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+    { 0x1F8E, 0x1F86 },  // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+    { 0x1F8F, 0x1F87 },  // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+    { 0x1F98, 0x1F90 },  // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+    { 0x1F99, 0x1F91 },  // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+    { 0x1F9A, 0x1F92 },  // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+    { 0x1F9B, 0x1F93 },  // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+    { 0x1F9C, 0x1F94 },  // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+    { 0x1F9D, 0x1F95 },  // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+    { 0x1F9E, 0x1F96 },  // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+    { 0x1F9F, 0x1F97 },  // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+    { 0x1FA8, 0x1FA0 },  // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+    { 0x1FA9, 0x1FA1 },  // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+    { 0x1FAA, 0x1FA2 },  // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+    { 0x1FAB, 0x1FA3 },  // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+    { 0x1FAC, 0x1FA4 },  // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+    { 0x1FAD, 0x1FA5 },  // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+    { 0x1FAE, 0x1FA6 },  // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+    { 0x1FAF, 0x1FA7 },  // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+    { 0x1FB8, 0x1FB0 },  // GREEK CAPITAL LETTER ALPHA WITH VRACHY
+    { 0x1FB9, 0x1FB1 },  // GREEK CAPITAL LETTER ALPHA WITH MACRON
+    { 0x1FBA, 0x1F70 },  // GREEK CAPITAL LETTER ALPHA WITH VARIA
+    { 0x1FBB, 0x1F71 },  // GREEK CAPITAL LETTER ALPHA WITH OXIA
+    { 0x1FBC, 0x1FB3 },  // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+    { 0x1FC8, 0x1F72 },  // GREEK CAPITAL LETTER EPSILON WITH VARIA
+    { 0x1FC9, 0x1F73 },  // GREEK CAPITAL LETTER EPSILON WITH OXIA
+    { 0x1FCA, 0x1F74 },  // GREEK CAPITAL LETTER ETA WITH VARIA
+    { 0x1FCB, 0x1F75 },  // GREEK CAPITAL LETTER ETA WITH OXIA
+    { 0x1FCC, 0x1FC3 },  // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+    { 0x1FD8, 0x1FD0 },  // GREEK CAPITAL LETTER IOTA WITH VRACHY
+    { 0x1FD9, 0x1FD1 },  // GREEK CAPITAL LETTER IOTA WITH MACRON
+    { 0x1FDA, 0x1F76 },  // GREEK CAPITAL LETTER IOTA WITH VARIA
+    { 0x1FDB, 0x1F77 },  // GREEK CAPITAL LETTER IOTA WITH OXIA
+    { 0x1FE8, 0x1FE0 },  // GREEK CAPITAL LETTER UPSILON WITH VRACHY
+    { 0x1FE9, 0x1FE1 },  // GREEK CAPITAL LETTER UPSILON WITH MACRON
+    { 0x1FEA, 0x1F7A },  // GREEK CAPITAL LETTER UPSILON WITH VARIA
+    { 0x1FEB, 0x1F7B },  // GREEK CAPITAL LETTER UPSILON WITH OXIA
+    { 0x1FEC, 0x1FE5 },  // GREEK CAPITAL LETTER RHO WITH DASIA
+    { 0x1FF8, 0x1F78 },  // GREEK CAPITAL LETTER OMICRON WITH VARIA
+    { 0x1FF9, 0x1F79 },  // GREEK CAPITAL LETTER OMICRON WITH OXIA
+    { 0x1FFA, 0x1F7C },  // GREEK CAPITAL LETTER OMEGA WITH VARIA
+    { 0x1FFB, 0x1F7D },  // GREEK CAPITAL LETTER OMEGA WITH OXIA
+    { 0x1FFC, 0x1FF3 },  // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+    { 0x2126, 0x03C9 },  // OHM SIGN
+    { 0x212A, 0x006B },  // KELVIN SIGN
+    { 0x212B, 0x00E5 },  // ANGSTROM SIGN
+    { 0x2132, 0x214E },  // TURNED CAPITAL F
+    { 0x2160, 0x2170 },  // ROMAN NUMERAL ONE
+    { 0x2161, 0x2171 },  // ROMAN NUMERAL TWO
+    { 0x2162, 0x2172 },  // ROMAN NUMERAL THREE
+    { 0x2163, 0x2173 },  // ROMAN NUMERAL FOUR
+    { 0x2164, 0x2174 },  // ROMAN NUMERAL FIVE
+    { 0x2165, 0x2175 },  // ROMAN NUMERAL SIX
+    { 0x2166, 0x2176 },  // ROMAN NUMERAL SEVEN
+    { 0x2167, 0x2177 },  // ROMAN NUMERAL EIGHT
+    { 0x2168, 0x2178 },  // ROMAN NUMERAL NINE
+    { 0x2169, 0x2179 },  // ROMAN NUMERAL TEN
+    { 0x216A, 0x217A },  // ROMAN NUMERAL ELEVEN
+    { 0x216B, 0x217B },  // ROMAN NUMERAL TWELVE
+    { 0x216C, 0x217C },  // ROMAN NUMERAL FIFTY
+    { 0x216D, 0x217D },  // ROMAN NUMERAL ONE HUNDRED
+    { 0x216E, 0x217E },  // ROMAN NUMERAL FIVE HUNDRED
+    { 0x216F, 0x217F },  // ROMAN NUMERAL ONE THOUSAND
+    { 0x2183, 0x2184 },  // ROMAN NUMERAL REVERSED ONE HUNDRED
+    { 0x24B6, 0x24D0 },  // CIRCLED LATIN CAPITAL LETTER A
+    { 0x24B7, 0x24D1 },  // CIRCLED LATIN CAPITAL LETTER B
+    { 0x24B8, 0x24D2 },  // CIRCLED LATIN CAPITAL LETTER C
+    { 0x24B9, 0x24D3 },  // CIRCLED LATIN CAPITAL LETTER D
+    { 0x24BA, 0x24D4 },  // CIRCLED LATIN CAPITAL LETTER E
+    { 0x24BB, 0x24D5 },  // CIRCLED LATIN CAPITAL LETTER F
+    { 0x24BC, 0x24D6 },  // CIRCLED LATIN CAPITAL LETTER G
+    { 0x24BD, 0x24D7 },  // CIRCLED LATIN CAPITAL LETTER H
+    { 0x24BE, 0x24D8 },  // CIRCLED LATIN CAPITAL LETTER I
+    { 0x24BF, 0x24D9 },  // CIRCLED LATIN CAPITAL LETTER J
+    { 0x24C0, 0x24DA },  // CIRCLED LATIN CAPITAL LETTER K
+    { 0x24C1, 0x24DB },  // CIRCLED LATIN CAPITAL LETTER L
+    { 0x24C2, 0x24DC },  // CIRCLED LATIN CAPITAL LETTER M
+    { 0x24C3, 0x24DD },  // CIRCLED LATIN CAPITAL LETTER N
+    { 0x24C4, 0x24DE },  // CIRCLED LATIN CAPITAL LETTER O
+    { 0x24C5, 0x24DF },  // CIRCLED LATIN CAPITAL LETTER P
+    { 0x24C6, 0x24E0 },  // CIRCLED LATIN CAPITAL LETTER Q
+    { 0x24C7, 0x24E1 },  // CIRCLED LATIN CAPITAL LETTER R
+    { 0x24C8, 0x24E2 },  // CIRCLED LATIN CAPITAL LETTER S
+    { 0x24C9, 0x24E3 },  // CIRCLED LATIN CAPITAL LETTER T
+    { 0x24CA, 0x24E4 },  // CIRCLED LATIN CAPITAL LETTER U
+    { 0x24CB, 0x24E5 },  // CIRCLED LATIN CAPITAL LETTER V
+    { 0x24CC, 0x24E6 },  // CIRCLED LATIN CAPITAL LETTER W
+    { 0x24CD, 0x24E7 },  // CIRCLED LATIN CAPITAL LETTER X
+    { 0x24CE, 0x24E8 },  // CIRCLED LATIN CAPITAL LETTER Y
+    { 0x24CF, 0x24E9 },  // CIRCLED LATIN CAPITAL LETTER Z
+    { 0x2C00, 0x2C30 },  // GLAGOLITIC CAPITAL LETTER AZU
+    { 0x2C01, 0x2C31 },  // GLAGOLITIC CAPITAL LETTER BUKY
+    { 0x2C02, 0x2C32 },  // GLAGOLITIC CAPITAL LETTER VEDE
+    { 0x2C03, 0x2C33 },  // GLAGOLITIC CAPITAL LETTER GLAGOLI
+    { 0x2C04, 0x2C34 },  // GLAGOLITIC CAPITAL LETTER DOBRO
+    { 0x2C05, 0x2C35 },  // GLAGOLITIC CAPITAL LETTER YESTU
+    { 0x2C06, 0x2C36 },  // GLAGOLITIC CAPITAL LETTER ZHIVETE
+    { 0x2C07, 0x2C37 },  // GLAGOLITIC CAPITAL LETTER DZELO
+    { 0x2C08, 0x2C38 },  // GLAGOLITIC CAPITAL LETTER ZEMLJA
+    { 0x2C09, 0x2C39 },  // GLAGOLITIC CAPITAL LETTER IZHE
+    { 0x2C0A, 0x2C3A },  // GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+    { 0x2C0B, 0x2C3B },  // GLAGOLITIC CAPITAL LETTER I
+    { 0x2C0C, 0x2C3C },  // GLAGOLITIC CAPITAL LETTER DJERVI
+    { 0x2C0D, 0x2C3D },  // GLAGOLITIC CAPITAL LETTER KAKO
+    { 0x2C0E, 0x2C3E },  // GLAGOLITIC CAPITAL LETTER LJUDIJE
+    { 0x2C0F, 0x2C3F },  // GLAGOLITIC CAPITAL LETTER MYSLITE
+    { 0x2C10, 0x2C40 },  // GLAGOLITIC CAPITAL LETTER NASHI
+    { 0x2C11, 0x2C41 },  // GLAGOLITIC CAPITAL LETTER ONU
+    { 0x2C12, 0x2C42 },  // GLAGOLITIC CAPITAL LETTER POKOJI
+    { 0x2C13, 0x2C43 },  // GLAGOLITIC CAPITAL LETTER RITSI
+    { 0x2C14, 0x2C44 },  // GLAGOLITIC CAPITAL LETTER SLOVO
+    { 0x2C15, 0x2C45 },  // GLAGOLITIC CAPITAL LETTER TVRIDO
+    { 0x2C16, 0x2C46 },  // GLAGOLITIC CAPITAL LETTER UKU
+    { 0x2C17, 0x2C47 },  // GLAGOLITIC CAPITAL LETTER FRITU
+    { 0x2C18, 0x2C48 },  // GLAGOLITIC CAPITAL LETTER HERU
+    { 0x2C19, 0x2C49 },  // GLAGOLITIC CAPITAL LETTER OTU
+    { 0x2C1A, 0x2C4A },  // GLAGOLITIC CAPITAL LETTER PE
+    { 0x2C1B, 0x2C4B },  // GLAGOLITIC CAPITAL LETTER SHTA
+    { 0x2C1C, 0x2C4C },  // GLAGOLITIC CAPITAL LETTER TSI
+    { 0x2C1D, 0x2C4D },  // GLAGOLITIC CAPITAL LETTER CHRIVI
+    { 0x2C1E, 0x2C4E },  // GLAGOLITIC CAPITAL LETTER SHA
+    { 0x2C1F, 0x2C4F },  // GLAGOLITIC CAPITAL LETTER YERU
+    { 0x2C20, 0x2C50 },  // GLAGOLITIC CAPITAL LETTER YERI
+    { 0x2C21, 0x2C51 },  // GLAGOLITIC CAPITAL LETTER YATI
+    { 0x2C22, 0x2C52 },  // GLAGOLITIC CAPITAL LETTER SPIDERY HA
+    { 0x2C23, 0x2C53 },  // GLAGOLITIC CAPITAL LETTER YU
+    { 0x2C24, 0x2C54 },  // GLAGOLITIC CAPITAL LETTER SMALL YUS
+    { 0x2C25, 0x2C55 },  // GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+    { 0x2C26, 0x2C56 },  // GLAGOLITIC CAPITAL LETTER YO
+    { 0x2C27, 0x2C57 },  // GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+    { 0x2C28, 0x2C58 },  // GLAGOLITIC CAPITAL LETTER BIG YUS
+    { 0x2C29, 0x2C59 },  // GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+    { 0x2C2A, 0x2C5A },  // GLAGOLITIC CAPITAL LETTER FITA
+    { 0x2C2B, 0x2C5B },  // GLAGOLITIC CAPITAL LETTER IZHITSA
+    { 0x2C2C, 0x2C5C },  // GLAGOLITIC CAPITAL LETTER SHTAPIC
+    { 0x2C2D, 0x2C5D },  // GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+    { 0x2C2E, 0x2C5E },  // GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+    { 0x2C60, 0x2C61 },  // LATIN CAPITAL LETTER L WITH DOUBLE BAR
+    { 0x2C62, 0x026B },  // LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+    { 0x2C63, 0x1D7D },  // LATIN CAPITAL LETTER P WITH STROKE
+    { 0x2C64, 0x027D },  // LATIN CAPITAL LETTER R WITH TAIL
+    { 0x2C67, 0x2C68 },  // LATIN CAPITAL LETTER H WITH DESCENDER
+    { 0x2C69, 0x2C6A },  // LATIN CAPITAL LETTER K WITH DESCENDER
+    { 0x2C6B, 0x2C6C },  // LATIN CAPITAL LETTER Z WITH DESCENDER
+    { 0x2C6D, 0x0251 },  // LATIN CAPITAL LETTER ALPHA
+    { 0x2C6E, 0x0271 },  // LATIN CAPITAL LETTER M WITH HOOK
+    { 0x2C6F, 0x0250 },  // LATIN CAPITAL LETTER TURNED A
+    { 0x2C70, 0x0252 },  // LATIN CAPITAL LETTER TURNED ALPHA
+    { 0x2C72, 0x2C73 },  // LATIN CAPITAL LETTER W WITH HOOK
+    { 0x2C75, 0x2C76 },  // LATIN CAPITAL LETTER HALF H
+    { 0x2C7E, 0x023F },  // LATIN CAPITAL LETTER S WITH SWASH TAIL
+    { 0x2C7F, 0x0240 },  // LATIN CAPITAL LETTER Z WITH SWASH TAIL
+    { 0x2C80, 0x2C81 },  // COPTIC CAPITAL LETTER ALFA
+    { 0x2C82, 0x2C83 },  // COPTIC CAPITAL LETTER VIDA
+    { 0x2C84, 0x2C85 },  // COPTIC CAPITAL LETTER GAMMA
+    { 0x2C86, 0x2C87 },  // COPTIC CAPITAL LETTER DALDA
+    { 0x2C88, 0x2C89 },  // COPTIC CAPITAL LETTER EIE
+    { 0x2C8A, 0x2C8B },  // COPTIC CAPITAL LETTER SOU
+    { 0x2C8C, 0x2C8D },  // COPTIC CAPITAL LETTER ZATA
+    { 0x2C8E, 0x2C8F },  // COPTIC CAPITAL LETTER HATE
+    { 0x2C90, 0x2C91 },  // COPTIC CAPITAL LETTER THETHE
+    { 0x2C92, 0x2C93 },  // COPTIC CAPITAL LETTER IAUDA
+    { 0x2C94, 0x2C95 },  // COPTIC CAPITAL LETTER KAPA
+    { 0x2C96, 0x2C97 },  // COPTIC CAPITAL LETTER LAULA
+    { 0x2C98, 0x2C99 },  // COPTIC CAPITAL LETTER MI
+    { 0x2C9A, 0x2C9B },  // COPTIC CAPITAL LETTER NI
+    { 0x2C9C, 0x2C9D },  // COPTIC CAPITAL LETTER KSI
+    { 0x2C9E, 0x2C9F },  // COPTIC CAPITAL LETTER O
+    { 0x2CA0, 0x2CA1 },  // COPTIC CAPITAL LETTER PI
+    { 0x2CA2, 0x2CA3 },  // COPTIC CAPITAL LETTER RO
+    { 0x2CA4, 0x2CA5 },  // COPTIC CAPITAL LETTER SIMA
+    { 0x2CA6, 0x2CA7 },  // COPTIC CAPITAL LETTER TAU
+    { 0x2CA8, 0x2CA9 },  // COPTIC CAPITAL LETTER UA
+    { 0x2CAA, 0x2CAB },  // COPTIC CAPITAL LETTER FI
+    { 0x2CAC, 0x2CAD },  // COPTIC CAPITAL LETTER KHI
+    { 0x2CAE, 0x2CAF },  // COPTIC CAPITAL LETTER PSI
+    { 0x2CB0, 0x2CB1 },  // COPTIC CAPITAL LETTER OOU
+    { 0x2CB2, 0x2CB3 },  // COPTIC CAPITAL LETTER DIALECT-P ALEF
+    { 0x2CB4, 0x2CB5 },  // COPTIC CAPITAL LETTER OLD COPTIC AIN
+    { 0x2CB6, 0x2CB7 },  // COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+    { 0x2CB8, 0x2CB9 },  // COPTIC CAPITAL LETTER DIALECT-P KAPA
+    { 0x2CBA, 0x2CBB },  // COPTIC CAPITAL LETTER DIALECT-P NI
+    { 0x2CBC, 0x2CBD },  // COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+    { 0x2CBE, 0x2CBF },  // COPTIC CAPITAL LETTER OLD COPTIC OOU
+    { 0x2CC0, 0x2CC1 },  // COPTIC CAPITAL LETTER SAMPI
+    { 0x2CC2, 0x2CC3 },  // COPTIC CAPITAL LETTER CROSSED SHEI
+    { 0x2CC4, 0x2CC5 },  // COPTIC CAPITAL LETTER OLD COPTIC SHEI
+    { 0x2CC6, 0x2CC7 },  // COPTIC CAPITAL LETTER OLD COPTIC ESH
+    { 0x2CC8, 0x2CC9 },  // COPTIC CAPITAL LETTER AKHMIMIC KHEI
+    { 0x2CCA, 0x2CCB },  // COPTIC CAPITAL LETTER DIALECT-P HORI
+    { 0x2CCC, 0x2CCD },  // COPTIC CAPITAL LETTER OLD COPTIC HORI
+    { 0x2CCE, 0x2CCF },  // COPTIC CAPITAL LETTER OLD COPTIC HA
+    { 0x2CD0, 0x2CD1 },  // COPTIC CAPITAL LETTER L-SHAPED HA
+    { 0x2CD2, 0x2CD3 },  // COPTIC CAPITAL LETTER OLD COPTIC HEI
+    { 0x2CD4, 0x2CD5 },  // COPTIC CAPITAL LETTER OLD COPTIC HAT
+    { 0x2CD6, 0x2CD7 },  // COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+    { 0x2CD8, 0x2CD9 },  // COPTIC CAPITAL LETTER OLD COPTIC DJA
+    { 0x2CDA, 0x2CDB },  // COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+    { 0x2CDC, 0x2CDD },  // COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+    { 0x2CDE, 0x2CDF },  // COPTIC CAPITAL LETTER OLD NUBIAN NGI
+    { 0x2CE0, 0x2CE1 },  // COPTIC CAPITAL LETTER OLD NUBIAN NYI
+    { 0x2CE2, 0x2CE3 },  // COPTIC CAPITAL LETTER OLD NUBIAN WAU
+    { 0x2CEB, 0x2CEC },  // COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+    { 0x2CED, 0x2CEE },  // COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+    { 0xA640, 0xA641 },  // CYRILLIC CAPITAL LETTER ZEMLYA
+    { 0xA642, 0xA643 },  // CYRILLIC CAPITAL LETTER DZELO
+    { 0xA644, 0xA645 },  // CYRILLIC CAPITAL LETTER REVERSED DZE
+    { 0xA646, 0xA647 },  // CYRILLIC CAPITAL LETTER IOTA
+    { 0xA648, 0xA649 },  // CYRILLIC CAPITAL LETTER DJERV
+    { 0xA64A, 0xA64B },  // CYRILLIC CAPITAL LETTER MONOGRAPH UK
+    { 0xA64C, 0xA64D },  // CYRILLIC CAPITAL LETTER BROAD OMEGA
+    { 0xA64E, 0xA64F },  // CYRILLIC CAPITAL LETTER NEUTRAL YER
+    { 0xA650, 0xA651 },  // CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+    { 0xA652, 0xA653 },  // CYRILLIC CAPITAL LETTER IOTIFIED YAT
+    { 0xA654, 0xA655 },  // CYRILLIC CAPITAL LETTER REVERSED YU
+    { 0xA656, 0xA657 },  // CYRILLIC CAPITAL LETTER IOTIFIED A
+    { 0xA658, 0xA659 },  // CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+    { 0xA65A, 0xA65B },  // CYRILLIC CAPITAL LETTER BLENDED YUS
+    { 0xA65C, 0xA65D },  // CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+    { 0xA65E, 0xA65F },  // CYRILLIC CAPITAL LETTER YN
+    { 0xA662, 0xA663 },  // CYRILLIC CAPITAL LETTER SOFT DE
+    { 0xA664, 0xA665 },  // CYRILLIC CAPITAL LETTER SOFT EL
+    { 0xA666, 0xA667 },  // CYRILLIC CAPITAL LETTER SOFT EM
+    { 0xA668, 0xA669 },  // CYRILLIC CAPITAL LETTER MONOCULAR O
+    { 0xA66A, 0xA66B },  // CYRILLIC CAPITAL LETTER BINOCULAR O
+    { 0xA66C, 0xA66D },  // CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
+    { 0xA680, 0xA681 },  // CYRILLIC CAPITAL LETTER DWE
+    { 0xA682, 0xA683 },  // CYRILLIC CAPITAL LETTER DZWE
+    { 0xA684, 0xA685 },  // CYRILLIC CAPITAL LETTER ZHWE
+    { 0xA686, 0xA687 },  // CYRILLIC CAPITAL LETTER CCHE
+    { 0xA688, 0xA689 },  // CYRILLIC CAPITAL LETTER DZZE
+    { 0xA68A, 0xA68B },  // CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+    { 0xA68C, 0xA68D },  // CYRILLIC CAPITAL LETTER TWE
+    { 0xA68E, 0xA68F },  // CYRILLIC CAPITAL LETTER TSWE
+    { 0xA690, 0xA691 },  // CYRILLIC CAPITAL LETTER TSSE
+    { 0xA692, 0xA693 },  // CYRILLIC CAPITAL LETTER TCHE
+    { 0xA694, 0xA695 },  // CYRILLIC CAPITAL LETTER HWE
+    { 0xA696, 0xA697 },  // CYRILLIC CAPITAL LETTER SHWE
+    { 0xA722, 0xA723 },  // LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+    { 0xA724, 0xA725 },  // LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+    { 0xA726, 0xA727 },  // LATIN CAPITAL LETTER HENG
+    { 0xA728, 0xA729 },  // LATIN CAPITAL LETTER TZ
+    { 0xA72A, 0xA72B },  // LATIN CAPITAL LETTER TRESILLO
+    { 0xA72C, 0xA72D },  // LATIN CAPITAL LETTER CUATRILLO
+    { 0xA72E, 0xA72F },  // LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+    { 0xA732, 0xA733 },  // LATIN CAPITAL LETTER AA
+    { 0xA734, 0xA735 },  // LATIN CAPITAL LETTER AO
+    { 0xA736, 0xA737 },  // LATIN CAPITAL LETTER AU
+    { 0xA738, 0xA739 },  // LATIN CAPITAL LETTER AV
+    { 0xA73A, 0xA73B },  // LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
+    { 0xA73C, 0xA73D },  // LATIN CAPITAL LETTER AY
+    { 0xA73E, 0xA73F },  // LATIN CAPITAL LETTER REVERSED C WITH DOT
+    { 0xA740, 0xA741 },  // LATIN CAPITAL LETTER K WITH STROKE
+    { 0xA742, 0xA743 },  // LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+    { 0xA744, 0xA745 },  // LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+    { 0xA746, 0xA747 },  // LATIN CAPITAL LETTER BROKEN L
+    { 0xA748, 0xA749 },  // LATIN CAPITAL LETTER L WITH HIGH STROKE
+    { 0xA74A, 0xA74B },  // LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+    { 0xA74C, 0xA74D },  // LATIN CAPITAL LETTER O WITH LOOP
+    { 0xA74E, 0xA74F },  // LATIN CAPITAL LETTER OO
+    { 0xA750, 0xA751 },  // LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+    { 0xA752, 0xA753 },  // LATIN CAPITAL LETTER P WITH FLOURISH
+    { 0xA754, 0xA755 },  // LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+    { 0xA756, 0xA757 },  // LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+    { 0xA758, 0xA759 },  // LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+    { 0xA75A, 0xA75B },  // LATIN CAPITAL LETTER R ROTUNDA
+    { 0xA75C, 0xA75D },  // LATIN CAPITAL LETTER RUM ROTUNDA
+    { 0xA75E, 0xA75F },  // LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+    { 0xA760, 0xA761 },  // LATIN CAPITAL LETTER VY
+    { 0xA762, 0xA763 },  // LATIN CAPITAL LETTER VISIGOTHIC Z
+    { 0xA764, 0xA765 },  // LATIN CAPITAL LETTER THORN WITH STROKE
+    { 0xA766, 0xA767 },  // LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+    { 0xA768, 0xA769 },  // LATIN CAPITAL LETTER VEND
+    { 0xA76A, 0xA76B },  // LATIN CAPITAL LETTER ET
+    { 0xA76C, 0xA76D },  // LATIN CAPITAL LETTER IS
+    { 0xA76E, 0xA76F },  // LATIN CAPITAL LETTER CON
+    { 0xA779, 0xA77A },  // LATIN CAPITAL LETTER INSULAR D
+    { 0xA77B, 0xA77C },  // LATIN CAPITAL LETTER INSULAR F
+    { 0xA77D, 0x1D79 },  // LATIN CAPITAL LETTER INSULAR G
+    { 0xA77E, 0xA77F },  // LATIN CAPITAL LETTER TURNED INSULAR G
+    { 0xA780, 0xA781 },  // LATIN CAPITAL LETTER TURNED L
+    { 0xA782, 0xA783 },  // LATIN CAPITAL LETTER INSULAR R
+    { 0xA784, 0xA785 },  // LATIN CAPITAL LETTER INSULAR S
+    { 0xA786, 0xA787 },  // LATIN CAPITAL LETTER INSULAR T
+    { 0xA78B, 0xA78C },  // LATIN CAPITAL LETTER SALTILLO
+    { 0xFF21, 0xFF41 },  // FULLWIDTH LATIN CAPITAL LETTER A
+    { 0xFF22, 0xFF42 },  // FULLWIDTH LATIN CAPITAL LETTER B
+    { 0xFF23, 0xFF43 },  // FULLWIDTH LATIN CAPITAL LETTER C
+    { 0xFF24, 0xFF44 },  // FULLWIDTH LATIN CAPITAL LETTER D
+    { 0xFF25, 0xFF45 },  // FULLWIDTH LATIN CAPITAL LETTER E
+    { 0xFF26, 0xFF46 },  // FULLWIDTH LATIN CAPITAL LETTER F
+    { 0xFF27, 0xFF47 },  // FULLWIDTH LATIN CAPITAL LETTER G
+    { 0xFF28, 0xFF48 },  // FULLWIDTH LATIN CAPITAL LETTER H
+    { 0xFF29, 0xFF49 },  // FULLWIDTH LATIN CAPITAL LETTER I
+    { 0xFF2A, 0xFF4A },  // FULLWIDTH LATIN CAPITAL LETTER J
+    { 0xFF2B, 0xFF4B },  // FULLWIDTH LATIN CAPITAL LETTER K
+    { 0xFF2C, 0xFF4C },  // FULLWIDTH LATIN CAPITAL LETTER L
+    { 0xFF2D, 0xFF4D },  // FULLWIDTH LATIN CAPITAL LETTER M
+    { 0xFF2E, 0xFF4E },  // FULLWIDTH LATIN CAPITAL LETTER N
+    { 0xFF2F, 0xFF4F },  // FULLWIDTH LATIN CAPITAL LETTER O
+    { 0xFF30, 0xFF50 },  // FULLWIDTH LATIN CAPITAL LETTER P
+    { 0xFF31, 0xFF51 },  // FULLWIDTH LATIN CAPITAL LETTER Q
+    { 0xFF32, 0xFF52 },  // FULLWIDTH LATIN CAPITAL LETTER R
+    { 0xFF33, 0xFF53 },  // FULLWIDTH LATIN CAPITAL LETTER S
+    { 0xFF34, 0xFF54 },  // FULLWIDTH LATIN CAPITAL LETTER T
+    { 0xFF35, 0xFF55 },  // FULLWIDTH LATIN CAPITAL LETTER U
+    { 0xFF36, 0xFF56 },  // FULLWIDTH LATIN CAPITAL LETTER V
+    { 0xFF37, 0xFF57 },  // FULLWIDTH LATIN CAPITAL LETTER W
+    { 0xFF38, 0xFF58 },  // FULLWIDTH LATIN CAPITAL LETTER X
+    { 0xFF39, 0xFF59 },  // FULLWIDTH LATIN CAPITAL LETTER Y
+    { 0xFF3A, 0xFF5A }   // FULLWIDTH LATIN CAPITAL LETTER Z
+};
+
+static int compare_pair_capital(const void *a, const void *b) {
+    return (int)(*(unsigned short *)a)
+            - (int)((struct LatinCapitalSmallPair*)b)->capital;
+}
+
+unsigned short latin_tolower(unsigned short c) {
+    struct LatinCapitalSmallPair *p =
+            (struct LatinCapitalSmallPair *)bsearch(&c, SORTED_CHAR_MAP,
+                    sizeof(SORTED_CHAR_MAP) / sizeof(SORTED_CHAR_MAP[0]),
+                    sizeof(SORTED_CHAR_MAP[0]),
+                    compare_pair_capital);
+    return p ? p->small : c;
+}
+
+} // namespace latinime
diff --git a/native/src/char_utils.h b/native/src/char_utils.h
new file mode 100644
index 0000000..921ecb4
--- /dev/null
+++ b/native/src/char_utils.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef LATINIME_CHAR_UTILS_H
+#define LATINIME_CHAR_UTILS_H
+
+namespace latinime {
+
+unsigned short latin_tolower(unsigned short c);
+
+}; // namespace latinime
+
+#endif // LATINIME_CHAR_UTILS_H
diff --git a/dictionary/src/dictionary.cpp b/native/src/dictionary.cpp
similarity index 97%
rename from dictionary/src/dictionary.cpp
rename to native/src/dictionary.cpp
index 6e6f441..e75beb5 100644
--- a/dictionary/src/dictionary.cpp
+++ b/native/src/dictionary.cpp
@@ -19,19 +19,12 @@
 #include <fcntl.h>
 #include <sys/mman.h>
 #include <string.h>
-#include <cutils/log.h>
-
-#include <unicode/uchar.h>
-
-//#define USE_ASSET_MANAGER
-
-#ifdef USE_ASSET_MANAGER
-#include <utils/AssetManager.h>
-#include <utils/Asset.h>
-#endif
+//#include <cutils/log.h>
+#define LOGI
 
 #include "dictionary.h"
 #include "basechars.h"
+#include "char_utils.h"
 
 #define DEBUG_DICT 0
 
@@ -176,7 +169,7 @@
     if (c >='A' && c <= 'Z') {
         c |= 32;
     } else if (c > 127) {
-        c = u_tolower(c);
+        c = latin_tolower(c);
     }
     return c;
 }
diff --git a/dictionary/src/dictionary.h b/native/src/dictionary.h
similarity index 100%
rename from dictionary/src/dictionary.h
rename to native/src/dictionary.h