Merge "Return NOT_A_PROBABILITY in getProbability for inalid dictionary."
diff --git a/java/res/xml-sw600dp/keys_arabic3_left.xml b/java/res/xml-sw600dp/keys_arabic3_left.xml
new file mode 100644
index 0000000..0f2ccc0
--- /dev/null
+++ b/java/res/xml-sw600dp/keys_arabic3_left.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0630: "ذ" ARABIC LETTER THAL -->
+    <Key
+        latin:keyLabel="&#x0630;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE -->
+    <Key
+        latin:keyLabel="&#x0626;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml-sw600dp/keys_farsi3_right.xml b/java/res/xml-sw600dp/keys_farsi3_right.xml
new file mode 100644
index 0000000..3c91ae9
--- /dev/null
+++ b/java/res/xml-sw600dp/keys_farsi3_right.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE -->
+    <Key
+        latin:keyLabel="&#x0622;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0686: "چ" ARABIC LETTER TCHEH -->
+    <Key
+        latin:keyLabel="&#x0686;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml-sw600dp/rowkeys_arabic1.xml b/java/res/xml-sw600dp/rowkeys_arabic1.xml
deleted file mode 100644
index 3c0acf1..0000000
--- a/java/res/xml-sw600dp/rowkeys_arabic1.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <!-- U+0636: "ض" ARABIC LETTER DAD
-         U+0661: "١" ARABIC-INDIC DIGIT ONE -->
-    <Key
-        latin:keyLabel="&#x0636;"
-        latin:keyHintLabel="1"
-        latin:additionalMoreKeys="1,&#x0661;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0635: "ص" ARABIC LETTER SAD
-         U+0662: "٢" ARABIC-INDIC DIGIT TWO -->
-    <Key
-        latin:keyLabel="&#x0635;"
-        latin:keyHintLabel="2"
-        latin:additionalMoreKeys="2,&#x0662;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062B: "ث" ARABIC LETTER THEH
-         U+0663: "٣" ARABIC-INDIC DIGIT THREE -->
-    <Key
-        latin:keyLabel="&#x062B;"
-        latin:keyHintLabel="3"
-        latin:additionalMoreKeys="3,&#x0663;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0642: "ق" ARABIC LETTER QAF
-         U+06A8: "ڨ" ARABIC LETTER QAF WITH THREE DOTS ABOVE
-         U+0664: "٤" ARABIC-INDIC DIGIT FOUR -->
-    <!-- TODO: DroidSansArabic lacks the glyph of U+06A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE -->
-    <Key
-        latin:keyLabel="&#x0642;"
-        latin:keyHintLabel="4"
-        latin:additionalMoreKeys="4,&#x0664;"
-        latin:moreKeys="&#x06A8;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0641: "ف" ARABIC LETTER FEH
-         U+06A4: "ڤ" ARABIC LETTER VEH
-         U+06A2: "ڢ" ARABIC LETTER FEH WITH DOT MOVED BELOW
-         U+06A5: "ڥ" ARABIC LETTER FEH WITH THREE DOTS BELOW
-         U+0665: "٥" ARABIC-INDIC DIGIT FIVE -->
-    <!-- TODO: DroidSansArabic lacks the glyph of U+06A2 ARABIC LETTER FEH WITH DOT MOVED BELOW -->
-    <!-- TODO: DroidSansArabic lacks the glyph of U+06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW -->
-    <Key
-        latin:keyLabel="&#x0641;"
-        latin:keyHintLabel="5"
-        latin:additionalMoreKeys="5,&#x0665;"
-        latin:moreKeys="&#x06A4;,&#x06A2;,&#x06A5;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+063A: "غ" ARABIC LETTER GHAIN
-         U+0666: "٦" ARABIC-INDIC DIGIT SIX -->
-    <Key
-        latin:keyLabel="&#x063A;"
-        latin:keyHintLabel="6"
-        latin:additionalMoreKeys="6,&#x0666;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0639: "ع" ARABIC LETTER AIN
-         U+0667: "٧" ARABIC-INDIC DIGIT SEVEN -->
-    <Key
-        latin:keyLabel="&#x0639;"
-        latin:keyHintLabel="7"
-        latin:additionalMoreKeys="7,&#x0667;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0647: "ه" ARABIC LETTER HEH
-         U+FEEB: "ﻫ" ARABIC LETTER HEH INITIAL FORM
-         U+0647 U+200D: ARABIC LETTER HEH + ZERO WIDTH JOINER
-         U+0668: "٨" ARABIC-INDIC DIGIT EIGHT -->
-    <Key
-        latin:keyLabel="&#x0647;"
-        latin:keyHintLabel="8"
-        latin:additionalMoreKeys="8,&#x0668;"
-        latin:moreKeys="&#xFEEB;|&#x0647;&#x200D;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062E: "خ" ARABIC LETTER KHAH
-         U+0669: "٩" ARABIC-INDIC DIGIT NINE -->
-    <Key
-        latin:keyLabel="&#x062E;"
-        latin:keyHintLabel="9"
-        latin:additionalMoreKeys="9,&#x0669;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062D: "ح" ARABIC LETTER HAH
-         U+0660: "٠" ARABIC-INDIC DIGIT ZERO -->
-    <Key
-        latin:keyLabel="&#x062D;"
-        latin:keyHintLabel="0"
-        latin:additionalMoreKeys="0,&#x0660;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062C: "ج" ARABIC LETTER JEEM
-         U+0686: "چ" ARABIC LETTER TCHEH -->
-    <Key
-        latin:keyLabel="&#x062C;"
-        latin:moreKeys="&#x0686;"
-        latin:keyLabelFlags="fontNormal" />
-</merge>
diff --git a/java/res/xml-sw600dp/rowkeys_arabic2.xml b/java/res/xml-sw600dp/rowkeys_arabic2.xml
deleted file mode 100644
index 00e69ac..0000000
--- a/java/res/xml-sw600dp/rowkeys_arabic2.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <!-- U+0634: "ش" ARABIC LETTER SHEEN
-         U+069C: "ڜ" ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE -->
-    <!-- TODO: DroidSansArabic lacks the glyph of U+069C ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE -->
-    <Key
-        latin:keyLabel="&#x0634;"
-        latin:moreKeys="&#x069C;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0633: "س" ARABIC LETTER SEEN -->
-    <Key
-        latin:keyLabel="&#x0633;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+064A: "ي" ARABIC LETTER YEH
-         U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE
-         U+0649: "ى" ARABIC LETTER ALEF MAKSURA -->
-    <Key
-        latin:keyLabel="&#x064A;"
-        latin:moreKeys="&#x0626;,&#x0649;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0628: "ب" ARABIC LETTER BEH
-         U+067E: "پ" ARABIC LETTER PEH -->
-    <Key
-        latin:keyLabel="&#x0628;"
-        latin:moreKeys="&#x067E;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0644: "ل" ARABIC LETTER LAM
-         U+FEFB: "ﻻ" ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
-         U+0627: "ا" ARABIC LETTER ALEF
-         U+FEF7: "ﻷ" ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
-         U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE
-         U+FEF9: "ﻹ" ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
-         U+0625: "إ" ARABIC LETTER ALEF WITH HAMZA BELOW
-         U+FEF5: "ﻵ" ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
-         U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE -->
-    <Key
-        latin:keyLabel="&#x0644;"
-        latin:moreKeys="&#xFEFB;|&#x0644;&#x0627;,&#xFEF7;|&#x0644;&#x0623;,&#xFEF9;|&#x0644;&#x0625;,&#xFEF5;|&#x0644;&#x0622;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0627: "ا" ARABIC LETTER ALEF
-         U+0621: "ء" ARABIC LETTER HAMZA
-         U+0671: "ٱ" ARABIC LETTER ALEF WASLA
-         U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE
-         U+0625: "إ" ARABIC LETTER ALEF WITH HAMZA BELOW
-         U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE -->
-    <Key
-        latin:keyLabel="&#x0627;"
-        latin:moreKeys="&#x0621;,&#x0671;,&#x0623;,&#x0625;,&#x0622;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062A: "ت" ARABIC LETTER TEH -->
-    <Key
-        latin:keyLabel="&#x062A;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0646: "ن" ARABIC LETTER NOON -->
-    <Key
-        latin:keyLabel="&#x0646;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0645: "م" ARABIC LETTER MEEM -->
-    <Key
-        latin:keyLabel="&#x0645;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0643: "ك" ARABIC LETTER KAF
-         U+06AF: "گ" ARABIC LETTER GAF
-         U+06A9: "ک" ARABIC LETTER KEHEH -->
-    <Key
-        latin:keyLabel="&#x0643;"
-        latin:moreKeys="&#x06AF;,&#x06A9;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0637: "ط" ARABIC LETTER TAH -->
-    <Key
-        latin:keyLabel="&#x0637;"
-        latin:keyLabelFlags="fontNormal" />
-</merge>
diff --git a/java/res/xml-sw600dp/rowkeys_arabic3.xml b/java/res/xml-sw600dp/rowkeys_arabic3.xml
deleted file mode 100644
index b0bcd78..0000000
--- a/java/res/xml-sw600dp/rowkeys_arabic3.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <!-- U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE -->
-    <Key
-        latin:keyLabel="&#x0626;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0621: "ء" ARABIC LETTER HAMZA -->
-    <Key
-        latin:keyLabel="&#x0621;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0624: "ؤ" ARABIC LETTER WAW WITH HAMZA ABOVE -->
-    <Key
-        latin:keyLabel="&#x0624;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0631: "ر" ARABIC LETTER REH -->
-    <Key
-        latin:keyLabel="&#x0631;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0630: "ذ" ARABIC LETTER THAL -->
-    <Key
-        latin:keyLabel="&#x0630;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0649: "ى" ARABIC LETTER ALEF MAKSURA -->
-    <Key
-        latin:keyLabel="&#x0649;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0629: "ة" ARABIC LETTER TEH MARBUTA -->
-    <Key
-        latin:keyLabel="&#x0629;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0648: "و" ARABIC LETTER WAW -->
-    <Key
-        latin:keyLabel="&#x0648;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0632: "ز" ARABIC LETTER ZAIN
-         U+0698: "ژ" ARABIC LETTER JEH -->
-    <Key
-        latin:keyLabel="&#x0632;"
-        latin:moreKeys="&#x0698;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0638: "ظ" ARABIC LETTER ZAH -->
-    <Key
-        latin:keyLabel="&#x0638;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062F: "د" ARABIC LETTER DAL -->
-    <Key
-        latin:keyLabel="&#x062F;"
-        latin:keyLabelFlags="fontNormal" />
-</merge>
diff --git a/java/res/xml-sw600dp/rowkeys_farsi1.xml b/java/res/xml-sw600dp/rowkeys_farsi1.xml
deleted file mode 100644
index 6dd9a65..0000000
--- a/java/res/xml-sw600dp/rowkeys_farsi1.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <!-- U+0636: "ض" ARABIC LETTER DAD
-         U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE -->
-    <Key
-        latin:keyLabel="&#x0636;"
-        latin:keyHintLabel="&#x06F1;"
-        latin:additionalMoreKeys="&#x06F1;,1"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0635: "ص" ARABIC LETTER SAD
-         U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO -->
-    <Key
-        latin:keyLabel="&#x0635;"
-        latin:keyHintLabel="&#x06F2;"
-        latin:additionalMoreKeys="&#x06F2;,2"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062B: "ث" ARABIC LETTER THEH
-         U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE -->
-    <Key
-        latin:keyLabel="&#x062B;"
-        latin:keyHintLabel="&#x06F3;"
-        latin:additionalMoreKeys="&#x06F3;,3"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0642: "ق" ARABIC LETTER QAF
-         U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR -->
-    <Key
-        latin:keyLabel="&#x0642;"
-        latin:keyHintLabel="&#x06F4;"
-        latin:additionalMoreKeys="&#x06F4;,4"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0641: "ف" ARABIC LETTER FEH
-         U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE -->
-    <Key
-        latin:keyLabel="&#x0641;"
-        latin:keyHintLabel="&#x06F5;"
-        latin:additionalMoreKeys="&#x06F5;,5"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+063A: "غ" ARABIC LETTER GHAIN
-         U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX -->
-    <Key
-        latin:keyLabel="&#x063A;"
-        latin:keyHintLabel="&#x06F6;"
-        latin:additionalMoreKeys="&#x06F6;,6"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0639: "ع" ARABIC LETTER AIN
-         U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN -->
-    <Key
-        latin:keyLabel="&#x0639;"
-        latin:keyHintLabel="&#x06F7;"
-        latin:additionalMoreKeys="&#x06F7;,7"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0647: "ه" ARABIC LETTER HEH
-         U+FEEB: "ﻫ" ARABIC LETTER HEH INITIAL FORM
-         U+0647/U+200D: ARABIC LETTER HEH + ZERO WIDTH JOINER
-         U+0647/U+0654: ARABIC LETTER HEH + ARABIC HAMZA ABOVE
-         U+0629: "ة" ARABIC LETTER TEH MARBUTA
-         U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT -->
-    <Key
-        latin:keyLabel="&#x0647;"
-        latin:moreKeys="&#xFEEB;|&#x0647;&#x200D;,&#x0647;&#x0654;,&#x0629;,%"
-        latin:keyHintLabel="&#x06F8;"
-        latin:additionalMoreKeys="&#x06F8;,8"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062E: "خ" ARABIC LETTER KHAH
-         U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE -->
-    <Key
-        latin:keyLabel="&#x062E;"
-        latin:keyHintLabel="&#x06F9;"
-        latin:additionalMoreKeys="&#x06F9;,9"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062D: "ح" ARABIC LETTER HAH
-         U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO -->
-    <Key
-        latin:keyLabel="&#x062D;"
-        latin:keyHintLabel="&#x06F0;"
-        latin:additionalMoreKeys="&#x06F0;,0"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062C: "ج" ARABIC LETTER JEEM -->
-    <Key
-        latin:keyLabel="&#x062C;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0686: "چ" ARABIC LETTER TCHEH -->
-    <Key
-        latin:keyLabel="&#x0686;"
-        latin:keyLabelFlags="fontNormal" />
-</merge>
diff --git a/java/res/xml-sw600dp/rowkeys_farsi2.xml b/java/res/xml-sw600dp/rowkeys_farsi2.xml
deleted file mode 100644
index 3b759b6..0000000
--- a/java/res/xml-sw600dp/rowkeys_farsi2.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <!-- U+0634: "ش" ARABIC LETTER SHEEN -->
-    <Key
-        latin:keyLabel="&#x0634;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0633: "س" ARABIC LETTER SEEN -->
-    <Key
-        latin:keyLabel="&#x0633;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+06CC: "ی" ARABIC LETTER FARSI YEH
-         U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE
-         U+064A: "ي" ARABIC LETTER YEH
-         U+FBE8: "ﯨ" ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
-         U+0649: "ى" ARABIC LETTER ALEF MAKSURA -->
-    <Key
-        latin:keyLabel="&#x06CC;"
-        latin:moreKeys="&#x0626;,&#x064A;,&#xFBE8;|&#x0649;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0628: "ب" ARABIC LETTER BEH -->
-    <Key
-        latin:keyLabel="&#x0628;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0644: "ل" ARABIC LETTER LAM -->
-    <Key
-        latin:keyLabel="&#x0644;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0627: "ا" ARABIC LETTER ALEF
-         U+0621: "ء" ARABIC LETTER HAMZA
-         U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE
-         U+0623: "أ" ARABIC LETTER ALEF WITH HAMZA ABOVE
-         U+0671: "ٱ" ARABIC LETTER ALEF WASLA
-         U+0625: "إ" ARABIC LETTER ALEF WITH HAMZA BELOW -->
-    <Key
-        latin:keyLabel="&#x0627;"
-        latin:moreKeys="&#x0621;,&#x0622;,&#x0623;,&#x0671;,&#x0625;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062A: "ت" ARABIC LETTER TEH
-         U+062B: "ﺙ" ARABIC LETTER THEH
-         U+0629: "ة": ARABIC LETTER TEH MARBUTA -->
-    <Key
-        latin:keyLabel="&#x062A;"
-        latin:moreKeys="&#x062B;,&#x0629;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0646: "ن" ARABIC LETTER NOON -->
-    <Key
-        latin:keyLabel="&#x0646;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0645: "م" ARABIC LETTER MEEM -->
-    <Key
-        latin:keyLabel="&#x0645;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+06A9: "ک" ARABIC LETTER KEHEH
-         U+0643: "ك" ARABIC LETTER KAF -->
-    <Key
-        latin:keyLabel="&#x06A9;"
-        latin:moreKeys="&#x0643;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+06AF: "گ" ARABIC LETTER GAF -->
-    <Key
-        latin:keyLabel="&#x06AF;"
-        latin:keyLabelFlags="fontNormal" />
-</merge>
diff --git a/java/res/xml-sw600dp/rowkeys_farsi3.xml b/java/res/xml-sw600dp/rowkeys_farsi3.xml
deleted file mode 100644
index 3597618..0000000
--- a/java/res/xml-sw600dp/rowkeys_farsi3.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <!-- U+0638: "ظ" ARABIC LETTER ZAH -->
-    <Key
-        latin:keyLabel="&#x0638;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0637: "ط" ARABIC LETTER TAH -->
-    <Key
-        latin:keyLabel="&#x0637;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0698: "ژ" ARABIC LETTER JEH -->
-    <Key
-        latin:keyLabel="&#x0698;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0632: "ز" ARABIC LETTER ZAIN -->
-    <Key
-        latin:keyLabel="&#x0632;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0631: "ر" ARABIC LETTER REH -->
-    <Key
-        latin:keyLabel="&#x0631;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0630: "ذ" ARABIC LETTER THAL -->
-    <Key
-        latin:keyLabel="&#x0630;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062F: "د" ARABIC LETTER DAL -->
-    <Key
-        latin:keyLabel="&#x062F;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+067E: "پ" ARABIC LETTER PEH -->
-    <Key
-        latin:keyLabel="&#x067E;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0648: "و" ARABIC LETTER WAW
-         U+0624: "ؤ" ARABIC LETTER WAW WITH HAMZA ABOVE -->
-    <Key
-        latin:keyLabel="&#x0648;"
-        latin:moreKeys="&#x0624;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0622: "آ" ARABIC LETTER ALEF WITH MADDA ABOVE -->
-    <Key
-        latin:keyLabel="&#x0622;"
-        latin:keyLabelFlags="fontNormal" />
-</merge>
diff --git a/java/res/xml-sw600dp/rows_arabic.xml b/java/res/xml-sw600dp/rows_arabic.xml
index ec7c2ad..5a28d45 100644
--- a/java/res/xml-sw600dp/rows_arabic.xml
+++ b/java/res/xml-sw600dp/rows_arabic.xml
@@ -45,8 +45,7 @@
         latin:keyWidth="8.182%p"
     >
         <include
