Merge "Add authentication/http request related code to LatinIme"
diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index 74988f9..959fe83 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -31,11 +31,13 @@
         <item>en_GB</item>
         <item>es_US</item>
         <item>hi_ZZ</item>
+        <item>sr_ZZ</item>
     </string-array>
 
     <!-- Subtype locale whose name should be displayed in Locale.ROOT. -->
     <string-array name="subtype_locale_displayed_in_root_locale">
         <item>hi_ZZ</item>
+        <item>sr_ZZ</item>
     </string-array>
 
     <!-- Generic subtype label -->
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index d64444e..76da5ce 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -207,6 +207,10 @@
     <string name="subtype_es_US">Spanish (US)</string>
     <!-- Description for Hinglish (https://en.wikipedia.org/wiki/Hinglish) keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_hi_ZZ">Hinglish</string>
+    <!-- Description for Serbian (Latin) keyboard subtype [CHAR LIMIT=25]
+         (Latin) can be an abbreviation to fit in the CHAR LIMIT.
+         Note for Serbian translator: this should be translated with Latin script and (Latin) should be omitted. -->
+    <string name="subtype_sr_ZZ">Serbian (Latin)</string>
     <!-- Description for English (UK) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
          (UK) should be an abbreviation of United Kingdom to fit in the CHAR LIMIT.
          This should be identical to subtype_en_GB aside from the trailing (%s). -->
@@ -222,6 +226,10 @@
     <!-- Description for Hinglish (https://en.wikipedia.org/wiki/Hinglish) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
          This should be identical to subtype_hi_ZZ aside from the trailing (%s). -->
     <string name="subtype_with_layout_hi_ZZ">Hinglish (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
+    <!-- Description for Serbian (Latin) keyboard subtype with explicit keyboard layout [CHAR LIMIT=25]
+         This should be identical to subtype_sr_ZZ aside from the trailing (%s).
+         Note for Serbian translator: this should be translated with Latin script. -->
+    <string name="subtype_with_layout_sr_ZZ">Serbian (<xliff:g id="KEYBOARD_LAYOUT" example="QWERTY">%s</xliff:g>)</string>
     <!-- Description for "LANGUAGE_NAME" (Traditional) keyboard subtype [CHAR LIMIT=25]
          (Traditional) can be an abbreviation to fit in the CHAR LIMIT. -->
     <string name="subtype_generic_traditional"><xliff:g id="LANGUAGE_NAME" example="Nepali">%s</xliff:g> (Traditional)</string>
@@ -229,12 +237,6 @@
          (Compact) can be an abbreviation to fit in the CHAR LIMIT.
          TODO: Remove translatable=false once we are settled down with the naming. -->
     <string name="subtype_generic_compact" translatable="false"><xliff:g id="LANGUAGE_NAME" example="Hindi">%s</xliff:g> (Compact)</string>
-    <!-- Description for "LANGUAGE_NAME" (Cyrillic) keyboard subtype [CHAR LIMIT=25]
-         (Cyrillic) can be an abbreviation to fit in the CHAR LIMIT. -->
-    <string name="subtype_generic_cyrillic"><xliff:g id="LANGUAGE_NAME" example="Serbian">%s</xliff:g> (Cyrillic)</string>
-    <!-- Description for "LANGUAGE_NAME" (Latin) keyboard subtype [CHAR LIMIT=25]
-         (Latin) can be an abbreviation to fit in the CHAR LIMIT. -->
-    <string name="subtype_generic_latin"><xliff:g id="LANGUAGE_NAME" example="Serbian">%s</xliff:g> (Latin)</string>
     <!-- This string is displayed in a language list that allows to choose a language for
 suggestions in a software keyboard. This setting won't give suggestions in any particular
 language, hence "No language".
diff --git a/java/res/xml-sw600dp/rows_serbian_qwertz.xml b/java/res/xml-sw600dp/rows_serbian_qwertz.xml
new file mode 100644
index 0000000..a3fb625
--- /dev/null
+++ b/java/res/xml-sw600dp/rows_serbian_qwertz.xml
@@ -0,0 +1,43 @@
+<?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_serbian_qwertz1" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="fillRight" />
+    </Row>
+    <Row latin:keyWidth="8.182%p" >
+        <include latin:keyboardLayout="@xml/rowkeys_serbian_qwertz2" />
+        <Key
+            latin:keyStyle="enterKeyStyle"
+            latin:keyWidth="fillRight" />
+    </Row>
+    <Row latin:keyWidth="8.182%p" >
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="10.0%p" />
+        <include latin:keyboardLayout="@xml/rowkeys_serbian_qwertz3" />
+        <include latin:keyboardLayout="@xml/keys_exclamation_question" />
+    </Row>
+    <include latin:keyboardLayout="@xml/row_qwerty4" />
+</merge>
diff --git a/java/res/xml/kbd_serbian_qwertz.xml b/java/res/xml/kbd_serbian_qwertz.xml
new file mode 100644
index 0000000..4f763b8
--- /dev/null
+++ b/java/res/xml/kbd_serbian_qwertz.xml
@@ -0,0 +1,23 @@
+<?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_serbian_qwertz" />
+</Keyboard>
\ No newline at end of file
diff --git a/java/res/xml/keyboard_layout_set_nordic.xml b/java/res/xml/keyboard_layout_set_nordic.xml
index d07f78a..eb3d45b 100644
--- a/java/res/xml/keyboard_layout_set_nordic.xml
+++ b/java/res/xml/keyboard_layout_set_nordic.xml
@@ -24,7 +24,7 @@
         latin:elementName="alphabet"
         latin:elementKeyboard="@xml/kbd_nordic"
         latin:enableProximityCharsCorrection="true"
-        latin:allowRedundantMoreKeys="true" />
+        latin:allowRedundantMoreKeys="false" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml/keyboard_layout_set_serbian_qwertz.xml b/java/res/xml/keyboard_layout_set_serbian_qwertz.xml
new file mode 100644
index 0000000..2c7e28b
--- /dev/null
+++ b/java/res/xml/keyboard_layout_set_serbian_qwertz.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:allowRedundantMoreKeys="false"
+        latin:elementKeyboard="@xml/kbd_serbian_qwertz"
+        latin:elementName="alphabet"
+        latin:enableProximityCharsCorrection="true" />
+    <Element
+        latin:elementKeyboard="@xml/kbd_symbols"
+        latin:elementName="symbols" />
+    <Element
+        latin:elementKeyboard="@xml/kbd_symbols_shift"
+        latin:elementName="symbolsShifted" />
+    <Element
+        latin:elementKeyboard="@xml/kbd_phone"
+        latin:elementName="phone" />
+    <Element
+        latin:elementKeyboard="@xml/kbd_phone_symbols"
+        latin:elementName="phoneSymbols" />
+    <Element
+        latin:elementKeyboard="@xml/kbd_number"
+        latin:elementName="number" />
+</KeyboardLayoutSet>
\ No newline at end of file
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index 74ac79f..270f90c 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -89,7 +89,7 @@
     sk: Slovak/qwerty
     sl: Slovenian/qwerty
     sr: Serbian/south_slavic
-    (sr-Latn: Serbian/qwerty) # not yet implemented.
+    (sr_ZZ: Serbian (Latin)/serbian_qwertz) # This is a preliminary keyboard layout.
     sv: Swedish/nordic
     sw: Swahili/qwerty
     ta_IN: Tamil (India)/tamil
@@ -661,24 +661,14 @@
             android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable"
             android:isAsciiCapable="false"
     />
-    <!-- TODO: Uncomment once we can handle IETF language tag with script name specified.
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
-            android:label="@string/subtype_serbian_cyrillic"
-            android:subtypeId="0xXXXXXXXX"
-            android:imeSubtypeLocale="sr"
+            android:label="@string/subtype_sr_ZZ"
+            android:subtypeId="0xf4a5569c"
+            android:imeSubtypeLocale="sr_ZZ"
             android:imeSubtypeMode="keyboard"
-            android:imeSubtypeExtraValue="SupportTouchPositionCorrection,EmojiCapable"
-            android:isAsciiCapable="false"
-    />
-    <subtype android:icon="@drawable/ic_ime_switcher_dark"
-            android:label="@string/subtype_serbian_latin"
-            android:subtypeId="0xXXXXXXXX"
-            android:imeSubtypeLocale="sr-Latn"
-            android:imeSubtypeMode="keyboard"
-            android:imeSubtypeExtraValue="KeyboardLayoutSet=qwerty,AsciiCapable,EmojiCapable"
+            android:imeSubtypeExtraValue="KeyboardLayoutSet=serbian_qwertz,AsciiCapable,EmojiCapable"
             android:isAsciiCapable="true"
     />
-    -->
     <subtype android:icon="@drawable/ic_ime_switcher_dark"
             android:label="@string/subtype_generic"
             android:subtypeId="0x48b4ff43"
diff --git a/java/res/xml/rowkeys_serbian_qwertz1.xml b/java/res/xml/rowkeys_serbian_qwertz1.xml
new file mode 100644
index 0000000..1615701
--- /dev/null
+++ b/java/res/xml/rowkeys_serbian_qwertz1.xml
@@ -0,0 +1,25 @@
+<?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/rowkeys_qwertz1" />
+    <!-- U+0161: "š" LATIN SMALL LETTER S WITH CARON -->
+    <Key latin:keySpec="&#x0161;" />
+</merge>
\ No newline at end of file
diff --git a/java/res/xml/rowkeys_serbian_qwertz2.xml b/java/res/xml/rowkeys_serbian_qwertz2.xml
new file mode 100644
index 0000000..83ec92d
--- /dev/null
+++ b/java/res/xml/rowkeys_serbian_qwertz2.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" >
+    <include latin:keyboardLayout="@xml/rowkeys_qwerty2" />
+    <!-- U+010D: "č" LATIN SMALL LETTER C WITH CARON -->
+    <Key latin:keySpec="&#x010D;" />
+    <!-- U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE -->
+    <Key latin:keySpec="&#x0107;" />
+</merge>
diff --git a/java/res/xml/rowkeys_serbian_qwertz3.xml b/java/res/xml/rowkeys_serbian_qwertz3.xml
new file mode 100644
index 0000000..30ba7af
--- /dev/null
+++ b/java/res/xml/rowkeys_serbian_qwertz3.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" >
+    <include latin:keyboardLayout="@xml/rowkeys_qwertz3" />
+    <!-- U+0111: "đ" LATIN SMALL LETTER D WITH STROKE -->
+    <Key latin:keySpec="&#x0111;" />
+    <!-- U+017E: "ž" LATIN SMALL LETTER Z WITH CARON -->
+    <Key latin:keySpec="&#x017E;" />
+</merge>
diff --git a/java/res/xml/rows_serbian_qwertz.xml b/java/res/xml/rows_serbian_qwertz.xml
new file mode 100644
index 0000000..4be2abf
--- /dev/null
+++ b/java/res/xml/rows_serbian_qwertz.xml
@@ -0,0 +1,39 @@
+<?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_serbian_qwertz1" />
+    </Row>
+    <Row latin:keyWidth="9.091%p" >
+        <include latin:keyboardLayout="@xml/rowkeys_serbian_qwertz2" />
+    </Row>
+    <Row latin:keyWidth="8.711%p" >
+        <Key
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="10.8%p" />
+        <include latin:keyboardLayout="@xml/rowkeys_serbian_qwertz3" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyWidth="fillRight" />
+    </Row>
+    <include latin:keyboardLayout="@xml/row_qwerty4" />
+</merge>
\ No newline at end of file
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
index 1920113..a778ee8 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -85,19 +85,19 @@
     //  /* index:histogram */ "name",
         /*   0:32 */ "morekeys_a",
         /*   1:32 */ "morekeys_o",
-        /*   2:30 */ "morekeys_e",
+        /*   2:31 */ "morekeys_e",
         /*   3:30 */ "morekeys_u",
         /*   4:30 */ "keylabel_to_alpha",
-        /*   5:28 */ "morekeys_i",
+        /*   5:29 */ "morekeys_i",
         /*   6:24 */ "morekeys_n",
-        /*   7:23 */ "morekeys_c",
+        /*   7:24 */ "morekeys_c",
         /*   8:23 */ "double_quotes",
         /*   9:22 */ "single_quotes",
-        /*  10:20 */ "morekeys_s",
+        /*  10:21 */ "morekeys_s",
         /*  11:18 */ "keyspec_currency",
         /*  12:16 */ "morekeys_y",
-        /*  13:14 */ "morekeys_z",
-        /*  14:13 */ "morekeys_d",
+        /*  13:15 */ "morekeys_z",
+        /*  14:14 */ "morekeys_d",
         /*  15:10 */ "morekeys_t",
         /*  16:10 */ "morekeys_l",
         /*  17: 9 */ "morekeys_g",
@@ -193,30 +193,30 @@
         /* 107: 2 */ "keyspec_symbols_percent",
         /* 108: 2 */ "morekeys_symbols_semicolon",
         /* 109: 2 */ "morekeys_symbols_percent",
-        /* 110: 1 */ "morekeys_v",
-        /* 111: 1 */ "morekeys_j",
-        /* 112: 1 */ "morekeys_q",
-        /* 113: 1 */ "morekeys_x",
-        /* 114: 1 */ "keyspec_q",
-        /* 115: 1 */ "keyspec_w",
-        /* 116: 1 */ "keyspec_y",
-        /* 117: 1 */ "keyspec_x",
-        /* 118: 1 */ "morekeys_east_slavic_row2_11",
-        /* 119: 1 */ "morekeys_cyrillic_ka",
-        /* 120: 1 */ "morekeys_cyrillic_a",
-        /* 121: 1 */ "morekeys_currency_dollar",
-        /* 122: 1 */ "morekeys_plus",
-        /* 123: 1 */ "morekeys_less_than",
-        /* 124: 1 */ "morekeys_greater_than",
-        /* 125: 1 */ "morekeys_exclamation",
-        /* 126: 1 */ "label_go_key",
-        /* 127: 1 */ "label_send_key",
-        /* 128: 1 */ "label_next_key",
-        /* 129: 1 */ "label_done_key",
-        /* 130: 1 */ "label_search_key",
-        /* 131: 1 */ "label_previous_key",
-        /* 132: 1 */ "label_pause_key",
-        /* 133: 1 */ "label_wait_key",
+        /* 110: 2 */ "label_go_key",
+        /* 111: 2 */ "label_send_key",
+        /* 112: 2 */ "label_next_key",
+        /* 113: 2 */ "label_done_key",
+        /* 114: 2 */ "label_search_key",
+        /* 115: 2 */ "label_previous_key",
+        /* 116: 2 */ "label_pause_key",
+        /* 117: 2 */ "label_wait_key",
+        /* 118: 1 */ "morekeys_v",
+        /* 119: 1 */ "morekeys_j",
+        /* 120: 1 */ "morekeys_q",
+        /* 121: 1 */ "morekeys_x",
+        /* 122: 1 */ "keyspec_q",
+        /* 123: 1 */ "keyspec_w",
+        /* 124: 1 */ "keyspec_y",
+        /* 125: 1 */ "keyspec_x",
+        /* 126: 1 */ "morekeys_east_slavic_row2_11",
+        /* 127: 1 */ "morekeys_cyrillic_ka",
+        /* 128: 1 */ "morekeys_cyrillic_a",
+        /* 129: 1 */ "morekeys_currency_dollar",
+        /* 130: 1 */ "morekeys_plus",
+        /* 131: 1 */ "morekeys_less_than",
+        /* 132: 1 */ "morekeys_greater_than",
+        /* 133: 1 */ "morekeys_exclamation",
         /* 134: 0 */ "morekeys_currency_generic",
         /* 135: 0 */ "morekeys_symbols_1",
         /* 136: 0 */ "morekeys_symbols_2",
@@ -365,6 +365,14 @@
         /* morekeys_symbols_semicolon */ EMPTY,
         // U+2030: "‰" PER MILLE SIGN
         /* morekeys_symbols_percent */ "\u2030",
+        /* label_go_key */ "!string/label_go_key",
+        /* label_send_key */ "!string/label_send_key",
+        /* label_next_key */ "!string/label_next_key",
+        /* label_done_key */ "!string/label_done_key",
+        /* label_search_key */ "!string/label_search_key",
+        /* label_previous_key */ "!string/label_previous_key",
+        /* label_pause_key */ "!string/label_pause_key",
+        /* label_wait_key */ "!string/label_wait_key",
         /* morekeys_v ~ */
         EMPTY, EMPTY, EMPTY, EMPTY,
         /* ~ morekeys_x */
@@ -387,14 +395,6 @@
         /* morekeys_greater_than */ "!fixedColumnOrder!3,!text/keyspec_right_single_angle_quote,!text/keyspec_greater_than_equal,!text/keyspec_right_double_angle_quote",
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
         /* morekeys_exclamation */ "\u00A1",
-        /* label_go_key */ "!string/label_go_key",
-        /* label_send_key */ "!string/label_send_key",
-        /* label_next_key */ "!string/label_next_key",
-        /* label_done_key */ "!string/label_done_key",
-        /* label_search_key */ "!string/label_search_key",
-        /* label_previous_key */ "!string/label_previous_key",
-        /* label_pause_key */ "!string/label_pause_key",
-        /* label_wait_key */ "!string/label_wait_key",
         /* morekeys_currency_generic */ "$,\u00A2,\u20AC,\u00A3,\u00A5,\u20B1",
         // U+00B9: "¹" SUPERSCRIPT ONE
         // U+00BD: "½" VULGAR FRACTION ONE HALF
@@ -952,20 +952,24 @@
 
     /* Locale da: Danish */
     private static final String[] TEXTS_da = {
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
         // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* morekeys_a */ "\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
+        /* morekeys_a */ "\u00E5,\u00E6,\u00E1,\u00E4,\u00E0,\u00E2,\u00E3,\u0101",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* morekeys_o */ "\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
+        /* morekeys_o */ "\u00F8,\u00F6,\u00F3,\u00F4,\u00F2,\u00F5,\u0153,\u014D",
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
         /* morekeys_e */ "\u00E9,\u00EB",
@@ -1281,8 +1285,9 @@
         // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
         /* keyspec_spanish_row2_10 */ "\u0135",
         /* morekeys_bullet ~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        /* ~ morekeys_symbols_percent */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
+        /* ~ label_wait_key */
         // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
         /* morekeys_v */ "w,\u0175",
         /* morekeys_j */ null,
@@ -1649,8 +1654,9 @@
         /* morekeys_symbols_semicolon */ ";",
         // U+2030: "‰" PER MILLE SIGN
         /* morekeys_symbols_percent */ "\\%,\u2030",
-        /* morekeys_v ~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        /* label_go_key ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
         /* ~ morekeys_plus */
         // U+2264: "≤" LESS-THAN OR EQUAL TO
         // U+2265: "≥" GREATER-THAN EQUAL TO
@@ -1664,13 +1670,16 @@
 
     /* Locale fi: Finnish */
     private static final String[] TEXTS_fi = {
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
         // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
         // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* morekeys_a */ "\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
+        /* morekeys_a */ "\u00E4,\u00E5,\u00E6,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
@@ -1678,7 +1687,7 @@
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* morekeys_o */ "\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
+        /* morekeys_o */ "\u00F6,\u00F8,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
         /* morekeys_e */ null,
         // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
         /* morekeys_u */ "\u00FC",
@@ -1908,9 +1917,8 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        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_exclamation */
+        null, null, null, null, null, null, null, null,
+        /* ~ morekeys_symbols_percent */
         /* label_go_key */ "Go",
         /* label_send_key */ "Send",
         /* label_next_key */ "Next",
@@ -2063,7 +2071,7 @@
         /* keyspec_tablet_period */ "\u0589",
         /* keyhintlabel_tablet_period ~ */
         null, null, null, null, null, null, null, null, null, null, null, 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_greater_than */
         // U+055C: "՜" ARMENIAN EXCLAMATION MARK
         // U+00A1: "¡" INVERTED EXCLAMATION MARK
@@ -2244,6 +2252,7 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null,
         /* ~ morekeys_currency_dollar */
         // U+00B1: "±" PLUS-MINUS SIGN
         // U+FB29: "﬩" HEBREW LETTER ALTERNATIVE PLUS SIGN
@@ -2315,7 +2324,8 @@
         /* morekeys_cyrillic_o */ "\u04E9",
         /* morekeys_cyrillic_i ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
         /* ~ keyspec_x */
         // U+04BB: "һ" CYRILLIC SMALL LETTER SHHA
         /* morekeys_east_slavic_row2_11 */ "\u04BB",
@@ -2343,7 +2353,8 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, 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",
@@ -2780,21 +2791,24 @@
 
     /* Locale nb: Norwegian Bokmål */
     private static final String[] TEXTS_nb = {
-        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+        // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
         // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
         // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-        /* morekeys_a */ "\u00E0,\u00E4,\u00E1,\u00E2,\u00E3,\u0101",
+        /* morekeys_a */ "\u00E5,\u00E6,\u00E4,\u00E0,\u00E1,\u00E2,\u00E3,\u0101",
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* morekeys_o */ "\u00F4,\u00F2,\u00F3,\u00F6,\u00F5,\u0153,\u014D",
+        /* morekeys_o */ "\u00F8,\u00F6,\u00F4,\u00F2,\u00F3,\u00F5,\u0153,\u014D",
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -3332,20 +3346,69 @@
         /* keyspec_south_slavic_row3_8 */ "\u0452",
     };
 
+    /* Locale sr_ZZ: Serbian (ZZ) */
+    private static final String[] TEXTS_sr_ZZ = {
+        /* morekeys_a */ null,
+        /* morekeys_o */ null,
+        // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+        /* morekeys_e */ "\u00E8",
+        /* morekeys_u */ null,
+        /* keylabel_to_alpha */ null,
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        /* morekeys_i */ "\u00EC",
+        /* morekeys_n */ null,
+        // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+        // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+        /* morekeys_c */ "\u010D,\u0107,%",
+        /* double_quotes */ null,
+        /* single_quotes */ null,
+        // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+        /* morekeys_s */ "\u0161,%",
+        /* keyspec_currency */ null,
+        /* morekeys_y */ null,
+        // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+        /* morekeys_z */ "\u017E,%",
+        // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+        /* morekeys_d */ "\u0111,%",
+        /* 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, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, 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_symbols_percent */
+        /* label_go_key */ "Idi",
+        /* label_send_key */ "\u0160alji",
+        /* label_next_key */ "Sled",
+        /* label_done_key */ "Gotov",
+        /* label_search_key */ "Tra\u017Ei",
+        /* label_previous_key */ "Preth",
+        /* label_pause_key */ "Pauza",
+        /* label_wait_key */ "\u010Cekaj",
+    };
+
     /* Locale sv: Swedish */
     private static final String[] TEXTS_sv = {
+        // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+        // U+00E5: "å" LATIN SMALL LETTER A WITH RING
+        // U+00E6: "æ" LATIN SMALL LETTER AE
         // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
         // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
         // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
         // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
         // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-        /* morekeys_a */ "\u00E1,\u00E0,\u00E2,\u0105,\u00E3",
+        /* morekeys_a */ "\u00E4,\u00E5,\u00E6,\u00E1,\u00E0,\u00E2,\u0105,\u00E3",
+        // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+        // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+        // U+0153: "œ" LATIN SMALL LIGATURE OE
         // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
         // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
         // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
         // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
         // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-        /* morekeys_o */ "\u00F3,\u00F2,\u00F4,\u00F5,\u014D",
+        /* morekeys_o */ "\u00F6,\u00F8,\u0153,\u00F3,\u00F2,\u00F4,\u00F5,\u014D",
         // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
         // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
         // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -3978,7 +4041,8 @@
         /* morekeys_w */ "\u0175",
         /* morekeys_east_slavic_row2_2 ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, 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_v */
         // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
         /* morekeys_j */ "\u0135",
@@ -3999,25 +4063,25 @@
         "de"     , TEXTS_de,    /*  16/ 62 German */
         "el"     , TEXTS_el,    /*   1/  5 Greek */
         "en"     , TEXTS_en,    /*   8/ 11 English */
-        "eo"     , TEXTS_eo,    /*  26/118 Esperanto */
+        "eo"     , TEXTS_eo,    /*  26/126 Esperanto */
         "es"     , TEXTS_es,    /*   8/ 55 Spanish */
         "et_EE"  , TEXTS_et_EE, /*  22/ 27 Estonian (Estonia) */
         "eu_ES"  , TEXTS_eu_ES, /*   7/  8 Basque (Spain) */
-        "fa"     , TEXTS_fa,    /*  58/125 Persian */
+        "fa"     , TEXTS_fa,    /*  58/133 Persian */
         "fi"     , TEXTS_fi,    /*  10/ 54 Finnish */
         "fr"     , TEXTS_fr,    /*  13/ 62 French */
         "gl_ES"  , TEXTS_gl_ES, /*   7/  8 Gallegan (Spain) */
         "hi"     , TEXTS_hi,    /*  23/ 53 Hindi */
-        "hi_ZZ"  , TEXTS_hi_ZZ, /*   9/134 Hindi (ZZ) */
+        "hi_ZZ"  , TEXTS_hi_ZZ, /*   9/118 Hindi (ZZ) */
         "hr"     , TEXTS_hr,    /*   9/ 20 Croatian */
         "hu"     , TEXTS_hu,    /*   9/ 20 Hungarian */
-        "hy_AM"  , TEXTS_hy_AM, /*   9/126 Armenian (Armenia) */
+        "hy_AM"  , TEXTS_hy_AM, /*   9/134 Armenian (Armenia) */
         "is"     , TEXTS_is,    /*  10/ 16 Icelandic */
         "it"     , TEXTS_it,    /*  11/ 62 Italian */
-        "iw"     , TEXTS_iw,    /*  20/123 Hebrew */
+        "iw"     , TEXTS_iw,    /*  20/131 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) */
+        "kk"     , TEXTS_kk,    /*  15/129 Kazakh */
+        "km_KH"  , TEXTS_km_KH, /*   2/130 Khmer (Cambodia) */
         "kn_IN"  , TEXTS_kn_IN, /*   2/ 12 Kannada (India) */
         "ky"     , TEXTS_ky,    /*  10/ 89 Kirghiz */
         "lo_LA"  , TEXTS_lo_LA, /*   2/ 12 Lao (Laos) */
@@ -4040,6 +4104,7 @@
         "sk"     , TEXTS_sk,    /*  20/ 22 Slovak */
         "sl"     , TEXTS_sl,    /*   8/ 20 Slovenian */
         "sr"     , TEXTS_sr,    /*  11/ 94 Serbian */
+        "sr_ZZ"  , TEXTS_sr_ZZ, /*  14/118 Serbian (ZZ) */
         "sv"     , TEXTS_sv,    /*  21/ 54 Swedish */
         "sw"     , TEXTS_sw,    /*   9/ 18 Swahili */
         "ta_IN"  , TEXTS_ta_IN, /*   2/ 12 Tamil (India) */
@@ -4052,7 +4117,7 @@
         "uk"     , TEXTS_uk,    /*  11/ 88 Ukrainian */
         "vi"     , TEXTS_vi,    /*   8/ 15 Vietnamese */
         "zu"     , TEXTS_zu,    /*   8/ 11 Zulu */
-        "zz"     , TEXTS_zz,    /*  19/112 Alphabet */
+        "zz"     , TEXTS_zz,    /*  19/120 Alphabet */
     };
 
     static {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
index 764159c..0cd031e 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java
@@ -149,8 +149,13 @@
             }
         }
         final int size = filteredMoreKeys.size();
-        return (moreKeys.length == size) ? moreKeys
-                : filteredMoreKeys.toArray(new MoreKeySpec[size]);
+        if (size == moreKeys.length) {
+            return moreKeys;
+        }
+        if (size == 0) {
+            return null;
+        }
+        return filteredMoreKeys.toArray(new MoreKeySpec[size]);
     }
 
     private static final boolean DEBUG = DebugFlags.DEBUG_ENABLED;
diff --git a/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java
index 9bc3986..2174f52 100644
--- a/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/settings/CustomInputStyleSettingsFragment.java
@@ -32,6 +32,7 @@
 import android.preference.PreferenceGroup;
 import android.support.v4.view.ViewCompat;
 import android.text.TextUtils;
+import android.util.Log;
 import android.util.Pair;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -59,6 +60,12 @@
 import java.util.TreeSet;
 
 public final class CustomInputStyleSettingsFragment extends PreferenceFragment {
+    private static final String TAG = CustomInputStyleSettingsFragment.class.getSimpleName();
+    private static final boolean DEBUG_SUBTYPE_ID = false;
+    // Note: We would like to turn this debug flag true in order to see what input styles are
+    // defined in a bug-report.
+    private static final boolean DEBUG_CUSTOM_INPUT_STYLES = true;
+
     private RichInputMethodManager mRichImm;
     private SharedPreferences mPrefs;
     private SubtypeLocaleAdapter mSubtypeLocaleAdapter;
@@ -96,8 +103,7 @@
     }
 
     static final class SubtypeLocaleAdapter extends ArrayAdapter<SubtypeLocaleItem> {
-        private static final String TAG = SubtypeLocaleAdapter.class.getSimpleName();
-        private static final boolean DEBUG_SUBTYPE_ID = false;
+        private static final String TAG_SUBTYPE = SubtypeLocaleAdapter.class.getSimpleName();
 
         public SubtypeLocaleAdapter(final Context context) {
             super(context, android.R.layout.simple_spinner_item);
@@ -110,7 +116,7 @@
             for (int i = 0; i < count; i++) {
                 final InputMethodSubtype subtype = imi.getSubtypeAt(i);
                 if (DEBUG_SUBTYPE_ID) {
-                    android.util.Log.d(TAG, String.format("%-6s 0x%08x %11d %s",
+                    Log.d(TAG_SUBTYPE, String.format("%-6s 0x%08x %11d %s",
                             subtype.getLocale(), subtype.hashCode(), subtype.hashCode(),
                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype)));
                 }
@@ -445,6 +451,9 @@
 
         final String prefSubtypes =
                 Settings.readPrefAdditionalSubtypes(mPrefs, getResources());
+        if (DEBUG_CUSTOM_INPUT_STYLES) {
+            Log.i(TAG, "Load custom input styles: " + prefSubtypes);
+        }
         setPrefSubtypes(prefSubtypes, context);
 
         mIsAddingNewSubtype = (savedInstanceState != null)
@@ -611,6 +620,9 @@
         final String oldSubtypes = Settings.readPrefAdditionalSubtypes(mPrefs, getResources());
         final InputMethodSubtype[] subtypes = getSubtypes();
         final String prefSubtypes = AdditionalSubtypeUtils.createPrefSubtypes(subtypes);
+        if (DEBUG_CUSTOM_INPUT_STYLES) {
+            Log.i(TAG, "Save custom input styles: " + prefSubtypes);
+        }
         if (prefSubtypes.equals(oldSubtypes)) {
             return;
         }
diff --git a/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java
index ea406fa..142548b 100644
--- a/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java
@@ -53,7 +53,8 @@
         // This utility class is not publicly instantiable.
     }
 
-    private static boolean isInSystemSetupWizard(final Context context) {
+    @UsedForTesting
+    static boolean isInSystemSetupWizard(final Context context) {
         try {
             final int userSetupComplete = Settings.Secure.getInt(
                     context.getContentResolver(), Settings_Secure_USER_SETUP_COMPLETE);
@@ -84,7 +85,8 @@
         return getLastImportantNoticeVersion(context) + 1;
     }
 
-    private static boolean hasNewImportantNotice(final Context context) {
+    @UsedForTesting
+    static boolean hasNewImportantNotice(final Context context) {
         final int lastVersion = getLastImportantNoticeVersion(context);
         return getCurrentImportantNoticeVersion(context) > lastVersion;
     }
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
index 89c06a7..25bac9d 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
@@ -25,8 +25,8 @@
 
 @SmallTest
 public class KeyboardLayoutSetSubtypesCountTests extends KeyboardLayoutSetTestsBase {
-    private static final int NUMBER_OF_SUBTYPES = 80;
-    private static final int NUMBER_OF_ASCII_CAPABLE_SUBTYPES = 48;
+    private static final int NUMBER_OF_SUBTYPES = 81;
+    private static final int NUMBER_OF_ASCII_CAPABLE_SUBTYPES = 49;
     private static final int NUMBER_OF_PREDEFINED_ADDITIONAL_SUBTYPES = 2;
 
     @Override
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionCustomTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionCustomTests.java
index e7ef330..cb1c6ad 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionCustomTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionCustomTests.java
@@ -16,13 +16,13 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class KlpActionCustomTests extends KlpActionTestsBase {
     public void testActionCustom() {
         for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionDoneTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionDoneTests.java
index ada91b2..e0a87a7 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionDoneTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionDoneTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class KlpActionDoneTests extends KlpActionTestsBase {
     public void testActionDone() {
         for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionGoTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionGoTests.java
index 101523a..865b598 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionGoTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionGoTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class KlpActionGoTests extends KlpActionTestsBase {
     public void testActionGo() {
         for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionLabelTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionLabelTests.java
index 3fd3a36..74343cb 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionLabelTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionLabelTests.java
@@ -156,4 +156,17 @@
         doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, hi_ZZ, Locale.ITALIAN);
         doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, hi_ZZ, Locale.JAPANESE);
     }
+
+    public void testSerbianLatinActionLabel() {
+        final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
+        final Locale sr_ZZ = new Locale("sr", "ZZ");
+        final InputMethodSubtype hinglish = richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+                sr_ZZ.toString(), "serbian_qwertz");
+        // An action label should be displayed in subtype's locale regardless of the system locale.
+        doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, sr_ZZ, sr_ZZ);
+        doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, sr_ZZ, Locale.US);
+        doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, sr_ZZ, Locale.FRENCH);
+        doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, sr_ZZ, Locale.ITALIAN);
+        doTestActionKeysInLocaleWithKeyboardTextsSet(hinglish, sr_ZZ, Locale.JAPANESE);
+    }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionNextTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionNextTests.java
index b24f7d0..c67740c 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionNextTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionNextTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class KlpActionNextTests extends KlpActionTestsBase {
     public void testActionNext() {
         for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionNoneTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionNoneTests.java
index 18f7daf..0be2ecb 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionNoneTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionNoneTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class KlpActionNoneTests extends KlpActionTestsBase {
     public void testActionNone() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionPreviousTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionPreviousTests.java
index da44920..af6a154 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionPreviousTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionPreviousTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class KlpActionPreviousTests extends KlpActionTestsBase {
     public void testActionPrevious() {
         for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionSearchTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionSearchTests.java
index 18b6daf..adc3fee 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionSearchTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionSearchTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class KlpActionSearchTests extends KlpActionTestsBase {
     public void testActionSearch() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionSendTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionSendTests.java
index f3ec173..82f97a2 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionSendTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionSendTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class KlpActionSendTests extends KlpActionTestsBase {
     public void testActionSend() {
         for (final InputMethodSubtype subtype : mSubtypesWhoseNameIsDisplayedInItsLocale) {
diff --git a/tests/src/com/android/inputmethod/keyboard/action/KlpActionUnspecifiedTests.java b/tests/src/com/android/inputmethod/keyboard/action/KlpActionUnspecifiedTests.java
index a465c0d..307e273 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/KlpActionUnspecifiedTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/KlpActionUnspecifiedTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class KlpActionUnspecifiedTests extends KlpActionTestsBase {
     public void testActionUnspecified() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/LxxActionCustomTests.java b/tests/src/com/android/inputmethod/keyboard/action/LxxActionCustomTests.java
index 3d24d63..d561f45 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/LxxActionCustomTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/LxxActionCustomTests.java
@@ -16,13 +16,13 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class LxxActionCustomTests extends LxxActionTestsBase {
     public void testActionCustom() {
         for (final InputMethodSubtype subtype : getAllSubtypesList()) {
diff --git a/tests/src/com/android/inputmethod/keyboard/action/LxxActionDoneTests.java b/tests/src/com/android/inputmethod/keyboard/action/LxxActionDoneTests.java
index c39839b..b818bb1 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/LxxActionDoneTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/LxxActionDoneTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class LxxActionDoneTests extends LxxActionTestsBase {
     public void testActionDone() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/LxxActionGoTests.java b/tests/src/com/android/inputmethod/keyboard/action/LxxActionGoTests.java
index 4793514..8001f71 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/LxxActionGoTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/LxxActionGoTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class LxxActionGoTests extends LxxActionTestsBase {
     public void testActionGo() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/LxxActionNextTests.java b/tests/src/com/android/inputmethod/keyboard/action/LxxActionNextTests.java
index 37c7120..09a8c87 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/LxxActionNextTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/LxxActionNextTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class LxxActionNextTests extends LxxActionTestsBase {
     public void testActionNext() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/LxxActionNoneTests.java b/tests/src/com/android/inputmethod/keyboard/action/LxxActionNoneTests.java
index 6a2e774..98595e9 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/LxxActionNoneTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/LxxActionNoneTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class LxxActionNoneTests extends LxxActionTestsBase {
     public void testActionNone() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/LxxActionPreviousTests.java b/tests/src/com/android/inputmethod/keyboard/action/LxxActionPreviousTests.java
index 1917f03..2327889 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/LxxActionPreviousTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/LxxActionPreviousTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class LxxActionPreviousTests extends LxxActionTestsBase {
     public void testActionPrevious() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/LxxActionSearchTests.java b/tests/src/com/android/inputmethod/keyboard/action/LxxActionSearchTests.java
index 5e498e4..7e1d86b 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/LxxActionSearchTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/LxxActionSearchTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class LxxActionSearchTests extends LxxActionTestsBase {
     public void testActionSearch() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/LxxActionSendTests.java b/tests/src/com/android/inputmethod/keyboard/action/LxxActionSendTests.java
index 722f79e..fa0134f 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/LxxActionSendTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/LxxActionSendTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class LxxActionSendTests extends LxxActionTestsBase {
     public void testActionSend() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/action/LxxActionUnspecifiedTests.java b/tests/src/com/android/inputmethod/keyboard/action/LxxActionUnspecifiedTests.java
index 00e908f..711ca26 100644
--- a/tests/src/com/android/inputmethod/keyboard/action/LxxActionUnspecifiedTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/action/LxxActionUnspecifiedTests.java
@@ -16,14 +16,14 @@
 
 package com.android.inputmethod.keyboard.action;
 
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
-@MediumTest
+@LargeTest
 public class LxxActionUnspecifiedTests extends LxxActionTestsBase {
     public void testActionUnspecified() {
         final ExpectedActionKey expectedKey = ExpectedActionKey.newIconKey(
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java b/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
index b05789b..b714ec7 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
@@ -51,6 +51,24 @@
         }
 
         /**
+         * Set accented letters to a specific keyboard element.
+         * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard
+         *        layout.
+         * @param elementId the element id of keyboard
+         * @return the {@link ExpectedKeyboardBuilder} object that contains accented letters as
+         *        "more keys".
+         */
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder,
+                final int elementId) {
+            // This method can be overridden by an extended class to provide customized expected
+            // accented letters depending on the shift state of keyboard.
+            // This is a default behavior to call a shift-state-independent
+            // {@link #setAccentedLetters(ExpectedKeyboardBuilder)} implementation, so that
+            // <code>elementId</code> is ignored here.
+            return setAccentedLetters(builder);
+        }
+
+        /**
          * Set accented letters to common layout.
          * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard
          *        layout.
@@ -310,7 +328,7 @@
 
     // U+00A1: "¡" INVERTED EXCLAMATION MARK
     // U+00BF: "¿" INVERTED QUESTION MARK
-    static final ExpectedKey[] EXCLAMATION_AND_QUESTION_MARKS = joinKeys(
+    public static final ExpectedKey[] EXCLAMATION_AND_QUESTION_MARKS = joinKeys(
             key("!", moreKey("\u00A1")), key("?", moreKey("\u00BF")));
     // U+200C: ZERO WIDTH NON-JOINER
     // U+200D: ZERO WIDTH JOINER
@@ -386,7 +404,7 @@
     ExpectedKey[][] getCommonAlphabetShiftLayout(final boolean isPhone, final int elementId) {
         final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(
                 getCommonAlphabetLayout(isPhone));
-        getCustomizer().setAccentedLetters(builder);
+        getCustomizer().setAccentedLetters(builder, elementId);
         builder.toUpperCase(getLocale());
         return builder.build();
     }
@@ -411,7 +429,7 @@
         final ExpectedKeyboardBuilder builder;
         if (elementId == KeyboardId.ELEMENT_ALPHABET) {
             builder = new ExpectedKeyboardBuilder(getCommonAlphabetLayout(isPhone));
-            getCustomizer().setAccentedLetters(builder);
+            getCustomizer().setAccentedLetters(builder, elementId);
         } else {
             final ExpectedKey[][] commonLayout = getCommonAlphabetShiftLayout(isPhone, elementId);
             if (commonLayout == null) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/SerbianQwertz.java b/tests/src/com/android/inputmethod/keyboard/layout/SerbianQwertz.java
new file mode 100644
index 0000000..b23fe76
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/SerbianQwertz.java
@@ -0,0 +1,57 @@
+/*
+ * 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;
+
+public final class SerbianQwertz extends LayoutBase {
+    private static final String LAYOUT_NAME = "serbian_qwertz";
+
+    public SerbianQwertz(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) { return ALPHABET_COMMON; }
+
+    public static final String ROW1_11 = "ROW1_11";
+    public static final String ROW2_10 = "ROW2_10";
+    public static final String ROW2_11 = "ROW2_11";
+    public static final String ROW3_8 = "ROW3_8";
+    public static final String ROW3_9 = "ROW3_9";
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    key("q", additionalMoreKey("1")),
+                    key("w", additionalMoreKey("2")),
+                    key("e", additionalMoreKey("3")),
+                    key("r", additionalMoreKey("4")),
+                    key("t", additionalMoreKey("5")),
+                    key("z", additionalMoreKey("6")),
+                    key("u", additionalMoreKey("7")),
+                    key("i", additionalMoreKey("8")),
+                    key("o", additionalMoreKey("9")),
+                    key("p", additionalMoreKey("0")),
+                    ROW1_11)
+            .setKeysOfRow(2, "a", "s", "d", "f", "g", "h", "j", "k", "l", ROW2_10, ROW2_11)
+            .setKeysOfRow(3, "y", "x", "c", "v", "b", "n", "m", ROW3_8, ROW3_9)
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/DanishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/DanishCustomizer.java
index b7c181b..2c5df60 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/DanishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/DanishCustomizer.java
@@ -53,9 +53,35 @@
                 .setMoreKeysOf("\u00F8", "\u00F6");
     }
 
+    protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                .setMoreKeysOf("a", "\u00E1", "\u00E4", "\u00E0", "\u00E2", "\u00E3", "\u0101");
+    }
+
+    protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                // U+0153: "œ" LATIN SMALL LIGATURE OE
+                // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                .setMoreKeysOf("o", "\u00F6", "\u00F3", "\u00F4", "\u00F2", "\u00F5", "\u0153",
+                        "\u014D");
+    }
+
     @Override
     public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
         setNordicKeys(builder);
+        setMoreKeysOfA(builder);
+        setMoreKeysOfO(builder);
         return builder
                 // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
                 // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
@@ -72,20 +98,6 @@
                 // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
                 // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
                 .setMoreKeysOf("i", "\u00ED", "\u00EF")
-                // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-                // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-                // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-                // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-                // U+0153: "œ" LATIN SMALL LIGATURE OE
-                // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-                .setMoreKeysOf("o", "\u00F3", "\u00F4", "\u00F2", "\u00F5", "\u0153", "\u014D")
-                // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-                // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-                // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-                // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-                // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-                // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-                .setMoreKeysOf("a", "\u00E1", "\u00E4", "\u00E0", "\u00E2", "\u00E3", "\u0101")
                 // U+00DF: "ß" LATIN SMALL LETTER SHARP S
                 // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
                 // U+0161: "š" LATIN SMALL LETTER S WITH CARON
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/EstonianEECustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/EstonianEECustomizer.java
new file mode 100644
index 0000000..d0b8772
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/EstonianEECustomizer.java
@@ -0,0 +1,170 @@
+/*
+ * 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 com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.LayoutBase.EuroCustomizer;
+import com.android.inputmethod.keyboard.layout.Nordic;
+import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+class EstonianEECustomizer extends EuroCustomizer {
+    public EstonianEECustomizer(final Locale locale) {
+        super(locale);
+    }
+
+    @Override
+    public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
+
+    @Override
+    public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_R9L; }
+
+    protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                .replaceKeyOfLabel(Nordic.ROW1_11, "\u00FC")
+                // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                .replaceKeyOfLabel(Nordic.ROW2_10, "\u00F6")
+                .setMoreKeysOf("\u00F6", "\u00F5")
+                // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                .replaceKeyOfLabel(Nordic.ROW2_11, "\u00E4");
+    }
+
+    protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                // U+00E6: "æ" LATIN SMALL LETTER AE
+                // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+                .setMoreKeysOf("a", "\u0101", "\u00E0", "\u00E1", "\u00E2", "\u00E3", "\u00E5",
+                        "\u00E6", "\u0105");
+    }
+
+    protected void setMoreKeysOfI(final ExpectedKeyboardBuilder builder, final int elementId) {
+        // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+        // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+        // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+        // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+        // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+        // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+        // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+        if (elementId == KeyboardId.ELEMENT_ALPHABET) {
+            builder.setMoreKeysOf("i",
+                    "\u012B", "\u00EC", "\u012F", "\u00ED", "\u00EE", "\u00EF", "\u0131");
+        } else {
+            // The upper-case letter of "ı" in Estonian locale is "I". It should be omitted
+            // from the more keys of "I".
+            builder.setMoreKeysOf("i",
+                    "\u012B", "\u00EC", "\u012F", "\u00ED", "\u00EE", "\u00EF");
+        }
+    }
+
+    protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                // U+0153: "œ" LATIN SMALL LIGATURE OE
+                // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+                // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                .setMoreKeysOf("o", "\u00F5", "\u00F2", "\u00F3", "\u00F4", "\u0153", "\u0151",
+                        "\u00F8");
+    }
+
+    protected void setMoreKeysOfU(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+                // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+                // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+                .setMoreKeysOf("u", "\u016B", "\u0173", "\u00F9", "\u00FA", "\u00FB", "\u016F",
+                        "\u0171");
+    }
+
+    @Override
+    public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder,
+            final int elementId) {
+        setNordicKeys(builder);
+        setMoreKeysOfA(builder);
+        setMoreKeysOfI(builder, elementId);
+        setMoreKeysOfO(builder);
+        setMoreKeysOfU(builder);
+        return builder
+                // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+                // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+                // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+                // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+                // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+                .setMoreKeysOf("e",
+                        "\u0113", "\u00E8", "\u0117", "\u00E9", "\u00EA", "\u00EB", "\u0119",
+                        "\u011B")
+                // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+                // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+                // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+                .setMoreKeysOf("r", "\u0157", "\u0159", "\u0155")
+                // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+                // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+                .setMoreKeysOf("t", "\u0163", "\u0165")
+                // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+                // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+                .setMoreKeysOf("y", "\u00FD", "\u00FF")
+                // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+                // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+                // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+                // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+                .setMoreKeysOf("s", "\u0161", "\u00DF", "\u015B", "\u015F")
+                // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+                .setMoreKeysOf("d", "\u010F")
+                // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
+                // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+                .setMoreKeysOf("g", "\u0123", "\u011F")
+                // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+                .setMoreKeysOf("k", "\u0137")
+                // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+                // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+                // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+                // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+                .setMoreKeysOf("l", "\u013C", "\u0142", "\u013A", "\u013E")
+                // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+                // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+                // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+                .setMoreKeysOf("z", "\u017E", "\u017C", "\u017A")
+                // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+                // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                .setMoreKeysOf("c", "\u010D", "\u00E7", "\u0107")
+                // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+                // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                .setMoreKeysOf("n", "\u0146", "\u00F1", "\u0144");
+    }
+}
\ No newline at end of file
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/FinnishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/FinnishCustomizer.java
index 9adb637..912aec4 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/FinnishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/FinnishCustomizer.java
@@ -39,12 +39,19 @@
                 .setMoreKeysOf("\u00E4", "\u00E6");
     }
 
-    @Override
-    public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
-        setNordicKeys(builder);
-        return builder
-                // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-                .setMoreKeysOf("u", "\u00FC")
+    protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+00E6: "æ" LATIN SMALL LETTER AE
+                // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                .setMoreKeysOf("a", "\u00E6", "\u00E0", "\u00E1", "\u00E2", "\u00E3", "\u0101");
+    }
+
+    protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+        builder
                 // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
                 // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
                 // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
@@ -52,15 +59,18 @@
                 // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
                 // U+0153: "œ" LATIN SMALL LIGATURE OE
                 // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-                .setMoreKeysOf("o",
-                        "\u00F8", "\u00F4", "\u00F2", "\u00F3", "\u00F5", "\u0153", "\u014D")
-                // U+00E6: "æ" LATIN SMALL LETTER AE
-                // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-                // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-                // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-                // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-                // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-                .setMoreKeysOf("a", "\u00E6", "\u00E0", "\u00E1", "\u00E2", "\u00E3", "\u0101")
+                .setMoreKeysOf("o", "\u00F8", "\u00F4", "\u00F2", "\u00F3", "\u00F5", "\u0153",
+                        "\u014D");
+    }
+
+    @Override
+    public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+        setNordicKeys(builder);
+        setMoreKeysOfA(builder);
+        setMoreKeysOfO(builder);
+        return builder
+                // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                .setMoreKeysOf("u", "\u00FC")
                 // U+0161: "š" LATIN SMALL LETTER S WITH CARON
                 // U+00DF: "ß" LATIN SMALL LETTER SHARP S
                 // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/NorwegianCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/NorwegianCustomizer.java
index 3d3ed4b..4be7a57 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/NorwegianCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/NorwegianCustomizer.java
@@ -47,9 +47,35 @@
                 .setMoreKeysOf("\u00E6", "\u00E4");
     }
 
+    protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                .setMoreKeysOf("a", "\u00E4", "\u00E0", "\u00E1", "\u00E2", "\u00E3", "\u0101");
+    }
+
+    protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                // U+0153: "œ" LATIN SMALL LIGATURE OE
+                // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                .setMoreKeysOf("o", "\u00F6", "\u00F4", "\u00F2", "\u00F3", "\u00F5", "\u0153",
+                        "\u014D");
+    }
+
     @Override
     public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
         setNordicKeys(builder);
+        setMoreKeysOfA(builder);
+        setMoreKeysOfO(builder);
         return builder
                 // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
                 // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
@@ -65,22 +91,6 @@
                 // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
                 // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
                 // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-                .setMoreKeysOf("u", "\u00FC", "\u00FB", "\u00F9", "\u00FA", "\u016B")
-                // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-                // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-                // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-                // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-                // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-                // U+0153: "œ" LATIN SMALL LIGATURE OE
-                // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-                .setMoreKeysOf("o",
-                        "\u00F4", "\u00F2", "\u00F3", "\u00F6", "\u00F5", "\u0153", "\u014D")
-                // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-                // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-                // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-                // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-                // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-                // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-                .setMoreKeysOf("a", "\u00E0", "\u00E4", "\u00E1", "\u00E2", "\u00E3", "\u0101");
+                .setMoreKeysOf("u", "\u00FC", "\u00FB", "\u00F9", "\u00FA", "\u016B");
     }
 }
\ No newline at end of file
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/SerbianLatinCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/SerbianLatinCustomizer.java
new file mode 100644
index 0000000..3660ce4
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/SerbianLatinCustomizer.java
@@ -0,0 +1,82 @@
+/*
+ * 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 com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.SerbianQwertz;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+class SerbianLatinCustomizer extends LayoutCustomizer {
+    public SerbianLatinCustomizer(final Locale locale) { super(locale); }
+
+    @Override
+    public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+        return isPhone ? EMPTY_KEYS : LayoutBase.EXCLAMATION_AND_QUESTION_MARKS;
+    }
+
+    protected void setSerbianKeys(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+                .replaceKeyOfLabel(SerbianQwertz.ROW1_11, "\u0161")
+                // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                .replaceKeyOfLabel(SerbianQwertz.ROW2_10, "\u010D")
+                // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                .replaceKeyOfLabel(SerbianQwertz.ROW2_11, "\u0107")
+                // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+                .replaceKeyOfLabel(SerbianQwertz.ROW3_8, "\u0111")
+                // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+                .replaceKeyOfLabel(SerbianQwertz.ROW3_9, "\u017E");
+    }
+
+    @SuppressWarnings("unused")
+    protected void setMoreKeysOfS(final ExpectedKeyboardBuilder builder) {
+        // Serbian QWERTZ has a dedicated "š" key.
+    }
+
+    @SuppressWarnings("unused")
+    protected void setMoreKeysOfC(final ExpectedKeyboardBuilder builder) {
+        // Serbian QWERTZ has a dedicated "č" and "ć" keys.
+    }
+
+    @SuppressWarnings("unused")
+    protected void setMoreKeysOfD(final ExpectedKeyboardBuilder builder) {
+        // Serbian QWERTZ has a dedicated "đ" key.
+    }
+
+    @SuppressWarnings("unused")
+    protected void setMoreKeysOfZ(final ExpectedKeyboardBuilder builder) {
+        // Serbian QWERTZ has a dedicated "ž" key.
+    }
+
+    @Override
+    public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+        setSerbianKeys(builder);
+        setMoreKeysOfS(builder);
+        setMoreKeysOfC(builder);
+        setMoreKeysOfD(builder);
+        setMoreKeysOfZ(builder);
+        return builder
+                // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                .setMoreKeysOf("e", "\u00E8")
+                // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                .setMoreKeysOf("i", "\u00EC");
+    }
+}
\ No newline at end of file
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/SwedishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/SwedishCustomizer.java
index 36b55b1..af4a971 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/SwedishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/SwedishCustomizer.java
@@ -64,9 +64,35 @@
                 .setMoreKeysOf("\u00E4", "\u00E6");
     }
 
+    protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+00E6: "æ" LATIN SMALL LETTER AE
+                // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+                // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                .setMoreKeysOf("a", "\u00E6", "\u00E1", "\u00E0", "\u00E2", "\u0105", "\u00E3");
+    }
+
+    protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+        builder
+                // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                // U+0153: "œ" LATIN SMALL LIGATURE OE
+                // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                .setMoreKeysOf("o", "\u00F8", "\u0153", "\u00F3", "\u00F2", "\u00F4", "\u00F5",
+                        "\u014D");
+    }
+
     @Override
     public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
         setNordicKeys(builder);
+        setMoreKeysOfA(builder);
+        setMoreKeysOfO(builder);
         return builder
                 // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
                 // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
@@ -93,18 +119,6 @@
                 // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
                 // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
                 .setMoreKeysOf("i", "\u00ED", "\u00EC", "\u00EE", "\u00EF")
-                // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-                // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-                // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-                // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-                // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
-                .setMoreKeysOf("o", "\u00F3", "\u00F2", "\u00F4", "\u00F5", "\u014D")
-                // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-                // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-                // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-                // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-                // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-                .setMoreKeysOf("a", "\u00E1", "\u00E0", "\u00E2", "\u0105", "\u00E3")
                 // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
                 // U+0161: "š" LATIN SMALL LETTER S WITH CARON
                 // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanishQwertz.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanishQwertz.java
index a53a3d4..886b3de 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanishQwertz.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanishQwertz.java
@@ -44,5 +44,35 @@
         protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
             // QWERTZ layout doesn't have Nordic keys.
         }
+
+        @Override
+        protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    .setMoreKeysOf("a", "\u00E5", "\u00E6", "\u00E1", "\u00E4", "\u00E0", "\u00E2",
+                            "\u00E3", "\u0101");
+        }
+
+        @Override
+        protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                    // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    .setMoreKeysOf("o", "\u00F8", "\u00F6", "\u00F3", "\u00F4", "\u00F2", "\u00F5",
+                            "\u0153", "\u014D");
+        }
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java
index 865e9ea..28c2eb3 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java
@@ -19,11 +19,7 @@
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
-import com.android.inputmethod.keyboard.layout.LayoutBase.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Nordic;
-import com.android.inputmethod.keyboard.layout.Symbols;
-import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
-import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
@@ -37,121 +33,4 @@
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
-
-    private static class EstonianEECustomizer extends EuroCustomizer {
-        public EstonianEECustomizer(final Locale locale) {
-            super(locale);
-        }
-
-        @Override
-        public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
-
-        @Override
-        public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_R9L; }
-
-        @Override
-        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
-            return builder
-                    // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
-                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-                    // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
-                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
-                    // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
-                    // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
-                    // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
-                    // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
-                    .setMoreKeysOf("e",
-                            "\u0113", "\u00E8", "\u0117", "\u00E9", "\u00EA", "\u00EB", "\u0119",
-                            "\u011B")
-                    // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
-                    // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
-                    // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
-                    .setMoreKeysOf("r", "\u0157", "\u0159", "\u0155")
-                    // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
-                    // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
-                    .setMoreKeysOf("t", "\u0163", "\u0165")
-                    // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
-                    // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
-                    .setMoreKeysOf("y", "\u00FD", "\u00FF")
-                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
-                    // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
-                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
-                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
-                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
-                    // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
-                    // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
-                    .setMoreKeysOf("u",
-                            "\u00FC", "\u016B", "\u0173", "\u00F9", "\u00FA", "\u00FB", "\u016F",
-                            "\u0171")
-                    // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
-                    // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
-                    // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
-                    // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
-                    // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
-                    // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
-                    // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
-                    .setMoreKeysOf("i",
-                            "\u012B", "\u00EC", "\u012F", "\u00ED", "\u00EE", "\u00EF", "\u0131")
-                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-                    // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
-                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-                    // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
-                    // U+0153: "œ" LATIN SMALL LIGATURE OE
-                    // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
-                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
-                    .setMoreKeysOf("o",
-                            "\u00F6", "\u00F5", "\u00F2", "\u00F3", "\u00F4", "\u0153", "\u0151",
-                            "\u00F8")
-                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
-                    .replaceKeyOfLabel(Nordic.ROW1_11, "\u00FC")
-                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
-                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
-                    .replaceKeyOfLabel(Nordic.ROW2_10, key("\u00F6", moreKey("\u00F5")))
-                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-                    .replaceKeyOfLabel(Nordic.ROW2_11, "\u00E4")
-                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
-                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
-                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
-                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
-                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
-                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
-                    // U+00E6: "æ" LATIN SMALL LETTER AE
-                    // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
-                    .setMoreKeysOf("a",
-                            "\u00E4", "\u0101", "\u00E0", "\u00E1", "\u00E2", "\u00E3", "\u00E5",
-                            "\u00E6", "\u0105")
-                    // U+0161: "š" LATIN SMALL LETTER S WITH CARON
-                    // U+00DF: "ß" LATIN SMALL LETTER SHARP S
-                    // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
-                    // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
-                    .setMoreKeysOf("s", "\u0161", "\u00DF", "\u015B", "\u015F")
-                    // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
-                    .setMoreKeysOf("d", "\u010F")
-                    // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
-                    // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
-                    .setMoreKeysOf("g", "\u0123", "\u011F")
-                    // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
-                    .setMoreKeysOf("k", "\u0137")
-                    // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
-                    // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
-                    // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
-                    // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
-                    .setMoreKeysOf("l", "\u013C", "\u0142", "\u013A", "\u013E")
-                    // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
-                    // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
-                    // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
-                    .setMoreKeysOf("z", "\u017E", "\u017C", "\u017A")
-                    // U+010D: "č" LATIN SMALL LETTER C WITH CARON
-                    // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
-                    // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
-                    .setMoreKeysOf("c", "\u010D", "\u00E7", "\u0107")
-                    // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
-                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
-                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
-                    .setMoreKeysOf("n", "\u0146", "\u00F1", "\u0144");
-        }
-    }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEEQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEEQwerty.java
new file mode 100644
index 0000000..ab8960b
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEEQwerty.java
@@ -0,0 +1,110 @@
+/*
+ * 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.LayoutBase;
+import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * et_EE: Estonian (Estonia)/qwerty
+ */
+@SmallTest
+public final class TestsEstonianEEQwerty extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("et", "EE");
+    private static final LayoutBase LAYOUT = new Qwerty(new EstonianEEQwertyCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class EstonianEEQwertyCustomizer extends EstonianEECustomizer {
+        public EstonianEEQwertyCustomizer(final Locale locale) {
+            super(locale);
+        }
+
+        @Override
+        protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
+            // QWERTY layout doesn't have Nordic keys.
+        }
+
+        @Override
+        protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+                    .setMoreKeysOf("a", "\u00E4", "\u0101", "\u00E0", "\u00E1", "\u00E2", "\u00E3",
+                            "\u00E5", "\u00E6", "\u0105");
+        }
+
+        @Override
+        protected void setMoreKeysOfI(final ExpectedKeyboardBuilder builder, final int elementId) {
+            // TODO: The upper-case letter of "ı" in Estonian locale is "I". It should be omitted
+            // from the more keys of "I".
+            builder
+                    // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+                    // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                    // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+                    // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+                    // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+                    // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+                    // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+                    .setMoreKeysOf("i",
+                            "\u012B", "\u00EC", "\u012F", "\u00ED", "\u00EE", "\u00EF", "\u0131");
+        }
+
+        @Override
+        protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    .setMoreKeysOf("o", "\u00F6", "\u00F5", "\u00F2", "\u00F3", "\u00F4", "\u0153",
+                            "\u0151", "\u00F8");
+        }
+
+        @Override
+        protected void setMoreKeysOfU(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+                    // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+                    .setMoreKeysOf("u", "\u00FC", "\u016B", "\u0173", "\u00F9", "\u00FA", "\u00FB",
+                            "\u016F", "\u0171");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnishQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnishQwerty.java
index 2838fef..c3df9d1 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnishQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnishQwerty.java
@@ -44,5 +44,35 @@
         protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
             // QWERTY layout doesn't have Nordic keys.
         }
+
+        @Override
+        protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    .setMoreKeysOf("a", "\u00E4", "\u00E5", "\u00E6", "\u00E0", "\u00E1", "\u00E2",
+                            "\u00E3", "\u0101");
+        }
+
+        @Override
+        protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                    // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    .setMoreKeysOf("o", "\u00F6", "\u00F8", "\u00F4", "\u00F2", "\u00F3", "\u00F5",
+                            "\u0153", "\u014D");
+        }
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegianColemak.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegianColemak.java
index 6c3f8b9..a481796 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegianColemak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegianColemak.java
@@ -44,5 +44,36 @@
         protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
             // Colemak layout doesn't have Nordic keys.
         }
+
+        @Override
+        protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    .setMoreKeysOf("a", "\u00E5", "\u00E6", "\u00E4", "\u00E0", "\u00E1", "\u00E2",
+                            "\u00E3", "\u0101");
+        }
+
+        @Override
+        protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                    // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    .setMoreKeysOf("o", "\u00F8", "\u00F6", "\u00F4", "\u00F2", "\u00F3", "\u00F5",
+                            "\u0153", "\u014D");
+        }
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatin.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatin.java
new file mode 100644
index 0000000..70f4bce
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatin.java
@@ -0,0 +1,36 @@
+/*
+ * 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.LayoutBase;
+import com.android.inputmethod.keyboard.layout.SerbianQwertz;
+
+import java.util.Locale;
+
+/**
+ * sr_ZZ: Serbian (Latin)/serbian_qwertz
+ */
+@SmallTest
+public final class TestsSerbianLatin extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("sr", "ZZ");
+    private static final LayoutBase LAYOUT = new SerbianQwertz(new SerbianLatinCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatinQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatinQwerty.java
new file mode 100644
index 0000000..d8ef51b
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatinQwerty.java
@@ -0,0 +1,88 @@
+/*
+ * 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.LayoutBase;
+import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * sr_ZZ: Serbian (Latin)/qwerty
+ */
+@SmallTest
+public final class TestsSerbianLatinQwerty extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("sr", "ZZ");
+    private static final LayoutBase LAYOUT = new Qwerty(new SerbianLatinQwertyCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class SerbianLatinQwertyCustomizer extends SerbianLatinCustomizer {
+        public SerbianLatinQwertyCustomizer(final Locale locale) {
+            super(locale);
+        }
+
+        @Override
+        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+            return isPhone ? EMPTY_KEYS
+                    : joinKeys(LayoutBase.EXCLAMATION_AND_QUESTION_MARKS, LayoutBase.SHIFT_KEY);
+        }
+
+        @Override
+        protected void setSerbianKeys(final ExpectedKeyboardBuilder builder) {
+            // QWERTY layout doesn't have Serbian Latin Keys.
+        }
+
+        @Override
+        protected void setMoreKeysOfS(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+                    .setMoreKeysOf("s", "\u0161")
+                    .setAdditionalMoreKeysPositionOf("s", 2);
+        }
+
+        @Override
+        protected void setMoreKeysOfC(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                    // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                    .setMoreKeysOf("c", "\u010D", "\u0107")
+                    .setAdditionalMoreKeysPositionOf("c", 3);
+        }
+
+        @Override
+        protected void setMoreKeysOfD(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+                    .setMoreKeysOf("d", "\u0111")
+                    .setAdditionalMoreKeysPositionOf("d", 2);
+        }
+
+        @Override
+        protected void setMoreKeysOfZ(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+                    .setMoreKeysOf("z", "\u017E")
+                    .setAdditionalMoreKeysPositionOf("z", 2);
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedishPcQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedishPcQwerty.java
index bb4b9dd..ed74d6d 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedishPcQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedishPcQwerty.java
@@ -85,5 +85,36 @@
         protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
             // PC QWERTY layout doesn't have Nordic keys.
         }
+
+        @Override
+        protected void setMoreKeysOfA(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                    // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    .setMoreKeysOf("a", "\u00E4", "\u00E5", "\u00E6", "\u00E1", "\u00E0", "\u00E2",
+                            "\u0105", "\u00E3");
+        }
+
+        @Override
+        protected void setMoreKeysOfO(final ExpectedKeyboardBuilder builder) {
+            builder
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                    // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    .setMoreKeysOf("o", "\u00F6", "\u00F8", "\u0153", "\u00F3", "\u00F2", "\u00F4",
+                            "\u00F5", "\u014D");
+        }
+
     }
 }
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictUtils.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictUtils.java
index 5a3eba8..965479d 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictUtils.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictUtils.java
@@ -69,7 +69,7 @@
             }
             return new Ver4DictEncoder(file);
         } else if (formatOptions.mVersion == FormatSpec.VERSION2) {
-            return new Ver2DictEncoder(file);
+            return new Ver2DictEncoder(file, Ver2DictEncoder.CODE_POINT_TABLE_OFF);
         } else {
             throw new RuntimeException("The format option has a wrong version : "
                     + formatOptions.mVersion);
diff --git a/tests/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java b/tests/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java
index a7693d5..0fa75e8 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java
@@ -40,12 +40,16 @@
     private OutputStream mOutStream;
     private byte[] mBuffer;
     private int mPosition;
+    private final int mCodePointTableMode;
+    public static final int CODE_POINT_TABLE_OFF = 0;
+    public static final int CODE_POINT_TABLE_ON = 1;
 
     @UsedForTesting
-    public Ver2DictEncoder(final File dictFile) {
+    public Ver2DictEncoder(final File dictFile, final int codePointTableMode) {
         mDictFile = dictFile;
         mOutStream = null;
         mBuffer = null;
+        mCodePointTableMode = codePointTableMode;
     }
 
     // This constructor is used only by BinaryDictOffdeviceUtilsTests.
@@ -55,6 +59,7 @@
     public Ver2DictEncoder(final OutputStream outStream) {
         mDictFile = null;
         mOutStream = outStream;
+        mCodePointTableMode = CODE_POINT_TABLE_OFF;
     }
 
     private void openStream() throws FileNotFoundException {
diff --git a/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java
index 819d763..cbabf7e 100644
--- a/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java
@@ -16,18 +16,18 @@
 
 package com.android.inputmethod.latin.utils;
 
-import static com.android.inputmethod.latin.utils.ImportantNoticeUtils.KEY_TIMESTAMP_OF_FIRST_IMPORTANT_NOTICE;
 import static com.android.inputmethod.latin.utils.ImportantNoticeUtils.KEY_IMPORTANT_NOTICE_VERSION;
+import static com.android.inputmethod.latin.utils.ImportantNoticeUtils.KEY_TIMESTAMP_OF_FIRST_IMPORTANT_NOTICE;
 
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.test.suitebuilder.annotation.MediumTest;
 import android.text.TextUtils;
 
 import java.util.concurrent.TimeUnit;
 
-@SmallTest
+@MediumTest
 public class ImportantNoticeUtilsTests extends AndroidTestCase {
     // This should be aligned with R.integer.config_important_notice_version.
     private static final int CURRENT_IMPORTANT_NOTICE_VERSION = 1;
@@ -112,6 +112,28 @@
                 ImportantNoticeUtils.getCurrentImportantNoticeVersion(getContext()));
     }
 
+    public void testStateAfterFreshInstall() {
+        mImportantNoticePreferences.clear();
+
+        // Check internal state of {@link ImportantNoticeUtils.shouldShowImportantNotice(Context)}
+        // after fresh install.
+        assertEquals("Has new imortant notice after fresh install", true,
+                ImportantNoticeUtils.hasNewImportantNotice(getContext()));
+        assertEquals("Next important norice title after fresh install", false, TextUtils.isEmpty(
+                ImportantNoticeUtils.getNextImportantNoticeTitle(getContext())));
+        assertEquals("Is in system setup wizard after fresh install", false,
+                ImportantNoticeUtils.isInSystemSetupWizard(getContext()));
+        final long currentTimeMillis = System.currentTimeMillis();
+        assertEquals("Has timeout passed after fresh install", false,
+                ImportantNoticeUtils.hasTimeoutPassed(getContext(), currentTimeMillis));
+        assertEquals("Timestamp of first important notice after fresh install",
+                (Long)currentTimeMillis,
+                mImportantNoticePreferences.getLong(KEY_TIMESTAMP_OF_FIRST_IMPORTANT_NOTICE));
+
+        assertEquals("Current boolean before update", true,
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext()));
+    }
+
     public void testUpdateVersion() {
         mImportantNoticePreferences.clear();
 
@@ -163,7 +185,7 @@
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version before timeout 1", 1,
                 ImportantNoticeUtils.getNextImportantNoticeVersion(getContext()));
-        assertEquals("Last time before timeout 1", (Long)lastTime,
+        assertEquals("Timestamp of first important notice before timeout 1", (Long)lastTime,
                 mImportantNoticePreferences.getLong(KEY_TIMESTAMP_OF_FIRST_IMPORTANT_NOTICE));
         assertEquals("Current title before timeout 1", false, TextUtils.isEmpty(
                 ImportantNoticeUtils.getNextImportantNoticeTitle(getContext())));
@@ -180,7 +202,7 @@
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version before timeout 2", 1,
                 ImportantNoticeUtils.getNextImportantNoticeVersion(getContext()));
-        assertEquals("Last time before timeout 2", (Long)lastTime,
+        assertEquals("Timestamp of first important notice before timeout 2", (Long)lastTime,
                 mImportantNoticePreferences.getLong(KEY_TIMESTAMP_OF_FIRST_IMPORTANT_NOTICE));
         assertEquals("Current title before timeout 2", false, TextUtils.isEmpty(
                 ImportantNoticeUtils.getNextImportantNoticeTitle(getContext())));
@@ -196,7 +218,7 @@
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version after timeout 1", 2,
                 ImportantNoticeUtils.getNextImportantNoticeVersion(getContext()));
-        assertEquals("Last time aflter timeout 1", null,
+        assertEquals("Timestamp of first important notice after timeout 1", null,
                 mImportantNoticePreferences.getLong(KEY_TIMESTAMP_OF_FIRST_IMPORTANT_NOTICE));
         assertEquals("Current title after timeout 1", true, TextUtils.isEmpty(
                 ImportantNoticeUtils.getNextImportantNoticeTitle(getContext())));
@@ -212,7 +234,7 @@
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version after timeout 2", 2,
                 ImportantNoticeUtils.getNextImportantNoticeVersion(getContext()));
-        assertEquals("Last time aflter timeout 2", null,
+        assertEquals("Timestamp of first important notice after timeout 2", null,
                 mImportantNoticePreferences.getLong(KEY_TIMESTAMP_OF_FIRST_IMPORTANT_NOTICE));
         assertEquals("Current title after timeout 2", true, TextUtils.isEmpty(
                 ImportantNoticeUtils.getNextImportantNoticeTitle(getContext())));
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/DictionaryMaker.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/DictionaryMaker.java
index 3d0557b..44f9695 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/DictionaryMaker.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/DictionaryMaker.java
@@ -59,6 +59,9 @@
         private static final String OPTION_OUTPUT_XML = "-x";
         private static final String OPTION_OUTPUT_COMBINED = "-o";
         private static final String OPTION_HELP = "-h";
+        private static final String OPTION_CODE_POINT_TABLE = "-t";
+        private static final String OPTION_CODE_POINT_TABLE_OFF = "off";
+        private static final String OPTION_CODE_POINT_TABLE_ON = "on";
         public final String mInputBinary;
         public final String mInputCombined;
         public final String mInputUnigramXml;
@@ -68,6 +71,7 @@
         public final String mOutputXml;
         public final String mOutputCombined;
         public final int mOutputBinaryFormatVersion;
+        public final int mCodePointTableMode;
 
         private void checkIntegrity() throws IOException {
             checkHasExactlyOneInput();
@@ -131,7 +135,7 @@
                     + "[-s <unigrams.xml> [-b <bigrams.xml>] [-c <shortcuts_and_whitelist.xml>] "
                     + "| [-s <combined format input]"
                     + "| [-s <binary input>] [-d <binary output>] [-x <xml output>] "
-                    + " [-o <combined output>]"
+                    + " [-o <combined output>] [-t <code point table switch: on/off/auto>]"
                     + "[-2] [-3] [-4]\n"
                     + "\n"
                     + "  Converts a source dictionary file to one or several outputs.\n"
@@ -155,6 +159,8 @@
             String outputXml = null;
             String outputCombined = null;
             int outputBinaryFormatVersion = 2; // the default version is 2.
+            // Don't use code point table by default.
+            int codePointTableMode = Ver2DictEncoder.CODE_POINT_TABLE_OFF;
 
             while (!args.isEmpty()) {
                 final String arg = args.get(0);
@@ -172,29 +178,38 @@
                             throw new IllegalArgumentException("Option " + arg + " is unknown or "
                                     + "requires an argument");
                         }
-                        String filename = args.get(0);
+                        String argValue = args.get(0);
                         args.remove(0);
                         if (OPTION_INPUT_SOURCE.equals(arg)) {
-                            if (XmlDictInputOutput.isXmlUnigramDictionary(filename)) {
-                                inputUnigramXml = filename;
-                            } else if (CombinedInputOutput.isCombinedDictionary(filename)) {
-                                inputCombined = filename;
-                            } else if (BinaryDictDecoderUtils.isBinaryDictionary(filename)) {
-                                inputBinary = filename;
+                            if (XmlDictInputOutput.isXmlUnigramDictionary(argValue)) {
+                                inputUnigramXml = argValue;
+                            } else if (CombinedInputOutput.isCombinedDictionary(argValue)) {
+                                inputCombined = argValue;
+                            } else if (BinaryDictDecoderUtils.isBinaryDictionary(argValue)) {
+                                inputBinary = argValue;
                             } else {
                                 throw new IllegalArgumentException(
-                                        "Unknown format for file " + filename);
+                                        "Unknown format for file " + argValue);
                             }
                         } else if (OPTION_INPUT_SHORTCUT_XML.equals(arg)) {
-                            inputShortcutXml = filename;
+                            inputShortcutXml = argValue;
                         } else if (OPTION_INPUT_BIGRAM_XML.equals(arg)) {
-                            inputBigramXml = filename;
+                            inputBigramXml = argValue;
                         } else if (OPTION_OUTPUT_BINARY.equals(arg)) {
-                            outputBinary = filename;
+                            outputBinary = argValue;
                         } else if (OPTION_OUTPUT_XML.equals(arg)) {
-                            outputXml = filename;
+                            outputXml = argValue;
                         } else if (OPTION_OUTPUT_COMBINED.equals(arg)) {
-                            outputCombined = filename;
+                            outputCombined = argValue;
+                        } else if (OPTION_CODE_POINT_TABLE.equals(arg)) {
+                            if (OPTION_CODE_POINT_TABLE_OFF.equals(argValue)) {
+                                codePointTableMode = Ver2DictEncoder.CODE_POINT_TABLE_OFF;
+                            } else if (OPTION_CODE_POINT_TABLE_ON.equals(argValue)) {
+                                codePointTableMode = Ver2DictEncoder.CODE_POINT_TABLE_ON;
+                            } else {
+                                throw new IllegalArgumentException(
+                                        "Unknown argument to -t option : " + argValue);
+                            }
                         } else {
                             throw new IllegalArgumentException("Unknown option : " + arg);
                         }
@@ -225,6 +240,7 @@
             mOutputXml = outputXml;
             mOutputCombined = outputCombined;
             mOutputBinaryFormatVersion = outputBinaryFormatVersion;
+            mCodePointTableMode = codePointTableMode;
             checkIntegrity();
         }
     }
@@ -335,7 +351,8 @@
             throws FileNotFoundException, IOException, UnsupportedFormatException,
             IllegalArgumentException {
         if (null != args.mOutputBinary) {
-            writeBinaryDictionary(args.mOutputBinary, dict, args.mOutputBinaryFormatVersion);
+            writeBinaryDictionary(args.mOutputBinary, dict, args.mOutputBinaryFormatVersion,
+                    args.mCodePointTableMode);
         }
         if (null != args.mOutputXml) {
             writeXmlDictionary(args.mOutputXml, dict);
@@ -351,19 +368,21 @@
      * @param outputFilename the name of the file to write to.
      * @param dict the dictionary to write.
      * @param version the binary format version to use.
+     * @param codePointTableMode the value to decide how we treat the code point table.
      * @throws FileNotFoundException if the output file can't be created.
      * @throws IOException if the output file can't be written to.
      */
     private static void writeBinaryDictionary(final String outputFilename,
-            final FusionDictionary dict, final int version)
+            final FusionDictionary dict, final int version, final int codePointTableMode)
             throws FileNotFoundException, IOException, UnsupportedFormatException {
         final File outputFile = new File(outputFilename);
         final FormatSpec.FormatOptions formatOptions = new FormatSpec.FormatOptions(version);
         final DictEncoder dictEncoder;
         if (version == FormatSpec.VERSION4) {
+            // VERSION4 doesn't use the code point table.
             dictEncoder = new Ver4DictEncoder(outputFile);
         } else {
-            dictEncoder = new Ver2DictEncoder(outputFile);
+            dictEncoder = new Ver2DictEncoder(outputFile, codePointTableMode);
         }
         dictEncoder.writeDictionary(dict, formatOptions);
     }
diff --git a/tools/make-keyboard-text/res/values-da/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-da/donottranslate-more-keys.xml
index c22e262..98abb05 100644
--- a/tools/make-keyboard-text/res/values-da/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-da/donottranslate-more-keys.xml
@@ -18,26 +18,30 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+    <!-- U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+         U+00E6: "æ" LATIN SMALL LETTER AE
+         U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
          U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
          U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
          U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
          U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
          U+0101: "ā" LATIN SMALL LETTER A WITH MACRON -->
-    <string name="morekeys_a">&#x00E1;,&#x00E4;,&#x00E0;,&#x00E2;,&#x00E3;,&#x0101;</string>
+    <string name="morekeys_a">&#x00E5;,&#x00E6;,&#x00E1;,&#x00E4;,&#x00E0;,&#x00E2;,&#x00E3;,&#x0101;</string>
     <!-- U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
          U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS -->
     <string name="morekeys_e">&#x00E9;,&#x00EB;</string>
     <!-- U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
          U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS -->
     <string name="morekeys_i">&#x00ED;,&#x00EF;</string>
-    <!-- U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+    <!-- U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+         U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+         U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
          U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
          U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
          U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
          U+0153: "œ" LATIN SMALL LIGATURE OE
          U+014D: "ō" LATIN SMALL LETTER O WITH MACRON -->
-    <string name="morekeys_o">&#x00F3;,&#x00F4;,&#x00F2;,&#x00F5;,&#x0153;,&#x014D;</string>
+    <string name="morekeys_o">&#x00F8;,&#x00F6;,&#x00F3;,&#x00F4;,&#x00F2;,&#x00F5;,&#x0153;,&#x014D;</string>
     <!-- U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
          U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
          U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
diff --git a/tools/make-keyboard-text/res/values-et-rEE/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-et-rEE/donottranslate-more-keys.xml
index 9a8fa3c..79266e8 100644
--- a/tools/make-keyboard-text/res/values-et-rEE/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-et-rEE/donottranslate-more-keys.xml
@@ -72,7 +72,6 @@
          U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
          U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE -->
     <string name="morekeys_n">&#x0146;,&#x00F1;,&#x0144;</string>
-
     <!-- U+010D: "č" LATIN SMALL LETTER C WITH CARON
          U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
          U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE -->
diff --git a/tools/make-keyboard-text/res/values-fi/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-fi/donottranslate-more-keys.xml
index 82b8472..b06d9e4 100644
--- a/tools/make-keyboard-text/res/values-fi/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-fi/donottranslate-more-keys.xml
@@ -18,21 +18,24 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- U+00E6: "æ" LATIN SMALL LETTER AE
+    <!-- U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+         U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+         U+00E6: "æ" LATIN SMALL LETTER AE
          U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
          U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
          U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
          U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
          U+0101: "ā" LATIN SMALL LETTER A WITH MACRON -->
-    <string name="morekeys_a">&#x00E6;,&#x00E0;,&#x00E1;,&#x00E2;,&#x00E3;,&#x0101;</string>
-    <!-- U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+    <string name="morekeys_a">&#x00E4;,&#x00E5;,&#x00E6;,&#x00E0;,&#x00E1;,&#x00E2;,&#x00E3;,&#x0101;</string>
+    <!-- U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+         U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
          U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
          U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
          U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
          U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
          U+0153: "œ" LATIN SMALL LIGATURE OE
          U+014D: "ō" LATIN SMALL LETTER O WITH MACRON -->
-    <string name="morekeys_o">&#x00F8;,&#x00F4;,&#x00F2;,&#x00F3;,&#x00F5;,&#x0153;,&#x014D;</string>
+    <string name="morekeys_o">&#x00F6;,&#x00F8;,&#x00F4;,&#x00F2;,&#x00F3;,&#x00F5;,&#x0153;,&#x014D;</string>
     <!-- U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS -->
     <string name="morekeys_u">&#x00FC;</string>
     <!-- U+0161: "š" LATIN SMALL LETTER S WITH CARON
diff --git a/tools/make-keyboard-text/res/values-nb/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-nb/donottranslate-more-keys.xml
index c5307a9..37f9f8a 100644
--- a/tools/make-keyboard-text/res/values-nb/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-nb/donottranslate-more-keys.xml
@@ -18,13 +18,15 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+    <!-- U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+         U+00E6: "æ" LATIN SMALL LETTER AE
          U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+         U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
          U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
          U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
          U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
          U+0101: "ā" LATIN SMALL LETTER A WITH MACRON -->
-    <string name="morekeys_a">&#x00E0;,&#x00E4;,&#x00E1;,&#x00E2;,&#x00E3;,&#x0101;</string>
+    <string name="morekeys_a">&#x00E5;,&#x00E6;,&#x00E4;,&#x00E0;,&#x00E1;,&#x00E2;,&#x00E3;,&#x0101;</string>
     <!-- U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
          U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
          U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
@@ -33,14 +35,15 @@
          U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
          U+0113: "ē" LATIN SMALL LETTER E WITH MACRON -->
     <string name="morekeys_e">&#x00E9;,&#x00E8;,&#x00EA;,&#x00EB;,&#x0119;,&#x0117;,&#x0113;</string>
-    <!-- U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+    <!-- U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+         U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+         U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
          U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
          U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
-         U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
          U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
          U+0153: "œ" LATIN SMALL LIGATURE OE
          U+014D: "ō" LATIN SMALL LETTER O WITH MACRON -->
-    <string name="morekeys_o">&#x00F4;,&#x00F2;,&#x00F3;,&#x00F6;,&#x00F5;,&#x0153;,&#x014D;</string>
+    <string name="morekeys_o">&#x00F8;,&#x00F6;,&#x00F4;,&#x00F2;,&#x00F3;,&#x00F5;,&#x0153;,&#x014D;</string>
     <!-- U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
          U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
          U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
diff --git a/tools/make-keyboard-text/res/values-sr-rZZ/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-sr-rZZ/donottranslate-more-keys.xml
new file mode 100644
index 0000000..1168126
--- /dev/null
+++ b/tools/make-keyboard-text/res/values-sr-rZZ/donottranslate-more-keys.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.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE -->
+    <string name="morekeys_e">&#x00E8;</string>
+    <!-- U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE -->
+    <string name="morekeys_i">&#x00EC;</string>
+    <!-- U+0161: "š" LATIN SMALL LETTER S WITH CARON -->
+    <string name="morekeys_s">&#x0161;,%</string>
+    <!-- U+010D: "č" LATIN SMALL LETTER C WITH CARON
+         U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE -->
+    <string name="morekeys_c">&#x010D;,&#x0107;,%</string>
+    <!-- U+0111: "đ" LATIN SMALL LETTER D WITH STROKE -->
+    <string name="morekeys_d">&#x0111;,%</string>
+    <!-- U+017E: "ž" LATIN SMALL LETTER Z WITH CARON -->
+    <string name="morekeys_z">&#x017E;,%</string>
+    <string name="label_go_key">"Idi"</string>
+    <string name="label_send_key">"Šalji"</string>
+    <string name="label_next_key">"Sled"</string>
+    <string name="label_done_key">"Gotov"</string>
+    <string name="label_search_key">"Traži"</string>
+    <string name="label_previous_key">"Preth"</string>
+    <string name="label_pause_key">"Pauza"</string>
+    <string name="label_wait_key">"Čekaj"</string>
+</resources>
diff --git a/tools/make-keyboard-text/res/values-sv/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-sv/donottranslate-more-keys.xml
index ead5140..832e438 100644
--- a/tools/make-keyboard-text/res/values-sv/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-sv/donottranslate-more-keys.xml
@@ -18,12 +18,15 @@
 */
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+    <!-- U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+         U+00E5: "å" LATIN SMALL LETTER A WITH RING
+         U+00E6: "æ" LATIN SMALL LETTER AE
+         U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
          U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
          U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
          U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
          U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE -->
-    <string name="morekeys_a">&#x00E1;,&#x00E0;,&#x00E2;,&#x0105;,&#x00E3;</string>
+    <string name="morekeys_a">&#x00E4;,&#x00E5;,&#x00E6;,&#x00E1;,&#x00E0;,&#x00E2;,&#x0105;,&#x00E3;</string>
     <!-- U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
          U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
          U+010D: "č" LATIN SMALL LETTER C WITH CARON -->
@@ -48,12 +51,15 @@
          U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
          U+0148: "ň" LATIN SMALL LETTER N WITH CARON -->
     <string name="morekeys_n">&#x0144;,&#x00F1;,&#x0148;</string>
-    <!-- U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+    <!-- U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+         U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+         U+0153: "œ" LATIN SMALL LIGATURE OE
+         U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
          U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
          U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
          U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
          U+014D: "ō" LATIN SMALL LETTER O WITH MACRON -->
-    <string name="morekeys_o">&#x00F3;,&#x00F2;,&#x00F4;,&#x00F5;,&#x014D;</string>
+    <string name="morekeys_o">&#x00F6;,&#x00F8;,&#x0153;,&#x00F3;,&#x00F2;,&#x00F4;,&#x00F5;,&#x014D;</string>
     <!-- U+0159: "ř" LATIN SMALL LETTER R WITH CARON -->
     <string name="morekeys_r">&#x0159;</string>
     <!-- U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE