diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Bulgarian.java b/tests/src/com/android/inputmethod/keyboard/layout/Bulgarian.java
new file mode 100644
index 0000000..a1ad549
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Bulgarian.java
@@ -0,0 +1,105 @@
+/*
+ * 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.EastSlavic.EastSlavicCustomizer;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+public final class Bulgarian extends LayoutBase {
+    private static final String LAYOUT_NAME = "bulgarian";
+
+    public Bulgarian(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    public static class BulgarianCustomizer extends LayoutCustomizer {
+        private final EastSlavicCustomizer mEastSlavicCustomizer;
+
+        public BulgarianCustomizer(final Locale locale) {
+            super(locale);
+            mEastSlavicCustomizer = new EastSlavicCustomizer(locale);
+        }
+
+        @Override
+        public ExpectedKey getAlphabetKey() {
+            return mEastSlavicCustomizer.getAlphabetKey();
+        }
+
+        @Override
+        public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) { return ALPHABET_COMMON; }
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    // U+044F: "я" CYRILLIC SMALL LETTER YA
+                    key("\u044F", moreKey("1")),
+                    // U+0432: "в" CYRILLIC SMALL LETTER VE
+                    key("\u0432", moreKey("2")),
+                    // U+0435: "е" CYRILLIC SMALL LETTER IE
+                    key("\u0435", moreKey("3")),
+                    // U+0440: "р" CYRILLIC SMALL LETTER ER
+                    key("\u0440", moreKey("4")),
+                    // U+0442: "т" CYRILLIC SMALL LETTER TE
+                    key("\u0442", moreKey("5")),
+                    // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+                    key("\u044A", moreKey("6")),
+                    // U+0443: "у" CYRILLIC SMALL LETTER U
+                    key("\u0443", moreKey("7")),
+                    // U+0438: "и" CYRILLIC SMALL LETTER I
+                    // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
+                    key("\u0438", joinMoreKeys("8", "\u045D")),
+                    // U+043E: "о" CYRILLIC SMALL LETTER O
+                    key("\u043E", moreKey("9")),
+                    // U+043F: "п" CYRILLIC SMALL LETTER PE
+                    key("\u043F", moreKey("0")),
+                    // U+0447: "ч" CYRILLIC SMALL LETTER CHE
+                    key("\u0447"))
+            // U+0430: "а" CYRILLIC SMALL LETTER A
+            // U+0441: "с" CYRILLIC SMALL LETTER ES
+            // U+0434: "д" CYRILLIC SMALL LETTER DE
+            // U+0444: "ф" CYRILLIC SMALL LETTER EF
+            // U+0433: "г" CYRILLIC SMALL LETTER GHE
+            // U+0445: "х" CYRILLIC SMALL LETTER HA
+            // U+0439: "й" CYRILLIC SMALL LETTER SHORT I
+            // U+043A: "к" CYRILLIC SMALL LETTER KA
+            // U+043B: "л" CYRILLIC SMALL LETTER EL
+            // U+0448: "ш" CYRILLIC SMALL LETTER SHA
+            // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+            .setLabelsOfRow(2,
+                    "\u0430", "\u0441", "\u0434", "\u0444", "\u0433", "\u0445", "\u0439", "\u043A",
+                    "\u043B", "\u0448", "\u0449")
+            // U+0437: "з" CYRILLIC SMALL LETTER ZE
+            // U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN
+            // U+0446: "ц" CYRILLIC SMALL LETTER TSE
+            // U+0436: "ж" CYRILLIC SMALL LETTER ZHE
+            // U+0431: "б" CYRILLIC SMALL LETTER BE
+            // U+043D: "н" CYRILLIC SMALL LETTER EN
+            // U+043C: "м" CYRILLIC SMALL LETTER EM
+            // U+044E: "ю" CYRILLIC SMALL LETTER YU
+            .setLabelsOfRow(3,
+                    "\u0437", "\u044C", "\u0446", "\u0436", "\u0431", "\u043D", "\u043C", "\u044E")
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/BulgarianBds.java b/tests/src/com/android/inputmethod/keyboard/layout/BulgarianBds.java
new file mode 100644
index 0000000..b47b592
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/BulgarianBds.java
@@ -0,0 +1,97 @@
+/*
+ * 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.EastSlavic.EastSlavicCustomizer;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+public final class BulgarianBds extends LayoutBase {
+    private static final String LAYOUT_NAME = "bulgarian_bds";
+
+    public BulgarianBds(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    public static class BulgarianBdsCustomizer extends EastSlavicCustomizer {
+        public BulgarianBdsCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) { return ALPHABET_COMMON; }
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    // U+0443: "у" CYRILLIC SMALL LETTER U
+                    key("\u0443", moreKey("1")),
+                    // U+0435: "е" CYRILLIC SMALL LETTER IE
+                    key("\u0435", moreKey("2")),
+                    // U+0438: "и" CYRILLIC SMALL LETTER I
+                    // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
+                    key("\u0438", joinMoreKeys("3", "\u045D")),
+                    // U+0448: "ш" CYRILLIC SMALL LETTER SHA
+                    key("\u0448", moreKey("4")),
+                    // U+0449: "щ" CYRILLIC SMALL LETTER SHCHA
+                    key("\u0449", moreKey("5")),
+                    // U+043A: "к" CYRILLIC SMALL LETTER KA
+                    key("\u043A", moreKey("6")),
+                    // U+0441: "с" CYRILLIC SMALL LETTER ES
+                    key("\u0441", moreKey("7")),
+                    // U+0434: "д" CYRILLIC SMALL LETTER DE
+                    key("\u0434", moreKey("8")),
+                    // U+0437: "з" CYRILLIC SMALL LETTER ZE
+                    key("\u0437", moreKey("9")),
+                    // U+0446: "ц" CYRILLIC SMALL LETTER TSE
+                    key("\u0446", moreKey("0")),
+                    // U+0431: "б" CYRILLIC SMALL LETTER BE
+                    key("\u0431"))
+            // U+044C: "ь" CYRILLIC SMALL LETTER SOFT SIGN
+            // U+044F: "я" CYRILLIC SMALL LETTER YA
+            // U+0430: "а" CYRILLIC SMALL LETTER A
+            // U+043E: "о" CYRILLIC SMALL LETTER O
+            // U+0436: "ж" CYRILLIC SMALL LETTER ZHE
+            // U+0433: "г" CYRILLIC SMALL LETTER GHE
+            // U+0442: "т" CYRILLIC SMALL LETTER TE
+            // U+043D: "н" CYRILLIC SMALL LETTER EN
+            // U+0432: "в" CYRILLIC SMALL LETTER VE
+            // U+043C: "м" CYRILLIC SMALL LETTER EM
+            // U+0447: "ч" CYRILLIC SMALL LETTER CHE
+            .setLabelsOfRow(2,
+                    "\u044C", "\u044F", "\u0430", "\u043E", "\u0436", "\u0433", "\u0442", "\u043D",
+                    "\u0432", "\u043C", "\u0447")
+            // U+044E: "ю" CYRILLIC SMALL LETTER YU
+            // U+0439: "й" CYRILLIC SMALL LETTER SHORT I
+            // U+044A: "ъ" CYRILLIC SMALL LETTER HARD SIGN
+            // U+044D: "э" CYRILLIC SMALL LETTER E
+            // U+0444: "ф" CYRILLIC SMALL LETTER EF
+            // U+0445: "х" CYRILLIC SMALL LETTER HA
+            // U+043F: "п" CYRILLIC SMALL LETTER PE
+            // U+0440: "р" CYRILLIC SMALL LETTER ER
+            // U+043B: "л" CYRILLIC SMALL LETTER EL
+            .setLabelsOfRow(3,
+                    "\u044E", "\u0439", "\u044A", "\u044D", "\u0444", "\u0445", "\u043F", "\u0440",
+                    "\u043B")
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Greek.java b/tests/src/com/android/inputmethod/keyboard/layout/Greek.java
new file mode 100644
index 0000000..762170b
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Greek.java
@@ -0,0 +1,148 @@
+/*
+ * 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.KeyboardId;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+/**
+ * The Greek alphabet keyboard.
+ */
+public final class Greek extends LayoutBase {
+    private static final String LAYOUT_NAME = "greek";
+
+    public Greek(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    public static class GreekCustomizer extends EuroLayoutCustomizer {
+        public GreekCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey getAlphabetKey() { return GREEK_ALPHABET_KEY; }
+
+        // U+0391: "Α" GREEK CAPITAL LETTER ALPHA
+        // U+0392: "Β" GREEK CAPITAL LETTER BETA
+        // U+0393: "Γ" GREEK CAPITAL LETTER GAMMA
+        private static final ExpectedKey GREEK_ALPHABET_KEY = key(
+                "\u0391\u0392\u0393", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
+        final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
+        builder.replaceKeyOfLabel(ROW1_1, ROW1_1_SEMICOLON);
+        builder.replaceKeyOfLabel(ROW1_2, ROW1_2_FINAL_SIGMA);
+        return builder.build();
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetShiftLayout(final boolean isPhone, final int elementId) {
+        final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
+        builder.toUpperCase(getLocale());
+        if (elementId == KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED
+                || elementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED) {
+            builder.replaceKeyOfLabel(ROW1_1, ROW1_1_COLON);
+        } else {
+            builder.replaceKeyOfLabel(ROW1_1, ROW1_1_SEMICOLON);
+        }
+        builder.replaceKeyOfLabel(ROW1_2, ROW1_2_FINAL_SIGMA);
+        return builder.build();
+    }
+
+    private static final String ROW1_1 = "ROW1_1";
+    private static final ExpectedKey ROW1_1_SEMICOLON = key(";", joinMoreKeys("1", ":"));
+    private static final ExpectedKey ROW1_1_COLON = key(":", joinMoreKeys("1", ";"));
+
+    private static final String ROW1_2 = "ROW2_2";
+    // U+03C2: "ς" GREEK SMALL LETTER FINAL SIGMA
+    private static final ExpectedKey ROW1_2_FINAL_SIGMA = key("\u03C2", moreKey("2"));
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    key(ROW1_1, moreKey("1")),
+                    key(ROW1_2, moreKey("2")),
+                    // U+03B5: "ε" GREEK SMALL LETTER EPSILON
+                    // U+03AD: "έ" GREEK SMALL LETTER EPSILON WITH TONOS
+                    key("\u03B5", joinMoreKeys("3", "\u03AD")),
+                    // U+03C1: "ρ" GREEK SMALL LETTER RHO
+                    key("\u03C1", moreKey("4")),
+                    // U+03C4: "τ" GREEK SMALL LETTER TAU
+                    key("\u03C4", moreKey("5")),
+                    // U+03C5: "υ" GREEK SMALL LETTER UPSILON
+                    // U+03CD: "ύ" GREEK SMALL LETTER UPSILON WITH TONOS
+                    // U+03CB: "ϋ" GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+                    // U+03B0: "ΰ" GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+                    key("\u03C5", joinMoreKeys("6", "\u03CD", "\u03CB", "\u03B0")),
+                    // U+03B8: "θ" GREEK SMALL LETTER THETA
+                    key("\u03B8", moreKey("7")),
+                    // U+03B9: "ι" GREEK SMALL LETTER IOTA
+                    // U+03AF: "ί" GREEK SMALL LETTER IOTA WITH TONOS
+                    // U+03CA: "ϊ" GREEK SMALL LETTER IOTA WITH DIALYTIKA
+                    // U+0390: "ΐ" GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+                    key("\u03B9", joinMoreKeys("8", "\u03AF", "\u03CA", "\u0390")),
+                    // U+03BF: "ο" GREEK SMALL LETTER OMICRON
+                    // U+03CC: "ό" GREEK SMALL LETTER OMICRON WITH TONOS
+                    key("\u03BF", joinMoreKeys("9", "\u03CC")),
+                    // U+03C0: "π" GREEK SMALL LETTER PI
+                    key("\u03C0", moreKey("0")))
+            .setKeysOfRow(2,
+                    // U+03B1: "α" GREEK SMALL LETTER ALPHA
+                    // U+03AC: "ά" GREEK SMALL LETTER ALPHA WITH TONOS
+                    key("\u03B1", moreKey("\u03AC")),
+                    // U+03C3: "σ" GREEK SMALL LETTER SIGMA
+                    key("\u03C3"),
+                    // U+03B4: "δ" GREEK SMALL LETTER DELTA
+                    key("\u03B4"),
+                    // U+03C6: "φ" GREEK SMALL LETTER PHI
+                    key("\u03C6"),
+                    // U+03B3: "γ" GREEK SMALL LETTER GAMMA
+                    key("\u03B3"),
+                    // U+03B7: "η" GREEK SMALL LETTER ETA
+                    // U+03AE: "ή" GREEK SMALL LETTER ETA WITH TONOS
+                    key("\u03B7", moreKey("\u03AE")),
+                    // U+03BE: "ξ" GREEK SMALL LETTER XI
+                    key("\u03BE"),
+                    // U+03BA: "κ" GREEK SMALL LETTER KAPPA
+                    key("\u03BA"),
+                    // U+03BB: "λ" GREEK SMALL LETTER LAMDA
+                    key("\u03BB"))
+            .setKeysOfRow(3,
+                    // U+03B6: "ζ" GREEK SMALL LETTER ZETA
+                    key("\u03B6"),
+                    // U+03C7: "χ" GREEK SMALL LETTER CHI
+                    key("\u03C7"),
+                    // U+03C8: "ψ" GREEK SMALL LETTER PSI
+                    key("\u03C8"),
+                    // U+03C9: "ω" GREEK SMALL LETTER OMEGA
+                    // U+03CE: "ώ" GREEK SMALL LETTER OMEGA WITH TONOS
+                    key("\u03C9", moreKey("\u03CE")),
+                    // U+03B2: "β" GREEK SMALL LETTER BETA
+                    key("\u03B2"),
+                    // U+03BD: "ν" GREEK SMALL LETTER NU
+                    key("\u03BD"),
+                    // U+03BC: "μ" GREEK SMALL LETTER MU
+                    key("\u03BC"))
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Nordic.java b/tests/src/com/android/inputmethod/keyboard/layout/Nordic.java
new file mode 100644
index 0000000..a535ad2
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Nordic.java
@@ -0,0 +1,58 @@
+/*
+ * 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;
+
+/**
+ * The Nordic alphabet keyboard.
+ */
+public final class Nordic extends LayoutBase {
+    private static final String LAYOUT_NAME = "nordic";
+
+    public Nordic(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";
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    key("q", moreKey("1")),
+                    key("w", moreKey("2")),
+                    key("e", moreKey("3")),
+                    key("r", moreKey("4")),
+                    key("t", moreKey("5")),
+                    key("y", moreKey("6")),
+                    key("u", moreKey("7")),
+                    key("i", moreKey("8")),
+                    key("o", moreKey("9")),
+                    key("p", moreKey("0")),
+                    key(ROW1_11))
+            .setLabelsOfRow(2, "a", "s", "d", "f", "g", "h", "j", "k", "l", ROW2_10, ROW2_11)
+            .setLabelsOfRow(3, "z", "x", "c", "v", "b", "n", "m")
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
index 4070837..a0da7e3 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
@@ -36,17 +36,17 @@
     ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) { return ALPHABET_COMMON; }
 
     private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
-            .setLabelsOfRow(1, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p")
-            .setMoreKeysOf("q", "1")
-            .setMoreKeysOf("w", "2")
-            .setMoreKeysOf("e", "3")
-            .setMoreKeysOf("r", "4")
-            .setMoreKeysOf("t", "5")
-            .setMoreKeysOf("y", "6")
-            .setMoreKeysOf("u", "7")
-            .setMoreKeysOf("i", "8")
-            .setMoreKeysOf("o", "9")
-            .setMoreKeysOf("p", "0")
+            .setKeysOfRow(1,
+                    key("q", moreKey("1")),
+                    key("w", moreKey("2")),
+                    key("e", moreKey("3")),
+                    key("r", moreKey("4")),
+                    key("t", moreKey("5")),
+                    key("y", moreKey("6")),
+                    key("u", moreKey("7")),
+                    key("i", moreKey("8")),
+                    key("o", moreKey("9")),
+                    key("p", moreKey("0")))
             .setLabelsOfRow(2, "a", "s", "d", "f", "g", "h", "j", "k", "l")
             .setLabelsOfRow(3, "z", "x", "c", "v", "b", "n", "m")
             .build();
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Qwertz.java b/tests/src/com/android/inputmethod/keyboard/layout/Qwertz.java
new file mode 100644
index 0000000..25f4734
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Qwertz.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.keyboard.layout;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+public final class Qwertz extends LayoutBase {
+    private static final String LAYOUT_NAME = "qwertz";
+
+    public Qwertz(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; }
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    key("q", moreKey("1")),
+                    key("w", moreKey("2")),
+                    key("e", moreKey("3")),
+                    key("r", moreKey("4")),
+                    key("t", moreKey("5")),
+                    key("z", moreKey("6")),
+                    key("u", moreKey("7")),
+                    key("i", moreKey("8")),
+                    key("o", moreKey("9")),
+                    key("p", moreKey("0")))
+            .setLabelsOfRow(2, "a", "s", "d", "f", "g", "h", "j", "k", "l")
+            .setLabelsOfRow(3, "y", "x", "c", "v", "b", "n", "m")
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/SouthSlavic.java b/tests/src/com/android/inputmethod/keyboard/layout/SouthSlavic.java
new file mode 100644
index 0000000..ad226dd
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/SouthSlavic.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;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+public final class SouthSlavic extends LayoutBase {
+    private static final String LAYOUT_NAME = "south_slavic";
+
+    public SouthSlavic(final LayoutCustomizer customizer) {
+        super(customizer, Symbols.class, SymbolsShifted.class);
+    }
+
+    @Override
+    public String getName() { return LAYOUT_NAME; }
+
+    public static class SouthSlavicLayoutCustomizer extends LayoutCustomizer {
+        public SouthSlavicLayoutCustomizer(final Locale locale) {
+            super(locale);
+        }
+
+        @Override
+        public final ExpectedKey getAlphabetKey() { return SOUTH_SLAVIC_ALPHABET_KEY; }
+
+        @Override
+        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+            return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
+        }
+
+        // U+0410: "А" CYRILLIC CAPITAL LETTER A
+        // U+0411: "Б" CYRILLIC CAPITAL LETTER BE
+        // U+0412: "В" CYRILLIC CAPITAL LETTER VE
+        private static final ExpectedKey SOUTH_SLAVIC_ALPHABET_KEY = key(
+                "\u0410\u0411\u0412", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+    }
+
+    @Override
+    ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) { return ALPHABET_COMMON; }
+
+    public static final String ROW1_6 = "ROW1_6";
+    public static final String ROW2_11 = "ROW2_11";
+    public static final String ROW3_1 = "ROW3_1";
+    public static final String ROW3_8 = "ROW3_8";
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    // U+0459: "љ" CYRILLIC SMALL LETTER LJE
+                    key("\u0459", moreKey("1")),
+                    // U+045A: "њ" CYRILLIC SMALL LETTER NJE
+                    key("\u045A", moreKey("2")),
+                    // U+0435: "е" CYRILLIC SMALL LETTER IE
+                    key("\u0435", moreKey("3")),
+                    // U+0440: "р" CYRILLIC SMALL LETTER ER
+                    key("\u0440", moreKey("4")),
+                    // U+0442: "т" CYRILLIC SMALL LETTER TE
+                    key("\u0442", moreKey("5")),
+                    key(ROW1_6, moreKey("6")),
+                    // U+0443: "у" CYRILLIC SMALL LETTER U
+                    key("\u0443", moreKey("7")),
+                    // U+0438: "и" CYRILLIC SMALL LETTER I
+                    key("\u0438", moreKey("8")),
+                    // U+043E: "о" CYRILLIC SMALL LETTER O
+                    key("\u043E", moreKey("9")),
+                    // U+043F: "п" CYRILLIC SMALL LETTER PE
+                    key("\u043F", moreKey("0")),
+                    // U+0448: "ш" CYRILLIC SMALL LETTER SHA
+                    key("\u0448"))
+            // U+0430: "а" CYRILLIC SMALL LETTER A
+            // U+0441: "с" CYRILLIC SMALL LETTER ES
+            // U+0434: "д" CYRILLIC SMALL LETTER DE
+            // U+0444: "ф" CYRILLIC SMALL LETTER EF
+            // U+0433: "г" CYRILLIC SMALL LETTER GHE
+            // U+0445: "х" CYRILLIC SMALL LETTER HA
+            // U+0458: "ј" CYRILLIC SMALL LETTER JE
+            // U+043A: "к" CYRILLIC SMALL LETTER KA
+            // U+043B: "л" CYRILLIC SMALL LETTER EL
+            // U+0447: "ч" CYRILLIC SMALL LETTER CHE
+            .setLabelsOfRow(2,
+                    "\u0430", "\u0441", "\u0434", "\u0444", "\u0433", "\u0445", "\u0458", "\u043A",
+                    "\u043B", "\u0447", ROW2_11)
+            // U+045F: "џ" CYRILLIC SMALL LETTER DZHE
+            // U+0446: "ц" CYRILLIC SMALL LETTER TSE
+            // U+0432: "в" CYRILLIC SMALL LETTER VE
+            // U+0431: "б" CYRILLIC SMALL LETTER BE
+            // U+043D: "н" CYRILLIC SMALL LETTER EN
+            // U+043C: "м" CYRILLIC SMALL LETTER EM
+            // U+0436: "ж" CYRILLIC SMALL LETTER ZHE
+            .setLabelsOfRow(3,
+                    ROW3_1, "\u045F", "\u0446", "\u0432", "\u0431", "\u043D", "\u043C", ROW3_8,
+                    "\u0436")
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Spanish.java b/tests/src/com/android/inputmethod/keyboard/layout/Spanish.java
new file mode 100644
index 0000000..5ccc364
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Spanish.java
@@ -0,0 +1,52 @@
+/*
+ * 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 Spanish extends LayoutBase {
+    private static final String LAYOUT_NAME = "spanish";
+
+    public Spanish(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 ROW2_10 = "ROW2_10";
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    key("q", moreKey("1")),
+                    key("w", moreKey("2")),
+                    key("e", moreKey("3")),
+                    key("r", moreKey("4")),
+                    key("t", moreKey("5")),
+                    key("y", moreKey("6")),
+                    key("u", moreKey("7")),
+                    key("i", moreKey("8")),
+                    key("o", moreKey("9")),
+                    key("p", moreKey("0")))
+            .setLabelsOfRow(2, "a", "s", "d", "f", "g", "h", "j", "k", "l", ROW2_10)
+            .setLabelsOfRow(3, "z", "x", "c", "v", "b", "n", "m")
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Swiss.java b/tests/src/com/android/inputmethod/keyboard/layout/Swiss.java
new file mode 100644
index 0000000..5bc45d4
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Swiss.java
@@ -0,0 +1,55 @@
+/*
+ * 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 Swiss extends LayoutBase {
+    private static final String LAYOUT_NAME = "swiss";
+
+    public Swiss(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";
+
+    private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
+            .setKeysOfRow(1,
+                    key("q", moreKey("1")),
+                    key("w", moreKey("2")),
+                    key("e", moreKey("3")),
+                    key("r", moreKey("4")),
+                    key("t", moreKey("5")),
+                    key("z", moreKey("6")),
+                    key("u", moreKey("7")),
+                    key("i", moreKey("8")),
+                    key("o", moreKey("9")),
+                    key("p", moreKey("0")),
+                    key(ROW1_11))
+            .setLabelsOfRow(2, "a", "s", "d", "f", "g", "h", "j", "k", "l", ROW2_10, ROW2_11)
+            .setLabelsOfRow(3, "y", "x", "c", "v", "b", "n", "m")
+            .build();
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarian.java
new file mode 100644
index 0000000..ded8d72
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarian.java
@@ -0,0 +1,37 @@
+/*
+ * 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.Bulgarian;
+import com.android.inputmethod.keyboard.layout.Bulgarian.BulgarianCustomizer;
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+
+import java.util.Locale;
+
+/**
+ * bg: TestsBulgarian/bulgarian
+ */
+@SmallTest
+public final class TestsBulgarian extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("bg");
+    private static final LayoutBase LAYOUT = new Bulgarian(new BulgarianCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarianBds.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarianBds.java
new file mode 100644
index 0000000..22b2011
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarianBds.java
@@ -0,0 +1,37 @@
+/*
+ * 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.BulgarianBds;
+import com.android.inputmethod.keyboard.layout.BulgarianBds.BulgarianBdsCustomizer;
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+
+import java.util.Locale;
+
+/**
+ * bg: Bulgarian/bulgarian_bds
+ */
+@SmallTest
+public final class TestsBulgarianBds extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("bg");
+    private static final LayoutBase LAYOUT = new BulgarianBds(new BulgarianBdsCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java
new file mode 100644
index 0000000..ec03f0d
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java
@@ -0,0 +1,124 @@
+/*
+ * 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.LayoutBase.EuroLayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * ca: Catalan/spanish
+ */
+@SmallTest
+public class TestsCatalan extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("ca");
+    private static final LayoutBase LAYOUT = new Spanish(new CatalanCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class CatalanCustomizer extends EuroLayoutCustomizer {
+        public CatalanCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) {
+            return isPhone ? PHONE_PUNCTUATION_MORE_KEYS
+                    : TABLET_PUNCTUATION_MORE_KEYS;
+        }
+
+        // U+00B7: "·" MIDDLE DOT
+        private static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
+                ";", "/", "(", ")", "#", "\u00B7", "!", ",", "?",
+                "&", "%", "+", "\"", "-", ":", "'", "@");
+
+        private static final ExpectedKey[] TABLET_PUNCTUATION_MORE_KEYS = joinKeys(
+                ";", "/", "(", ")", "#", "\u00B7", "'", ",",
+                "&", "%", "+", "\"", "-", ":", "@");
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+                    // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+                    // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+                    // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+                    .setMoreKeysOf("e",
+                            "3", "\u00E8", "\u00E9", "\u00EB", "\u00EA", "\u0119", "\u0117",
+                            "\u0113")
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "7", "\u00FA", "\u00FC", "\u00F9", "\u00FB", "\u016B")
+                    // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+                    // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+                    // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                    // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+                    // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+                    // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+                    .setMoreKeysOf("i",
+                            "8", "\u00ED", "\u00EF", "\u00EC", "\u00EE", "\u012F", "\u012B")
+                    // 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+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+                    .setMoreKeysOf("o",
+                            "9", "\u00F2", "\u00F3", "\u00F6", "\u00F4", "\u00F5", "\u00F8",
+                            "\u0153", "\u014D", "\u00BA")
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // 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+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+                    .setMoreKeysOf("a",
+                            "\u00E0", "\u00E1", "\u00E4", "\u00E2", "\u00E3", "\u00E5", "\u0105",
+                            "\u00E6", "\u0101", "\u00AA")
+                    // U+00B7: "·" MIDDLE DOT
+                    // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+                    .setMoreKeysOf("l", "l\u00B7l", "\u0142")
+                    // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+                    .replaceKeyOfLabel(Spanish.ROW2_10, key("\u00E7"))
+                    // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+                    // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                    // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                    .setMoreKeysOf("c", "\u00E7", "\u0107", "\u010D")
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                    .setMoreKeysOf("n", "\u00F1", "\u0144");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCroatian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCroatian.java
new file mode 100644
index 0000000..cf76de5
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCroatian.java
@@ -0,0 +1,78 @@
+/*
+ * 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.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Qwertz;
+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;
+
+/**
+ * hr: Croatian/qwertz
+ */
+@SmallTest
+public final class TestsCroatian extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("hr");
+    private static final LayoutBase LAYOUT = new Qwertz(new CroatianCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class CroatianCustomizer extends LayoutCustomizer {
+        public CroatianCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_L9R; }
+
+        @Override
+        public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_L9R; }
+
+        @Override
+        public ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+                    // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+                    // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+                    .setMoreKeysOf("z", "6", "\u017E", "\u017A", "\u017C")
+                    // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+                    // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+                    // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+                    .setMoreKeysOf("s", "\u0161", "\u015B", "\u00DF")
+                    // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+                    .setMoreKeysOf("d", "\u0111")
+                    // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                    // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                    // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+                    .setMoreKeysOf("c", "\u010D", "\u0107", "\u00E7")
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                    .setMoreKeysOf("n", "\u00F1", "\u0144");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCzech.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCzech.java
new file mode 100644
index 0000000..5cf4740
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCzech.java
@@ -0,0 +1,135 @@
+/*
+ * 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.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Qwertz;
+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;
+
+/**
+ * cs: Czech/qwertz
+ */
+@SmallTest
+public final class TestsCzech extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("cs");
+    private static final LayoutBase LAYOUT = new Qwertz(new CzechCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class CzechCustomizer extends LayoutCustomizer {
+        public CzechCustomizer(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 ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // 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+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+                    .setMoreKeysOf("e",
+                            "3", "\u00E9", "\u011B", "\u00E8", "\u00EA", "\u00EB", "\u0119",
+                            "\u0117", "\u0113")
+                    // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+                    .setMoreKeysOf("r", "4", "\u0159")
+                    // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+                    .setMoreKeysOf("t", "5", "\u0165")
+                    // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+                    // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+                    // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+                    .setMoreKeysOf("z", "6", "\u017E", "\u017A", "\u017C")
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u",
+                            "7", "\u00FA", "\u016F", "\u00FB", "\u00FC", "\u00F9", "\u016B")
+                    // 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+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                    // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+                    // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+                    .setMoreKeysOf("i",
+                            "8", "\u00ED", "\u00EE", "\u00EF", "\u00EC", "\u012F", "\u012B")
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // 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+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    .setMoreKeysOf("o",
+                            "9", "\u00F3", "\u00F6", "\u00F4", "\u00F2", "\u00F5", "\u0153",
+                            "\u00F8", "\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+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    .setMoreKeysOf("a",
+                            "\u00E1", "\u00E0", "\u00E2", "\u00E4", "\u00E6", "\u00E3", "\u00E5",
+                            "\u0101")
+                    // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+                    // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+                    // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+                    .setMoreKeysOf("s", "\u0161", "\u00DF", "\u015B")
+                    // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+                    .setMoreKeysOf("d", "\u010F")
+                    // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+                    // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+                    .setMoreKeysOf("y", "\u00FD", "\u00FF")
+                    // 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+0148: "ň" LATIN SMALL LETTER N WITH CARON
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                    .setMoreKeysOf("n", "\u0148", "\u00F1", "\u0144");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanish.java
new file mode 100644
index 0000000..050a0c4
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanish.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.LayoutBase.EuroLayoutCustomizer;
+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;
+
+/**
+ * da: Danish/nordic
+ */
+@SmallTest
+public final class TestsDanish extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("da");
+    private static final LayoutBase LAYOUT = new Nordic(new DanishCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class DanishCustomizer extends EuroLayoutCustomizer {
+        public DanishCustomizer(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 ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+                    .setMoreKeysOf("e", "3", "\u00E9", "\u00EB")
+                    // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+                    // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+                    .setMoreKeysOf("y", "6", "\u00FD", "\u00FF")
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "7", "\u00FA", "\u00FC", "\u00FB", "\u00F9", "\u016B")
+                    // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+                    // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+                    .setMoreKeysOf("i", "8", "\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",
+                            "9", "\u00F3", "\u00F4", "\u00F2", "\u00F5", "\u0153", "\u014D")
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    .replaceKeyOfLabel(Nordic.ROW1_11, key("\u00E5"))
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    .replaceKeyOfLabel(Nordic.ROW2_10, key("\u00E6", moreKey("\u00E4")))
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    .replaceKeyOfLabel(Nordic.ROW2_11, key("\u00F8", moreKey("\u00F6")))
+                    // 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
+                    .setMoreKeysOf("s", "\u00DF", "\u015B", "\u0161")
+                    // U+00F0: "ð" LATIN SMALL LETTER ETH
+                    .setMoreKeysOf("d", "\u00F0")
+                    // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+                    .setMoreKeysOf("l", "\u0142")
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                    .setMoreKeysOf("n", "\u00F1", "\u0144");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEsperanto.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEsperanto.java
new file mode 100644
index 0000000..a54601b
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEsperanto.java
@@ -0,0 +1,181 @@
+/*
+ * 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.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * eo: Esperanto/spanish
+ */
+@SmallTest
+public class TestsEsperanto extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("eo");
+    private static final LayoutBase LAYOUT = new Spanish(new EsperantoCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class EsperantoCustomizer extends LayoutCustomizer {
+        public EsperantoCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+015D: "ŝ" LATIN SMALL LETTER S WITH CIRCUMFLEX
+                    .replaceKeyOfLabel("q", key("\u015D", moreKey("1"), moreKey("q")))
+                    // U+011D: "ĝ" LATIN SMALL LETTER G WITH CIRCUMFLEX
+                    // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
+                    .replaceKeyOfLabel("w", key("\u011D",
+                            moreKey("2"), moreKey("w"), moreKey("\u0175")))
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+011B: "ě" LATIN SMALL LETTER E WITH CARON
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // 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+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+                    .setMoreKeysOf("e",
+                            "3", "\u00E9", "\u011B", "\u00E8", "\u00EA", "\u00EB", "\u0119",
+                            "\u0117", "\u0113")
+                    // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+                    // U+0155: "ŕ" LATIN SMALL LETTER R WITH ACUTE
+                    // U+0157: "ŗ" LATIN SMALL LETTER R WITH CEDILLA
+                    .setMoreKeysOf("r", "4", "\u0159", "\u0155", "\u0157")
+                    // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+                    // U+021B: "ț" LATIN SMALL LETTER T WITH COMMA BELOW
+                    // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+                    // U+0167: "ŧ" LATIN SMALL LETTER T WITH STROKE
+                    .setMoreKeysOf("t", "5", "\u0165", "\u021B", "\u0163", "\u0167")
+                    // U+016D: "ŭ" LATIN SMALL LETTER U WITH BREVE
+                    // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+                    // U+0177: "ŷ" LATIN SMALL LETTER Y WITH CIRCUMFLEX
+                    // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+                    // U+00FE: "þ" LATIN SMALL LETTER THORN
+                    .replaceKeyOfLabel("y", key("\u016D",
+                            moreKey("6"), moreKey("y"), moreKey("\u00FD"), moreKey("\u0177"),
+                            moreKey("\u00FF"), moreKey("\u00FE")))
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+016F: "ů" LATIN SMALL LETTER U WITH RING ABOVE
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    // U+0169: "ũ" LATIN SMALL LETTER U WITH TILDE
+                    // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+                    // U+0173: "ų" LATIN SMALL LETTER U WITH OGONEK
+                    // U+00B5: "µ" MICRO SIGN
+                    .setMoreKeysOf("u",
+                            "7", "\u00FA", "\u016F", "\u00FB", "\u00FC", "\u00F9", "\u016B",
+                            "\u0169", "\u0171", "\u0173", "\u00B5")
+                    // 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+0129: "ĩ" LATIN SMALL LETTER I WITH TILDE
+                    // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                    // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+                    // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+                    // U+0131: "ı" LATIN SMALL LETTER DOTLESS I
+                    // U+0133: "ĳ" LATIN SMALL LIGATURE IJ
+                    .setMoreKeysOf("i",
+                            "8", "\u00ED", "\u00EE", "\u00EF", "\u0129", "\u00EC", "\u012F",
+                            "\u012B", "\u0131", "\u0133")
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // 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+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE ACUTE
+                    // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+                    .setMoreKeysOf("o",
+                            "9", "\u00F3", "\u00F6", "\u00F4", "\u00F2", "\u00F5", "\u0153",
+                            "\u00F8", "\u014D", "\u0151", "\u00BA")
+                    // 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+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    // U+0103: "ă" LATIN SMALL LETTER A WITH BREVE
+                    // U+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+                    // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+                    .setMoreKeysOf("a",
+                            "\u00E1", "\u00E0", "\u00E2", "\u00E4", "\u00E6", "\u00E3", "\u00E5",
+                            "\u0101", "\u0103", "\u0105", "\u00AA")
+                    // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+                    // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+                    // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+                    // U+0219: "ș" LATIN SMALL LETTER S WITH COMMA BELOW
+                    // U+015F: "ş" LATIN SMALL LETTER S WITH CEDILLA
+                    .setMoreKeysOf("s", "\u00DF", "\u0161", "\u015B", "\u0219", "\u015F")
+                    // U+00F0: "ð" LATIN SMALL LETTER ETH
+                    // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+                    // U+0111: "đ" LATIN SMALL LETTER D WITH STROKE
+                    .setMoreKeysOf("d", "\u00F0", "\u010F", "\u0111")
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                    // U+0146: "ņ" LATIN SMALL LETTER N WITH CEDILLA
+                    // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+                    // U+0149: "ŉ" LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+                    // U+014B: "ŋ" LATIN SMALL LETTER ENG
+                    .setMoreKeysOf("n", "\u00F1", "\u0144", "\u0146", "\u0148", "\u0149", "\u014B")
+                    // U+011F: "ğ" LATIN SMALL LETTER G WITH BREVE
+                    // U+0121: "ġ" LATIN SMALL LETTER G WITH DOT ABOVE
+                    // U+0123: "ģ" LATIN SMALL LETTER G WITH CEDILLA
+                    .setMoreKeysOf("g", "\u011F", "\u0121", "\u0123")
+                    // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
+                    // U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE
+                    .setMoreKeysOf("h", "\u0125", "\u0127")
+                    // U+0137: "ķ" LATIN SMALL LETTER K WITH CEDILLA
+                    // U+0138: "ĸ" LATIN SMALL LETTER KRA
+                    .setMoreKeysOf("k", "\u0137", "\u0138")
+                    // U+013A: "ĺ" LATIN SMALL LETTER L WITH ACUTE
+                    // U+013C: "ļ" LATIN SMALL LETTER L WITH CEDILLA
+                    // U+013E: "ľ" LATIN SMALL LETTER L WITH CARON
+                    // U+0140: "ŀ" LATIN SMALL LETTER L WITH MIDDLE DOT
+                    // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+                    .setMoreKeysOf("l", "\u013A", "\u013C", "\u013E", "\u0140", "\u0142")
+                    // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
+                    .replaceKeyOfLabel(Spanish.ROW2_10, key("\u0135"))
+                    // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+                    // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+                    // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+                    .setMoreKeysOf("z", "\u017A", "\u017C", "\u017E")
+                    // U+0109: "ĉ" LATIN SMALL LETTER C WITH CIRCUMFLEX
+                    .replaceKeyOfLabel("x", key("\u0109", moreKey("x")))
+                    // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                    // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                    // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+                    // U+010B: "ċ" LATIN SMALL LETTER C WITH DOT ABOVE
+                    .setMoreKeysOf("c", "\u0107", "\u010D", "\u00E7", "\u010B")
+                    // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
+                    .setMoreKeysOf("v", "w", "\u0175");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java
new file mode 100644
index 0000000..be3786a
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java
@@ -0,0 +1,158 @@
+/*
+ * 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.LayoutBase.EuroLayoutCustomizer;
+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;
+
+/**
+ * et_EE: Estonian (Estonia)/nordic
+ */
+@SmallTest
+public final class TestsEstonianEE extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("et", "EE");
+    private static final LayoutBase LAYOUT = new Nordic(new EstonianEECustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class EstonianEECustomizer extends EuroLayoutCustomizer {
+        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",
+                            "3", "\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", "4", "\u0157", "\u0159", "\u0155")
+                    // U+0163: "ţ" LATIN SMALL LETTER T WITH CEDILLA
+                    // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+                    .setMoreKeysOf("t", "5", "\u0163", "\u0165")
+                    // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+                    // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+                    .setMoreKeysOf("y", "6", "\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",
+                            "7", "\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",
+                            "8", "\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",
+                            "9", "\u00F6", "\u00F5", "\u00F2", "\u00F3", "\u00F4", "\u0153",
+                            "\u0151", "\u00F8")
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    .replaceKeyOfLabel(Nordic.ROW1_11, key("\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, key("\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/TestsFinnish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnish.java
new file mode 100644
index 0000000..20ecd51
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnish.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 android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.LayoutBase.EuroLayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Nordic;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * fi: Finnish/nordic
+ */
+@SmallTest
+public final class TestsFinnish extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("fi");
+    private static final LayoutBase LAYOUT = new Nordic(new FinnishCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class FinnishCustomizer extends EuroLayoutCustomizer {
+        public FinnishCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    .setMoreKeysOf("u", "7", "\u00FC")
+                    // 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",
+                            "9", "\u00F8", "\u00F4", "\u00F2", "\u00F3", "\u00F5", "\u0153",
+                            "\u014D")
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    .replaceKeyOfLabel(Nordic.ROW1_11, key("\u00E5"))
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    .replaceKeyOfLabel(Nordic.ROW2_10, key("\u00F6", moreKey("\u00F8")))
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    .replaceKeyOfLabel(Nordic.ROW2_11, key("\u00E4", moreKey("\u00E6")))
+                    // 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")
+                    // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+                    // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+                    // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+                    .setMoreKeysOf("s", "\u0161", "\u00DF", "\u015B")
+                    // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+                    // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+                    // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+                    .setMoreKeysOf("z", "\u017E", "\u017A", "\u017C");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCH.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCH.java
new file mode 100644
index 0000000..5a56ad1
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCH.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.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Swiss;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * fr_CH: French (Switzerland)/swiss
+ */
+@SmallTest
+public final class TestsFrenchCH extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("fr", "CH");
+    private static final LayoutBase LAYOUT = new Swiss(new FrenchCHCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class FrenchCHCustomizer extends LayoutCustomizer {
+        public FrenchCHCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // 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+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+                    .setMoreKeysOf("e",
+                            "\u00E9", "\u00E8", "\u00EA", "\u00EB", "3", "\u0119", "\u0117",
+                            "\u0113")
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "\u00F9", "\u00FB", "7", "\u00FC", "\u00FA", "\u016B")
+                    // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+                    // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+                    // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                    // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+                    // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+                    // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+                    .setMoreKeysOf("i", "\u00EE", "8", "\u00EF", "\u00EC", "\u00ED", "\u012F",
+                            "\u012B")
+                    // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+                    .setMoreKeysOf("o",
+                            "\u00F4", "\u0153", "9", "\u00F6", "\u00F2", "\u00F3", "\u00F5",
+                            "\u00F8", "\u014D", "\u00BA")
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    .replaceKeyOfLabel(Swiss.ROW1_11, key("\u00E8", moreKey("\u00FC")))
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+                    .setMoreKeysOf("a",
+                            "\u00E0", "\u00E2", "\u00E6", "\u00E1", "\u00E4", "\u00E3", "\u00E5",
+                            "\u0101", "\u00AA")
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    .replaceKeyOfLabel(Swiss.ROW2_10, key("\u00E9", moreKey("\u00F6")))
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    .replaceKeyOfLabel(Swiss.ROW2_11, key("\u00E0", moreKey("\u00E4")))
+                    // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+                    .setMoreKeysOf("y", "\u00FF")
+                    // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+                    // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                    // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                    .setMoreKeysOf("c", "\u00E7", "\u0107", "\u010D");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchQwertz.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchQwertz.java
new file mode 100644
index 0000000..0582b0c
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchQwertz.java
@@ -0,0 +1,101 @@
+/*
+ * 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.LayoutBase.EuroLayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Qwertz;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * fr: French/qwertz
+ */
+@SmallTest
+public final class TestsFrenchQwertz extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("fr");
+    private static final LayoutBase LAYOUT = new Qwertz(new FrenchQwertzCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class FrenchQwertzCustomizer extends EuroLayoutCustomizer {
+        public FrenchQwertzCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // 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+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+                    .setMoreKeysOf("e",
+                            "\u00E9", "\u00E8", "\u00EA", "\u00EB", "3", "\u0119", "\u0117",
+                            "\u0113")
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "\u00F9", "\u00FB", "7", "\u00FC", "\u00FA", "\u016B")
+                    // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+                    // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+                    // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                    // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+                    // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+                    // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+                    .setMoreKeysOf("i", "\u00EE", "8", "\u00EF", "\u00EC", "\u00ED", "\u012F",
+                            "\u012B")
+                    // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+                    .setMoreKeysOf("o",
+                            "\u00F4", "\u0153", "9", "\u00F6", "\u00F2", "\u00F3", "\u00F5",
+                            "\u00F8", "\u014D", "\u00BA")
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+                    .setMoreKeysOf("a",
+                            "\u00E0", "\u00E2", "\u00E6", "\u00E1", "\u00E4", "\u00E3", "\u00E5",
+                            "\u0101", "\u00AA")
+                    // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+                    .setMoreKeysOf("y", "\u00FF")
+                    // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+                    // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                    // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                    .setMoreKeysOf("c", "\u00E7", "\u0107", "\u010D");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGerman.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGerman.java
new file mode 100644
index 0000000..7c12b37
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGerman.java
@@ -0,0 +1,102 @@
+/*
+ * 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.LayoutBase.EuroLayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Qwertz;
+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;
+
+/**
+ * de: German/qwertz
+ */
+@SmallTest
+public final class TestsGerman extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("de");
+    private static final LayoutBase LAYOUT = new Qwertz(new GermanCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class GermanCustomizer extends EuroLayoutCustomizer {
+        public GermanCustomizer(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 ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+                    // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+                    // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    .setMoreKeysOf("e", "3", "\u00E9", "\u00E8", "\u00EA", "\u00EB", "\u0117")
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "7", "\u00FC", "\u00FB", "\u00F9", "\u00FA", "\u016B")
+                    // 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+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    .setMoreKeysOf("o",
+                            "9", "\u00F6", "\u00F4", "\u00F2", "\u00F3", "\u00F5", "\u0153",
+                            "\u00F8", "\u014D")
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    .setMoreKeysOf("a",
+                            "\u00E4", "\u00E2", "\u00E0", "\u00E1", "\u00E6", "\u00E3", "\u00E5",
+                            "\u0101")
+                    // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+                    // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+                    // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+                    .setMoreKeysOf("s", "\u00DF", "\u015B", "\u0161")
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                    .setMoreKeysOf("n", "\u00F1", "\u0144");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanCH.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanCH.java
new file mode 100644
index 0000000..001c3c4
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanCH.java
@@ -0,0 +1,111 @@
+/*
+ * 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.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Swiss;
+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;
+
+/**
+ * de_CH: German (Switzerland)/swiss
+ */
+@SmallTest
+public final class TestsGermanCH extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("de", "CH");
+    private static final LayoutBase LAYOUT = new Swiss(new GermanCHCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class GermanCHCustomizer extends LayoutCustomizer {
+        public GermanCHCustomizer(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 ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+                    // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+                    // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    .setMoreKeysOf("e", "3", "\u00E9", "\u00E8", "\u00EA", "\u00EB", "\u0117")
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "7", "\u00FC", "\u00FB", "\u00F9", "\u00FA", "\u016B")
+                    // 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+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    .setMoreKeysOf("o",
+                            "9", "\u00F6", "\u00F4", "\u00F2", "\u00F3", "\u00F5", "\u0153",
+                            "\u00F8", "\u014D")
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    .replaceKeyOfLabel(Swiss.ROW1_11, key("\u00FC", moreKey("\u00E8")))
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E2: "â" LATIN SMALL LETTER A WITH CIRCUMFLEX
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    .setMoreKeysOf("a",
+                            "\u00E4", "\u00E2", "\u00E0", "\u00E1", "\u00E6", "\u00E3", "\u00E5",
+                            "\u0101")
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    .replaceKeyOfLabel(Swiss.ROW2_10, key("\u00F6", moreKey("\u00E9")))
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    .replaceKeyOfLabel(Swiss.ROW2_11, key("\u00E4", moreKey("\u00E0")))
+                    // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+                    // U+015B: "ś" LATIN SMALL LETTER S WITH ACUTE
+                    // U+0161: "š" LATIN SMALL LETTER S WITH CARON
+                    .setMoreKeysOf("s", "\u00DF", "\u015B", "\u0161")
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                    .setMoreKeysOf("n", "\u00F1", "\u0144");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGreek.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGreek.java
new file mode 100644
index 0000000..4acb119
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGreek.java
@@ -0,0 +1,37 @@
+/*
+ * 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.Greek;
+import com.android.inputmethod.keyboard.layout.Greek.GreekCustomizer;
+import com.android.inputmethod.keyboard.layout.LayoutBase;
+
+import java.util.Locale;
+
+/**
+ * el: Greek/greek
+ */
+@SmallTest
+public class TestsGreek extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("el");
+    private static final LayoutBase LAYOUT = new Greek(new GreekCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHungarian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHungarian.java
new file mode 100644
index 0000000..942c07a
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHungarian.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.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Qwertz;
+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;
+
+/**
+ * hu: Hungarian/qwertz
+ */
+@SmallTest
+public final class TestsHungarian extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("hu");
+    private static final LayoutBase LAYOUT = new Qwertz(new HungarianCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class HungarianCustomizer extends LayoutCustomizer {
+        public HungarianCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_L9R; }
+
+        @Override
+        public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_L9R; }
+
+        @Override
+        public ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // 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+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+                    .setMoreKeysOf("e",
+                            "3", "\u00E9", "\u00E8", "\u00EA", "\u00EB", "\u0119", "\u0117",
+                            "\u0113")
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+0171: "ű" LATIN SMALL LETTER U WITH DOUBLE ACUTE
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "7", "\u00FA", "\u00FC", "\u0171", "\u00FB", "\u00F9",
+                            "\u016B")
+                    // 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+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                    // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+                    // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+                    .setMoreKeysOf("i", "8", "\u00ED", "\u00EE", "\u00EF", "\u00EC", "\u012F",
+                            "\u012B")
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+0151: "ő" LATIN SMALL LETTER O WITH DOUBLE 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+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    .setMoreKeysOf("o",
+                            "9", "\u00F3", "\u00F6", "\u0151", "\u00F4", "\u00F2", "\u00F5",
+                            "\u0153", "\u00F8", "\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+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E3: "ã" LATIN SMALL LETTER A WITH TILDE
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    .setMoreKeysOf("a",
+                            "\u00E1", "\u00E0", "\u00E2", "\u00E4", "\u00E6", "\u00E3", "\u00E5",
+                            "\u0101");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMacedonian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMacedonian.java
new file mode 100644
index 0000000..5202698
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMacedonian.java
@@ -0,0 +1,69 @@
+/*
+ * 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.SouthSlavic;
+import com.android.inputmethod.keyboard.layout.SouthSlavic.SouthSlavicLayoutCustomizer;
+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;
+
+/**
+ * mk: Macedonian/south_slavic
+ */
+@SmallTest
+public final class TestsMacedonian extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("mk");
+    private static final LayoutBase LAYOUT = new SouthSlavic(new MacedonianCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class MacedonianCustomizer extends SouthSlavicLayoutCustomizer {
+        public MacedonianCustomizer(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+0435: "е" CYRILLIC SMALL LETTER IE
+                    // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
+                    .setMoreKeysOf("\u0435", "3", "\u0450")
+                    // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
+                    .replaceKeyOfLabel(SouthSlavic.ROW1_6, key("\u0455", moreKey("6")))
+                    // U+0438: "и" CYRILLIC SMALL LETTER I
+                    // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
+                    .setMoreKeysOf("\u0438", "8", "\u045D")
+                    // U+045C: "ќ" CYRILLIC SMALL LETTER KJE
+                    .replaceKeyOfLabel(SouthSlavic.ROW2_11, key("\u045C"))
+                    // U+0437: "з" CYRILLIC SMALL LETTER ZE
+                    .replaceKeyOfLabel(SouthSlavic.ROW3_1, key("\u0437"))
+                    // U+0453: "ѓ" CYRILLIC SMALL LETTER GJE
+                    .replaceKeyOfLabel(SouthSlavic.ROW3_8, key("\u0453"));
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegian.java
new file mode 100644
index 0000000..d5b904c
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegian.java
@@ -0,0 +1,96 @@
+/*
+ * 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.LayoutBase.LayoutCustomizer;
+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;
+
+/**
+ * nb: Norwegian Bokmål/nordic
+ */
+@SmallTest
+public final class TestsNorwegian extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("nb");
+    private static final LayoutBase LAYOUT = new Nordic(new NorwegianCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class NorwegianCustomizer extends LayoutCustomizer {
+        public NorwegianCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_L9R; }
+
+        @Override
+        public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_L9R; }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // 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+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+                    .setMoreKeysOf("e",
+                            "3", "\u00E9", "\u00E8", "\u00EA", "\u00EB", "\u0119", "\u0117",
+                            "\u0113")
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "7", "\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",
+                            "9", "\u00F4", "\u00F2", "\u00F3", "\u00F6", "\u00F5", "\u0153",
+                            "\u014D")
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    .replaceKeyOfLabel(Nordic.ROW1_11, key("\u00E5"))
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    .replaceKeyOfLabel(Nordic.ROW2_10, key("\u00F8", moreKey("\u00F6")))
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    .replaceKeyOfLabel(Nordic.ROW2_11, key("\u00E6", moreKey("\u00E4")))
+                    // 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");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbian.java
new file mode 100644
index 0000000..119ea14
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbian.java
@@ -0,0 +1,75 @@
+/*
+ * 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.SouthSlavic;
+import com.android.inputmethod.keyboard.layout.SouthSlavic.SouthSlavicLayoutCustomizer;
+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;
+
+/**
+ * sr: Serbian/south_slavic
+ */
+@SmallTest
+public final class TestsSerbian extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("sr");
+    private static final LayoutBase LAYOUT = new SouthSlavic(new SerbianCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class SerbianCustomizer extends SouthSlavicLayoutCustomizer {
+        public SerbianCustomizer(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 ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+0435: "е" CYRILLIC SMALL LETTER IE
+                    // U+0450: "ѐ" CYRILLIC SMALL LETTER IE WITH GRAVE
+                    .setMoreKeysOf("\u0435", "3", "\u0450")
+                    // U+0437: "з" CYRILLIC SMALL LETTER ZE
+                    .replaceKeyOfLabel(SouthSlavic.ROW1_6, key("\u0437", moreKey("6")))
+                    // U+0438: "и" CYRILLIC SMALL LETTER I
+                    // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
+                    .setMoreKeysOf("\u0438", "8", "\u045D")
+                    // U+045B: "ћ" CYRILLIC SMALL LETTER TSHE
+                    .replaceKeyOfLabel(SouthSlavic.ROW2_11, key("\u045B"))
+                    // U+0455: "ѕ" CYRILLIC SMALL LETTER DZE
+                    .replaceKeyOfLabel(SouthSlavic.ROW3_1, key("\u0455"))
+                    // U+0452: "ђ" CYRILLIC SMALL LETTER DJE
+                    .replaceKeyOfLabel(SouthSlavic.ROW3_8, key("\u0452"));
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish.java
new file mode 100644
index 0000000..cc5a64c
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish.java
@@ -0,0 +1,59 @@
+/*
+ * 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.LayoutBase.EuroLayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.keyboard.layout.tests.TestsSpanishUS.SpanishUSCustomizer;
+
+import java.util.Locale;
+
+/**
+ * es: Spanish/spanish
+ */
+@SmallTest
+public class TestsSpanish extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("es");
+    private static final LayoutBase LAYOUT = new Spanish(new SpanishESCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class SpanishESCustomizer extends EuroLayoutCustomizer {
+        private final SpanishUSCustomizer mSpanishUSCustomizer;
+
+        public SpanishESCustomizer(final Locale locale) {
+            super(locale);
+            mSpanishUSCustomizer = new SpanishUSCustomizer(locale);
+        }
+
+        @Override
+        public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) {
+            return mSpanishUSCustomizer.getPunctuationMoreKeys(isPhone);
+        }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return mSpanishUSCustomizer.setAccentedLetters(builder);
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanishUS.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanishUS.java
new file mode 100644
index 0000000..517db9d
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanishUS.java
@@ -0,0 +1,120 @@
+/*
+ * 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.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * es_US: Spanish (United States)/spanish
+ */
+@SmallTest
+public class TestsSpanishUS extends TestsSpanish {
+    private static final Locale LOCALE = new Locale("es", "US");
+    private static final LayoutBase LAYOUT = new Spanish(new SpanishUSCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    // Make this as generic Spanish customizer.
+    static class SpanishUSCustomizer extends LayoutCustomizer {
+        public SpanishUSCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) {
+            return isPhone ? PHONE_PUNCTUATION_MORE_KEYS
+                    : LayoutBase.TABLET_PUNCTUATION_MORE_KEYS;
+        }
+
+        // Punctuation more keys for phone form factor.
+        private static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
+                // U+00A1: "¡" INVERTED EXCLAMATION MARK
+                // U+00BF: "¿" INVERTED QUESTION MARK
+                "\u00A1", ";", "/", "(", ")", "#", "!", ",", "?",
+                "\u00BF", "&", "%", "+", "\"", "-", ":", "'", "@");
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+                    // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+                    // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+                    // U+0117: "ė" LATIN SMALL LETTER E WITH DOT ABOVE
+                    // U+0113: "ē" LATIN SMALL LETTER E WITH MACRON
+                    .setMoreKeysOf("e",
+                            "3", "\u00E9", "\u00E8", "\u00EB", "\u00EA", "\u0119", "\u0117",
+                            "\u0113")
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "7", "\u00FA", "\u00FC", "\u00F9", "\u00FB", "\u016B")
+                    // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+                    // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+                    // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                    // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+                    // U+012F: "į" LATIN SMALL LETTER I WITH OGONEK
+                    // U+012B: "ī" LATIN SMALL LETTER I WITH MACRON
+                    .setMoreKeysOf("i", "8", "\u00ED", "\u00EF", "\u00EC", "\u00EE", "\u012F",
+                            "\u012B")
+                    // U+00F3: "ó" LATIN SMALL LETTER O WITH ACUTE
+                    // U+00F2: "ò" LATIN SMALL LETTER O WITH GRAVE
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F4: "ô" LATIN SMALL LETTER O WITH CIRCUMFLEX
+                    // U+00F5: "õ" LATIN SMALL LETTER O WITH TILDE
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    // U+014D: "ō" LATIN SMALL LETTER O WITH MACRON
+                    // U+00BA: "º" MASCULINE ORDINAL INDICATOR
+                    .setMoreKeysOf("o",
+                            "9", "\u00F3", "\u00F2", "\u00F6", "\u00F4", "\u00F5", "\u00F8",
+                            "\u0153", "\u014D", "\u00BA")
+                    // U+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                    // U+00E0: "à" LATIN SMALL LETTER A WITH GRAVE
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // 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+0105: "ą" LATIN SMALL LETTER A WITH OGONEK
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    // U+0101: "ā" LATIN SMALL LETTER A WITH MACRON
+                    // U+00AA: "ª" FEMININE ORDINAL INDICATOR
+                    .setMoreKeysOf("a",
+                            "\u00E1", "\u00E0", "\u00E4", "\u00E2", "\u00E3", "\u00E5", "\u0105",
+                            "\u00E6", "\u0101", "\u00AA")
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    .replaceKeyOfLabel(Spanish.ROW2_10, key("\u00F1"))
+                    // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+                    // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                    // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                    .setMoreKeysOf("c", "\u00E7", "\u0107", "\u010D")
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                    .setMoreKeysOf("n", "\u00F1", "\u0144");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedish.java
new file mode 100644
index 0000000..14155cb
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedish.java
@@ -0,0 +1,124 @@
+/*
+ * 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.LayoutBase.EuroLayoutCustomizer;
+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;
+
+/**
+ * sv: Swedish/nordic
+ */
+@SmallTest
+public final class TestsSwedish extends LayoutTestsBase {
+    private static final Locale LOCALE = new Locale("sv");
+    private static final LayoutBase LAYOUT = new Nordic(new SwedishCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class SwedishCustomizer extends EuroLayoutCustomizer {
+        public SwedishCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_RL; }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return builder
+                    // U+00E9: "é" LATIN SMALL LETTER E WITH ACUTE
+                    // U+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                    // U+00EA: "ê" LATIN SMALL LETTER E WITH CIRCUMFLEX
+                    // U+00EB: "ë" LATIN SMALL LETTER E WITH DIAERESIS
+                    // U+0119: "ę" LATIN SMALL LETTER E WITH OGONEK
+                    .setMoreKeysOf("e", "3", "\u00E9", "\u00E8", "\u00EA", "\u00EB", "\u0119")
+                    // U+0159: "ř" LATIN SMALL LETTER R WITH CARON
+                    .setMoreKeysOf("r", "4", "\u0159")
+                    // U+0165: "ť" LATIN SMALL LETTER T WITH CARON
+                    // U+00FE: "þ" LATIN SMALL LETTER THORN
+                    .setMoreKeysOf("t", "5", "\u0165", "\u00FE")
+                    // U+00FD: "ý" LATIN SMALL LETTER Y WITH ACUTE
+                    // U+00FF: "ÿ" LATIN SMALL LETTER Y WITH DIAERESIS
+                    .setMoreKeysOf("y", "6", "\u00FD", "\u00FF")
+                    // U+00FC: "ü" LATIN SMALL LETTER U WITH DIAERESIS
+                    // U+00FA: "ú" LATIN SMALL LETTER U WITH ACUTE
+                    // U+00F9: "ù" LATIN SMALL LETTER U WITH GRAVE
+                    // U+00FB: "û" LATIN SMALL LETTER U WITH CIRCUMFLEX
+                    // U+016B: "ū" LATIN SMALL LETTER U WITH MACRON
+                    .setMoreKeysOf("u", "7", "\u00FC", "\u00FA", "\u00F9", "\u00FB", "\u016B")
+                    // U+00ED: "í" LATIN SMALL LETTER I WITH ACUTE
+                    // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
+                    // U+00EE: "î" LATIN SMALL LETTER I WITH CIRCUMFLEX
+                    // U+00EF: "ï" LATIN SMALL LETTER I WITH DIAERESIS
+                    .setMoreKeysOf("i", "8", "\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", "9", "\u00F3", "\u00F2", "\u00F4", "\u00F5", "\u014D")
+                    // U+00E5: "å" LATIN SMALL LETTER A WITH RING ABOVE
+                    .replaceKeyOfLabel(Nordic.ROW1_11, key("\u00E5"))
+                    // U+00F6: "ö" LATIN SMALL LETTER O WITH DIAERESIS
+                    // U+00F8: "ø" LATIN SMALL LETTER O WITH STROKE
+                    // U+0153: "œ" LATIN SMALL LIGATURE OE
+                    .replaceKeyOfLabel(Nordic.ROW2_10, key("\u00F6",
+                            moreKey("\u00F8"), moreKey("\u0153")))
+                    // U+00E4: "ä" LATIN SMALL LETTER A WITH DIAERESIS
+                    // U+00E6: "æ" LATIN SMALL LETTER AE
+                    .replaceKeyOfLabel(Nordic.ROW2_11, key("\u00E4", moreKey("\u00E6")))
+                    // 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
+                    // U+00DF: "ß" LATIN SMALL LETTER SHARP S
+                    .setMoreKeysOf("s", "\u015B", "\u0161", "\u015F", "\u00DF")
+                    // U+00F0: "ð" LATIN SMALL LETTER ETH
+                    // U+010F: "ď" LATIN SMALL LETTER D WITH CARON
+                    .setMoreKeysOf("d", "\u00F0", "\u010F")
+                    // U+0142: "ł" LATIN SMALL LETTER L WITH STROKE
+                    .setMoreKeysOf("l", "\u0142")
+                    // U+017A: "ź" LATIN SMALL LETTER Z WITH ACUTE
+                    // U+017E: "ž" LATIN SMALL LETTER Z WITH CARON
+                    // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
+                    .setMoreKeysOf("z", "\u017A", "\u017E", "\u017C")
+                    // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
+                    // U+0107: "ć" LATIN SMALL LETTER C WITH ACUTE
+                    // U+010D: "č" LATIN SMALL LETTER C WITH CARON
+                    .setMoreKeysOf("c", "\u00E7", "\u0107", "\u010D")
+                    // U+0144: "ń" LATIN SMALL LETTER N WITH ACUTE
+                    // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
+                    // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
+                    .setMoreKeysOf("n", "\u0144", "\u00F1", "\u0148");
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTagalog.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTagalog.java
new file mode 100644
index 0000000..72e435a
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTagalog.java
@@ -0,0 +1,53 @@
+/*
+ * 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.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.keyboard.layout.tests.TestsSpanishUS.SpanishUSCustomizer;
+
+import java.util.Locale;
+
+/**
+ * tl: Tagalog/spanish
+ */
+@SmallTest
+public class TestsTagalog extends TestsSpanish {
+    private static final Locale LOCALE = new Locale("tl");
+    private static final LayoutBase LAYOUT = new Spanish(new TagalogCustomizer(LOCALE));
+
+    @Override
+    LayoutBase getLayout() { return LAYOUT; }
+
+    private static class TagalogCustomizer extends LayoutCustomizer {
+        private final SpanishUSCustomizer mSpanishUSCustomizer;
+
+        public TagalogCustomizer(final Locale locale) {
+            super(locale);
+            mSpanishUSCustomizer = new SpanishUSCustomizer(locale);
+        }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return mSpanishUSCustomizer.setAccentedLetters(builder);
+        }
+    }
+}