-            latin:keyboardLayout="@xml/rowkeys_arabic3"
-            latin:keyXPos="4.091%p" />
+            latin:keyboardLayout="@xml/rowkeys_arabic3" />
     </Row>
     <include
         latin:keyboardLayout="@xml/row_qwerty4" />
diff --git a/java/res/xml-sw600dp/rows_farsi.xml b/java/res/xml-sw600dp/rows_farsi.xml
index 52c2d93..a353b67 100644
--- a/java/res/xml-sw600dp/rows_farsi.xml
+++ b/java/res/xml-sw600dp/rows_farsi.xml
@@ -28,12 +28,6 @@
     >
         <include
             latin:keyboardLayout="@xml/rowkeys_farsi1" />
-    </Row>
-    <Row
-        latin:keyWidth="8.182%p"
-    >
-        <include
-            latin:keyboardLayout="@xml/rowkeys_farsi2" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyWidth="fillRight" />
@@ -42,12 +36,18 @@
         latin:keyWidth="8.182%p"
     >
         <include
-            latin:keyboardLayout="@xml/rowkeys_farsi3"
-            latin:keyXPos="4.091%p" />
+            latin:keyboardLayout="@xml/rowkeys_farsi2" />
         <Key
             latin:keyStyle="enterKeyStyle"
             latin:keyWidth="fillRight" />
     </Row>
+    <Row
+        latin:keyWidth="8.182%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_farsi3"
+            latin:keyXPos="4.091%p" />
+    </Row>
     <include
         latin:keyboardLayout="@xml/row_qwerty4" />
 </merge>
diff --git a/java/res/xml-sw768dp/rows_arabic.xml b/java/res/xml-sw768dp/rows_arabic.xml
index 8b05d93..204f6d5 100644
--- a/java/res/xml-sw768dp/rows_arabic.xml
+++ b/java/res/xml-sw768dp/rows_arabic.xml
@@ -54,7 +54,7 @@
     >
         <include
             latin:keyboardLayout="@xml/rowkeys_arabic3"
-            latin:keyXPos="13.829%p" />
+            latin:keyXPos="6.602%p" />
     </Row>
     <include
         latin:keyboardLayout="@xml/row_qwerty4" />
diff --git a/java/res/xml-sw768dp/rows_farsi.xml b/java/res/xml-sw768dp/rows_farsi.xml
index 4b4c970..8d3fb05 100644
--- a/java/res/xml-sw768dp/rows_farsi.xml
+++ b/java/res/xml-sw768dp/rows_farsi.xml
@@ -32,6 +32,9 @@
             latin:keyWidth="7.969%p" />
         <include
             latin:keyboardLayout="@xml/rowkeys_farsi1" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="fillRight" />
     </Row>
     <Row
         latin:keyWidth="7.227%p"
@@ -39,22 +42,19 @@
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelFlags="alignLeft"
-            latin:keyWidth="11.172%p"/>
+            latin:keyWidth="11.172%p" />
         <include
             latin:keyboardLayout="@xml/rowkeys_farsi2" />
         <Key
-            latin:keyStyle="deleteKeyStyle"
+            latin:keyStyle="enterKeyStyle"
             latin:keyWidth="fillRight" />
     </Row>
     <Row
-        latin:keyWidth="7.186%p"
+        latin:keyWidth="7.227%p"
     >
         <include
             latin:keyboardLayout="@xml/rowkeys_farsi3"
             latin:keyXPos="13.829%p" />
-        <Key
-            latin:keyStyle="enterKeyStyle"
-            latin:keyWidth="fillRight" />
     </Row>
     <include
         latin:keyboardLayout="@xml/row_qwerty4" />
diff --git a/java/res/xml/keys_arabic3_left.xml b/java/res/xml/keys_arabic3_left.xml
new file mode 100644
index 0000000..157af4a
--- /dev/null
+++ b/java/res/xml/keys_arabic3_left.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0630: "ذ" ARABIC LETTER THAL -->
+    <Key
+        latin:keyLabel="&#x0630;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml/keys_farsi3_right.xml b/java/res/xml/keys_farsi3_right.xml
new file mode 100644
index 0000000..77efb0a
--- /dev/null
+++ b/java/res/xml/keys_farsi3_right.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0686: "چ" ARABIC LETTER TCHEH -->
+    <Key
+        latin:keyLabel="&#x0686;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index f30ef23..5e33601 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -21,9 +21,10 @@
 <!-- for the Input Method Manager. -->
 
 <!-- Supported subtypes
-    keyboard_locale: script_name/keyboard_layout_set[:keyboard_locale]
+    keyboard_locale: script_name/keyboard_layout_set
     af: Afrikaans/qwerty
     ar: Arabic/arabic
+    az: Azerbaijani/qwerty
     be: Belarusian/east_slavic
     bg: Bulgarian/bulgarian
     bg: Bulgarian/bulgarian_bds
@@ -51,6 +52,7 @@
     it: Italian/qwerty
     iw: Hebrew/hebrew        # "he" is official language code of Hebrew.
     ka: Georgian/georgian
+    kk: Kazakh/east_slavic
     ky: Kyrgyz/east_slavic
     lt: Lithuanian/qwerty
     lv: Latvian/qwerty
@@ -117,6 +119,13 @@
     />
     <subtype android:icon="@drawable/ic_subtype_keyboard"
             android:label="@string/subtype_generic"
+            android:subtypeId="0x2a362219"
+            android:imeSubtypeLocale="az"
+            android:imeSubtypeMode="keyboard"
+            android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection"
+    />
+    <subtype android:icon="@drawable/ic_subtype_keyboard"
+            android:label="@string/subtype_generic"
             android:subtypeId="0x1dc3a859"
             android:imeSubtypeLocale="be"
             android:imeSubtypeMode="keyboard"
@@ -296,6 +305,13 @@
     />
     <subtype android:icon="@drawable/ic_subtype_keyboard"
             android:label="@string/subtype_generic"
+            android:subtypeId="0x2d73d2f6"
+            android:imeSubtypeLocale="kk"
+            android:imeSubtypeMode="keyboard"
+            android:imeSubtypeExtraValue="KeyboardLayoutSet=east_slavic"
+    />
+    <subtype android:icon="@drawable/ic_subtype_keyboard"
+            android:label="@string/subtype_generic"
             android:subtypeId="0x2e391c04"
             android:imeSubtypeLocale="ky"
             android:imeSubtypeMode="keyboard"
diff --git a/java/res/xml/rowkeys_arabic1.xml b/java/res/xml/rowkeys_arabic1.xml
index a4bef83..3c0acf1 100644
--- a/java/res/xml/rowkeys_arabic1.xml
+++ b/java/res/xml/rowkeys_arabic1.xml
@@ -35,74 +35,78 @@
         latin:keyHintLabel="2"
         latin:additionalMoreKeys="2,&#x0662;"
         latin:keyLabelFlags="fontNormal" />
+    <!-- U+062B: "ث" ARABIC LETTER THEH
+         U+0663: "٣" ARABIC-INDIC DIGIT THREE -->
+    <Key
+        latin:keyLabel="&#x062B;"
+        latin:keyHintLabel="3"
+        latin:additionalMoreKeys="3,&#x0663;"
+        latin:keyLabelFlags="fontNormal" />
     <!-- U+0642: "ق" ARABIC LETTER QAF
          U+06A8: "ڨ" ARABIC LETTER QAF WITH THREE DOTS ABOVE
-         U+0663: "٣" ARABIC-INDIC DIGIT THREE -->
+         U+0664: "٤" ARABIC-INDIC DIGIT FOUR -->
     <!-- TODO: DroidSansArabic lacks the glyph of U+06A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE -->
     <Key
         latin:keyLabel="&#x0642;"
-        latin:keyHintLabel="3"
-        latin:additionalMoreKeys="3,&#x0663;"
+        latin:keyHintLabel="4"
+        latin:additionalMoreKeys="4,&#x0664;"
         latin:moreKeys="&#x06A8;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0641: "ف" ARABIC LETTER FEH
          U+06A4: "ڤ" ARABIC LETTER VEH
          U+06A2: "ڢ" ARABIC LETTER FEH WITH DOT MOVED BELOW
          U+06A5: "ڥ" ARABIC LETTER FEH WITH THREE DOTS BELOW
-         U+0664: "٤" ARABIC-INDIC DIGIT FOUR -->
+         U+0665: "٥" ARABIC-INDIC DIGIT FIVE -->
     <!-- TODO: DroidSansArabic lacks the glyph of U+06A2 ARABIC LETTER FEH WITH DOT MOVED BELOW -->
     <!-- TODO: DroidSansArabic lacks the glyph of U+06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW -->
     <Key
         latin:keyLabel="&#x0641;"
-        latin:keyHintLabel="4"
-        latin:additionalMoreKeys="4,&#x0664;"
+        latin:keyHintLabel="5"
+        latin:additionalMoreKeys="5,&#x0665;"
         latin:moreKeys="&#x06A4;,&#x06A2;,&#x06A5;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+063A: "غ" ARABIC LETTER GHAIN
-         U+0665: "٥" ARABIC-INDIC DIGIT FIVE -->
-    <Key
-        latin:keyLabel="&#x063A;"
-        latin:keyHintLabel="5"
-        latin:additionalMoreKeys="5,&#x0665;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0639: "ع" ARABIC LETTER AIN
          U+0666: "٦" ARABIC-INDIC DIGIT SIX -->
     <Key
-        latin:keyLabel="&#x0639;"
+        latin:keyLabel="&#x063A;"
         latin:keyHintLabel="6"
         latin:additionalMoreKeys="6,&#x0666;"
         latin:keyLabelFlags="fontNormal" />
+    <!-- U+0639: "ع" ARABIC LETTER AIN
+         U+0667: "٧" ARABIC-INDIC DIGIT SEVEN -->
+    <Key
+        latin:keyLabel="&#x0639;"
+        latin:keyHintLabel="7"
+        latin:additionalMoreKeys="7,&#x0667;"
+        latin:keyLabelFlags="fontNormal" />
     <!-- U+0647: "ه" ARABIC LETTER HEH
          U+FEEB: "ﻫ" ARABIC LETTER HEH INITIAL FORM
          U+0647 U+200D: ARABIC LETTER HEH + ZERO WIDTH JOINER
-         U+0667: "٧" ARABIC-INDIC DIGIT SEVEN -->
+         U+0668: "٨" ARABIC-INDIC DIGIT EIGHT -->
     <Key
         latin:keyLabel="&#x0647;"
-        latin:keyHintLabel="7"
-        latin:additionalMoreKeys="7,&#x0667;"
+        latin:keyHintLabel="8"
+        latin:additionalMoreKeys="8,&#x0668;"
         latin:moreKeys="&#xFEEB;|&#x0647;&#x200D;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062E: "خ" ARABIC LETTER KHAH
-         U+0668: "٨" ARABIC-INDIC DIGIT EIGHT -->
-    <Key
-        latin:keyLabel="&#x062E;"
-        latin:keyHintLabel="8"
-        latin:additionalMoreKeys="8,&#x0668;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062D: "ح" ARABIC LETTER HAH
          U+0669: "٩" ARABIC-INDIC DIGIT NINE -->
     <Key
-        latin:keyLabel="&#x062D;"
+        latin:keyLabel="&#x062E;"
         latin:keyHintLabel="9"
         latin:additionalMoreKeys="9,&#x0669;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+062C: "ج" ARABIC LETTER JEEM
-         U+0686: "چ" ARABIC LETTER TCHEH
+    <!-- U+062D: "ح" ARABIC LETTER HAH
          U+0660: "٠" ARABIC-INDIC DIGIT ZERO -->
     <Key
-        latin:keyLabel="&#x062C;"
+        latin:keyLabel="&#x062D;"
         latin:keyHintLabel="0"
         latin:additionalMoreKeys="0,&#x0660;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+062C: "ج" ARABIC LETTER JEEM
+         U+0686: "چ" ARABIC LETTER TCHEH -->
+    <Key
+        latin:keyLabel="&#x062C;"
         latin:moreKeys="&#x0686;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_arabic2.xml b/java/res/xml/rowkeys_arabic2.xml
index d733f64..00e69ac 100644
--- a/java/res/xml/rowkeys_arabic2.xml
+++ b/java/res/xml/rowkeys_arabic2.xml
@@ -68,11 +68,9 @@
         latin:keyLabel="&#x0627;"
         latin:moreKeys="&#x0621;,&#x0671;,&#x0623;,&#x0625;,&#x0622;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+062A: "ت" ARABIC LETTER TEH
-         U+062B: "ﺙ" ARABIC LETTER THEH -->
+    <!-- U+062A: "ت" ARABIC LETTER TEH -->
     <Key
         latin:keyLabel="&#x062A;"
-        latin:moreKeys="&#x062B;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0646: "ن" ARABIC LETTER NOON -->
     <Key
@@ -89,4 +87,8 @@
         latin:keyLabel="&#x0643;"
         latin:moreKeys="&#x06AF;,&#x06A9;"
         latin:keyLabelFlags="fontNormal" />
+    <!-- U+0637: "ط" ARABIC LETTER TAH -->
+    <Key
+        latin:keyLabel="&#x0637;"
+        latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_arabic3.xml b/java/res/xml/rowkeys_arabic3.xml
index e4e6948..8a17b4b 100644
--- a/java/res/xml/rowkeys_arabic3.xml
+++ b/java/res/xml/rowkeys_arabic3.xml
@@ -21,21 +21,33 @@
 <merge
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
-    <!-- U+0638: "ظ" ARABIC LETTER ZAH -->
+    <include
+        latin:keyboardLayout="@xml/keys_arabic3_left" />
+    <!-- U+0621: "ء" ARABIC LETTER HAMZA -->
     <Key
-        latin:keyLabel="&#x0638;"
+        latin:keyLabel="&#x0621;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0637: "ط" ARABIC LETTER TAH -->
+    <!-- U+0624: "ؤ" ARABIC LETTER WAW WITH HAMZA ABOVE -->
     <Key
-        latin:keyLabel="&#x0637;"
+        latin:keyLabel="&#x0624;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0630: "ذ" ARABIC LETTER THAL -->
+    <!-- U+0631: "ر" ARABIC LETTER REH -->
     <Key
-        latin:keyLabel="&#x0630;"
+        latin:keyLabel="&#x0631;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+062F: "د" ARABIC LETTER DAL -->
+    <!-- U+0649: "ى" ARABIC LETTER ALEF MAKSURA
+         U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE -->
     <Key
