diff --git a/java/res/xml-sw600dp/rows_bengali.xml b/java/res/xml-sw600dp/rows_bengali.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b1e787849fe0c0bcb82facb9043c87166657ca2e
--- /dev/null
+++ b/java/res/xml-sw600dp/rows_bengali.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <include
+        latin:keyboardLayout="@xml/key_styles_common" />
+    <Row
+        latin:keyWidth="8.182%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_bengali1" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="fillRight" />
+    </Row>
+    <Row
+        latin:keyWidth="8.182%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_bengali2" />
+        <Key
+            latin:keyStyle="enterKeyStyle"
+            latin:keyWidth="fillRight" />
+    </Row>
+    <Row
+        latin:keyWidth="8.182%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_bengali3" />
+        <include
+            latin:keyboardLayout="@xml/keys_exclamation_question" />
+    </Row>
+    <include
+        latin:keyboardLayout="@xml/row_qwerty4" />
+</merge>
diff --git a/java/res/xml/kbd_bengali.xml b/java/res/xml/kbd_bengali.xml
new file mode 100644
index 0000000000000000000000000000000000000000..879a897df900e58b3248e79be37115720cd6d4a6
--- /dev/null
+++ b/java/res/xml/kbd_bengali.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<Keyboard
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <include
+        latin:keyboardLayout="@xml/rows_bengali" />
+</Keyboard>
diff --git a/java/res/xml/key_styles_currency.xml b/java/res/xml/key_styles_currency.xml
index 0bb2bb4082f2ea48b05ea5c37b549e8f4ad5fd6f..f576d046524854aa4c62c5f29b1cec4315e5434c 100644
--- a/java/res/xml/key_styles_currency.xml
+++ b/java/res/xml/key_styles_currency.xml
@@ -92,28 +92,17 @@
             <include
                 latin:keyboardLayout="@xml/key_styles_currency_euro" />
         </case>
-        <!-- fa: Persian (Rial and Afgahni)
-             hi: Hindi (Indian Rupee)
-             iw: Hebrew (New Sheqel)
-             lo: Lao (Kip)
-             mn: Mongolian (Tugrik)
-             ne: Nepali (Nepalese Rupee)
-             th: Thai (Baht)
-             uk: Ukrainian (Hryvnia)
-             vi: Vietnamese (Dong)  -->
-        <!-- TODO: The currency sign of Turkish Lira was created in 2012 and assigned U+20BA for
-             its unicode, although there is no font glyph for it as of November 2012. -->
-        <!-- TODO: The currency sign of Armenian Dram was created in 2012 and assigned U+058F for
-             its unicode, although there is no font glyph for it as of September 2013. -->
+        <!-- IN: India (Rupee) -->
         <case
-            latin:languageCode="fa|hi|iw|lo|mn|ne|th|uk|vi"
+            latin:countryCode="IN"
         >
-            <!-- U+00A3: "£" POUND SIGN
+            <!-- U+20B9: "₹" INDIAN RUPEE SIGN
+                 U+00A3: "£" POUND SIGN
                  U+20AC: "€" EURO SIGN
                  U+00A2: "¢" CENT SIGN -->
             <key-style
                 latin:styleName="currencyKeyStyle"
-                latin:keySpec="!text/keyspec_currency"
+                latin:keySpec="&#x20B9;"
                 latin:moreKeys="!text/morekeys_currency" />
             <key-style
                 latin:styleName="moreCurrency1KeyStyle"
@@ -129,17 +118,29 @@
                 latin:styleName="moreCurrency4KeyStyle"
                 latin:keySpec="&#x00A2;" />
         </case>
-        <!-- IN: India (Rupee) -->
+        <!-- bn: Bengali (Bangladesh Taka)
+             fa: Persian (Rial and Afgahni)
+             hi: Hindi (Indian Rupee)
+             iw: Hebrew (New Sheqel)
+             lo: Lao (Kip)
+             mn: Mongolian (Tugrik)
+             ne: Nepali (Nepalese Rupee)
+             th: Thai (Baht)
+             uk: Ukrainian (Hryvnia)
+             vi: Vietnamese (Dong)  -->
+        <!-- TODO: The currency sign of Turkish Lira was created in 2012 and assigned U+20BA for
+             its unicode, although there is no font glyph for it as of November 2012. -->
+        <!-- TODO: The currency sign of Armenian Dram was created in 2012 and assigned U+058F for
+             its unicode, although there is no font glyph for it as of September 2013. -->
         <case
-            latin:countryCode="IN"
+            latin:languageCode="bn|fa|hi|iw|lo|mn|ne|th|uk|vi"
         >
-            <!-- U+20B9: "₹" INDIAN RUPEE SIGN
-                 U+00A3: "£" POUND SIGN
+            <!-- U+00A3: "£" POUND SIGN
                  U+20AC: "€" EURO SIGN
                  U+00A2: "¢" CENT SIGN -->
             <key-style
                 latin:styleName="currencyKeyStyle"
-                latin:keySpec="&#x20B9;"
+                latin:keySpec="!text/keyspec_currency"
                 latin:moreKeys="!text/morekeys_currency" />
             <key-style
                 latin:styleName="moreCurrency1KeyStyle"
diff --git a/java/res/xml/keyboard_layout_set_bengali.xml b/java/res/xml/keyboard_layout_set_bengali.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6e40e6de48c4b921ca4dd502864aa92b31f1eae2
--- /dev/null
+++ b/java/res/xml/keyboard_layout_set_bengali.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<KeyboardLayoutSet
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin">
+    <Element
+        latin:elementName="alphabet"
+        latin:elementKeyboard="@xml/kbd_bengali"
+        latin:enableProximityCharsCorrection="true" />
+    <Element
+        latin:elementName="symbols"
+        latin:elementKeyboard="@xml/kbd_symbols" />
+    <Element
+        latin:elementName="symbolsShifted"
+        latin:elementKeyboard="@xml/kbd_symbols_shift" />
+    <Element
+        latin:elementName="phone"
+        latin:elementKeyboard="@xml/kbd_phone" />
+    <Element
+        latin:elementName="phoneSymbols"
+        latin:elementKeyboard="@xml/kbd_phone_symbols" />
+    <Element
+        latin:elementName="number"
+        latin:elementKeyboard="@xml/kbd_number" />
+</KeyboardLayoutSet>
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index 68dce8abc47d8a80bb70e9a0801aecf64b73affc..67be24256046694f8291792acbcaae44796af300 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -28,6 +28,7 @@
     be_BY: Belarusian (Belarus)/east_slavic
     bg: Bulgarian/bulgarian
     bg: Bulgarian/bulgarian_bds
+    (bn_IN: Bengali (India)/bengali)  # This is a preliminary keyboard layout.
     ca: Catalan/spanish
     cs: Czech/qwertz
     da: Danish/nordic
@@ -171,6 +172,16 @@
             android:imeSubtypeExtraValue="KeyboardLayoutSet=bulgarian_bds,EmojiCapable"
             android:isAsciiCapable="false"
     />
+    <!-- TODO: This bengali keyboard is a preliminary layout.
+               This isn't based on the final specification. -->
+    <subtype android:icon="@drawable/ic_ime_switcher_dark"
+            android:label="@string/subtype_generic"
+            android:subtypeId="0xbff5986c"
+            android:imeSubtypeLocale="bn_IN"
+            android:imeSubtypeMode="keyboard"
+            android:imeSubtypeExtraValue="KeyboardLayoutSet=bengali,EmojiCapable"
+            android:isAsciiCapable="false"
+    />
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic"
             android:subtypeId="0xd2e520d5"