-        latin:keyLabel="&#x062F;"
+        latin:keyLabel="&#x0649;"
+        latin:moreKeys="&#x0626;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0629: "ة" ARABIC LETTER TEH MARBUTA -->
+    <Key
+        latin:keyLabel="&#x0629;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0648: "و" ARABIC LETTER WAW -->
+    <Key
+        latin:keyLabel="&#x0648;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0632: "ز" ARABIC LETTER ZAIN
          U+0698: "ژ" ARABIC LETTER JEH -->
@@ -43,18 +55,12 @@
         latin:keyLabel="&#x0632;"
         latin:moreKeys="&#x0698;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0631: "ر" ARABIC LETTER REH -->
+    <!-- U+0638: "ظ" ARABIC LETTER ZAH -->
     <Key
-        latin:keyLabel="&#x0631;"
+        latin:keyLabel="&#x0638;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0629: "ة" ARABIC LETTER TEH MARBUTA -->
+    <!-- U+062F: "د" ARABIC LETTER DAL -->
     <Key
-        latin:keyLabel="&#x0629;"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+0648: "و" ARABIC LETTER WAW
-         U+0624: "ﺅ" ARABIC LETTER WAW WITH HAMZA ABOVE -->
-    <Key
-        latin:keyLabel="&#x0648;"
-        latin:moreKeys="&#x0624;"
+        latin:keyLabel="&#x062F;"
         latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_east_slavic1.xml b/java/res/xml/rowkeys_east_slavic1.xml
index c1b43bd..5b3b4b4 100644
--- a/java/res/xml/rowkeys_east_slavic1.xml
+++ b/java/res/xml/rowkeys_east_slavic1.xml
@@ -41,7 +41,8 @@
     <Key
         latin:keyLabel="&#x043A;"
         latin:keyHintLabel="4"
-        latin:additionalMoreKeys="4" />
+        latin:additionalMoreKeys="4"
+        latin:moreKeys="!text/more_keys_for_cyrillic_ka" />
     <!-- U+0435: "е" CYRILLIC SMALL LETTER IE -->
     <Key
         latin:keyLabel="&#x0435;"
diff --git a/java/res/xml/rowkeys_east_slavic2.xml b/java/res/xml/rowkeys_east_slavic2.xml
index 9743727..2e412f0 100644
--- a/java/res/xml/rowkeys_east_slavic2.xml
+++ b/java/res/xml/rowkeys_east_slavic2.xml
@@ -32,7 +32,8 @@
         latin:keyLabel="&#x0432;" />
     <!-- U+0430: "а" CYRILLIC SMALL LETTER A -->
     <Key
-        latin:keyLabel="&#x0430;" />
+        latin:keyLabel="&#x0430;"
+        latin:moreKeys="!text/more_keys_for_cyrillic_a" />
     <!-- U+043F: "п" CYRILLIC SMALL LETTER PE -->
     <Key
         latin:keyLabel="&#x043F;" />
@@ -53,5 +54,6 @@
     <Key
         latin:keyLabel="&#x0436;" />
     <Key
-        latin:keyLabel="!text/keylabel_for_east_slavic_row2_11" />
+        latin:keyLabel="!text/keylabel_for_east_slavic_row2_11"
+        latin:moreKeys="!text/more_keys_for_east_slavic_row2_11" />
 </merge>
diff --git a/java/res/xml/rowkeys_farsi1.xml b/java/res/xml/rowkeys_farsi1.xml
index 0ccf1ab..5a22a24 100644
--- a/java/res/xml/rowkeys_farsi1.xml
+++ b/java/res/xml/rowkeys_farsi1.xml
@@ -21,81 +21,83 @@
 <merge
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
-    <!-- U+0635: "ص" ARABIC LETTER SAD
-         U+0636: "ض" ARABIC LETTER DAD
+    <!-- U+0636: "ض" ARABIC LETTER DAD
          U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE -->
     <Key
-        latin:keyLabel="&#x0635;"
-        latin:moreKeys="&#x0636;,%"
+        latin:keyLabel="&#x0636;"
         latin:keyHintLabel="&#x06F1;"
         latin:additionalMoreKeys="&#x06F1;,1"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0642: "ق" ARABIC LETTER QAF
+    <!-- U+0635: "ص" ARABIC LETTER SAD
          U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO -->
     <Key
-        latin:keyLabel="&#x0642;"
+        latin:keyLabel="&#x0635;"
         latin:keyHintLabel="&#x06F2;"
         latin:additionalMoreKeys="&#x06F2;,2"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0641: "ف" ARABIC LETTER FEH
+    <!-- U+062B: "ث" ARABIC LETTER THEH
          U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE -->
     <Key
-        latin:keyLabel="&#x0641;"
+        latin:keyLabel="&#x062B;"
         latin:keyHintLabel="&#x06F3;"
         latin:additionalMoreKeys="&#x06F3;,3"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+063A: "غ" ARABIC LETTER GHAIN
+    <!-- U+0642: "ق" ARABIC LETTER QAF
          U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR -->
     <Key
-        latin:keyLabel="&#x063A;"
+        latin:keyLabel="&#x0642;"
         latin:keyHintLabel="&#x06F4;"
         latin:additionalMoreKeys="&#x06F4;,4"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0639: "ع" ARABIC LETTER AIN
+    <!-- U+0641: "ف" ARABIC LETTER FEH
          U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE -->
     <Key
-        latin:keyLabel="&#x0639;"
+        latin:keyLabel="&#x0641;"
         latin:keyHintLabel="&#x06F5;"
         latin:additionalMoreKeys="&#x06F5;,5"
         latin:keyLabelFlags="fontNormal" />
+    <!-- U+063A: "غ" ARABIC LETTER GHAIN
+         U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX -->
+    <Key
+        latin:keyLabel="&#x063A;"
+        latin:keyHintLabel="&#x06F6;"
+        latin:additionalMoreKeys="&#x06F6;,6"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0639: "ع" ARABIC LETTER AIN
+         U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN -->
+    <Key
+        latin:keyLabel="&#x0639;"
+        latin:keyHintLabel="&#x06F7;"
+        latin:additionalMoreKeys="&#x06F7;,7"
+        latin:keyLabelFlags="fontNormal" />
     <!-- U+0647: "ه" ARABIC LETTER HEH
          U+FEEB: "ﻫ" ARABIC LETTER HEH INITIAL FORM
          U+0647/U+200D: ARABIC LETTER HEH + ZERO WIDTH JOINER
          U+0647/U+0654: ARABIC LETTER HEH + ARABIC HAMZA ABOVE
          U+0629: "ة" ARABIC LETTER TEH MARBUTA
-         U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX -->
+         U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT -->
     <Key
         latin:keyLabel="&#x0647;"
         latin:moreKeys="&#xFEEB;|&#x0647;&#x200D;,&#x0647;&#x0654;,&#x0629;,%"
-        latin:keyHintLabel="&#x06F6;"
-        latin:additionalMoreKeys="&#x06F6;,6"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062E: "خ" ARABIC LETTER KHAH
-         U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN -->
-    <Key
-        latin:keyLabel="&#x062E;"
-        latin:keyHintLabel="&#x06F7;"
-        latin:additionalMoreKeys="&#x06F7;,7"
-        latin:keyLabelFlags="fontNormal" />
-    <!-- U+062D: "ح" ARABIC LETTER HAH
-         U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT -->
-    <Key
-        latin:keyLabel="&#x062D;"
         latin:keyHintLabel="&#x06F8;"
         latin:additionalMoreKeys="&#x06F8;,8"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+062C: "ج" ARABIC LETTER JEEM
+    <!-- U+062E: "خ" ARABIC LETTER KHAH
          U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE -->
     <Key
-        latin:keyLabel="&#x062C;"
+        latin:keyLabel="&#x062E;"
         latin:keyHintLabel="&#x06F9;"
         latin:additionalMoreKeys="&#x06F9;,9"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0686: "چ" ARABIC LETTER TCHEH
+    <!-- U+062D: "ح" ARABIC LETTER HAH
          U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO -->
     <Key
-        latin:keyLabel="&#x0686;"
+        latin:keyLabel="&#x062D;"
         latin:keyHintLabel="&#x06F0;"
         latin:additionalMoreKeys="&#x06F0;,0"
         latin:keyLabelFlags="fontNormal" />
+    <!-- U+062C: "ج" ARABIC LETTER JEEM -->
+    <Key
+        latin:keyLabel="&#x062C;"
+        latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_farsi2.xml b/java/res/xml/rowkeys_farsi2.xml
index 4b6abe2..fc6789e 100644
--- a/java/res/xml/rowkeys_farsi2.xml
+++ b/java/res/xml/rowkeys_farsi2.xml
@@ -25,11 +25,9 @@
     <Key
         latin:keyLabel="&#x0634;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0633: "س" ARABIC LETTER SEEN
-         U+0636: "ض" ARABIC LETTER DAD -->
+    <!-- U+0633: "س" ARABIC LETTER SEEN -->
     <Key
         latin:keyLabel="&#x0633;"
-        latin:moreKeys="&#x0636;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+06CC: "ی" ARABIC LETTER FARSI YEH
          U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE
@@ -59,11 +57,10 @@
         latin:moreKeys="&#x0621;,&#x0622;,&#x0623;,&#x0671;,&#x0625;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+062A: "ت" ARABIC LETTER TEH
-         U+062B: "ﺙ" ARABIC LETTER THEH
          U+0629: "ة": ARABIC LETTER TEH MARBUTA -->
     <Key
         latin:keyLabel="&#x062A;"
-        latin:moreKeys="&#x062B;,&#x0629;"
+        latin:moreKeys="&#x0629;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0646: "ن" ARABIC LETTER NOON -->
     <Key
@@ -79,4 +76,8 @@
         latin:keyLabel="&#x06A9;"
         latin:moreKeys="&#x0643;"
         latin:keyLabelFlags="fontNormal" />
+    <!-- U+06AF: "گ" ARABIC LETTER GAF -->
+    <Key
+        latin:keyLabel="&#x06AF;"
+        latin:keyLabelFlags="fontNormal" />
 </merge>
diff --git a/java/res/xml/rowkeys_farsi3.xml b/java/res/xml/rowkeys_farsi3.xml
index 7d2e81f..98949f4 100644
--- a/java/res/xml/rowkeys_farsi3.xml
+++ b/java/res/xml/rowkeys_farsi3.xml
@@ -21,17 +21,21 @@
 <merge
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
-    <!-- U+0637: "ط" ARABIC LETTER TAH
-         U+0638: "ظ" ARABIC LETTER ZAH -->
+    <!-- U+0638: "ظ" ARABIC LETTER ZAH -->
+    <Key
+        latin:keyLabel="&#x0638;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0637: "ط" ARABIC LETTER TAH -->
     <Key
         latin:keyLabel="&#x0637;"
-        latin:moreKeys="&#x0638;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+0632: "ز" ARABIC LETTER ZAIN
-         U+0698: "ژ" ARABIC LETTER JEH -->
+    <!-- U+0698: "ژ" ARABIC LETTER JEH -->
+    <Key
+        latin:keyLabel="&#x0698;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0632: "ز" ARABIC LETTER ZAIN -->
     <Key
         latin:keyLabel="&#x0632;"
-        latin:moreKeys="&#x0698;"
         latin:keyLabelFlags="fontNormal" />
     <!-- U+0631: "ر" ARABIC LETTER REH -->
     <Key
@@ -55,8 +59,6 @@
         latin:keyLabel="&#x0648;"
         latin:moreKeys="&#x0624;"
         latin:keyLabelFlags="fontNormal" />
-    <!-- U+06AF: "گ" ARABIC LETTER GAF -->
-    <Key
-        latin:keyLabel="&#x06AF;"
-        latin:keyLabelFlags="fontNormal" />
+    <include
+        latin:keyboardLayout="@xml/keys_farsi3_right" />
 </merge>
diff --git a/java/res/xml/rows_arabic.xml b/java/res/xml/rows_arabic.xml
index 6449af2..798c23e 100644
--- a/java/res/xml/rows_arabic.xml
+++ b/java/res/xml/rows_arabic.xml
@@ -24,27 +24,25 @@
     <include
         latin:keyboardLayout="@xml/key_styles_common" />
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="9.091%p"
     >
         <include
             latin:keyboardLayout="@xml/rowkeys_arabic1" />
     </Row>
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="9.091%p"
     >
         <include
             latin:keyboardLayout="@xml/rowkeys_arabic2" />
     </Row>
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="9.091%p"
     >
         <include
-            latin:keyboardLayout="@xml/rowkeys_arabic3"
-            latin:keyXPos="5.0%p" />
+            latin:keyboardLayout="@xml/rowkeys_arabic3" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="fillRight"
-            latin:visualInsetsLeft="1%p" />
+            latin:keyWidth="fillRight" />
     </Row>
     <include
         latin:keyboardLayout="@xml/row_qwerty4" />
diff --git a/java/res/xml/rows_farsi.xml b/java/res/xml/rows_farsi.xml
index cc0c526..c74614f 100644
--- a/java/res/xml/rows_farsi.xml
+++ b/java/res/xml/rows_farsi.xml
@@ -24,27 +24,25 @@
     <include
         latin:keyboardLayout="@xml/key_styles_common" />
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="9.091%p"
     >
         <include
             latin:keyboardLayout="@xml/rowkeys_farsi1" />
     </Row>
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="9.091%p"
     >
         <include
             latin:keyboardLayout="@xml/rowkeys_farsi2" />
     </Row>
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="9.091%p"
     >
         <include
-            latin:keyboardLayout="@xml/rowkeys_farsi3"
-            latin:keyXPos="5.0%p" />
+            latin:keyboardLayout="@xml/rowkeys_farsi3" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="fillRight"
-            latin:visualInsetsLeft="1%p" />
+            latin:keyWidth="fillRight" />
     </Row>
     <include
         latin:keyboardLayout="@xml/row_qwerty4" />
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
index 467c15f..1594df7 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
@@ -133,122 +133,125 @@
         /* 28 */ "keylabel_for_east_slavic_row2_11",
         /* 29 */ "keylabel_for_east_slavic_row3_5",
         /* 30 */ "more_keys_for_cyrillic_u",
-        /* 31 */ "more_keys_for_cyrillic_en",
-        /* 32 */ "more_keys_for_cyrillic_ghe",
-        /* 33 */ "more_keys_for_east_slavic_row2_1",
-        /* 34 */ "more_keys_for_cyrillic_o",
-        /* 35 */ "more_keys_for_cyrillic_soft_sign",
-        /* 36 */ "keylabel_for_south_slavic_row1_6",
-        /* 37 */ "keylabel_for_south_slavic_row2_11",
-        /* 38 */ "keylabel_for_south_slavic_row3_1",
-        /* 39 */ "keylabel_for_south_slavic_row3_8",
-        /* 40 */ "more_keys_for_cyrillic_ie",
-        /* 41 */ "more_keys_for_cyrillic_i",
-        /* 42 */ "label_to_alpha_key",
-        /* 43 */ "single_quotes",
-        /* 44 */ "double_quotes",
-        /* 45 */ "single_angle_quotes",
-        /* 46 */ "double_angle_quotes",
-        /* 47 */ "more_keys_for_currency_dollar",
-        /* 48 */ "keylabel_for_currency_generic",
-        /* 49 */ "more_keys_for_currency_generic",
-        /* 50 */ "more_keys_for_punctuation",
-        /* 51 */ "more_keys_for_star",
-        /* 52 */ "more_keys_for_bullet",
-        /* 53 */ "more_keys_for_plus",
-        /* 54 */ "more_keys_for_left_parenthesis",
-        /* 55 */ "more_keys_for_right_parenthesis",
-        /* 56 */ "more_keys_for_less_than",
-        /* 57 */ "more_keys_for_greater_than",
-        /* 58 */ "more_keys_for_arabic_diacritics",
-        /* 59 */ "keyhintlabel_for_arabic_diacritics",
-        /* 60 */ "keylabel_for_symbols_1",
-        /* 61 */ "keylabel_for_symbols_2",
-        /* 62 */ "keylabel_for_symbols_3",
-        /* 63 */ "keylabel_for_symbols_4",
-        /* 64 */ "keylabel_for_symbols_5",
-        /* 65 */ "keylabel_for_symbols_6",
-        /* 66 */ "keylabel_for_symbols_7",
-        /* 67 */ "keylabel_for_symbols_8",
-        /* 68 */ "keylabel_for_symbols_9",
-        /* 69 */ "keylabel_for_symbols_0",
-        /* 70 */ "label_to_symbol_key",
-        /* 71 */ "label_to_symbol_with_microphone_key",
-        /* 72 */ "additional_more_keys_for_symbols_1",
-        /* 73 */ "additional_more_keys_for_symbols_2",
-        /* 74 */ "additional_more_keys_for_symbols_3",
-        /* 75 */ "additional_more_keys_for_symbols_4",
-        /* 76 */ "additional_more_keys_for_symbols_5",
-        /* 77 */ "additional_more_keys_for_symbols_6",
-        /* 78 */ "additional_more_keys_for_symbols_7",
-        /* 79 */ "additional_more_keys_for_symbols_8",
-        /* 80 */ "additional_more_keys_for_symbols_9",
-        /* 81 */ "additional_more_keys_for_symbols_0",
-        /* 82 */ "more_keys_for_symbols_1",
-        /* 83 */ "more_keys_for_symbols_2",
-        /* 84 */ "more_keys_for_symbols_3",
-        /* 85 */ "more_keys_for_symbols_4",
-        /* 86 */ "more_keys_for_symbols_5",
-        /* 87 */ "more_keys_for_symbols_6",
-        /* 88 */ "more_keys_for_symbols_7",
-        /* 89 */ "more_keys_for_symbols_8",
-        /* 90 */ "more_keys_for_symbols_9",
-        /* 91 */ "more_keys_for_symbols_0",
-        /* 92 */ "keylabel_for_comma",
-        /* 93 */ "more_keys_for_comma",
-        /* 94 */ "keylabel_for_symbols_question",
-        /* 95 */ "keylabel_for_symbols_semicolon",
-        /* 96 */ "keylabel_for_symbols_percent",
-        /* 97 */ "more_keys_for_symbols_exclamation",
-        /* 98 */ "more_keys_for_symbols_question",
-        /* 99 */ "more_keys_for_symbols_semicolon",
-        /* 100 */ "more_keys_for_symbols_percent",
-        /* 101 */ "keylabel_for_tablet_comma",
-        /* 102 */ "keyhintlabel_for_tablet_comma",
-        /* 103 */ "more_keys_for_tablet_comma",
-        /* 104 */ "keyhintlabel_for_tablet_period",
-        /* 105 */ "more_keys_for_tablet_period",
-        /* 106 */ "keylabel_for_apostrophe",
-        /* 107 */ "keyhintlabel_for_apostrophe",
-        /* 108 */ "more_keys_for_apostrophe",
-        /* 109 */ "more_keys_for_q",
-        /* 110 */ "more_keys_for_x",
-        /* 111 */ "keylabel_for_q",
-        /* 112 */ "keylabel_for_w",
-        /* 113 */ "keylabel_for_y",
-        /* 114 */ "keylabel_for_x",
-        /* 115 */ "keylabel_for_spanish_row2_10",
-        /* 116 */ "more_keys_for_am_pm",
-        /* 117 */ "settings_as_more_key",
-        /* 118 */ "shortcut_as_more_key",
-        /* 119 */ "action_next_as_more_key",
-        /* 120 */ "action_previous_as_more_key",
-        /* 121 */ "label_to_more_symbol_key",
-        /* 122 */ "label_to_more_symbol_for_tablet_key",
-        /* 123 */ "label_tab_key",
-        /* 124 */ "label_to_phone_numeric_key",
-        /* 125 */ "label_to_phone_symbols_key",
-        /* 126 */ "label_time_am",
-        /* 127 */ "label_time_pm",
-        /* 128 */ "label_to_symbol_key_pcqwerty",
-        /* 129 */ "keylabel_for_popular_domain",
-        /* 130 */ "more_keys_for_popular_domain",
-        /* 131 */ "more_keys_for_smiley",
-        /* 132 */ "single_laqm_raqm",
-        /* 133 */ "single_laqm_raqm_rtl",
-        /* 134 */ "single_raqm_laqm",
-        /* 135 */ "double_laqm_raqm",
-        /* 136 */ "double_laqm_raqm_rtl",
-        /* 137 */ "double_raqm_laqm",
-        /* 138 */ "single_lqm_rqm",
-        /* 139 */ "single_9qm_lqm",
-        /* 140 */ "single_9qm_rqm",
-        /* 141 */ "double_lqm_rqm",
-        /* 142 */ "double_9qm_lqm",
-        /* 143 */ "double_9qm_rqm",
-        /* 144 */ "more_keys_for_single_quote",
-        /* 145 */ "more_keys_for_double_quote",
-        /* 146 */ "more_keys_for_tablet_double_quote",
+        /* 31 */ "more_keys_for_cyrillic_ka",
+        /* 32 */ "more_keys_for_cyrillic_en",
+        /* 33 */ "more_keys_for_cyrillic_ghe",
+        /* 34 */ "more_keys_for_east_slavic_row2_1",
+        /* 35 */ "more_keys_for_cyrillic_a",
+        /* 36 */ "more_keys_for_cyrillic_o",
+        /* 37 */ "more_keys_for_cyrillic_soft_sign",
+        /* 38 */ "more_keys_for_east_slavic_row2_11",
+        /* 39 */ "keylabel_for_south_slavic_row1_6",
+        /* 40 */ "keylabel_for_south_slavic_row2_11",
+        /* 41 */ "keylabel_for_south_slavic_row3_1",
+        /* 42 */ "keylabel_for_south_slavic_row3_8",
+        /* 43 */ "more_keys_for_cyrillic_ie",
+        /* 44 */ "more_keys_for_cyrillic_i",
+        /* 45 */ "label_to_alpha_key",
+        /* 46 */ "single_quotes",
+        /* 47 */ "double_quotes",
+        /* 48 */ "single_angle_quotes",
+        /* 49 */ "double_angle_quotes",
+        /* 50 */ "more_keys_for_currency_dollar",
+        /* 51 */ "keylabel_for_currency_generic",
+        /* 52 */ "more_keys_for_currency_generic",
+        /* 53 */ "more_keys_for_punctuation",
+        /* 54 */ "more_keys_for_star",
+        /* 55 */ "more_keys_for_bullet",
+        /* 56 */ "more_keys_for_plus",
+        /* 57 */ "more_keys_for_left_parenthesis",
+        /* 58 */ "more_keys_for_right_parenthesis",
+        /* 59 */ "more_keys_for_less_than",
+        /* 60 */ "more_keys_for_greater_than",
+        /* 61 */ "more_keys_for_arabic_diacritics",
+        /* 62 */ "keyhintlabel_for_arabic_diacritics",
+        /* 63 */ "keylabel_for_symbols_1",
+        /* 64 */ "keylabel_for_symbols_2",
+        /* 65 */ "keylabel_for_symbols_3",
+        /* 66 */ "keylabel_for_symbols_4",
+        /* 67 */ "keylabel_for_symbols_5",
+        /* 68 */ "keylabel_for_symbols_6",
+        /* 69 */ "keylabel_for_symbols_7",
+        /* 70 */ "keylabel_for_symbols_8",
+        /* 71 */ "keylabel_for_symbols_9",
+        /* 72 */ "keylabel_for_symbols_0",
+        /* 73 */ "label_to_symbol_key",
+        /* 74 */ "label_to_symbol_with_microphone_key",
+        /* 75 */ "additional_more_keys_for_symbols_1",
+        /* 76 */ "additional_more_keys_for_symbols_2",
+        /* 77 */ "additional_more_keys_for_symbols_3",
+        /* 78 */ "additional_more_keys_for_symbols_4",
+        /* 79 */ "additional_more_keys_for_symbols_5",
+        /* 80 */ "additional_more_keys_for_symbols_6",
+        /* 81 */ "additional_more_keys_for_symbols_7",
+        /* 82 */ "additional_more_keys_for_symbols_8",
+        /* 83 */ "additional_more_keys_for_symbols_9",
+        /* 84 */ "additional_more_keys_for_symbols_0",
+        /* 85 */ "more_keys_for_symbols_1",
+        /* 86 */ "more_keys_for_symbols_2",
+        /* 87 */ "more_keys_for_symbols_3",
+        /* 88 */ "more_keys_for_symbols_4",
+        /* 89 */ "more_keys_for_symbols_5",
+        /* 90 */ "more_keys_for_symbols_6",
+        /* 91 */ "more_keys_for_symbols_7",
+        /* 92 */ "more_keys_for_symbols_8",
+        /* 93 */ "more_keys_for_symbols_9",
+        /* 94 */ "more_keys_for_symbols_0",
+        /* 95 */ "keylabel_for_comma",
+        /* 96 */ "more_keys_for_comma",
+        /* 97 */ "keylabel_for_symbols_question",
+        /* 98 */ "keylabel_for_symbols_semicolon",
+        /* 99 */ "keylabel_for_symbols_percent",
+        /* 100 */ "more_keys_for_symbols_exclamation",
+        /* 101 */ "more_keys_for_symbols_question",
+        /* 102 */ "more_keys_for_symbols_semicolon",
+        /* 103 */ "more_keys_for_symbols_percent",
+        /* 104 */ "keylabel_for_tablet_comma",
+        /* 105 */ "keyhintlabel_for_tablet_comma",
+        /* 106 */ "more_keys_for_tablet_comma",
+        /* 107 */ "keyhintlabel_for_tablet_period",
+        /* 108 */ "more_keys_for_tablet_period",
+        /* 109 */ "keylabel_for_apostrophe",
+        /* 110 */ "keyhintlabel_for_apostrophe",
+        /* 111 */ "more_keys_for_apostrophe",
+        /* 112 */ "more_keys_for_q",
+        /* 113 */ "more_keys_for_x",
+        /* 114 */ "keylabel_for_q",
+        /* 115 */ "keylabel_for_w",
+        /* 116 */ "keylabel_for_y",
+        /* 117 */ "keylabel_for_x",
+        /* 118 */ "keylabel_for_spanish_row2_10",
+        /* 119 */ "more_keys_for_am_pm",
+        /* 120 */ "settings_as_more_key",
+        /* 121 */ "shortcut_as_more_key",
+        /* 122 */ "action_next_as_more_key",
+        /* 123 */ "action_previous_as_more_key",
+        /* 124 */ "label_to_more_symbol_key",
+        /* 125 */ "label_to_more_symbol_for_tablet_key",
+        /* 126 */ "label_tab_key",
+        /* 127 */ "label_to_phone_numeric_key",
+        /* 128 */ "label_to_phone_symbols_key",
+        /* 129 */ "label_time_am",
+        /* 130 */ "label_time_pm",
+        /* 131 */ "label_to_symbol_key_pcqwerty",
+        /* 132 */ "keylabel_for_popular_domain",
+        /* 133 */ "more_keys_for_popular_domain",
+        /* 134 */ "more_keys_for_smiley",
+        /* 135 */ "single_laqm_raqm",
+        /* 136 */ "single_laqm_raqm_rtl",
+        /* 137 */ "single_raqm_laqm",
+        /* 138 */ "double_laqm_raqm",
+        /* 139 */ "double_laqm_raqm_rtl",
+        /* 140 */ "double_raqm_laqm",
+        /* 141 */ "single_lqm_rqm",
+        /* 142 */ "single_9qm_lqm",
+        /* 143 */ "single_9qm_rqm",
+        /* 144 */ "double_lqm_rqm",
+        /* 145 */ "double_9qm_lqm",
+        /* 146 */ "double_9qm_rqm",
+        /* 147 */ "more_keys_for_single_quote",
+        /* 148 */ "more_keys_for_double_quote",
+        /* 149 */ "more_keys_for_tablet_double_quote",
     };
 
     private static final String EMPTY = "";
@@ -259,147 +262,147 @@
         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        EMPTY, EMPTY, EMPTY,
-        /* ~41 */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
-        /* 42 */ "ABC",
-        /* 43 */ "!text/single_lqm_rqm",
-        /* 44 */ "!text/double_lqm_rqm",
-        /* 45 */ "!text/single_laqm_raqm",
-        /* 46 */ "!text/double_laqm_raqm",
+        /* 45 */ "ABC",
+        /* 46 */ "!text/single_lqm_rqm",
+        /* 47 */ "!text/double_lqm_rqm",
+        /* 48 */ "!text/single_laqm_raqm",
+        /* 49 */ "!text/double_laqm_raqm",
         // U+00A2: "¢" CENT SIGN
         // U+00A3: "£" POUND SIGN
         // U+20AC: "€" EURO SIGN
         // U+00A5: "¥" YEN SIGN
         // U+20B1: "₱" PESO SIGN
-        /* 47 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
-        /* 48 */ "$",
-        /* 49 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
-        /* 50 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\\,,?,@,&,\\%,+,;,/,(,)",
+        /* 50 */ "\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
+        /* 51 */ "$",
+        /* 52 */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
+        /* 53 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\\,,?,@,&,\\%,+,;,/,(,)",
         // U+2020: "†" DAGGER
         // U+2021: "‡" DOUBLE DAGGER
         // U+2605: "★" BLACK STAR
-        /* 51 */ "\u2020,\u2021,\u2605",
+        /* 54 */ "\u2020,\u2021,\u2605",
         // U+266A: "♪" EIGHTH NOTE
         // U+2665: "♥" BLACK HEART SUIT
         // U+2660: "♠" BLACK SPADE SUIT
         // U+2666: "♦" BLACK DIAMOND SUIT
         // U+2663: "♣" BLACK CLUB SUIT
-        /* 52 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
+        /* 55 */ "\u266A,\u2665,\u2660,\u2666,\u2663",
         // U+00B1: "±" PLUS-MINUS SIGN
-        /* 53 */ "\u00B1",
+        /* 56 */ "\u00B1",
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 54 */ "!fixedColumnOrder!3,<,{,[",
-        /* 55 */ "!fixedColumnOrder!3,>,},]",
+        /* 57 */ "!fixedColumnOrder!3,<,{,[",
+        /* 58 */ "!fixedColumnOrder!3,>,},]",
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        /* 56 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
-        /* 57 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
-        /* 58 */ EMPTY,
-        /* 59 */ EMPTY,
-        /* 60 */ "1",
-        /* 61 */ "2",
-        /* 62 */ "3",
-        /* 63 */ "4",
-        /* 64 */ "5",
-        /* 65 */ "6",
-        /* 66 */ "7",
-        /* 67 */ "8",
-        /* 68 */ "9",
-        /* 69 */ "0",
+        /* 59 */ "!fixedColumnOrder!3,\u2039,\u2264,\u00AB",
+        /* 60 */ "!fixedColumnOrder!3,\u203A,\u2265,\u00BB",
+        /* 61 */ EMPTY,
+        /* 62 */ EMPTY,
+        /* 63 */ "1",
+        /* 64 */ "2",
+        /* 65 */ "3",
+        /* 66 */ "4",
+        /* 67 */ "5",
+        /* 68 */ "6",
+        /* 69 */ "7",
+        /* 70 */ "8",
+        /* 71 */ "9",
+        /* 72 */ "0",
         // Label for "switch to symbols" key.
-        /* 70 */ "?123",
+        /* 73 */ "?123",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 71 */ "123",
-        /* 72~ */
+        /* 74 */ "123",
+        /* 75~ */
         EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~81 */
+        /* ~84 */
         // U+00B9: "¹" SUPERSCRIPT ONE
         // U+00BD: "½" VULGAR FRACTION ONE HALF
         // U+2153: "⅓" VULGAR FRACTION ONE THIRD
         // U+00BC: "¼" VULGAR FRACTION ONE QUARTER
         // U+215B: "⅛" VULGAR FRACTION ONE EIGHTH
-        /* 82 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
+        /* 85 */ "\u00B9,\u00BD,\u2153,\u00BC,\u215B",
         // U+00B2: "²" SUPERSCRIPT TWO
         // U+2154: "⅔" VULGAR FRACTION TWO THIRDS
-        /* 83 */ "\u00B2,\u2154",
+        /* 86 */ "\u00B2,\u2154",
         // U+00B3: "³" SUPERSCRIPT THREE
         // U+00BE: "¾" VULGAR FRACTION THREE QUARTERS
         // U+215C: "⅜" VULGAR FRACTION THREE EIGHTHS
-        /* 84 */ "\u00B3,\u00BE,\u215C",
+        /* 87 */ "\u00B3,\u00BE,\u215C",
         // U+2074: "⁴" SUPERSCRIPT FOUR
-        /* 85 */ "\u2074",
+        /* 88 */ "\u2074",
         // U+215D: "⅝" VULGAR FRACTION FIVE EIGHTHS
-        /* 86 */ "\u215D",
-        /* 87 */ EMPTY,
-        // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
-        /* 88 */ "\u215E",
-        /* 89 */ EMPTY,
+        /* 89 */ "\u215D",
         /* 90 */ EMPTY,