diff --git a/java/res/xml/rowkeys_bengali1.xml b/java/res/xml/rowkeys_bengali1.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c137d12e0f277f8a89b26008f544c7ab07e02f3c
--- /dev/null
+++ b/java/res/xml/rowkeys_bengali1.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0994: "ঔ" BENGALI LETTER AU
+         U+09E7: "à§§" BENGALI DIGIT ONE -->
+    <Key
+        latin:keySpec="&#x0994;"
+        latin:keyHintLabel="&#x09E7;"
+        latin:additionalMoreKeys="&#x09E7;,1"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0990: "ঐ" BENGALI LETTER AI
+         U+09E8: "২" BENGALI DIGIT TWO -->
+    <Key
+        latin:keySpec="&#x0990;"
+        latin:keyHintLabel="&#x09E8;"
+        latin:additionalMoreKeys="&#x09E8;,2"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0986: "আ" BENGALI LETTER AA
+         U+09E9: "à§©" BENGALI DIGIT THREE -->
+    <Key
+        latin:keySpec="&#x0986;"
+        latin:keyHintLabel="&#x09E9;"
+        latin:additionalMoreKeys="&#x09E9;,3"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0988: "ঈ" BENGALI LETTER II
+         U+09EA: "৪" BENGALI DIGIT FOUR -->
+    <Key
+        latin:keySpec="&#x0988;"
+        latin:keyHintLabel="&#x09EA;"
+        latin:additionalMoreKeys="&#x09EA;,4"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+098A: "ঊ" BENGALI LETTER UU
+         U+09EB: "à§«" BENGALI DIGIT FIVE -->
+    <Key
+        latin:keySpec="&#x098A;"
+        latin:keyHintLabel="&#x09EB;"
+        latin:additionalMoreKeys="&#x09EB;,5"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09AC: "ব" BENGALI LETTER BA
+         U+09AD: "ভ" BENGALI LETTER BHA
+         U+09EC: "৬" BENGALI DIGIT SIX -->
+    <Key
+        latin:keySpec="&#x09AC;"
+        latin:moreKeys="&#x09AD;,%"
+        latin:keyHintLabel="&#x09EC;"
+        latin:additionalMoreKeys="&#x09EC;,6"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09B9: "হ" BENGALI LETTER HA
+         U+09ED: "à§­" BENGALI DIGIT SEVEN -->
+    <Key
+        latin:keySpec="&#x09B9;"
+        latin:keyHintLabel="&#x09ED;"
+        latin:additionalMoreKeys="&#x09ED;,7"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0997: "গ" BENGALI LETTER GA
+         U+0998: "ঘ" BENGALI LETTER GHA
+         U+09EE: "à§®" BENGALI DIGIT EIGHT -->
+    <Key
+        latin:keySpec="&#x0997;"
+        latin:moreKeys="&#x0998;,%"
+        latin:keyHintLabel="&#x09EE;"
+        latin:additionalMoreKeys="&#x09EE;,8"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09A6: "দ" BENGALI LETTER DA
+         U+09A7: "ধ" BENGALI LETTER DHA
+         U+09EF: "৯" BENGALI DIGIT NINE -->
+    <Key
+        latin:keySpec="&#x09A6;"
+        latin:moreKeys="&#x09A7;,%"
+        latin:keyHintLabel="&#x09EF;"
+        latin:additionalMoreKeys="&#x09EF;,9"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+099C: "জ" BENGALI LETTER JA
+         U+099D: "ঝ" BENGALI LETTER JHA
+         U+099C/U+09CD/U+099E: "জ্ঞ" BENGALI LETTER JA/BENGALI SIGN VIRAMA/BENGALI LETTER NYA
+         U+09E6: "০" BENGALI DIGIT ZERO -->
+    <Key
+        latin:keySpec="&#x099C;"
+        latin:moreKeys="&#x099D;,&#x099C;&#x09CD;&#x099E;,%"
+        latin:keyHintLabel="&#x09E6;"
+        latin:additionalMoreKeys="&#x09E6;,0"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09A1: "ড" BENGALI LETTER DDA
+         U+09A1/U+09BC: "ড়" BENGALI LETTER DDA/BENGALI SIGN NUKTA -->
+    <Key
+        latin:keySpec="&#x09A1;"
+        latin:moreKeys="&#x09A1;&#x09BC;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml/rowkeys_bengali2.xml b/java/res/xml/rowkeys_bengali2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..589ce017d310a99264ea755492668be0e6cd86ac
--- /dev/null
+++ b/java/res/xml/rowkeys_bengali2.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0993: "ও" BENGALI LETTER O
+         U+09CB: "à§‹" BENGALI VOWEL SIGN O -->
+    <Key
+        latin:keySpec="&#x0993;"
+        latin:moreKeys="&#x09CB;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+098F: "এ" BENGALI LETTER E
+         U+09C7: "ে" BENGALI VOWEL SIGN E -->
+    <Key
+        latin:keySpec="&#x098F;"
+        latin:moreKeys="&#x09C7;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0985: "অ" BENGALI LETTER A
+         U+09CD: "্" BENGALI SIGN VIRAMA -->
+    <Key
+        latin:keySpec="&#x0985;"
+        latin:moreKeys="&#x09CD;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0987: "ই" BENGALI LETTER I
+         U+09BF: "ি" BENGALI VOWEL SIGN I -->
+    <Key
+        latin:keySpec="&#x0987;"
+        latin:moreKeys="&#x09BF;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0989: "উ" BENGALI LETTER U
+         U+09C1: "ু" BENGALI VOWEL SIGN U -->
+    <Key
+        latin:keySpec="&#x0989;"
+        latin:moreKeys="&#x09C1;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09AA: "প" BENGALI LETTER PA
+         U+09AB: "ফ" BENGALI LETTER PHA -->
+    <Key
+        latin:keySpec="&#x09AA;"
+        latin:moreKeys="&#x09AB;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09B0: "র" BENGALI LETTER RA
+         U+09C3: "ৃ" BENGALI VOWEL SIGN VOCALIC R
+         U+098B: "ঋ" BENGALI LETTER VOCALIC R
+         U+09A4/U+09CD/U+09B0: "ত্র" BENGALI LETTER TA/BENGALI SIGN VIRAMA/BENGALI LETTER RA -->
+    <Key
+        latin:keySpec="&#x09B0;"
+        latin:moreKeys="&#x09C3;,&#x098B;,&#x09A4;&#x09CD;&#x09B0;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0995: "ক" BENGALI LETTER KA
+         U+0996: "খ" BENGALI LETTER KHA -->
+    <Key
+        latin:keySpec="&#x0995;"
+        latin:moreKeys="&#x0996;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09A4: "ত" BENGALI LETTER TA
+         U+09CE: "à§Ž" BENGALI LETTER KHANDA TA
+         U+09A5: "থ" BENGALI LETTER THA
+         U+09A4/U+09CD/U+09A4: "ত্ত" BENGALI LETTER TA/BENGALI SIGN VIRAMA/BENGALI LETTER TA -->
+    <Key
+        latin:keySpec="&#x09A4;"
+        latin:moreKeys="&#x09CE;,&#x09A5;,&#x09A4;&#x09CD;&#x09A4;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+099A: "চ" BENGALI LETTER CA
+         U+099B: "ছ" BENGALI LETTER CHA -->
+    <Key
+        latin:keySpec="&#x099A;"
+        latin:moreKeys="&#x099B;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+099F: "ট" BENGALI LETTER TTA
+         U+09A0: "ঠ" BENGALI LETTER TTHA -->
+    <Key
+        latin:keySpec="&#x099F;"
+        latin:moreKeys="&#x09A0;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml/rowkeys_bengali3.xml b/java/res/xml/rowkeys_bengali3.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b6d46850f74914c083b9026a0f8a276e5ee6e3d3
--- /dev/null
+++ b/java/res/xml/rowkeys_bengali3.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <!-- U+0981: "ঁ" BENGALI SIGN CANDRABINDU
+         U+0983: "ঃ" BENGALI SIGN VISARGA
+         U+0982: "ং" BENGALI SIGN ANUSVARA -->
+    <Key
+        latin:keySpec="&#x0981;"
+        latin:moreKeys="&#x0983;,&#x0982;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09A2: "ঢ" BENGALI LETTER DDHA
+         U+09A2/U+09BC: "ঢ়" BENGALI LETTER DDHA/BENGALI SIGN NUKTA -->
+    <Key
+        latin:keySpec="&#x09A2;"
+        latin:moreKeys="&#x09A2;&#x09BC;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09AE: "ম" BENGALI LETTER MA -->
+    <Key
+        latin:keySpec="&#x09AE;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09A8: "ন" BENGALI LETTER NA
+         U+09A3: "ণ" BENGALI LETTER NNA -->
+    <Key
+        latin:keySpec="&#x09A8;"
+        latin:moreKeys="&#x09A3;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+099E: "ঞ" BENGALI LETTER NYA
+         U+0999: "ঙ" BENGALI LETTER NGA
+         U+099E/U+09CD/U+099C: "ঞ্জ" BENGALI LETTER NYA/BENGALI SIGN VIRAMA/BENGALI LETTER JA -->
+    <Key
+        latin:keySpec="&#x099E;"
+        latin:moreKeys="&#x0999;,&#x099E;&#x09CD;&#x099C;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09B2: "ল" BENGALI LETTER LA -->
+    <Key
+        latin:keySpec="&#x09B2;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09B7: "ষ" BENGALI LETTER SSA
+         U+0995/U+09CD/U+09B7: "ক্ষ" BENGALI LETTER KA/BENGALI SIGN VIRAMA/BENGALI LETTER SSA -->
+    <Key
+        latin:keySpec="&#x09B7;"
+        latin:moreKeys="&#x0995;&#x09CD;&#x09B7;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09B8: "স" BENGALI LETTER SA
+         U+09B6: "শ" BENGALI LETTER SHA -->
+    <Key
+        latin:keySpec="&#x09B8;"
+        latin:moreKeys="&#x09B6;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+09DF: "à§Ÿ" BENGALI LETTER YYA
+         U+09AF: "য" BENGALI LETTER YA -->
+    <Key
+        latin:keySpec="&#x09DF;"
+        latin:moreKeys="&#x09AF;"
+        latin:keyLabelFlags="fontNormal" />
+    <!-- U+0964: "।" DEVANAGARI DANDA
+         U+0965: "॥" DEVANAGARI DOUBLE DANDA -->
+    <Key
+        latin:keySpec="&#x0964;"
+        latin:moreKeys="&#x0965;"
+        latin:keyLabelFlags="fontNormal" />
+</merge>
diff --git a/java/res/xml/rows_bengali.xml b/java/res/xml/rows_bengali.xml
new file mode 100644
index 0000000000000000000000000000000000000000..890f9352f8bbc2b5c0e54463e760c90b65a3ffb7
--- /dev/null
+++ b/java/res/xml/rows_bengali.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <include
+        latin:keyboardLayout="@xml/key_styles_common" />
+    <Row
+        latin:keyWidth="9.091%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_bengali1" />
+    </Row>
+    <Row
+            latin:keyWidth="9.091%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_bengali2" />
+    </Row>
+    <Row
+        latin:keyWidth="9.091%p"
+    >
+        <include
+            latin:keyboardLayout="@xml/rowkeys_bengali3" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="fillRight" />
+    </Row>
+    <include
+        latin:keyboardLayout="@xml/row_qwerty4" />
+</merge>
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
index 13b174e94b5f442bd4e5e62a079924d764785ff0..6afc6210c3fb51fb6f6874ec71beb1f04cf132e0 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -88,8 +88,8 @@ public final class KeyboardTextsTable {
         /*   2:30 */ "morekeys_u",
         /*   3:29 */ "morekeys_e",
         /*   4:28 */ "morekeys_i",
-        /*   5:23 */ "morekeys_c",
-        /*   6:23 */ "keylabel_to_alpha",
+        /*   5:24 */ "keylabel_to_alpha",
+        /*   6:23 */ "morekeys_c",
         /*   7:23 */ "double_quotes",
         /*   8:22 */ "morekeys_n",
         /*   9:22 */ "single_quotes",
@@ -97,9 +97,9 @@ public final class KeyboardTextsTable {
         /*  11:14 */ "morekeys_y",
         /*  12:13 */ "morekeys_d",
         /*  13:12 */ "morekeys_z",
-        /*  14:10 */ "morekeys_t",
-        /*  15:10 */ "morekeys_l",
-        /*  16:10 */ "keyspec_currency",
+        /*  14:11 */ "keyspec_currency",
+        /*  15:10 */ "morekeys_t",
+        /*  16:10 */ "morekeys_l",
         /*  17: 9 */ "morekeys_g",
         /*  18: 9 */ "single_angle_quotes",
         /*  19: 9 */ "double_angle_quotes",
@@ -258,18 +258,21 @@ public final class KeyboardTextsTable {
     /* Default texts */
     private static final String[] TEXTS_DEFAULT = {
         /* morekeys_a ~ */
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~ morekeys_c */
+        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         /* keylabel_to_alpha */ "ABC",
+        /* morekeys_c */ EMPTY,
         /* double_quotes */ "!text/double_lqm_rqm",
         /* morekeys_n */ EMPTY,
         /* single_quotes */ "!text/single_lqm_rqm",
         /* morekeys_s ~ */
-        EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
-        /* ~ morekeys_l */
+        EMPTY, EMPTY, EMPTY, EMPTY,
+        /* ~ morekeys_z */
         /* keyspec_currency */ "$",
-        /* morekeys_g */ EMPTY,
+        /* morekeys_t ~ */
+        EMPTY, EMPTY, EMPTY,
+        /* ~ morekeys_g */
         /* single_angle_quotes */ "!text/single_laqm_raqm",
         /* double_angle_quotes */ "!text/double_laqm_raqm",
         /* morekeys_r ~ */
@@ -507,7 +510,7 @@ public final class KeyboardTextsTable {
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00ED,\u00EC,\u00EF,\u00EE,\u012F,\u012B,\u0133",
-        /* morekeys_c ~ */
+        /* keylabel_to_alpha ~ */
         null, null, null,
         /* ~ double_quotes */
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
@@ -523,17 +526,17 @@ public final class KeyboardTextsTable {
     /* Locale ar: Arabic */
     private static final String[] TEXTS_ar = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0623: "Ø£" ARABIC LETTER ALEF WITH HAMZA ABOVE
         // U+200C: ZERO WIDTH NON-JOINER
         // U+0628: "ب" ARABIC LETTER BEH
         // U+062C: "ج" ARABIC LETTER JEEM
         /* keylabel_to_alpha */ "\u0623\u200C\u0628\u200C\u062C",
-        /* double_quotes ~ */
+        /* morekeys_c ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_cyrillic_soft_sign */
         // U+0661: "Ù¡" ARABIC-INDIC DIGIT ONE
         /* keyspec_symbols_1 */ "\u0661",
@@ -681,12 +684,13 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* keylabel_to_alpha */ 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
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* keylabel_to_alpha ~ */
-        null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null,
         /* ~ single_quotes */
         // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
@@ -695,7 +699,7 @@ public final class KeyboardTextsTable {
         /* morekeys_s */ "\u015F,\u00DF,\u015B,\u0161",
         /* morekeys_y ~ */
         null, null, null, null, null, null,
-        /* ~ keyspec_currency */
+        /* ~ morekeys_l */
         // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
         /* morekeys_g */ "\u011F",
     };
@@ -703,13 +707,14 @@ public final class KeyboardTextsTable {
     /* Locale be_BY: Belarusian (Belarus) */
     private static final String[] TEXTS_be_BY = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -736,17 +741,35 @@ public final class KeyboardTextsTable {
     /* Locale bg: Bulgarian */
     private static final String[] TEXTS_bg = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* morekeys_c */ null,
         // single_quotes of Bulgarian is default single_quotes_right_left.
         /* double_quotes */ "!text/double_9qm_lqm",
     };
 
+    /* Locale bn: Bengali */
+    private static final String[] TEXTS_bn = {
+        /* morekeys_a ~ */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
+        // Label for "switch to alphabetic" key.
+        // U+0995: "क" BENGALI LETTER KA
+        // U+0996: "ख" BENGALI LETTER KHA
+        // U+0997: "ग" BENGALI LETTER GA
+        /* keylabel_to_alpha */ "\u0995\u0996\u0997",
+        /* morekeys_c ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ morekeys_z */
+        // U+09F3: "à§³" BENGALI RUPEE SIGN
+        /* keyspec_currency */ "\u09F3",
+    };
+
     /* Locale ca: Catalan */
     private static final String[] TEXTS_ca = {
         // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
@@ -791,25 +814,25 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* keylabel_to_alpha */ 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
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
         /* morekeys_n */ "\u00F1,\u0144",
         /* single_quotes ~ */
-        null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
         /* ~ morekeys_t */
         // U+00B7: "·" MIDDLE DOT
         // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
         /* morekeys_l */ "l\u00B7l,\u0142",
-        /* keyspec_currency ~ */
+        /* morekeys_g ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
         /* ~ morekeys_nordic_row2_11 */
         // U+00B7: "·" MIDDLE DOT
         /* morekeys_punctuation */ "!autoColumnOrder!9,\\,,?,!,\u00B7,#,),(,/,;,',@,:,-,\",+,\\%,&",
@@ -866,11 +889,11 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
+        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
@@ -890,11 +913,11 @@ public final class KeyboardTextsTable {
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         /* morekeys_z */ "\u017E,\u017A,\u017C",
+        /* keyspec_currency */ null,
         // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
         /* morekeys_t */ "\u0165",
-        /* morekeys_l ~ */
-        null, null, null,
-        /* ~ morekeys_g */
+        /* morekeys_l */ null,
+        /* morekeys_g */ null,
         /* single_angle_quotes */ "!text/single_raqm_laqm",
         /* double_angle_quotes */ "!text/double_raqm_laqm",
         // U+0159: "Å™" LATIN SMALL LETTER R WITH CARON
@@ -929,8 +952,8 @@ public final class KeyboardTextsTable {
         // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         /* morekeys_i */ "\u00ED,\u00EF",
-        /* morekeys_c */ null,
         /* keylabel_to_alpha */ null,
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -945,11 +968,11 @@ public final class KeyboardTextsTable {
         /* morekeys_y */ "\u00FD,\u00FF",
         // U+00F0: "ð" LATIN SMALL LETTER ETH
         /* morekeys_d */ "\u00F0",
-        /* morekeys_z */ null,
-        /* morekeys_t */ null,
+        /* morekeys_z ~ */
+        null, null, null,
+        /* ~ morekeys_t */
         // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
         /* morekeys_l */ "\u0142",
-        /* keyspec_currency */ null,
         /* morekeys_g */ null,
         /* single_angle_quotes */ "!text/single_raqm_laqm",
         /* double_angle_quotes */ "!text/double_raqm_laqm",
@@ -1006,7 +1029,7 @@ public final class KeyboardTextsTable {
         /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0117",
         /* morekeys_i ~ */
         null, null, null,
-        /* ~ keylabel_to_alpha */
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -1043,8 +1066,8 @@ public final class KeyboardTextsTable {
     /* Locale el: Greek */
     private static final String[] TEXTS_el = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
         // U+0392: "Î’" GREEK CAPITAL LETTER BETA
@@ -1090,9 +1113,9 @@ public final class KeyboardTextsTable {
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u012B,\u00EC",
+        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u00E7",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         /* morekeys_n */ "\u00F1",
@@ -1156,12 +1179,12 @@ public final class KeyboardTextsTable {
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u0129,\u00EC,\u012F,\u012B,\u0131,\u0133",
+        /* keylabel_to_alpha */ null,
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+010B: "Ä‹" LATIN SMALL LETTER C WITH DOT ABOVE
         /* morekeys_c */ "\u0107,\u010D,\u00E7,\u010B",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -1190,6 +1213,7 @@ public final class KeyboardTextsTable {
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         /* morekeys_z */ "\u017A,\u017C,\u017E",
+        /* keyspec_currency */ null,
         // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
         // U+021B: "È›" LATIN SMALL LETTER T WITH COMMA BELOW
         // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
@@ -1201,7 +1225,6 @@ public final class KeyboardTextsTable {
         // U+0140: "Å€" LATIN SMALL LETTER L WITH MIDDLE DOT
         // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
         /* morekeys_l */ "\u013A,\u013C,\u013E,\u0140,\u0142",
-        /* keyspec_currency */ null,
         // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
         // U+0121: "Ä¡" LATIN SMALL LETTER G WITH DOT ABOVE
         // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
@@ -1293,11 +1316,11 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* keylabel_to_alpha */ 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
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -1359,11 +1382,11 @@ public final class KeyboardTextsTable {
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         /* morekeys_i */ "\u012B,\u00EC,\u012F,\u00ED,\u00EE,\u00EF,\u0131",
+        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
@@ -1384,6 +1407,7 @@ public final class KeyboardTextsTable {
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         /* morekeys_z */ "\u017E,\u017C,\u017A",
+        /* keyspec_currency */ null,
         // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
         // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
         /* morekeys_t */ "\u0163,\u0165",
@@ -1392,7 +1416,6 @@ public final class KeyboardTextsTable {
         // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
         // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
         /* morekeys_l */ "\u013C,\u0142,\u013A,\u013E",
-        /* keyspec_currency */ null,
         // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
         /* morekeys_g */ "\u0123,\u011F",
@@ -1459,11 +1482,11 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* keylabel_to_alpha */ 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
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -1473,21 +1496,22 @@ public final class KeyboardTextsTable {
     /* Locale fa: Persian */
     private static final String[] TEXTS_fa = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // 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
         /* keylabel_to_alpha */ "\u0627\u200C\u0628\u200C\u067E",
-        /* double_quotes ~ */
-        null, null, null, null, null, null, null, null, null,
-        /* ~ morekeys_l */
+        /* morekeys_c ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ morekeys_z */
         // U+FDFC: "ï·¼" RIAL SIGN
         /* keyspec_currency */ "\uFDFC",
-        /* morekeys_g ~ */
+        /* morekeys_t ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
         /* ~ morekeys_cyrillic_soft_sign */
         // U+06F1: "Û±" EXTENDED ARABIC-INDIC DIGIT ONE
         /* keyspec_symbols_1 */ "\u06F1",
@@ -1645,7 +1669,7 @@ public final class KeyboardTextsTable {
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         /* morekeys_z */ "\u017E,\u017A,\u017C",
-        /* morekeys_t ~ */
+        /* keyspec_currency ~ */
         null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_cyrillic_ie */
         // U+00E5: "Ã¥" LATIN SMALL LETTER A WITH RING ABOVE
@@ -1707,12 +1731,13 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00EE,%,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* keylabel_to_alpha */ 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
         /* morekeys_c */ "\u00E7,%,\u0107,\u010D",
-        /* keylabel_to_alpha ~ */
-        null, null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null, null,
         /* ~ morekeys_s */
         // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
         /* morekeys_y */ "%,\u00FF",
@@ -1779,11 +1804,11 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* keylabel_to_alpha */ 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
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -1793,20 +1818,21 @@ public final class KeyboardTextsTable {
     /* Locale hi: Hindi */
     private static final String[] TEXTS_hi = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* keylabel_to_alpha */ "\u0915\u0916\u0917",
-        /* double_quotes ~ */
-        null, null, null, null, null, null, null, null, null,
-        /* ~ morekeys_l */
+        /* morekeys_c ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ morekeys_z */
         // U+20B9: "₹" INDIAN RUPEE SIGN
         /* keyspec_currency */ "\u20B9",
-        /* morekeys_g ~ */
+        /* morekeys_t ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
         /* ~ morekeys_cyrillic_soft_sign */
         // U+0967: "१" DEVANAGARI DIGIT ONE
         /* keyspec_symbols_1 */ "\u0967",
@@ -1845,13 +1871,12 @@ public final class KeyboardTextsTable {
     /* Locale hr: Croatian */
     private static final String[] TEXTS_hr = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null, null, null, null,
+        /* ~ keylabel_to_alpha */
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u010D,\u0107,\u00E7",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -1868,7 +1893,7 @@ public final class KeyboardTextsTable {
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         /* morekeys_z */ "\u017E,\u017A,\u017C",
-        /* morekeys_t ~ */
+        /* keyspec_currency ~ */
         null, null, null, null,
         /* ~ morekeys_g */
         /* single_angle_quotes */ "!text/single_raqm_laqm",
@@ -1918,8 +1943,8 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u00EC,\u012F,\u012B",
-        /* morekeys_c */ null,
         /* keylabel_to_alpha */ null,
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
@@ -1933,18 +1958,18 @@ public final class KeyboardTextsTable {
     /* Locale hy_AM: Armenian (Armenia) */
     private static final String[] TEXTS_hy_AM = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0531: "Ô±" ARMENIAN CAPITAL LETTER AYB
         // U+0532: "Ô²" ARMENIAN CAPITAL LETTER BEN
         // U+0533: "Ô³" ARMENIAN CAPITAL LETTER GIM
         /* keylabel_to_alpha */ "\u0531\u0532\u0533",
-        /* double_quotes ~ */
+        /* morekeys_c ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null,
+        null, null, null,
         /* ~ morekeys_nordic_row2_11 */
         // U+055E: "Õž" ARMENIAN QUESTION MARK
         // U+055C: "՜" ARMENIAN EXCLAMATION MARK
@@ -2029,8 +2054,8 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EE,\u00EC,\u012F,\u012B",
-        /* morekeys_c */ null,
         /* keylabel_to_alpha */ null,
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -2041,6 +2066,7 @@ public final class KeyboardTextsTable {
         // U+00F0: "ð" LATIN SMALL LETTER ETH
         /* morekeys_d */ "\u00F0",
         /* morekeys_z */ null,
+        /* keyspec_currency */ null,
         // U+00FE: "þ" LATIN SMALL LETTER THORN
         /* morekeys_t */ "\u00FE",
     };
@@ -2088,7 +2114,7 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u012F,\u012B",
-        /* morekeys_c ~ */
+        /* keylabel_to_alpha ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@@ -2111,25 +2137,27 @@ public final class KeyboardTextsTable {
     /* Locale iw: Hebrew */
     private static final String[] TEXTS_iw = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+05D0: "א" HEBREW LETTER ALEF
         // U+05D1: "ב" HEBREW LETTER BET
         // U+05D2: "×’" HEBREW LETTER GIMEL
         /* keylabel_to_alpha */ "\u05D0\u05D1\u05D2",
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_rqm_9qm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_rqm_9qm",
         /* morekeys_s ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_l */
+        null, null, null, null,
+        /* ~ morekeys_z */
         // U+20AA: "₪" NEW SHEQEL SIGN
         /* keyspec_currency */ "\u20AA",
-        /* morekeys_g ~ */
+        /* morekeys_t ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
         /* ~ morekeys_swiss_row2_11 */
         // U+2605: "★" BLACK STAR
         /* morekeys_star */ "\u2605",
@@ -2168,13 +2196,14 @@ public final class KeyboardTextsTable {
     /* Locale ka_GE: Georgian (Georgia) */
     private static final String[] TEXTS_ka_GE = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+10D0: "ა" GEORGIAN LETTER AN
         // U+10D1: "ბ" GEORGIAN LETTER BAN
         // U+10D2: "გ" GEORGIAN LETTER GAN
         /* keylabel_to_alpha */ "\u10D0\u10D1\u10D2",
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -2183,15 +2212,16 @@ public final class KeyboardTextsTable {
     /* Locale kk: Kazakh */
     private static final String[] TEXTS_kk = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* double_quotes ~ */
+        /* morekeys_c ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null,
         /* ~ morekeys_k */
         // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
         /* morekeys_cyrillic_ie */ "\u0451",
@@ -2240,14 +2270,14 @@ public final class KeyboardTextsTable {
     /* Locale km_KH: Khmer (Cambodia) */
     private static final String[] TEXTS_km_KH = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+1780: "ក" KHMER LETTER KA
         // U+1781: "ខ" KHMER LETTER KHA
         // U+1782: "áž‚" KHMER LETTER KO
         /* keylabel_to_alpha */ "\u1780\u1781\u1782",
-        /* double_quotes ~ */
+        /* morekeys_c ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@@ -2255,7 +2285,7 @@ public final class KeyboardTextsTable {
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_cyrillic_a */
         // U+17DB: "៛" KHMER CURRENCY SYMBOL RIEL
         /* morekeys_currency_dollar */ "\u17DB,\u00A2,\u00A3,\u20AC,\u00A5,\u20B1",
@@ -2264,15 +2294,16 @@ public final class KeyboardTextsTable {
     /* Locale ky: Kirghiz */
     private static final String[] TEXTS_ky = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* double_quotes ~ */
+        /* morekeys_c ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null,
         /* ~ morekeys_k */
         // U+0451: "Ñ‘" CYRILLIC SMALL LETTER IO
         /* morekeys_cyrillic_ie */ "\u0451",
@@ -2307,16 +2338,16 @@ public final class KeyboardTextsTable {
     /* Locale lo_LA: Lao (Laos) */
     private static final String[] TEXTS_lo_LA = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0E81: "ກ" LAO LETTER KO
         // U+0E82: "ຂ" LAO LETTER KHO SUNG
         // U+0E84: "ຄ" LAO LETTER KHO TAM
         /* keylabel_to_alpha */ "\u0E81\u0E82\u0E84",
-        /* double_quotes ~ */
-        null, null, null, null, null, null, null, null, null,
-        /* ~ morekeys_l */
+        /* morekeys_c ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ morekeys_z */
         // U+20AD: "â‚­" KIP SIGN
         /* keyspec_currency */ "\u20AD",
     };
@@ -2369,11 +2400,11 @@ public final class KeyboardTextsTable {
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         /* morekeys_i */ "\u012F,\u012B,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
@@ -2394,6 +2425,7 @@ public final class KeyboardTextsTable {
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         /* morekeys_z */ "\u017E,\u017C,\u017A",
+        /* keyspec_currency */ null,
         // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
         // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
         /* morekeys_t */ "\u0163,\u0165",
@@ -2402,7 +2434,6 @@ public final class KeyboardTextsTable {
         // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
         // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
         /* morekeys_l */ "\u013C,\u0142,\u013A,\u013E",
-        /* keyspec_currency */ null,
         // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
         /* morekeys_g */ "\u0123,\u011F",
@@ -2463,11 +2494,11 @@ public final class KeyboardTextsTable {
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         /* morekeys_i */ "\u012B,\u012F,\u00EC,\u00ED,\u00EE,\u00EF,\u0131",
+        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
@@ -2488,6 +2519,7 @@ public final class KeyboardTextsTable {
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         /* morekeys_z */ "\u017E,\u017C,\u017A",
+        /* keyspec_currency */ null,
         // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
         // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
         /* morekeys_t */ "\u0163,\u0165",
@@ -2496,7 +2528,6 @@ public final class KeyboardTextsTable {
         // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
         // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
         /* morekeys_l */ "\u013C,\u0142,\u013A,\u013E",
-        /* keyspec_currency */ null,
         // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
         /* morekeys_g */ "\u0123,\u011F",
@@ -2513,13 +2544,14 @@ public final class KeyboardTextsTable {
     /* Locale mk: Macedonian */
     private static final String[] TEXTS_mk = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -2550,16 +2582,16 @@ public final class KeyboardTextsTable {
     /* Locale mn_MN: Mongolian (Mongolia) */
     private static final String[] TEXTS_mn_MN = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
-        /* double_quotes ~ */
-        null, null, null, null, null, null, null, null, null,
-        /* ~ morekeys_l */
+        /* morekeys_c ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ morekeys_z */
         // U+20AE: "â‚®" TUGRIK SIGN
         /* keyspec_currency */ "\u20AE",
     };
@@ -2567,20 +2599,21 @@ public final class KeyboardTextsTable {
     /* Locale mr_IN: Marathi (India) */
     private static final String[] TEXTS_mr_IN = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* keylabel_to_alpha */ "\u0915\u0916\u0917",
-        /* double_quotes ~ */
-        null, null, null, null, null, null, null, null, null,
-        /* ~ morekeys_l */
+        /* morekeys_c ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ morekeys_z */
         // U+20B9: "₹" INDIAN RUPEE SIGN
         /* keyspec_currency */ "\u20B9",
-        /* morekeys_g ~ */
+        /* morekeys_t ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
         /* ~ morekeys_cyrillic_soft_sign */
         // U+0967: "१" DEVANAGARI DIGIT ONE
         /* keyspec_symbols_1 */ "\u0967",
@@ -2619,18 +2652,18 @@ public final class KeyboardTextsTable {
     /* Locale my_MM: Burmese (Myanmar) */
     private static final String[] TEXTS_my_MM = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+1000: "က" MYANMAR LETTER KA
         // U+1001: "ခ" MYANMAR LETTER KHA
         // U+1002: "ဂ" MYANMAR LETTER GA
         /* keylabel_to_alpha */ "\u1000\u1001\u1002",
-        /* double_quotes ~ */
+        /* morekeys_c ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null,
+        null, null, null,
         /* ~ morekeys_nordic_row2_11 */
         /* morekeys_punctuation */ "!autoColumnOrder!9,\u104A,.,?,!,#,),(,/,;,...,',@,:,-,\",+,\\%,&",
         // U+104A: "၊" MYANMAR SIGN LITTLE SECTION
@@ -2687,7 +2720,7 @@ public final class KeyboardTextsTable {
         /* morekeys_e */ "\u00E9,\u00E8,\u00EA,\u00EB,\u0119,\u0117,\u0113",
         /* morekeys_i ~ */
         null, null, null,
-        /* ~ keylabel_to_alpha */
+        /* ~ morekeys_c */
         /* double_quotes */ "!text/double_9qm_rqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
@@ -2713,20 +2746,21 @@ public final class KeyboardTextsTable {
     /* Locale ne_NP: Nepali (Nepal) */
     private static final String[] TEXTS_ne_NP = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0915: "क" DEVANAGARI LETTER KA
         // U+0916: "ख" DEVANAGARI LETTER KHA
         // U+0917: "ग" DEVANAGARI LETTER GA
         /* keylabel_to_alpha */ "\u0915\u0916\u0917",
-        /* double_quotes ~ */
-        null, null, null, null, null, null, null, null, null,
-        /* ~ morekeys_l */
+        /* morekeys_c ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ morekeys_z */
         // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
         /* keyspec_currency */ "\u0930\u0941.",
-        /* morekeys_g ~ */
+        /* morekeys_t ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null,
         /* ~ morekeys_cyrillic_soft_sign */
         // U+0967: "१" DEVANAGARI DIGIT ONE
         /* keyspec_symbols_1 */ "\u0967",
@@ -2804,8 +2838,8 @@ public final class KeyboardTextsTable {
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B,\u0133",
-        /* morekeys_c */ null,
         /* keylabel_to_alpha */ null,
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -2847,11 +2881,11 @@ public final class KeyboardTextsTable {
         // U+0113: "Ä“" LATIN SMALL LETTER E WITH MACRON
         /* morekeys_e */ "\u0119,\u00E8,\u00E9,\u00EA,\u00EB,\u0117,\u0113",
         /* morekeys_i */ null,
+        /* keylabel_to_alpha */ null,
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u0107,\u00E7,\u010D",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
@@ -2867,6 +2901,7 @@ public final class KeyboardTextsTable {
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         /* morekeys_z */ "\u017C,\u017A,\u017E",
+        /* keyspec_currency */ null,
         /* morekeys_t */ null,
         // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
         /* morekeys_l */ "\u0142",
@@ -2914,6 +2949,7 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EE,\u00EC,\u00EF,\u012F,\u012B",
+        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
@@ -2955,8 +2991,8 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
-        /* morekeys_c */ null,
         /* keylabel_to_alpha */ null,
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_rqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_rqm",
@@ -2966,8 +3002,8 @@ public final class KeyboardTextsTable {
         // U+0161: "Å¡" LATIN SMALL LETTER S WITH CARON
         /* morekeys_s */ "\u0219,\u00DF,\u015B,\u0161",
         /* morekeys_y ~ */
-        null, null, null,
-        /* ~ morekeys_z */
+        null, null, null, null,
+        /* ~ keyspec_currency */
         // U+021B: "È›" LATIN SMALL LETTER T WITH COMMA BELOW
         /* morekeys_t */ "\u021B",
     };
@@ -2975,13 +3011,14 @@ public final class KeyboardTextsTable {
     /* Locale ru: Russian */
     private static final String[] TEXTS_ru = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -3008,8 +3045,8 @@ public final class KeyboardTextsTable {
     /* Locale si_LK: Sinhalese (Sri Lanka) */
     private static final String[] TEXTS_si_LK = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0D85: "à¶…" SINHALA LETTER AYANNA
         // U+0D86: "ආ" SINHALA LETTER AAYANNA
@@ -3063,11 +3100,11 @@ public final class KeyboardTextsTable {
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         /* morekeys_i */ "\u00ED,\u012B,\u012F,\u00EC,\u00EE,\u00EF,\u0131",
+        /* keylabel_to_alpha */ null,
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u00E7,\u0107",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
         // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
@@ -3089,6 +3126,7 @@ public final class KeyboardTextsTable {
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
         /* morekeys_z */ "\u017E,\u017C,\u017A",
+        /* keyspec_currency */ null,
         // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
         // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
         /* morekeys_t */ "\u0165,\u0163",
@@ -3097,7 +3135,6 @@ public final class KeyboardTextsTable {
         // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
         // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
         /* morekeys_l */ "\u013E,\u013A,\u013C,\u0142",
-        /* keyspec_currency */ null,
         // U+0123: "Ä£" LATIN SMALL LETTER G WITH CEDILLA
         // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
         /* morekeys_g */ "\u0123,\u011F",
@@ -3114,12 +3151,11 @@ public final class KeyboardTextsTable {
     /* Locale sl: Slovenian */
     private static final String[] TEXTS_sl = {
         /* morekeys_a ~ */
-        null, null, null, null, null,
-        /* ~ morekeys_i */
+        null, null, null, null, null, null,
+        /* ~ keylabel_to_alpha */
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         /* morekeys_c */ "\u010D,\u0107",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -3130,7 +3166,7 @@ public final class KeyboardTextsTable {
         /* morekeys_d */ "\u0111",
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         /* morekeys_z */ "\u017E",
-        /* morekeys_t ~ */
+        /* keyspec_currency ~ */
         null, null, null, null,
         /* ~ morekeys_g */
         /* single_angle_quotes */ "!text/single_raqm_laqm",
@@ -3140,14 +3176,15 @@ public final class KeyboardTextsTable {
     /* Locale sr: Serbian */
     private static final String[] TEXTS_sr = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // 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
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
@@ -3228,11 +3265,11 @@ public final class KeyboardTextsTable {
         // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
         // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
         /* morekeys_i */ "\u00ED,\u00EC,\u00EE,\u00EF",
+        /* keylabel_to_alpha */ 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
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
@@ -3254,12 +3291,12 @@ public final class KeyboardTextsTable {
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         /* morekeys_z */ "\u017A,\u017E,\u017C",
+        /* keyspec_currency */ null,
         // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
         // U+00FE: "þ" LATIN SMALL LETTER THORN
         /* morekeys_t */ "\u0165,\u00FE",
         // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
         /* morekeys_l */ "\u0142",
-        /* keyspec_currency */ null,
         /* morekeys_g */ null,
         /* single_angle_quotes */ "!text/single_raqm_laqm",
         /* double_angle_quotes */ "!text/double_raqm_laqm",
@@ -3323,9 +3360,9 @@ public final class KeyboardTextsTable {
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
         /* morekeys_i */ "\u00EE,\u00EF,\u00ED,\u012B,\u00EC",
+        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u00E7",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         /* morekeys_n */ "\u00F1",
@@ -3334,23 +3371,23 @@ public final class KeyboardTextsTable {
         /* morekeys_s */ "\u00DF",
         /* morekeys_y ~ */
         null, null, null, null, null, null,
-        /* ~ keyspec_currency */
+        /* ~ morekeys_l */
         /* morekeys_g */ "g\'",
     };
 
     /* Locale th: Thai */
     private static final String[] TEXTS_th = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0E01: "ก" THAI CHARACTER KO KAI
         // U+0E02: "ข" THAI CHARACTER KHO KHAI
         // U+0E04: "ค" THAI CHARACTER KHO KHWAI
         /* keylabel_to_alpha */ "\u0E01\u0E02\u0E04",
-        /* double_quotes ~ */
-        null, null, null, null, null, null, null, null, null,
-        /* ~ morekeys_l */
+        /* morekeys_c ~ */
+        null, null, null, null, null, null, null, null,
+        /* ~ morekeys_z */
         // U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT
         /* keyspec_currency */ "\u0E3F",
     };
@@ -3399,11 +3436,11 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u00ED,\u00EF,\u00EC,\u00EE,\u012F,\u012B",
+        /* keylabel_to_alpha */ 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
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -3438,12 +3475,13 @@ public final class KeyboardTextsTable {
         // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         /* morekeys_i */ "\u0131,\u00EE,\u00EF,\u00EC,\u00ED,\u012F,\u012B",
+        /* keylabel_to_alpha */ 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
         /* morekeys_c */ "\u00E7,\u0107,\u010D",
-        /* keylabel_to_alpha ~ */
-        null, null, null, null,
+        /* double_quotes ~ */
+        null, null, null,
         /* ~ single_quotes */
         // U+015F: "ÅŸ" LATIN SMALL LETTER S WITH CEDILLA
         // U+00DF: "ß" LATIN SMALL LETTER SHARP S
@@ -3452,7 +3490,7 @@ public final class KeyboardTextsTable {
         /* morekeys_s */ "\u015F,\u00DF,\u015B,\u0161",
         /* morekeys_y ~ */
         null, null, null, null, null, null,
-        /* ~ keyspec_currency */
+        /* ~ morekeys_l */
         // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
         /* morekeys_g */ "\u011F",
     };
@@ -3460,23 +3498,24 @@ public final class KeyboardTextsTable {
     /* Locale uk: Ukrainian */
     private static final String[] TEXTS_uk = {
         /* morekeys_a ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_c */
+        null, null, null, null, null,
+        /* ~ morekeys_i */
         // Label for "switch to alphabetic" key.
         // U+0410: "А" CYRILLIC CAPITAL LETTER A
         // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
         // U+0412: "Ð’" CYRILLIC CAPITAL LETTER VE
         /* keylabel_to_alpha */ "\u0410\u0411\u0412",
+        /* morekeys_c */ null,
         /* double_quotes */ "!text/double_9qm_lqm",
         /* morekeys_n */ null,
         /* single_quotes */ "!text/single_9qm_lqm",
         /* morekeys_s ~ */
-        null, null, null, null, null, null,
-        /* ~ morekeys_l */
+        null, null, null, null,
+        /* ~ morekeys_z */
         // U+20B4: "â‚´" HRYVNIA SIGN
         /* keyspec_currency */ "\u20B4",
-        /* morekeys_g ~ */
-        null, null, null, null, null, null, null, null, null, null,
+        /* morekeys_t ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_nordic_row2_10 */
         // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
         /* keyspec_east_slavic_row1_9 */ "\u0449",
@@ -3570,7 +3609,7 @@ public final class KeyboardTextsTable {
         // U+0129: "Ä©" LATIN SMALL LETTER I WITH TILDE
         // U+1ECB: "ị" LATIN SMALL LETTER I WITH DOT BELOW
         /* morekeys_i */ "\u00EC,\u00ED,\u1EC9,\u0129,\u1ECB",
-        /* morekeys_c ~ */
+        /* keylabel_to_alpha ~ */
         null, null, null, null, null, null,
         /* ~ morekeys_s */
         // U+1EF3: "ỳ" LATIN SMALL LETTER Y WITH GRAVE
@@ -3581,9 +3620,7 @@ public final class KeyboardTextsTable {
         /* morekeys_y */ "\u1EF3,\u00FD,\u1EF7,\u1EF9,\u1EF5",
         // U+0111: "Ä‘" LATIN SMALL LETTER D WITH STROKE
         /* morekeys_d */ "\u0111",
-        /* morekeys_z ~ */
-        null, null, null,
-        /* ~ morekeys_l */
+        /* morekeys_z */ null,
         // U+20AB: "â‚«" DONG SIGN
         /* keyspec_currency */ "\u20AB",
     };
@@ -3627,9 +3664,9 @@ public final class KeyboardTextsTable {
         // U+012B: "Ä«" LATIN SMALL LETTER I WITH MACRON
         // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
         /* morekeys_i */ "\u00ED,\u00EE,\u00EF,\u012B,\u00EC",
+        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         /* morekeys_c */ "\u00E7",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         /* morekeys_n */ "\u00F1",
@@ -3696,13 +3733,13 @@ public final class KeyboardTextsTable {
         // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
         // U+0133: "ij" LATIN SMALL LIGATURE IJ
         /* morekeys_i */ "\u00EC,\u00ED,\u00EE,\u00EF,\u0129,\u012B,\u012D,\u012F,\u0131,\u0133",
+        /* keylabel_to_alpha */ null,
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
         // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
         // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
         // U+010B: "Ä‹" LATIN SMALL LETTER C WITH DOT ABOVE
         // U+010D: "č" LATIN SMALL LETTER C WITH CARON
         /* morekeys_c */ "\u00E7,\u0107,\u0109,\u010B,\u010D",
-        /* keylabel_to_alpha */ null,
         /* double_quotes */ null,
         // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
         // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
@@ -3732,6 +3769,7 @@ public final class KeyboardTextsTable {
         // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
         // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
         /* morekeys_z */ "\u017A,\u017C,\u017E",
+        /* keyspec_currency */ null,
         // U+00FE: "þ" LATIN SMALL LETTER THORN
         // U+0163: "Å£" LATIN SMALL LETTER T WITH CEDILLA
         // U+0165: "Å¥" LATIN SMALL LETTER T WITH CARON
@@ -3743,7 +3781,6 @@ public final class KeyboardTextsTable {
         // U+0140: "Å€" LATIN SMALL LETTER L WITH MIDDLE DOT
         // U+0142: "Å‚" LATIN SMALL LETTER L WITH STROKE
         /* morekeys_l */ "\u013A,\u013C,\u013E,\u0140,\u0142",
-        /* keyspec_currency */ null,
         // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
         // U+011F: "ÄŸ" LATIN SMALL LETTER G WITH BREVE
         // U+0121: "Ä¡" LATIN SMALL LETTER G WITH DOT ABOVE
@@ -3784,11 +3821,12 @@ public final class KeyboardTextsTable {
         "az_AZ"  , TEXTS_az_AZ, /*   8/ 18 Azerbaijani (Azerbaijan) */
         "be_BY"  , TEXTS_be_BY, /*   9/ 32 Belarusian (Belarus) */
         "bg"     , TEXTS_bg,    /*   2/  8 Bulgarian */
+        "bn"     , TEXTS_bn,    /*   2/ 15 Bengali */
         "ca"     , TEXTS_ca,    /*  11/ 95 Catalan */
         "cs"     , TEXTS_cs,    /*  17/ 21 Czech */
         "da"     , TEXTS_da,    /*  19/ 54 Danish */
         "de"     , TEXTS_de,    /*  16/ 62 German */
-        "el"     , TEXTS_el,    /*   1/  7 Greek */
+        "el"     , TEXTS_el,    /*   1/  6 Greek */
         "en"     , TEXTS_en,    /*   8/ 11 English */
         "eo"     , TEXTS_eo,    /*  26/118 Esperanto */
         "es"     , TEXTS_es,    /*   8/ 55 Spanish */
@@ -3802,39 +3840,39 @@ public final class KeyboardTextsTable {
         "hr"     , TEXTS_hr,    /*   9/ 20 Croatian */
         "hu"     , TEXTS_hu,    /*   9/ 20 Hungarian */
         "hy_AM"  , TEXTS_hy_AM, /*   8/126 Armenian (Armenia) */
-        "is"     , TEXTS_is,    /*  10/ 15 Icelandic */
+        "is"     , TEXTS_is,    /*  10/ 16 Icelandic */
         "it"     , TEXTS_it,    /*  11/ 62 Italian */
         "iw"     , TEXTS_iw,    /*  20/123 Hebrew */
         "ka_GE"  , TEXTS_ka_GE, /*   3/ 10 Georgian (Georgia) */
         "kk"     , TEXTS_kk,    /*  15/121 Kazakh */
         "km_KH"  , TEXTS_km_KH, /*   2/122 Khmer (Cambodia) */
         "ky"     , TEXTS_ky,    /*  10/ 88 Kirghiz */
-        "lo_LA"  , TEXTS_lo_LA, /*   2/ 17 Lao (Laos) */
+        "lo_LA"  , TEXTS_lo_LA, /*   2/ 15 Lao (Laos) */
         "lt"     , TEXTS_lt,    /*  18/ 22 Lithuanian */
         "lv"     , TEXTS_lv,    /*  18/ 22 Latvian */
         "mk"     , TEXTS_mk,    /*   9/ 93 Macedonian */
-        "mn_MN"  , TEXTS_mn_MN, /*   2/ 17 Mongolian (Mongolia) */
+        "mn_MN"  , TEXTS_mn_MN, /*   2/ 15 Mongolian (Mongolia) */
         "mr_IN"  , TEXTS_mr_IN, /*  23/ 53 Marathi (India) */
         "my_MM"  , TEXTS_my_MM, /*   8/104 Burmese (Myanmar) */
         "nb"     , TEXTS_nb,    /*  11/ 54 Norwegian Bokmål */
         "ne_NP"  , TEXTS_ne_NP, /*  23/ 53 Nepali (Nepal) */
         "nl"     , TEXTS_nl,    /*   9/ 12 Dutch */
-        "pl"     , TEXTS_pl,    /*  10/ 16 Polish */
-        "pt"     , TEXTS_pt,    /*   6/  6 Portuguese */
+        "pl"     , TEXTS_pl,    /*  10/ 17 Polish */
+        "pt"     , TEXTS_pt,    /*   6/  7 Portuguese */
         "rm"     , TEXTS_rm,    /*   1/  2 Raeto-Romance */
-        "ro"     , TEXTS_ro,    /*   6/ 15 Romanian */
+        "ro"     , TEXTS_ro,    /*   6/ 16 Romanian */
         "ru"     , TEXTS_ru,    /*   9/ 32 Russian */
-        "si_LK"  , TEXTS_si_LK, /*   1/  7 Sinhalese (Sri Lanka) */
+        "si_LK"  , TEXTS_si_LK, /*   1/  6 Sinhalese (Sri Lanka) */
         "sk"     , TEXTS_sk,    /*  20/ 22 Slovak */
         "sl"     , TEXTS_sl,    /*   8/ 20 Slovenian */
         "sr"     , TEXTS_sr,    /*  11/ 93 Serbian */
         "sv"     , TEXTS_sv,    /*  21/ 54 Swedish */
         "sw"     , TEXTS_sw,    /*   9/ 18 Swahili */
-        "th"     , TEXTS_th,    /*   2/ 17 Thai */
+        "th"     , TEXTS_th,    /*   2/ 15 Thai */
         "tl"     , TEXTS_tl,    /*   7/  9 Tagalog */
         "tr"     , TEXTS_tr,    /*   7/ 18 Turkish */
         "uk"     , TEXTS_uk,    /*  11/ 87 Ukrainian */
-        "vi"     , TEXTS_vi,    /*   8/ 17 Vietnamese */
+        "vi"     , TEXTS_vi,    /*   8/ 15 Vietnamese */
         "zu"     , TEXTS_zu,    /*   8/ 11 Zulu */
         "zz"     , TEXTS_zz,    /*  19/112 Alphabet */
     };
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
index 59fe611101ad056083c6616fe92a5b29be391fef..6ee6adbbae495dd4f4f020c5df42a059bc2701e2 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
@@ -25,7 +25,7 @@ import java.util.ArrayList;
 
 @SmallTest
 public class KeyboardLayoutSetSubtypesCountTests extends KeyboardLayoutSetTestsBase {
-    private static final int NUMBER_OF_SUBTYPES = 72;
+    private static final int NUMBER_OF_SUBTYPES = 73;
     private static final int NUMBER_OF_ASCII_CAPABLE_SUBTYPES = 45;
     private static final int NUMBER_OF_PREDEFINED_ADDITIONAL_SUBTYPES = 2;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Bengali.java b/tests/src/com/android/inputmethod/keyboard/layout/Bengali.java
new file mode 100644
index 0000000000000000000000000000000000000000..79c7d08cc58855b9cf2df477b6c8bb3ee737692a
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Bengali.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+/**
+ * The Bengali keyboard.
+ */
+public final class Bengali extends LayoutBase {
+    private static final String LAYOUT_NAME = "bengali";
+
+    public Bengali(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    public static class BengaliCustomizer extends LayoutCustomizer {
+        public BengaliCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey getAlphabetKey() { return BENGALI_ALPHABET_KEY; }
+
+        @Override
+        public ExpectedKey[] getOtherCurrencyKeys() {
+            return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
+        }
+
+        @Override
+        public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) { return EMPTY_KEYS; }
+
+        @Override
+        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+            return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
+        }
+
+        // U+0995: "क" BENGALI LETTER KA
+        // U+0996: "ख" BENGALI LETTER KHA
+        // U+0997: "ग" BENGALI LETTER GA
+        private static final ExpectedKey BENGALI_ALPHABET_KEY = key(
+                "\u0995\u0996\u0997", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(boolean isPhone) { return ALPHABET_COMMON; }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetShiftLayout(boolean isPhone, final int elementId) {
+        return null;
+    }
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    // U+0994: "ঔ" BENGALI LETTER AU
+                    // U+09E7: "à§§" BENGALI DIGIT ONE
+                    key("\u0994", joinMoreKeys("\u09E7", "1")),
+                    // U+0990: "ঐ" BENGALI LETTER AI
+                    // U+09E8: "২" BENGALI DIGIT TWO
+                    key("\u0990", joinMoreKeys("\u09E8", "2")),
+                    // U+0986: "আ" BENGALI LETTER AA
+                    // U+09E9: "à§©" BENGALI DIGIT THREE
+                    key("\u0986", joinMoreKeys("\u09E9", "3")),
+                    // U+0988: "ঈ" BENGALI LETTER II
+                    // U+09EA: "৪" BENGALI DIGIT FOUR
+                    key("\u0988", joinMoreKeys("\u09EA", "4")),
+                    // U+098A: "ঊ" BENGALI LETTER UU
+                    // U+09EB: "à§«" BENGALI DIGIT FIVE
+                    key("\u098A", joinMoreKeys("\u09EB", "5")),
+                    // U+09AC: "ব" BENGALI LETTER BA
+                    // U+09AD: "ভ" BENGALI LETTER BHA
+                    // U+09EC: "৬" BENGALI DIGIT SIX
+                    key("\u09AC", joinMoreKeys("\u09AD", "\u09EC", "6")),
+                    // U+09B9: "হ" BENGALI LETTER HA
+                    // U+09ED: "à§­" BENGALI DIGIT SEVEN
+                    key("\u09B9", joinMoreKeys("\u09ED", "7")),
+                    // U+0997: "গ" BENGALI LETTER GA
+                    // U+0998: "ঘ" BENGALI LETTER GHA
+                    // U+09EE: "à§®" BENGALI DIGIT EIGHT
+                    key("\u0997", joinMoreKeys("\u0998", "\u09EE", "8")),
+                    // U+09A6: "দ" BENGALI LETTER DA
+                    // U+09A7: "ধ" BENGALI LETTER DHA
+                    // U+09EF: "৯" BENGALI DIGIT NINE
+                    key("\u09A6", joinMoreKeys("\u09A7", "\u09EF", "9")),
+                    // U+099C: "জ" BENGALI LETTER JA
+                    // U+099D: "ঝ" BENGALI LETTER JHA
+                    // U+099C/U+09CD/U+099E:
+                    //     "জ্ঞ" BENGALI LETTER JA/BENGALI SIGN VIRAMA/BENGALI LETTER NYA
+                    // U+09E6: "০" BENGALI DIGIT ZERO
+                    key("\u099C", joinMoreKeys("\u099D", "\u099C\u09CD\u099E", "\u09E6", "0")),
+                    // U+09A1: "ড" BENGALI LETTER DDA
+                    // U+09A1/U+09BC: "ড়" BENGALI LETTER DDA/BENGALI SIGN NUKTA
+                    key("\u09A1", moreKey("\u09A1\u09BC")))
+            .setKeysOfRow(2,
+                    // U+0993: "ও" BENGALI LETTER O
+                    // U+09CB: "à§‹" BENGALI VOWEL SIGN O
+                    key("\u0993", moreKey("\u09CB")),
+                    // U+098F: "এ" BENGALI LETTER E
+                    // U+09C7: "ে" BENGALI VOWEL SIGN E
+                    key("\u098F", moreKey("\u09C7")),
+                    // U+0985: "অ" BENGALI LETTER A
+                    // U+09CD: "্" BENGALI SIGN VIRAMA
+                    key("\u0985", moreKey("\u09CD")),
+                    // U+0987: "ই" BENGALI LETTER I
+                    // U+09BF: "ি" BENGALI VOWEL SIGN I
+                    key("\u0987", moreKey("\u09BF")),
+                    // U+0989: "উ" BENGALI LETTER U
+                    // U+09C1: "ু" BENGALI VOWEL SIGN U
+                    key("\u0989", moreKey("\u09C1")),
+                    // U+09AA: "প" BENGALI LETTER PA
+                    // U+09AB: "ফ" BENGALI LETTER PHA
+                    key("\u09AA", moreKey("\u09AB")),
+                    // U+09B0: "র" BENGALI LETTER RA
+                    // U+09C3: "ৃ" BENGALI VOWEL SIGN VOCALIC R
+                    // U+098B: "ঋ" BENGALI LETTER VOCALIC R
+                    // U+09A4/U+09CD/U+09B0:
+                    //     "ত্র" BENGALI LETTER TA/BENGALI SIGN VIRAMA/BENGALI LETTER RA
+                    key("\u09B0", joinMoreKeys("\u09C3", "\u098B", "\u09A4\u09CD\u09B0")),
+                    // U+0995: "ক" BENGALI LETTER KA
+                    // U+0996: "খ" BENGALI LETTER KHA
+                    key("\u0995", moreKey("\u0996")),
+                    // U+09A4: "ত" BENGALI LETTER TA
+                    // U+09CE: "à§Ž" BENGALI LETTER KHANDA TA
+                    // U+09A5: "থ" BENGALI LETTER THA
+                    // U+09A4/U+09CD/U+09A4:
+                    //     "ত্ত" BENGALI LETTER TA/BENGALI SIGN VIRAMA/BENGALI LETTER TA
+                    key("\u09A4", joinMoreKeys("\u09CE", "\u09A5", "\u09A4\u09CD\u09A4")),
+                    // U+099A: "চ" BENGALI LETTER CA
+                    // U+099B: "ছ" BENGALI LETTER CHA
+                    key("\u099A", moreKey("\u099B")),
+                    // U+099F: "ট" BENGALI LETTER TTA
+                    // U+09A0: "ঠ" BENGALI LETTER TTHA
+                    key("\u099F", moreKey("\u09A0")))
+            .setKeysOfRow(3,
+                    // U+0981: "ঁ" BENGALI SIGN CANDRABINDU
+                    // U+0983: "ঃ" BENGALI SIGN VISARGA
+                    // U+0982: "ং" BENGALI SIGN ANUSVARA
+                    key("\u0981", joinMoreKeys("\u0983", "\u0982")),
+                    // U+09A2: "ঢ" BENGALI LETTER DDHA
+                    // U+09A2/U+09BC: "ঢ়" BENGALI LETTER DDHA/BENGALI SIGN NUKTA
+                    key("\u09A2", moreKey("\u09A2\u09BC")),
+                    // U+09AE: "ম" BENGALI LETTER MA
+                    "\u09AE",
+                    // U+09A8: "ন" BENGALI LETTER NA
+                    // U+09A3: "ণ" BENGALI LETTER NNA
+                    key("\u09A8", moreKey("\u09A3")),
+                    // U+099E: "ঞ" BENGALI LETTER NYA
+                    // U+0999: "ঙ" BENGALI LETTER NGA
+                    // U+099E/U+09CD/U+099C:
+                    //     "ঞ্জ" BENGALI LETTER NYA/BENGALI SIGN VIRAMA/BENGALI LETTER JA
+                    key("\u099E", joinMoreKeys("\u0999", "\u099E\u09CD\u099C")),
+                    // U+09B2: "ল" BENGALI LETTER LA
+                    "\u09B2",
+                    // U+09B7: "ষ" BENGALI LETTER SSA
+                    // U+0995/U+09CD/U+09B7:
+                    //     "ক্ষ" BENGALI LETTER KA/BENGALI SIGN VIRAMA/BENGALI LETTER SSA
+                    key("\u09B7", moreKey("\u0995\u09CD\u09B7")),
+                    // U+09B8: "স" BENGALI LETTER SA
+                    // U+09B6: "শ" BENGALI LETTER SHA
+                    key("\u09B8", moreKey("\u09B6")),
+                    // U+09DF: "à§Ÿ" BENGALI LETTER YYA
+                    // U+09AF: "য" BENGALI LETTER YA
+                    key("\u09DF", moreKey("\u09AF")),
+                    // U+0964: "।" DEVANAGARI DANDA
+                    // U+0965: "॥" DEVANAGARI DOUBLE DANDA
+                    key("\u0964", moreKey("\u0965")))
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliIN.java
new file mode 100644
index 0000000000000000000000000000000000000000..d642632077dd4d0985f213783d03bc2400857c6e
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliIN.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout.tests;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.keyboard.layout.Bengali;
+import com.android.inputmethod.keyboard.layout.Bengali.BengaliCustomizer;
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+
+import java.util.Locale;
+
+/**
+ * bn_IN: Bengali (India)/bengali
+ */
+@SmallTest
+public final class TestsBengaliIN extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("bn", "IN");
+    private static final LayoutBase LAYOUT = new Bengali(new BengaliINCustomzier(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class BengaliINCustomzier extends BengaliCustomizer {
+        public BengaliINCustomzier(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
+
+        // U+20B9: "₹" INDIAN RUPEE SIGN
+        private static final ExpectedKey CURRENCY_RUPEE = key("\u20B9",
+                Symbols.CURRENCY_GENERIC_MORE_KEYS);
+    }
+}
diff --git a/tools/make-keyboard-text/res/values-bn/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-bn/donottranslate-more-keys.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4955cd46a9d490338a8106bee4ad83629f13728a
--- /dev/null
+++ b/tools/make-keyboard-text/res/values-bn/donottranslate-more-keys.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Label for "switch to alphabetic" key.
+         U+0995: "क" BENGALI LETTER KA
+         U+0996: "ख" BENGALI LETTER KHA
+         U+0997: "ग" BENGALI LETTER GA -->
+    <string name="keylabel_to_alpha">&#x0995;&#x0996;&#x0997;</string>
+    <!-- U+09F3: "à§³" BENGALI RUPEE SIGN -->
+    <string name="keyspec_currency">&#x09F3;</string>
+</resources>