+        // U+215E: "⅞" VULGAR FRACTION SEVEN EIGHTHS
+        /* 91 */ "\u215E",
+        /* 92 */ EMPTY,
+        /* 93 */ EMPTY,
         // U+207F: "ⁿ" SUPERSCRIPT LATIN SMALL LETTER N
         // U+2205: "∅" EMPTY SET
-        /* 91 */ "\u207F,\u2205",
-        /* 92 */ ",",
-        /* 93 */ EMPTY,
-        /* 94 */ "?",
-        /* 95 */ ";",
-        /* 96 */ "%",
+        /* 94 */ "\u207F,\u2205",
+        /* 95 */ ",",
+        /* 96 */ EMPTY,
+        /* 97 */ "?",
+        /* 98 */ ";",
+        /* 99 */ "%",
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 97 */ "\u00A1",
+        /* 100 */ "\u00A1",
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 98 */ "\u00BF",
-        /* 99 */ EMPTY,
+        /* 101 */ "\u00BF",
+        /* 102 */ EMPTY,
         // U+2030: "‰" PER MILLE SIGN
-        /* 100 */ "\u2030",
-        /* 101 */ ",",
-        /* 102 */ "!",
-        /* 103 */ "!",
-        /* 104 */ "?",
-        /* 105 */ "?",
-        /* 106 */ "\'",
-        /* 107 */ "\"",
-        /* 108 */ "\"",
-        /* 109 */ EMPTY,
-        /* 110 */ EMPTY,
-        /* 111 */ "q",
-        /* 112 */ "w",
-        /* 113 */ "y",
-        /* 114 */ "x",
+        /* 103 */ "\u2030",
+        /* 104 */ ",",
+        /* 105 */ "!",
+        /* 106 */ "!",
+        /* 107 */ "?",
+        /* 108 */ "?",
+        /* 109 */ "\'",
+        /* 110 */ "\"",
+        /* 111 */ "\"",
+        /* 112 */ EMPTY,
+        /* 113 */ EMPTY,
+        /* 114 */ "q",
+        /* 115 */ "w",
+        /* 116 */ "y",
+        /* 117 */ "x",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-        /* 115 */ "\u00F1",
-        /* 116 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
-        /* 117 */ "!icon/settings_key|!code/key_settings",
-        /* 118 */ "!icon/shortcut_key|!code/key_shortcut",
-        /* 119 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
-        /* 120 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
+        /* 118 */ "\u00F1",
+        /* 119 */ "!fixedColumnOrder!2,!hasLabels!,!text/label_time_am,!text/label_time_pm",
+        /* 120 */ "!icon/settings_key|!code/key_settings",
+        /* 121 */ "!icon/shortcut_key|!code/key_shortcut",
+        /* 122 */ "!hasLabels!,!text/label_next_key|!code/key_action_next",
+        /* 123 */ "!hasLabels!,!text/label_previous_key|!code/key_action_previous",
         // Label for "switch to more symbol" modifier key.  Must be short to fit on key!
-        /* 121 */ "= \\ <",
+        /* 124 */ "= \\ <",
         // Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key!
-        /* 122 */ "~ \\ {",
+        /* 125 */ "~ \\ {",
         // Label for "Tab" key.  Must be short to fit on key!
-        /* 123 */ "Tab",
+        /* 126 */ "Tab",
         // Label for "switch to phone numeric" key.  Must be short to fit on key!
-        /* 124 */ "123",
+        /* 127 */ "123",
         // Label for "switch to phone symbols" key.  Must be short to fit on key!
         // U+FF0A: "*" FULLWIDTH ASTERISK
         // U+FF03: "#" FULLWIDTH NUMBER SIGN
-        /* 125 */ "\uFF0A\uFF03",
+        /* 128 */ "\uFF0A\uFF03",
         // Key label for "ante meridiem"
-        /* 126 */ "AM",
+        /* 129 */ "AM",
         // Key label for "post meridiem"
-        /* 127 */ "PM",
+        /* 130 */ "PM",
         // Label for "switch to symbols" key on PC QWERTY layout
-        /* 128 */ "Sym",
-        /* 129 */ ".com",
+        /* 131 */ "Sym",
+        /* 132 */ ".com",
         // popular web domains for the locale - most popular, displayed on the keyboard
-        /* 130 */ "!hasLabels!,.net,.org,.gov,.edu",
-        /* 131 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
+        /* 133 */ "!hasLabels!,.net,.org,.gov,.edu",
+        /* 134 */ "!fixedColumnOrder!5,!hasLabels!,=-O|=-O ,:-P|:-P ,;-)|;-) ,:-(|:-( ,:-)|:-) ,:-!|:-! ,:-$|:-$ ,B-)|B-) ,:O|:O ,:-*|:-* ,:-D|:-D ,:\'(|:\'( ,:-\\\\|:-\\\\ ,O:-)|O:-) ,:-[|:-[ ",
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
@@ -421,24 +424,24 @@
         // The following each quotation mark pair consist of
         // <opening quotation mark>, <closing quotation mark>
         // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 132 */ "\u2039,\u203A",
-        /* 133 */ "\u2039|\u203A,\u203A|\u2039",
-        /* 134 */ "\u203A,\u2039",
-        /* 135 */ "\u00AB,\u00BB",
-        /* 136 */ "\u00AB|\u00BB,\u00BB|\u00AB",
-        /* 137 */ "\u00BB,\u00AB",
+        /* 135 */ "\u2039,\u203A",
+        /* 136 */ "\u2039|\u203A,\u203A|\u2039",
+        /* 137 */ "\u203A,\u2039",
+        /* 138 */ "\u00AB,\u00BB",
+        /* 139 */ "\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 140 */ "\u00BB,\u00AB",
         // The following each quotation mark triplet consists of
         // <another quotation mark>, <opening quotation mark>, <closing quotation mark>
         // and is named after (single|double)_<opening quotation mark>_<closing quotation mark>.
-        /* 138 */ "\u201A,\u2018,\u2019",
-        /* 139 */ "\u2019,\u201A,\u2018",
-        /* 140 */ "\u2018,\u201A,\u2019",
-        /* 141 */ "\u201E,\u201C,\u201D",
-        /* 142 */ "\u201D,\u201E,\u201C",
-        /* 143 */ "\u201C,\u201E,\u201D",
-        /* 144 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
-        /* 145 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
-        /* 146 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
+        /* 141 */ "\u201A,\u2018,\u2019",
+        /* 142 */ "\u2019,\u201A,\u2018",
+        /* 143 */ "\u2018,\u201A,\u2019",
+        /* 144 */ "\u201E,\u201C,\u201D",
+        /* 145 */ "\u201D,\u201E,\u201C",
+        /* 146 */ "\u201C,\u201E,\u201D",
+        /* 147 */ "!fixedColumnOrder!5,!text/single_quotes,!text/single_angle_quotes",
+        /* 148 */ "!fixedColumnOrder!5,!text/double_quotes,!text/double_angle_quotes",
+        /* 149 */ "!fixedColumnOrder!6,!text/double_quotes,!text/single_quotes,!text/double_angle_quotes,!text/single_angle_quotes",
     };
 
     /* Language af: Afrikaans */
@@ -499,45 +502,45 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~41 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+0623: "ا" ARABIC LETTER ALEF
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
         // U+062C: "پ" ARABIC LETTER PEH
-        /* 42 */ "\u0623\u200C\u0628\u200C\u062C",
-        /* 43 */ null,
-        /* 44 */ null,
-        /* 45 */ "!text/single_laqm_raqm_rtl",
-        /* 46 */ "!text/double_laqm_raqm_rtl",
-        /* 47~ */
+        /* 45 */ "\u0623\u200C\u0628\u200C\u062C",
+        /* 46 */ null,
+        /* 47 */ null,
+        /* 48 */ "!text/single_laqm_raqm_rtl",
+        /* 49 */ "!text/double_laqm_raqm_rtl",
+        /* 50~ */
         null, null, null,
-        /* ~49 */
+        /* ~52 */
         // U+061F: "؟" ARABIC QUESTION MARK
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
-        /* 50 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
+        /* 53 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
         // U+2605: "★" BLACK STAR
         // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 51 */ "\u2605,\u066D",
+        /* 54 */ "\u2605,\u066D",
         // U+266A: "♪" EIGHTH NOTE
-        /* 52 */ "\u266A",
-        /* 53 */ null,
+        /* 55 */ "\u266A",
+        /* 56 */ null,
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
         // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
         // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
-        /* 54 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 55 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        /* 57 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 58 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 56 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 57 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        /* 59 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 60 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
         // U+0655: "ٕ" ARABIC HAMZA BELOW
         // U+0654: "ٔ" ARABIC HAMZA ABOVE
         // U+0652: "ْ" ARABIC SUKUN
@@ -554,70 +557,115 @@
         // U+0640: "ـ" ARABIC TATWEEL
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 58 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        /* 59 */ "\u0651",
+        /* 61 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
+        /* 62 */ "\u0651",
         // U+0661: "١" ARABIC-INDIC DIGIT ONE
-        /* 60 */ "\u0661",
+        /* 63 */ "\u0661",
         // U+0662: "٢" ARABIC-INDIC DIGIT TWO
-        /* 61 */ "\u0662",
+        /* 64 */ "\u0662",
         // U+0663: "٣" ARABIC-INDIC DIGIT THREE
-        /* 62 */ "\u0663",
+        /* 65 */ "\u0663",
         // U+0664: "٤" ARABIC-INDIC DIGIT FOUR
-        /* 63 */ "\u0664",
+        /* 66 */ "\u0664",
         // U+0665: "٥" ARABIC-INDIC DIGIT FIVE
-        /* 64 */ "\u0665",
+        /* 67 */ "\u0665",
         // U+0666: "٦" ARABIC-INDIC DIGIT SIX
-        /* 65 */ "\u0666",
+        /* 68 */ "\u0666",
         // U+0667: "٧" ARABIC-INDIC DIGIT SEVEN
-        /* 66 */ "\u0667",
+        /* 69 */ "\u0667",
         // U+0668: "٨" ARABIC-INDIC DIGIT EIGHT
-        /* 67 */ "\u0668",
+        /* 70 */ "\u0668",
         // U+0669: "٩" ARABIC-INDIC DIGIT NINE
-        /* 68 */ "\u0669",
+        /* 71 */ "\u0669",
         // U+0660: "٠" ARABIC-INDIC DIGIT ZERO
-        /* 69 */ "\u0660",
+        /* 72 */ "\u0660",
         // Label for "switch to symbols" key.
         // U+061F: "؟" ARABIC QUESTION MARK
-        /* 70 */ "\u0663\u0662\u0661\u061F",
+        /* 73 */ "\u0663\u0662\u0661\u061F",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 71 */ "\u0663\u0662\u0661",
-        /* 72 */ "1",
-        /* 73 */ "2",
-        /* 74 */ "3",
-        /* 75 */ "4",
-        /* 76 */ "5",
-        /* 77 */ "6",
-        /* 78 */ "7",
-        /* 79 */ "8",
-        /* 80 */ "9",
+        /* 74 */ "\u0663\u0662\u0661",
+        /* 75 */ "1",
+        /* 76 */ "2",
+        /* 77 */ "3",
+        /* 78 */ "4",
+        /* 79 */ "5",
+        /* 80 */ "6",
+        /* 81 */ "7",
+        /* 82 */ "8",
+        /* 83 */ "9",
         // U+066B: "٫" ARABIC DECIMAL SEPARATOR
         // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 81 */ "0,\u066B,\u066C",
-        /* 82~ */
+        /* 84 */ "0,\u066B,\u066C",
+        /* 85~ */
         null, null, null, null, null, null, null, null, null, null,
-        /* ~91 */
+        /* ~94 */
         // U+060C: "،" ARABIC COMMA
-        /* 92 */ "\u060C",
-        /* 93 */ "\\,",
-        /* 94 */ "\u061F",
-        /* 95 */ "\u061B",
+        /* 95 */ "\u060C",
+        /* 96 */ "\\,",
+        /* 97 */ "\u061F",
+        /* 98 */ "\u061B",
         // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 96 */ "\u066A",
-        /* 97 */ null,
-        /* 98 */ "?",
-        /* 99 */ ";",
+        /* 99 */ "\u066A",
+        /* 100 */ null,
+        /* 101 */ "?",
+        /* 102 */ ";",
         // U+2030: "‰" PER MILLE SIGN
-        /* 100 */ "\\%,\u2030",
-        /* 101~ */
+        /* 103 */ "\\%,\u2030",
+        /* 104~ */
         null, null, null, null, null,
-        /* ~105 */
+        /* ~108 */
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
         // U+061F: "؟" ARABIC QUESTION MARK
-        /* 106 */ "\u060C",
-        /* 107 */ "\u061F",
-        /* 108 */ "\u061F,\u061B,!,:,-,/,\',\"",
+        /* 109 */ "\u060C",
+        /* 110 */ "\u061F",
+        /* 111 */ "\u061F,\u061B,!,:,-,/,\',\"",
+    };
+
+    /* Language az: Azerbaijani */
+    private static final String[] LANGUAGE_az = {
+        /* 0 */ null,
+        // U+0259: "ə" LATIN SMALL LETTER SCHWA
+        /* 1 */ "\u0259",
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        /* 2 */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
+        // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+        // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+        // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+        /* 3 */ "\u00F6,\u00F4,\u0153,\u00F2,\u00F3,\u00F5,\u00F8,\u014D",
+        // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+        // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+        // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+        // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+        // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+        /* 4 */ "\u00FC,\u00FB,\u00F9,\u00FA,\u016B",
+        // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+        // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+        // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* 5 */ "\u015F,\u00DF,\u015B,\u0161",
+        /* 6 */ null,
+        // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        /* 7 */ "\u00E7,\u0107,\u010D",
+        /* 8~ */
+        null, null, null, null, null, null, null,
+        /* ~14 */
+        // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+        /* 15 */ "\u011F",
     };
 
     /* Language be: Belarusian */
@@ -637,23 +685,23 @@
         // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
         /* 29 */ "\u0456",
         /* 30~ */
-        null, null, null, null, null,
-        /* ~34 */
+        null, null, null, null, null, null, null,
+        /* ~36 */
         // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 35 */ "\u044A",
-        /* 36~ */
-        null, null, null, null,
-        /* ~39 */
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null,
+        /* ~42 */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 40 */ "\u0451",
-        /* 41 */ null,
+        /* 43 */ "\u0451",
+        /* 44 */ null,
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 42 */ "\u0410\u0411\u0412",
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "\u0410\u0411\u0412",
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
     };
 
     /* Language bg: Bulgarian */
@@ -661,16 +709,16 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~41 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 42 */ "\u0410\u0411\u0412",
-        /* 43 */ null,
+        /* 45 */ "\u0410\u0411\u0412",
+        /* 46 */ null,
         // single_quotes of Bulgarian is default single_quotes_right_left.
-        /* 44 */ "!text/double_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
     };
 
     /* Language ca: Catalan */
@@ -804,11 +852,12 @@
         /* 13~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
-        /* 45 */ "!text/single_raqm_laqm",
-        /* 46 */ "!text/double_raqm_laqm",
+        null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
+        /* 48 */ "!text/single_raqm_laqm",
+        /* 49 */ "!text/double_raqm_laqm",
     };
 
     /* Language da: Danish */
@@ -872,12 +921,12 @@
         /* 24 */ "\u00F6",
         /* 25~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
-        /* 45 */ "!text/single_raqm_laqm",
-        /* 46 */ "!text/double_raqm_laqm",
+        null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
+        /* 48 */ "!text/single_raqm_laqm",
+        /* 49 */ "!text/double_raqm_laqm",
     };
 
     /* Language de: German */
@@ -923,12 +972,12 @@
         /* 7~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
-        /* 45 */ "!text/single_raqm_laqm",
-        /* 46 */ "!text/double_raqm_laqm",
+        null, null, null, null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
+        /* 48 */ "!text/single_raqm_laqm",
+        /* 49 */ "!text/double_raqm_laqm",
     };
 
     /* Language el: Greek */
@@ -936,13 +985,13 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~41 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
         // U+0392: "Β" GREEK CAPITAL LETTER BETA
         // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA
-        /* 42 */ "\u0391\u0392\u0393",
+        /* 45 */ "\u0391\u0392\u0393",
     };
 
     /* Language en: English */
@@ -1113,20 +1162,21 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~108 */
-        /* 109 */ "q",
-        /* 110 */ "x",
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
+        /* ~111 */
+        /* 112 */ "q",
+        /* 113 */ "x",
         // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
-        /* 111 */ "\u015D",
+        /* 114 */ "\u015D",
         // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
-        /* 112 */ "\u011D",
+        /* 115 */ "\u011D",
         // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
-        /* 113 */ "\u016D",
+        /* 116 */ "\u016D",
         // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
-        /* 114 */ "\u0109",
+        /* 117 */ "\u0109",
         // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
-        /* 115 */ "\u0135",
+        /* 118 */ "\u0135",
     };
 
     /* Language es: Spanish */
@@ -1184,25 +1234,25 @@
         /* 8~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~49 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~52 */
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 50 */ "!fixedColumnOrder!9,\u00A1,\",\',#,-,:,!,\\,,?,\u00BF,@,&,\\%,+,;,/,(,)",
-        /* 51~ */
+        /* 53 */ "!fixedColumnOrder!9,\u00A1,\",\',#,-,:,!,\\,,?,\u00BF,@,&,\\%,+,;,/,(,)",
+        /* 54~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null,
-        /* ~102 */
+        /* ~105 */
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
-        /* 103 */ "!,\u00A1",
-        /* 104 */ null,
+        /* 106 */ "!,\u00A1",
+        /* 107 */ null,
         // U+00BF: "¿" INVERTED QUESTION MARK
-        /* 105 */ "?,\u00BF",
-        /* 106 */ "\"",
-        /* 107 */ "\'",
-        /* 108 */ "\'",
+        /* 108 */ "?,\u00BF",
+        /* 109 */ "\"",
+        /* 110 */ "\'",
+        /* 111 */ "\'",
     };
 
     /* Language et: Estonian */
@@ -1305,10 +1355,10 @@
         /* 23 */ "\u00F5",
         /* 24~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
+        null, null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
     };
 
     /* Language fa: Persian */
@@ -1316,45 +1366,45 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~41 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+0627: "ا" ARABIC LETTER ALEF
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
         // U+067E: "پ" ARABIC LETTER PEH
-        /* 42 */ "\u0627\u200C\u0628\u200C\u067E",
-        /* 43 */ null,
-        /* 44 */ null,
-        /* 45 */ "!text/single_laqm_raqm_rtl",
-        /* 46 */ "!text/double_laqm_raqm_rtl",
-        /* 47~ */
+        /* 45 */ "\u0627\u200C\u0628\u200C\u067E",
+        /* 46 */ null,
+        /* 47 */ null,
+        /* 48 */ "!text/single_laqm_raqm_rtl",
+        /* 49 */ "!text/double_laqm_raqm_rtl",
+        /* 50~ */
         null, null, null,
-        /* ~49 */
+        /* ~52 */
         // U+061F: "؟" ARABIC QUESTION MARK
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
-        /* 50 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
+        /* 53 */ "!fixedColumnOrder!8,\",\',#,-,:,!,\u060C,\u061F,@,&,\\%,+,\u061B,/,(,)",
         // U+2605: "★" BLACK STAR
         // U+066D: "٭" ARABIC FIVE POINTED STAR
-        /* 51 */ "\u2605,\u066D",
+        /* 54 */ "\u2605,\u066D",
         // U+266A: "♪" EIGHTH NOTE
-        /* 52 */ "\u266A",
-        /* 53 */ null,
+        /* 55 */ "\u266A",
+        /* 56 */ null,
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
         // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS
         // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS
-        /* 54 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
-        /* 55 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
+        /* 57 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]",
+        /* 58 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[",
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 56 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
-        /* 57 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
+        /* 59 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,<|>",
+        /* 60 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,>|<",
         // U+0655: "ٕ" ARABIC HAMZA BELOW
         // U+0652: "ْ" ARABIC SUKUN
         // U+0651: "ّ" ARABIC SHADDA
@@ -1371,74 +1421,74 @@
         // U+0640: "ـ" ARABIC TATWEEL
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
-        /* 58 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        /* 59 */ "\u064B",
+        /* 61 */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
+        /* 62 */ "\u064B",
         // U+06F1: "۱" EXTENDED ARABIC-INDIC DIGIT ONE
-        /* 60 */ "\u06F1",
+        /* 63 */ "\u06F1",
         // U+06F2: "۲" EXTENDED ARABIC-INDIC DIGIT TWO
-        /* 61 */ "\u06F2",
+        /* 64 */ "\u06F2",
         // U+06F3: "۳" EXTENDED ARABIC-INDIC DIGIT THREE
-        /* 62 */ "\u06F3",
+        /* 65 */ "\u06F3",
         // U+06F4: "۴" EXTENDED ARABIC-INDIC DIGIT FOUR
-        /* 63 */ "\u06F4",
+        /* 66 */ "\u06F4",
         // U+06F5: "۵" EXTENDED ARABIC-INDIC DIGIT FIVE
-        /* 64 */ "\u06F5",
+        /* 67 */ "\u06F5",
         // U+06F6: "۶" EXTENDED ARABIC-INDIC DIGIT SIX
-        /* 65 */ "\u06F6",
+        /* 68 */ "\u06F6",
         // U+06F7: "۷" EXTENDED ARABIC-INDIC DIGIT SEVEN
-        /* 66 */ "\u06F7",
+        /* 69 */ "\u06F7",
         // U+06F8: "۸" EXTENDED ARABIC-INDIC DIGIT EIGHT
-        /* 67 */ "\u06F8",
+        /* 70 */ "\u06F8",
         // U+06F9: "۹" EXTENDED ARABIC-INDIC DIGIT NINE
-        /* 68 */ "\u06F9",
+        /* 71 */ "\u06F9",
         // U+06F0: "۰" EXTENDED ARABIC-INDIC DIGIT ZERO
-        /* 69 */ "\u06F0",
+        /* 72 */ "\u06F0",
         // Label for "switch to symbols" key.
         // U+061F: "؟" ARABIC QUESTION MARK
-        /* 70 */ "\u06F3\u06F2\u06F1\u061F",
+        /* 73 */ "\u06F3\u06F2\u06F1\u061F",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 71 */ "\u06F3\u06F2\u06F1",
-        /* 72 */ "1",
-        /* 73 */ "2",
-        /* 74 */ "3",
-        /* 75 */ "4",
-        /* 76 */ "5",
-        /* 77 */ "6",
-        /* 78 */ "7",
-        /* 79 */ "8",
-        /* 80 */ "9",
+        /* 74 */ "\u06F3\u06F2\u06F1",
+        /* 75 */ "1",
+        /* 76 */ "2",
+        /* 77 */ "3",
+        /* 78 */ "4",
+        /* 79 */ "5",
+        /* 80 */ "6",
+        /* 81 */ "7",
+        /* 82 */ "8",
+        /* 83 */ "9",
         // U+066B: "٫" ARABIC DECIMAL SEPARATOR
         // U+066C: "٬" ARABIC THOUSANDS SEPARATOR
-        /* 81 */ "0,\u066B,\u066C",
-        /* 82~ */
+        /* 84 */ "0,\u066B,\u066C",
+        /* 85~ */
         null, null, null, null, null, null, null, null, null, null,
-        /* ~91 */
+        /* ~94 */
         // U+060C: "،" ARABIC COMMA
-        /* 92 */ "\u060C",
-        /* 93 */ "\\,",
-        /* 94 */ "\u061F",
-        /* 95 */ "\u061B",
+        /* 95 */ "\u060C",
+        /* 96 */ "\\,",
+        /* 97 */ "\u061F",
+        /* 98 */ "\u061B",
         // U+066A: "٪" ARABIC PERCENT SIGN
-        /* 96 */ "\u066A",
-        /* 97 */ null,
-        /* 98 */ "?",
-        /* 99 */ ";",
+        /* 99 */ "\u066A",
+        /* 100 */ null,
+        /* 101 */ "?",
+        /* 102 */ ";",
         // U+2030: "‰" PER MILLE SIGN
-        /* 100 */ "\\%,\u2030",
+        /* 103 */ "\\%,\u2030",
         // U+060C: "،" ARABIC COMMA
         // U+061B: "؛" ARABIC SEMICOLON
         // U+061F: "؟" ARABIC QUESTION MARK
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        /* 101 */ "\u060C",
-        /* 102 */ "!",
-        /* 103 */ "!,\\,",
-        /* 104 */ "\u061F",
-        /* 105 */ "\u061F,?",
-        /* 106 */ "\u060C",
+        /* 104 */ "\u060C",
+        /* 105 */ "!",
+        /* 106 */ "!,\\,",
         /* 107 */ "\u061F",
-        /* 108 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
+        /* 108 */ "\u061F,?",
+        /* 109 */ "\u060C",
+        /* 110 */ "\u061F",
+        /* 111 */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,/,\u00AB|\u00BB,\u00BB|\u00AB",
     };
 
     /* Language fi: Finnish */
@@ -1546,56 +1596,56 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~41 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
-        /* 42 */ "\u0915\u0916\u0917",
-        /* 43~ */
+        /* 45 */ "\u0915\u0916\u0917",
+        /* 46~ */
         null, null, null, null, null,
-        /* ~47 */
+        /* ~50 */
         // U+20B9: "₹" INDIAN RUPEE SIGN
-        /* 48 */ "\u20B9",
-        /* 49~ */
+        /* 51 */ "\u20B9",
+        /* 52~ */
         null, null, null, null, null, null, null, null, null, null, null,
-        /* ~59 */
+        /* ~62 */
         // U+0967: "१" DEVANAGARI DIGIT ONE
-        /* 60 */ "\u0967",
+        /* 63 */ "\u0967",
         // U+0968: "२" DEVANAGARI DIGIT TWO
-        /* 61 */ "\u0968",
+        /* 64 */ "\u0968",
         // U+0969: "३" DEVANAGARI DIGIT THREE
-        /* 62 */ "\u0969",
+        /* 65 */ "\u0969",
         // U+096A: "४" DEVANAGARI DIGIT FOUR
-        /* 63 */ "\u096A",
+        /* 66 */ "\u096A",
         // U+096B: "५" DEVANAGARI DIGIT FIVE
-        /* 64 */ "\u096B",
+        /* 67 */ "\u096B",
         // U+096C: "६" DEVANAGARI DIGIT SIX
-        /* 65 */ "\u096C",
+        /* 68 */ "\u096C",
         // U+096D: "७" DEVANAGARI DIGIT SEVEN
-        /* 66 */ "\u096D",
+        /* 69 */ "\u096D",
         // U+096E: "८" DEVANAGARI DIGIT EIGHT
-        /* 67 */ "\u096E",
+        /* 70 */ "\u096E",
         // U+096F: "९" DEVANAGARI DIGIT NINE
-        /* 68 */ "\u096F",
+        /* 71 */ "\u096F",
         // U+0966: "०" DEVANAGARI DIGIT ZERO
-        /* 69 */ "\u0966",
+        /* 72 */ "\u0966",
         // Label for "switch to symbols" key.
-        /* 70 */ "?\u0967\u0968\u0969",
+        /* 73 */ "?\u0967\u0968\u0969",
         // Label for "switch to symbols with microphone" key. This string shouldn't include the "mic"
         // part because it'll be appended by the code.
-        /* 71 */ "\u0967\u0968\u0969",
-        /* 72 */ "1",
-        /* 73 */ "2",
-        /* 74 */ "3",
-        /* 75 */ "4",
-        /* 76 */ "5",
-        /* 77 */ "6",
-        /* 78 */ "7",
-        /* 79 */ "8",
-        /* 80 */ "9",
-        /* 81 */ "0",
+        /* 74 */ "\u0967\u0968\u0969",
+        /* 75 */ "1",
+        /* 76 */ "2",
+        /* 77 */ "3",
+        /* 78 */ "4",
+        /* 79 */ "5",
+        /* 80 */ "6",
+        /* 81 */ "7",
+        /* 82 */ "8",
+        /* 83 */ "9",
+        /* 84 */ "0",
     };
 
     /* Language hr: Croatian */
@@ -1626,11 +1676,12 @@
         /* 13~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_rqm",
-        /* 44 */ "!text/double_9qm_rqm",
-        /* 45 */ "!text/single_raqm_laqm",
-        /* 46 */ "!text/double_raqm_laqm",
+        null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_rqm",
+        /* 47 */ "!text/double_9qm_rqm",
+        /* 48 */ "!text/single_raqm_laqm",
+        /* 49 */ "!text/double_raqm_laqm",
     };
 
     /* Language hu: Hungarian */
@@ -1679,12 +1730,12 @@
         /* 5~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_rqm",
-        /* 44 */ "!text/double_9qm_rqm",
-        /* 45 */ "!text/single_raqm_laqm",
-        /* 46 */ "!text/double_raqm_laqm",
+        null, null, null, null, null, null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_rqm",
+        /* 47 */ "!text/double_9qm_rqm",
+        /* 48 */ "!text/single_raqm_laqm",
+        /* 49 */ "!text/double_raqm_laqm",
     };
 
     /* Language is: Icelandic */
@@ -1750,10 +1801,10 @@
         /* 22 */ "\u00FE",
         /* 23~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
+        null, null, null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
     };
 
     /* Language it: Italian */
@@ -1806,13 +1857,13 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~41 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+05D0: "א" HEBREW LETTER ALEF
         // U+05D1: "ב" HEBREW LETTER BET
         // U+05D2: "ג" HEBREW LETTER GIMEL
-        /* 42 */ "\u05D0\u05D1\u05D2",
+        /* 45 */ "\u05D0\u05D1\u05D2",
         // The following characters don't need BIDI mirroring.
         // U+2018: "‘" LEFT SINGLE QUOTATION MARK
         // U+2019: "’" RIGHT SINGLE QUOTATION MARK
@@ -1820,31 +1871,31 @@
         // U+201C: "“" LEFT DOUBLE QUOTATION MARK
         // U+201D: "”" RIGHT DOUBLE QUOTATION MARK
         // U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
-        /* 43 */ "\u2018,\u2019,\u201A",
-        /* 44 */ "\u201C,\u201D,\u201E",
-        /* 45 */ "!text/single_laqm_raqm_rtl",
-        /* 46 */ "!text/double_laqm_raqm_rtl",
-        /* 47~ */
+        /* 46 */ "\u2018,\u2019,\u201A",
+        /* 47 */ "\u201C,\u201D,\u201E",
+        /* 48 */ "!text/single_laqm_raqm_rtl",
+        /* 49 */ "!text/double_laqm_raqm_rtl",
+        /* 50~ */
         null, null, null, null,
-        /* ~50 */
+        /* ~53 */
         // U+2605: "★" BLACK STAR
-        /* 51 */ "\u2605",
-        /* 52 */ null,
+        /* 54 */ "\u2605",
+        /* 55 */ null,
         // U+00B1: "±" PLUS-MINUS SIGN
         // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
-        /* 53 */ "\u00B1,\uFB29",
+        /* 56 */ "\u00B1,\uFB29",
         // The all letters need to be mirrored are found at
         // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt
-        /* 54 */ "!fixedColumnOrder!3,<|>,{|},[|]",
-        /* 55 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
+        /* 57 */ "!fixedColumnOrder!3,<|>,{|},[|]",
+        /* 58 */ "!fixedColumnOrder!3,>|<,}|{,]|[",
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
         // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        /* 56 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
-        /* 57 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
+        /* 59 */ "!fixedColumnOrder!3,\u2039|\u203A,\u2264|\u2265,\u00AB|\u00BB",
+        /* 60 */ "!fixedColumnOrder!3,\u203A|\u2039,\u2265|\u2264,\u00BB|\u00AB",
     };
 
     /* Language ka: Georgian */
@@ -1852,15 +1903,63 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~41 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+10D0: "ა" GEORGIAN LETTER AN
         // U+10D1: "ბ" GEORGIAN LETTER BAN
         // U+10D2: "გ" GEORGIAN LETTER GAN
-        /* 42 */ "\u10D0\u10D1\u10D2",
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "\u10D0\u10D1\u10D2",
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
+    };
+
+    /* Language kk: Kazakh */
+    private static final String[] LANGUAGE_kk = {
+        /* 0~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null,
+        /* ~24 */
+        // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+        /* 25 */ "\u0449",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 26 */ "\u044A",
+        // U+044B: "ы" CYRILLIC SMALL LETTER YERU
+        /* 27 */ "\u044B",
+        // U+044D: "э" CYRILLIC SMALL LETTER E
+        /* 28 */ "\u044D",
+        // U+0438: "и" CYRILLIC SMALL LETTER I
+        /* 29 */ "\u0438",
+        // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
+        // U+04B1: "ұ" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+        /* 30 */ "\u04AF,\u04B1",
+        // U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER
+        /* 31 */ "\u049B",
+        // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
+        /* 32 */ "\u04A3",
+        // U+0493: "ғ" CYRILLIC SMALL LETTER GHE WITH STROKE
+        /* 33 */ "\u0493",
+        // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+        /* 34 */ "\u0456",
+        // U+04D9: "ә" CYRILLIC SMALL LETTER SCHWA
+        /* 35 */ "\u04D9",
+        // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
+        /* 36 */ "\u04E9",
+        // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+        /* 37 */ "\u044A",
+        // U+04BB: "һ" CYRILLIC SMALL LETTER SHHA
+        /* 38 */ "\u04BB",
+        /* 39~ */
+        null, null, null, null,
+        /* ~42 */
+        // U+0451: "ё" CYRILLIC SMALL LETTER IO
+        /* 43 */ "\u0451",
+        /* 44 */ null,
+        // Label for "switch to alphabetic" key.
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        /* 45 */ "\u0410\u0411\u0412",
     };
 
     /* Language ky: Kirghiz */
@@ -1881,25 +1980,27 @@
         /* 29 */ "\u0438",
         // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
         /* 30 */ "\u04AF",
+        /* 31 */ null,
         // U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER
-        /* 31 */ "\u04A3",
-        /* 32 */ null,
-        /* 33 */ null,
+        /* 32 */ "\u04A3",
+        /* 33~ */
+        null, null, null,
+        /* ~35 */
         // U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O
-        /* 34 */ "\u04E9",
+        /* 36 */ "\u04E9",
         // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 35 */ "\u044A",
-        /* 36~ */
-        null, null, null, null,
-        /* ~39 */
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null,
+        /* ~42 */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 40 */ "\u0451",
-        /* 41 */ null,
+        /* 43 */ "\u0451",
+        /* 44 */ null,
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 42 */ "\u0410\u0411\u0412",
+        /* 45 */ "\u0410\u0411\u0412",
     };
 
     /* Language lt: Lithuanian */
@@ -1992,10 +2093,10 @@
         /* 15 */ "\u0123,\u011F",
         /* 16~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
     };
 
     /* Language lv: Latvian */
@@ -2087,10 +2188,10 @@
         /* 15 */ "\u0123,\u011F",
         /* 16~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
     };
 
     /* Language mk: Macedonian */
@@ -2098,27 +2199,27 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~35 */
+        null, null, null, null, null, null, null, null, null,
+        /* ~38 */
         // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
-        /* 36 */ "\u0455",
+        /* 39 */ "\u0455",
         // U+045C: "ќ" CYRILLIC SMALL LETTER KJE
-        /* 37 */ "\u045C",
+        /* 40 */ "\u045C",
         // U+0437: "з" CYRILLIC SMALL LETTER ZE
-        /* 38 */ "\u0437",
+        /* 41 */ "\u0437",
         // U+0453: "ѓ" CYRILLIC SMALL LETTER GJE
-        /* 39 */ "\u0453",
+        /* 42 */ "\u0453",
         // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
-        /* 40 */ "\u0450",
+        /* 43 */ "\u0450",
         // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
-        /* 41 */ "\u045D",
+        /* 44 */ "\u045D",
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 42 */ "\u0410\u0411\u0412",
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "\u0410\u0411\u0412",
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
     };
 
     /* Language mn: Mongolian */
@@ -2126,18 +2227,18 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~41 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 42 */ "\u0410\u0411\u0412",
-        /* 43~ */
+        /* 45 */ "\u0410\u0411\u0412",
+        /* 46~ */
         null, null, null, null, null,
-        /* ~47 */
+        /* ~50 */
         // U+20AE: "₮" TUGRIK SIGN
-        /* 48 */ "\u20AE",
+        /* 51 */ "\u20AE",
     };
 
     /* Language nb: Norwegian Bokmål */
@@ -2187,10 +2288,10 @@
         /* 24 */ "\u00E4",
         /* 25~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_rqm",
-        /* 44 */ "!text/double_9qm_rqm",
+        null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_rqm",
+        /* 47 */ "!text/double_9qm_rqm",
     };
 
     /* Language nl: Dutch */
@@ -2245,10 +2346,10 @@
         /* 9~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_rqm",
-        /* 44 */ "!text/double_9qm_rqm",
+        null, null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_rqm",
+        /* 47 */ "!text/double_9qm_rqm",
     };
 
     /* Language pl: Polish */
@@ -2305,10 +2406,11 @@
         /* 14 */ "\u0142",
         /* 15~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_rqm",
-        /* 44 */ "!text/double_9qm_rqm",
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_rqm",
+        /* 47 */ "!text/double_9qm_rqm",
     };
 
     /* Language pt: Portuguese */
@@ -2411,10 +2513,10 @@
         /* 12~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_rqm",
-        /* 44 */ "!text/double_9qm_rqm",
+        null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_rqm",
+        /* 47 */ "!text/double_9qm_rqm",
     };
 
     /* Language ru: Russian */
@@ -2434,23 +2536,23 @@
         // U+0438: "и" CYRILLIC SMALL LETTER I
         /* 29 */ "\u0438",
         /* 30~ */
-        null, null, null, null, null,
-        /* ~34 */
+        null, null, null, null, null, null, null,
+        /* ~36 */
         // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 35 */ "\u044A",
-        /* 36~ */
-        null, null, null, null,
-        /* ~39 */
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null,
+        /* ~42 */
         // U+0451: "ё" CYRILLIC SMALL LETTER IO
-        /* 40 */ "\u0451",
-        /* 41 */ null,
+        /* 43 */ "\u0451",
+        /* 44 */ null,
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 42 */ "\u0410\u0411\u0412",
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
+        /* 45 */ "\u0410\u0411\u0412",
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
     };
 
     /* Language sk: Slovak */
@@ -2543,12 +2645,12 @@
         /* 15 */ "\u0123,\u011F",
         /* 16~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
-        /* 45 */ "!text/single_raqm_laqm",
-        /* 46 */ "!text/double_raqm_laqm",
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
+        /* 48 */ "!text/single_raqm_laqm",
+        /* 49 */ "!text/double_raqm_laqm",
     };
 
     /* Language sl: Slovenian */
@@ -2572,11 +2674,12 @@
         /* 13~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~42 */
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
-        /* 45 */ "!text/single_raqm_laqm",
-        /* 46 */ "!text/double_raqm_laqm",
+        null, null, null,
+        /* ~45 */
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
+        /* 48 */ "!text/single_raqm_laqm",
+        /* 49 */ "!text/double_raqm_laqm",
     };
 
     /* Language sr: Serbian */
@@ -2584,8 +2687,8 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~35 */
+        null, null, null, null, null, null, null, null, null,
+        /* ~38 */
         // TODO: Move these to sr-Latn once we can handle IETF language tag with script name specified.
         // BEGIN: More keys definitions for Serbian (Latin)
         // U+0161: "š" LATIN SMALL LETTER S WITH CARON
@@ -2605,27 +2708,27 @@
         // END: More keys definitions for Serbian (Latin)
         // BEGIN: More keys definitions for Serbian (Cyrillic)
         // U+0437: "з" CYRILLIC SMALL LETTER ZE
-        /* 36 */ "\u0437",
+        /* 39 */ "\u0437",
         // U+045B: "ћ" CYRILLIC SMALL LETTER TSHE
-        /* 37 */ "\u045B",
+        /* 40 */ "\u045B",
         // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
-        /* 38 */ "\u0455",
+        /* 41 */ "\u0455",
         // U+0452: "ђ" CYRILLIC SMALL LETTER DJE
-        /* 39 */ "\u0452",
+        /* 42 */ "\u0452",
         // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
-        /* 40 */ "\u0450",
+        /* 43 */ "\u0450",
         // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
-        /* 41 */ "\u045D",
+        /* 44 */ "\u045D",
         // END: More keys definitions for Serbian (Cyrillic)
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 42 */ "\u0410\u0411\u0412",
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
-        /* 45 */ "!text/single_raqm_laqm",
-        /* 46 */ "!text/double_raqm_laqm",
+        /* 45 */ "\u0410\u0411\u0412",
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
+        /* 48 */ "!text/single_raqm_laqm",
+        /* 49 */ "!text/double_raqm_laqm",
     };
 
     /* Language sv: Swedish */
@@ -2670,10 +2773,10 @@
         /* 24 */ "\u00E6",
         /* 25~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null,
-        /* ~44 */
-        /* 45 */ "!text/single_raqm_laqm",
-        /* 46 */ "!text/double_raqm_laqm",
+        null, null, null, null, null, null, null, null,
+        /* ~47 */
+        /* 48 */ "!text/single_raqm_laqm",
+        /* 49 */ "!text/double_raqm_laqm",
     };
 
     /* Language sw: Swahili */
@@ -2732,18 +2835,18 @@
         /* 0~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~41 */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+0E01: "ก" THAI CHARACTER KO KAI
         // U+0E02: "ข" THAI CHARACTER KHO KHAI
         // U+0E04: "ค" THAI CHARACTER KHO KHWAI
-        /* 42 */ "\u0E01\u0E02\u0E04",
-        /* 43~ */
+        /* 45 */ "\u0E01\u0E02\u0E04",
+        /* 46~ */
         null, null, null, null, null,
-        /* ~47 */
+        /* ~50 */
         // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
-        /* 48 */ "\u0E3F",
+        /* 51 */ "\u0E3F",
     };
 
     /* Language tl: Tagalog */
@@ -2861,30 +2964,32 @@
         /* 28 */ "\u0454",
         // U+0438: "и" CYRILLIC SMALL LETTER I
         /* 29 */ "\u0438",
-        /* 30 */ null,
-        /* 31 */ null,
+        /* 30~ */
+        null, null, null,
+        /* ~32 */
         // U+0491: "ґ" CYRILLIC SMALL LETTER GHE WITH UPTURN
-        /* 32 */ "\u0491",
+        /* 33 */ "\u0491",
         // U+0457: "ї" CYRILLIC SMALL LETTER YI
-        /* 33 */ "\u0457",
-        /* 34 */ null,
+        /* 34 */ "\u0457",
+        /* 35 */ null,
+        /* 36 */ null,
         // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
-        /* 35 */ "\u044A",
-        /* 36~ */
-        null, null, null, null, null, null,
-        /* ~41 */
+        /* 37 */ "\u044A",
+        /* 38~ */
+        null, null, null, null, null, null, null,
+        /* ~44 */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "В" CYRILLIC CAPITAL LETTER VE
-        /* 42 */ "\u0410\u0411\u0412",
-        /* 43 */ "!text/single_9qm_lqm",
-        /* 44 */ "!text/double_9qm_lqm",
-        /* 45~ */
+        /* 45 */ "\u0410\u0411\u0412",
+        /* 46 */ "!text/single_9qm_lqm",
+        /* 47 */ "!text/double_9qm_lqm",
+        /* 48~ */
         null, null, null,
-        /* ~47 */
+        /* ~50 */
         // U+20B4: "₴" HRYVNIA SIGN
-        /* 48 */ "\u20B4",
+        /* 51 */ "\u20B4",
     };
 
     /* Language vi: Vietnamese */
@@ -2969,10 +3074,10 @@
         /* 10~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null,
-        /* ~47 */
+        null, null, null, null, null, null, null, null, null, null, null,
+        /* ~50 */
         // U+20AB: "₫" DONG SIGN
-        /* 48 */ "\u20AB",
+        /* 51 */ "\u20AB",
     };
 
     /* Language zu: Zulu */
@@ -3149,6 +3254,7 @@
         "DEFAULT", LANGUAGE_DEFAULT, /* default */
         "af", LANGUAGE_af, /* Afrikaans */
         "ar", LANGUAGE_ar, /* Arabic */
+        "az", LANGUAGE_az, /* Azerbaijani */
         "be", LANGUAGE_be, /* Belarusian */
         "bg", LANGUAGE_bg, /* Bulgarian */
         "ca", LANGUAGE_ca, /* Catalan */
@@ -3170,6 +3276,7 @@
         "it", LANGUAGE_it, /* Italian */
         "iw", LANGUAGE_iw, /* Hebrew */
         "ka", LANGUAGE_ka, /* Georgian */
+        "kk", LANGUAGE_kk, /* Kazakh */
         "ky", LANGUAGE_ky, /* Kirghiz */
         "lt", LANGUAGE_lt, /* Lithuanian */
         "lv", LANGUAGE_lv, /* Latvian */
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index a19363d..f4c4c65 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -35,7 +35,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 /**
  * Abstract base class for an expandable dictionary that can be created and updated dynamically
@@ -151,14 +151,14 @@
     @Override
     public void close() {
         // Ensure that no other threads are accessing the local binary dictionary.
-        mLocalDictionaryController.lock();
+        mLocalDictionaryController.writeLock().lock();
         try {
             if (mBinaryDictionary != null) {
                 mBinaryDictionary.close();
                 mBinaryDictionary = null;
             }
         } finally {
-            mLocalDictionaryController.unlock();
+            mLocalDictionaryController.writeLock().unlock();
         }
     }
 
@@ -205,14 +205,14 @@
             final String prevWord, final ProximityInfo proximityInfo,
             final boolean blockOffensiveWords) {
         asyncReloadDictionaryIfRequired();
-        if (mLocalDictionaryController.tryLock()) {
+        if (mLocalDictionaryController.readLock().tryLock()) {
             try {
                 if (mBinaryDictionary != null) {
                     return mBinaryDictionary.getSuggestions(composer, prevWord, proximityInfo,
                             blockOffensiveWords);
                 }
             } finally {
-                mLocalDictionaryController.unlock();
+                mLocalDictionaryController.readLock().unlock();
             }
         }
         return null;
@@ -225,11 +225,11 @@
     }
 
     protected boolean isValidWordInner(final String word) {
-        if (mLocalDictionaryController.tryLock()) {
+        if (mLocalDictionaryController.readLock().tryLock()) {
             try {
                 return isValidWordLocked(word);
             } finally {
-                mLocalDictionaryController.unlock();
+                mLocalDictionaryController.readLock().unlock();
             }
         }
         return false;
@@ -246,11 +246,11 @@
     }
 
     protected boolean isValidBigramInner(final String word1, final String word2) {
-        if (mLocalDictionaryController.tryLock()) {
+        if (mLocalDictionaryController.readLock().tryLock()) {
             try {
                 return isValidBigramLocked(word1, word2);
             } finally {
-                mLocalDictionaryController.unlock();
+                mLocalDictionaryController.readLock().unlock();
             }
         }
         return false;
@@ -293,9 +293,12 @@
             // Ensure all threads accessing the current dictionary have finished before swapping in
             // the new one.
             final BinaryDictionary oldBinaryDictionary = mBinaryDictionary;
-            mLocalDictionaryController.lock();
-            mBinaryDictionary = newBinaryDictionary;
-            mLocalDictionaryController.unlock();
+            mLocalDictionaryController.writeLock().lock();
+            try {
+                mBinaryDictionary = newBinaryDictionary;
+            } finally {
+                mLocalDictionaryController.writeLock().unlock();
+            }
             oldBinaryDictionary.close();
         } else {
             mBinaryDictionary = newBinaryDictionary;
@@ -390,7 +393,7 @@
     private final void syncReloadDictionaryInternal() {
         // Ensure that only one thread attempts to read or write to the shared binary dictionary
         // file at the same time.
-        mSharedDictionaryController.lock();
+        mSharedDictionaryController.writeLock().lock();
         try {
             final long time = SystemClock.uptimeMillis();
             final boolean dictionaryFileExists = dictionaryFileExists();
@@ -424,7 +427,7 @@
             }
             mLocalDictionaryController.mLastUpdateTime = time;
         } finally {
-            mSharedDictionaryController.unlock();
+            mSharedDictionaryController.writeLock().unlock();
         }
     }
 
@@ -449,7 +452,7 @@
      * dictionary is out of date. Can be shared across multiple dictionary instances that access the
      * same filename.
      */
-    private static class DictionaryController extends ReentrantLock {
+    private static class DictionaryController extends ReentrantReadWriteLock {
         private volatile long mLastUpdateTime = 0;
         private volatile long mLastUpdateRequestTime = 0;
 
diff --git a/native/jni/src/suggest/core/policy/traversal.h b/native/jni/src/suggest/core/policy/traversal.h
index c6f66f2..f26d714 100644
--- a/native/jni/src/suggest/core/policy/traversal.h
+++ b/native/jni/src/suggest/core/policy/traversal.h
@@ -45,7 +45,7 @@
             const DicNode *const dicNode) const = 0;
     virtual bool needsToTraverseAllUserInput() const = 0;
     virtual float getMaxSpatialDistance() const = 0;
-    virtual bool allowPartialCommit() const = 0;
+    virtual bool autoCorrectsToMultiWordSuggestionIfTop() const = 0;
     virtual int getDefaultExpandDicNodeSize() const = 0;
     virtual int getMaxCacheSize() const = 0;
     virtual bool isPossibleOmissionChildNode(const DicTraverseSession *const traverseSession,
diff --git a/native/jni/src/suggest/core/suggest.cpp b/native/jni/src/suggest/core/suggest.cpp
index 173a612..9a0f10c 100644
--- a/native/jni/src/suggest/core/suggest.cpp
+++ b/native/jni/src/suggest/core/suggest.cpp
@@ -85,9 +85,9 @@
     if (!traverseSession->getProximityInfoState(0)->isUsed()) {
         return;
     }
-    if (TRAVERSAL->allowPartialCommit()) {
-        commitPoint = 0;
-    }
+
+    // Never auto partial commit for now.
+    commitPoint = 0;
 
     if (traverseSession->getInputSize() > MIN_CONTINUOUS_SUGGESTION_INPUT_SIZE
             && traverseSession->isContinuousSuggestionPossible()) {
@@ -151,6 +151,17 @@
     int maxScore = S_INT_MIN;
     int bestExactMatchedNodeTerminalIndex = -1;
     int bestExactMatchedNodeOutputWordIndex = -1;
+    // Force autocorrection for obvious long multi-word suggestions when the top suggestion is
+    // a long multiple words suggestion.
+    // TODO: Implement a smarter auto-commit method for handling multi-word suggestions.
+    // traverseSession->isPartiallyCommited() always returns false because we never auto partial
+    // commit for now.
+    const bool forceCommitMultiWords = (terminalSize > 0) ?
+            TRAVERSAL->autoCorrectsToMultiWordSuggestionIfTop()
+                    && (traverseSession->isPartiallyCommited()
+                            || (traverseSession->getInputSize()
+                                    >= MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT
+                                            && terminals[0].hasMultipleWords())) : false;
     // Output suggestion results here
     for (int terminalIndex = 0; terminalIndex < terminalSize && outputWordIndex < MAX_RESULTS;
             ++terminalIndex) {
@@ -180,22 +191,16 @@
 
         // Increase output score of top typing suggestion to ensure autocorrection.
         // TODO: Better integration with java side autocorrection logic.
-        // Force autocorrection for obvious long multi-word suggestions.
-        const bool isForceCommitMultiWords = TRAVERSAL->allowPartialCommit()
-                && (traverseSession->isPartiallyCommited()
-                        || (traverseSession->getInputSize() >= MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT
-                                && terminalDicNode->hasMultipleWords()));
-
         const int finalScore = SCORING->calculateFinalScore(
                 compoundDistance, traverseSession->getInputSize(),
-                isForceCommitMultiWords || (isValidWord && SCORING->doesAutoCorrectValidWord()));
+                (forceCommitMultiWords && terminalDicNode->hasMultipleWords())
+                        || (isValidWord && SCORING->doesAutoCorrectValidWord()));
         maxScore = max(maxScore, finalScore);
 
-        if (TRAVERSAL->allowPartialCommit()) {
-            // Index for top typing suggestion should be 0.
-            if (isValidWord && outputWordIndex == 0) {
-                terminalDicNode->outputSpacePositionsResult(spaceIndices);
-            }
+        // TODO: Implement a smarter auto-commit method for handling multi-word suggestions.
+        // Index for top typing suggestion should be 0.
+        if (isValidWord && outputWordIndex == 0) {
+            terminalDicNode->outputSpacePositionsResult(spaceIndices);
         }
 
         // Don't output invalid words. However, we still need to submit their shortcuts if any.
@@ -227,9 +232,14 @@
             ++outputWordIndex;
         }
 
-        const bool sameAsTyped = TRAVERSAL->sameAsTyped(traverseSession, terminalDicNode);
-        outputWordIndex = ShortcutUtils::outputShortcuts(&terminalAttributes, outputWordIndex,
-                finalScore, outputCodePoints, frequencies, outputTypes, sameAsTyped);
+        if (!terminalDicNode->hasMultipleWords()) {
+            // Shortcut is not supported for multiple words suggestions.
+            // TODO: Check shortcuts during traversal for multiple words suggestions.
+            const bool sameAsTyped = TRAVERSAL->sameAsTyped(traverseSession, terminalDicNode);
+            outputWordIndex = ShortcutUtils::outputShortcuts(&terminalAttributes, outputWordIndex,
+                    finalScore, outputCodePoints, frequencies, outputTypes, sameAsTyped);
+
+        }
         DicNode::managedDelete(terminalDicNode);
     }
 
diff --git a/native/jni/src/suggest/policyimpl/typing/typing_traversal.h b/native/jni/src/suggest/policyimpl/typing/typing_traversal.h
index 76122eb..ef144e0 100644
--- a/native/jni/src/suggest/policyimpl/typing/typing_traversal.h
+++ b/native/jni/src/suggest/policyimpl/typing/typing_traversal.h
@@ -137,7 +137,7 @@
         return ScoringParams::MAX_SPATIAL_DISTANCE;
     }
 
-    AK_FORCE_INLINE bool allowPartialCommit() const {
+    AK_FORCE_INLINE bool autoCorrectsToMultiWordSuggestionIfTop() const {
         return true;
     }
 
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
index cca81a0..87acafe 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java
@@ -51,7 +51,7 @@
 @LargeTest
 public class BinaryDictIOTests extends AndroidTestCase {
     private static final String TAG = BinaryDictIOTests.class.getSimpleName();
-    private static final int MAX_UNIGRAMS = 100;
+    private static final int DEFAULT_MAX_UNIGRAMS = 100;
     private static final int UNIGRAM_FREQ = 10;
     private static final int BIGRAM_FREQ = 50;
     private static final int TOLERANCE_OF_BIGRAM_FREQ = 5;
@@ -73,13 +73,15 @@
             new FormatSpec.FormatOptions(3, true /* supportsDynamicUpdate */);
 
     public BinaryDictIOTests() {
-        super();
+        this(System.currentTimeMillis(), DEFAULT_MAX_UNIGRAMS);
+    }
 
-        final long time = System.currentTimeMillis();
-        Log.e(TAG, "Testing dictionary: seed is " + time);
-        final Random random = new Random(time);
+    public BinaryDictIOTests(final long seed, final int maxUnigrams) {
+        super();
+        Log.e(TAG, "Testing dictionary: seed is " + seed);
+        final Random random = new Random(seed);
         sWords.clear();
-        generateWords(MAX_UNIGRAMS, random);
+        generateWords(maxUnigrams, random);
 
         for (int i = 0; i < sWords.size(); ++i) {
             sChainBigrams.put(i, new ArrayList<Integer>());
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Dicttool.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Dicttool.java
index 7b311c3..cacee52 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Dicttool.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Dicttool.java
@@ -72,15 +72,21 @@
         return command;
     }
 
-    private void execute(final String[] arguments) {
+    /**
+     * Executes the specified command with the specified arguments.
+     * @param arguments the arguments passed to dicttool.
+     * @return 0 for success, an error code otherwise (always 1 at the moment)
+     */
+    private int execute(final String[] arguments) {
         final Command command = getCommand(arguments);
         try {
             command.run();
+            return 0;
         } catch (Exception e) {
             System.out.println("Exception while processing command "
                     + command.getClass().getSimpleName() + " : " + e);
             e.printStackTrace();
-            return;
+            return 1;
         }
     }
 
@@ -89,6 +95,7 @@
             help();
             return;
         }
-        new Dicttool().execute(arguments);
+        // Exit with the success/error code from #execute() as status.
+        System.exit(new Dicttool().execute(arguments));
     }
 }
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Test.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Test.java
index df5ea35..972b6e7 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Test.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Test.java
@@ -16,10 +16,12 @@
 
 package com.android.inputmethod.latin.dicttool;
 
+import com.android.inputmethod.latin.makedict.BinaryDictIOTests;
 import com.android.inputmethod.latin.makedict.BinaryDictIOUtilsTests;
 import com.android.inputmethod.latin.makedict.BinaryDictInputOutputTest;
 import com.android.inputmethod.latin.makedict.FusionDictionaryTest;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -36,7 +38,8 @@
         BinaryDictOffdeviceUtilsTests.class,
         FusionDictionaryTest.class,
         BinaryDictInputOutputTest.class,
-        BinaryDictIOUtilsTests.class
+        BinaryDictIOUtilsTests.class,
+        BinaryDictIOTests.class
     };
     private ArrayList<Method> mAllTestMethods = new ArrayList<Method>();
     private ArrayList<String> mUsedTestMethods = new ArrayList<String>();
@@ -86,12 +89,19 @@
         for (final Method m : mAllTestMethods) {
             final Class<?> declaringClass = m.getDeclaringClass();
             if (!mUsedTestMethods.isEmpty() && !mUsedTestMethods.contains(m.getName())) continue;
-            final Object instance;
-            if (BinaryDictIOUtilsTests.class == declaringClass) {
-                instance = new BinaryDictIOUtilsTests(mSeed, mMaxUnigrams);
-            } else {
-                instance = declaringClass.newInstance();
+            // Some of the test classes expose a two-argument constructor, taking a long as a
+            // seed for Random, and an int for a vocabulary size to test the dictionary with. They
+            // correspond respectively to the -s and -m numerical arguments to this command, which
+            // are stored in mSeed and mMaxUnigrams. If the two-arguments constructor is present,
+            // then invoke it; otherwise, invoke the default constructor.
+            Constructor<?> twoArgsConstructor = null;
+            try {
+                twoArgsConstructor = declaringClass.getDeclaredConstructor(Long.TYPE, Integer.TYPE);
+            } catch (NoSuchMethodException e) {
+                // No constructor with two args
             }
+            final Object instance = null == twoArgsConstructor ? declaringClass.newInstance()
+                    : twoArgsConstructor.newInstance(mSeed, mMaxUnigrams);
             m.invoke(instance);
         }
     }
diff --git a/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl b/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
index 2fc97b5..479a766 100644
--- a/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
+++ b/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
@@ -20,7 +20,7 @@
 import android.content.res.Resources;
 
 import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.CollectionUtils;
+import com.android.inputmethod.latin.utils.CollectionUtils;
 
 import java.util.HashMap;
 
diff --git a/tools/maketext/res/values-az/donottranslate-more-keys.xml b/tools/maketext/res/values-az/donottranslate-more-keys.xml
new file mode 100644
index 0000000..db1784c
--- /dev/null
+++ b/tools/maketext/res/values-az/donottranslate-more-keys.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX -->
+    <string name="more_keys_for_a">&#x00E2;</string>
+    <!-- U+0259: "ə" LATIN SMALL LETTER SCHWA -->
+    <string name="more_keys_for_e">&#x0259;</string>
+    <!-- U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+         U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+         U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+         U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+         U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+         U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+         U+012B: "ī" LATIN SMALL LETTER I WITH MACRON -->
+    <string name="more_keys_for_i">&#x0131;,&#x00EE;,&#x00EF;,&#x00EC;,&#x00ED;,&#x012F;,&#x012B;</string>
+    <!-- U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+         U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+         U+0153: "œ" LATIN SMALL LIGATURE OE
+         U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+         U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+         U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+         U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+         U+014D: "ō" LATIN SMALL LETTER O WITH MACRON -->
+    <string name="more_keys_for_o">&#x00F6;,&#x00F4;,&#x0153;,&#x00F2;,&#x00F3;,&#x00F5;,&#x00F8;,&#x014D;</string>
+    <!-- U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+         U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+         U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+         U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+         U+016B: "ū" LATIN SMALL LETTER U WITH MACRON -->
+    <string name="more_keys_for_u">&#x00FC;,&#x00FB;,&#x00F9;,&#x00FA;,&#x016B;</string>
+    <!-- U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+         U+00DF: "ß" LATIN SMALL LETTER SHARP S
+         U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+         U+0161: "š" LATIN SMALL LETTER S WITH CARON -->
+    <string name="more_keys_for_s">&#x015F;,&#x00DF;,&#x015B;,&#x0161;</string>
+    <!-- U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE -->
+    <string name="more_keys_for_g">&#x011F;</string>
+    <!-- U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+         U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+         U+010D: "č" LATIN SMALL LETTER C WITH CARON -->
+    <string name="more_keys_for_c">&#x00E7;,&#x0107;,&#x010D;</string>
+</resources>
diff --git a/tools/maketext/res/values-kk/donottranslate-more-keys.xml b/tools/maketext/res/values-kk/donottranslate-more-keys.xml
new file mode 100644
index 0000000..0e953ff
--- /dev/null
+++ b/tools/maketext/res/values-kk/donottranslate-more-keys.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- U+0449: "щ" CYRILLIC SMALL LETTER SHCHA -->
+    <string name="keylabel_for_east_slavic_row1_9">&#x0449;</string>
+    <!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
+    <string name="keylabel_for_east_slavic_row1_12">&#x044A;</string>
+    <!-- U+044B: "ы" CYRILLIC SMALL LETTER YERU -->
+    <string name="keylabel_for_east_slavic_row2_1">&#x044B;</string>
+    <!-- U+044D: "э" CYRILLIC SMALL LETTER E -->
+    <string name="keylabel_for_east_slavic_row2_11">&#x044D;</string>
+    <!-- U+0438: "и" CYRILLIC SMALL LETTER I -->
+    <string name="keylabel_for_east_slavic_row3_5">&#x0438;</string>
+    <!-- U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
+         U+04B1: "ұ" CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE -->
+    <string name="more_keys_for_cyrillic_u">&#x04AF;,&#x04B1;</string>
+    <!-- U+049B: "қ" CYRILLIC SMALL LETTER KA WITH DESCENDER -->
+    <string name="more_keys_for_cyrillic_ka">&#x049B;</string>
+    <!-- U+0451: "ё" CYRILLIC SMALL LETTER IO -->
+    <string name="more_keys_for_cyrillic_ie">&#x0451;</string>
+    <!-- U+04A3: "ң" CYRILLIC SMALL LETTER EN WITH DESCENDER -->
+    <string name="more_keys_for_cyrillic_en">&#x04A3;</string>
+    <!-- U+0493: "ғ" CYRILLIC SMALL LETTER GHE WITH STROKE -->
+    <string name="more_keys_for_cyrillic_ghe">&#x0493;</string>
+    <!-- U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -->
+    <string name="more_keys_for_east_slavic_row2_1">&#x0456;</string>
+    <!-- U+04D9: "ә" CYRILLIC SMALL LETTER SCHWA -->
+    <string name="more_keys_for_cyrillic_a">&#x04D9;</string>
+    <!-- U+04E9: "ө" CYRILLIC SMALL LETTER BARRED O -->
+    <string name="more_keys_for_cyrillic_o">&#x04E9;</string>
+    <!-- U+04BB: "һ" CYRILLIC SMALL LETTER SHHA -->
+    <string name="more_keys_for_east_slavic_row2_11">&#x04BB;</string>
+    <!-- U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN -->
+    <string name="more_keys_for_cyrillic_soft_sign">&#x044A;</string>
+    <!-- Label for "switch to alphabetic" key.
+         U+0410: "А" CYRILLIC CAPITAL LETTER A
+         U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+         U+0412: "В" CYRILLIC CAPITAL LETTER VE -->
+    <string name="label_to_alpha_key">&#x0410;&#x0411;&#x0412;</string>
+</resources>
diff --git a/tools/maketext/res/values/donottranslate-more-keys.xml b/tools/maketext/res/values/donottranslate-more-keys.xml
index c2b7513..b53a369 100644
--- a/tools/maketext/res/values/donottranslate-more-keys.xml
+++ b/tools/maketext/res/values/donottranslate-more-keys.xml
@@ -49,11 +49,14 @@
     <string name="keylabel_for_east_slavic_row2_11"></string>
     <string name="keylabel_for_east_slavic_row3_5"></string>
     <string name="more_keys_for_cyrillic_u"></string>
+    <string name="more_keys_for_cyrillic_ka"></string>
     <string name="more_keys_for_cyrillic_en"></string>
     <string name="more_keys_for_cyrillic_ghe"></string>
     <string name="more_keys_for_east_slavic_row2_1"></string>
+    <string name="more_keys_for_cyrillic_a"></string>
     <string name="more_keys_for_cyrillic_o"></string>
     <string name="more_keys_for_cyrillic_soft_sign"></string>
+    <string name="more_keys_for_east_slavic_row2_11"></string>
     <string name="keylabel_for_south_slavic_row1_6"></string>
     <string name="keylabel_for_south_slavic_row2_11"></string>
     <string name="keylabel_for_south_slavic_row3_1"></string>