diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java b/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
index 3f85e4baa58dd3c128b440c6d951a3a037858282..9c2efe2466a597113af34cca03e04dfb4f1cc738 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Arabic.java
@@ -18,6 +18,7 @@ package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.layout.Symbols.RtlSymbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted.RtlSymbolsShifted;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -27,17 +28,15 @@ import java.util.Locale;
 public final class Arabic extends LayoutBase {
     private static final String LAYOUT_NAME = "arabic";
 
-    public Arabic(final LayoutCustomizer customizer) {
-        super(customizer, ArabicSymbols.class, ArabicSymbolsShifted.class);
+    public Arabic(final Locale locale) {
+        super(new ArabicCustomizer(locale), ArabicSymbols.class, ArabicSymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class ArabicCustomizer extends LayoutCustomizer {
-        public ArabicCustomizer(final Locale locale) {
-            super(locale);
-        }
+    private static class ArabicCustomizer extends LayoutCustomizer {
+        ArabicCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getAlphabetKey() { return ARABIC_ALPHABET_KEY; }
@@ -141,12 +140,11 @@ public final class Arabic extends LayoutBase {
     ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
         if (isPhone) {
             return ALPHABET_COMMON;
-        } else {
-            final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
-            // U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE
-            builder.insertKeysAtRow(3, 2, "\u0626");
-            return builder.build();
         }
+        final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
+        // U+0626: "ئ" ARABIC LETTER YEH WITH HAMZA ABOVE
+        builder.insertKeysAtRow(3, 2, "\u0626");
+        return builder.build();
     }
 
     @Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java b/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
index 2cecedceb910f59cff2501bb1fd82fd752b934ef..261618f44051e60c103a4c2544a41023b4484bbd 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -28,15 +29,16 @@ import java.util.Locale;
 public final class ArmenianPhonetic extends LayoutBase {
     private static final String LAYOUT_NAME = "armenian_phonetic";
 
-    public ArmenianPhonetic(final LayoutCustomizer customizer) {
-        super(customizer, ArmenianSymbols.class, ArmenianSymbolsShifted.class);
+    public ArmenianPhonetic(final Locale locale) {
+        super(new ArmenianPhoneticCustomizer(locale), ArmenianSymbols.class,
+                ArmenianSymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class ArmenianPhoneticCustomizer extends LayoutCustomizer {
-        public ArmenianPhoneticCustomizer(final Locale locale) { super(locale); }
+    private static class ArmenianPhoneticCustomizer extends LayoutCustomizer {
+        ArmenianPhoneticCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public int getNumberOfRows() { return 5; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Azerty.java b/tests/src/com/android/inputmethod/keyboard/layout/Azerty.java
index a0949637b75089fe0ccfb96db718889ba884bbf4..f3176d09dad22917f9f5b6df111c0fcb4b96a626 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Azerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Azerty.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Bengali.java b/tests/src/com/android/inputmethod/keyboard/layout/Bengali.java
index 24852a0dc2d943f0f82dcbab40f485638c2b6df5..339cab444c2075744d5351fdee31bb0d571eb0fe 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Bengali.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Bengali.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/BengaliAkkhor.java b/tests/src/com/android/inputmethod/keyboard/layout/BengaliAkkhor.java
index 4dc16cffe0e8b446e0908f9f78c455ce54715265..bb1dc10fb1fa13cea51862a87da3cced94484f6e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/BengaliAkkhor.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/BengaliAkkhor.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Bulgarian.java b/tests/src/com/android/inputmethod/keyboard/layout/Bulgarian.java
index 3282e44ae1eed2e769fbacc20808d253ee93801a..bbe038414f5f20a6375580d7a6602569737c619c 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Bulgarian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Bulgarian.java
@@ -16,7 +16,8 @@
 
 package com.android.inputmethod.keyboard.layout;
 
-import com.android.inputmethod.keyboard.layout.EastSlavic.EastSlavicCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.EastSlavicCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -25,17 +26,17 @@ 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);
+    public Bulgarian(final Locale locale) {
+        super(new BulgarianCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class BulgarianCustomizer extends LayoutCustomizer {
+    private static class BulgarianCustomizer extends LayoutCustomizer {
         private final EastSlavicCustomizer mEastSlavicCustomizer;
 
-        public BulgarianCustomizer(final Locale locale) {
+        BulgarianCustomizer(final Locale locale) {
             super(locale);
             mEastSlavicCustomizer = new EastSlavicCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/BulgarianBds.java b/tests/src/com/android/inputmethod/keyboard/layout/BulgarianBds.java
index 20a5f7dac0390ebbe562bfd564fcaa9a0d5300c3..74372b9bce67246dfd51d5a85aedd7935072ffc0 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/BulgarianBds.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/BulgarianBds.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
-import com.android.inputmethod.keyboard.layout.EastSlavic.EastSlavicCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -25,15 +25,15 @@ 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);
+    public BulgarianBds(final Locale locale) {
+        super(new BulgarianBdsCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class BulgarianBdsCustomizer extends EastSlavicCustomizer {
-        public BulgarianBdsCustomizer(final Locale locale) { super(locale); }
+    private static class BulgarianBdsCustomizer extends EastSlavicCustomizer {
+        BulgarianBdsCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Colemak.java b/tests/src/com/android/inputmethod/keyboard/layout/Colemak.java
index a4a9701cdb03b5219a6a1ca76cc405cc4ce0a72a..3f8ce28eb5afebc048db85360942119a9ac693b1 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Colemak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Colemak.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Dvorak.java b/tests/src/com/android/inputmethod/keyboard/layout/Dvorak.java
index 66fce014b8ae0c90a03d3c5d5947ffc3a21cfb97..7cb3b92a7f3c92d3656894867ba2a220b05b7b2b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Dvorak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Dvorak.java
@@ -17,12 +17,10 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
-import com.android.inputmethod.keyboard.layout.expected.ExpectedKey.ExpectedAdditionalMoreKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
-import java.util.Locale;
-
 /**
  * The Dvorak alphabet keyboard.
  */
@@ -36,52 +34,17 @@ public class Dvorak extends LayoutBase {
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class DvorakCustomizer extends LayoutCustomizer {
-        public DvorakCustomizer(final Locale locale) { super(locale); }
-
-        @Override
-        public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
-            return isPhone ? joinKeys(SHIFT_KEY): joinKeys(SHIFT_KEY, key("q"));
-        }
-
-        @Override
-        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
-            return isPhone ? EMPTY_KEYS : joinKeys(key("z"), SHIFT_KEY);
-        }
-
-        @Override
-        public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
-            // U+00A1: "¡" INVERTED EXCLAMATION MARK
-            return isPhone ? joinKeys(key("q", SETTINGS_KEY))
-                    : joinKeys(key("!", joinMoreKeys("\u00A1", SETTINGS_KEY)));
-        }
-
-        @Override
-        public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
-            final ExpectedAdditionalMoreKey[] punctuationMoreKeys =
-                    convertToAdditionalMoreKeys(getPunctuationMoreKeys(isPhone));
-            // U+00BF: "¿" INVERTED QUESTION MARK
-            return isPhone
-                    ? joinKeys(key("z", punctuationMoreKeys))
-                    : joinKeys(key("?", joinMoreKeys(punctuationMoreKeys, "\u00BF")));
-        }
-
-        private static ExpectedAdditionalMoreKey[] convertToAdditionalMoreKeys(
-                final ExpectedKey ... moreKeys) {
-            final ExpectedAdditionalMoreKey[] additionalMoreKeys =
-                    new ExpectedAdditionalMoreKey[moreKeys.length];
-            for (int index = 0; index < moreKeys.length; index++) {
-                additionalMoreKeys[index] = ExpectedAdditionalMoreKey.newInstance(moreKeys[index]);
-            }
-            return additionalMoreKeys;
-        }
-    }
-
     @Override
     public ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
         return ALPHABET_COMMON;
     }
 
+    /**
+     * Get the left most key of the first row.
+     * @param isPhone true if requesting phone's keys.
+     * @param elementId the element id of the requesting shifted mode.
+     * @return the left most key of the first row.
+     */
     protected ExpectedKey getRow1_1Key(final boolean isPhone, final int elementId) {
         if (elementId == KeyboardId.ELEMENT_ALPHABET
                 || elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
@@ -90,6 +53,12 @@ public class Dvorak extends LayoutBase {
         return key("\"", additionalMoreKey("1"));
     }
 
+    /**
+     * Get the 2nd left key of the first row.
+     * @param isPhone true if requesting phone's keys.
+     * @param elementId the element id of the requesting shifted mode.
+     * @return the 2nd left key of the first row.
+     */
     protected ExpectedKey getRow1_2Key(final boolean isPhone, final int elementId) {
         if (elementId == KeyboardId.ELEMENT_ALPHABET
                 || elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
@@ -98,6 +67,12 @@ public class Dvorak extends LayoutBase {
         return key("<", additionalMoreKey("2"));
     }
 
+    /**
+     * Get the 3rd left key of the first row.
+     * @param isPhone true if requesting phone's keys.
+     * @param elementId the element id of the requesting shifted mode.
+     * @return the 3rd left key of the first row.
+     */
     protected ExpectedKey getRow1_3Key(final boolean isPhone, final int elementId) {
         if (elementId == KeyboardId.ELEMENT_ALPHABET
                 || elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/EastSlavic.java b/tests/src/com/android/inputmethod/keyboard/layout/EastSlavic.java
index 7fcc974c2a03b9ab5a48e26c88af3c0d03f65fee..f95d2d20eb964867bff224aa7fa16042dda09994 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/EastSlavic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/EastSlavic.java
@@ -16,11 +16,9 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 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 EastSlavic extends LayoutBase {
     private static final String LAYOUT_NAME = "east_slavic";
@@ -32,26 +30,6 @@ public final class EastSlavic extends LayoutBase {
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class EastSlavicCustomizer extends LayoutCustomizer {
-        public EastSlavicCustomizer(final Locale locale) {
-            super(locale);
-        }
-
-        @Override
-        public final ExpectedKey getAlphabetKey() { return EAST_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 EAST_SLAVIC_ALPHABET_KEY = key(
-                "\u0410\u0411\u0412", Constants.CODE_SWITCH_ALPHA_SYMBOL);
-    }
-
     @Override
     ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) { return ALPHABET_COMMON; }
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java b/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java
index 7390457d0906db1d41a743ffcdaa4d3fd769aeba..7c75a3ee9b5cb20e9a494881f619a96973f50847 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Farsi.java
@@ -18,6 +18,7 @@ package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.layout.Symbols.RtlSymbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted.RtlSymbolsShifted;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -27,17 +28,15 @@ import java.util.Locale;
 public final class Farsi extends LayoutBase {
     private static final String LAYOUT_NAME = "farsi";
 
-    public Farsi(final LayoutCustomizer customizer) {
-        super(customizer, FarsiSymbols.class, FarsiSymbolsShifted.class);
+    public Farsi(final Locale locale) {
+        super(new FarsiCustomizer(locale), FarsiSymbols.class, FarsiSymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class FarsiCustomizer extends LayoutCustomizer {
-        public FarsiCustomizer(final Locale locale) {
-            super(locale);
-        }
+    private static class FarsiCustomizer extends LayoutCustomizer {
+        FarsiCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getAlphabetKey() { return FARSI_ALPHABET_KEY; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Georgian.java b/tests/src/com/android/inputmethod/keyboard/layout/Georgian.java
index 6f20dfcd1d69ebe40724cb252a028cdf34ae7f70..c26cb967311a0b3906abeee651f39427259ab220 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Georgian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Georgian.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -29,15 +30,15 @@ import java.util.Locale;
 public final class Georgian extends LayoutBase {
     private static final String LAYOUT_NAME = "georgian";
 
-    public Georgian(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Georgian(final Locale locale) {
+        super(new GeorgianCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class GeorgianCustomizer extends LayoutCustomizer {
-        public GeorgianCustomizer(final Locale locale) { super(locale); }
+    private static class GeorgianCustomizer extends LayoutCustomizer {
+        GeorgianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getAlphabetKey() { return GEORGIAN_ALPHABET_KEY; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Greek.java b/tests/src/com/android/inputmethod/keyboard/layout/Greek.java
index 475052c7562085205ff674e5678904682eefed69..a8eb3d942e67861d3d93cb9291763cb604dcefe5 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Greek.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Greek.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -29,15 +30,15 @@ import java.util.Locale;
 public final class Greek extends LayoutBase {
     private static final String LAYOUT_NAME = "greek";
 
-    public Greek(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Greek(final Locale locale) {
+        super(new GreekCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class GreekCustomizer extends EuroCustomizer {
-        public GreekCustomizer(final Locale locale) { super(locale); }
+    private static class GreekCustomizer extends EuroCustomizer {
+        GreekCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getAlphabetKey() { return GREEK_ALPHABET_KEY; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Hebrew.java b/tests/src/com/android/inputmethod/keyboard/layout/Hebrew.java
index 552f0d3d5341b341a31fa125136478bcaf2ecfdb..69b43588f867bbc0a25937e64619b63a05ba24f4 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Hebrew.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Hebrew.java
@@ -18,6 +18,7 @@ package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.layout.Symbols.RtlSymbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted.RtlSymbolsShifted;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -27,17 +28,15 @@ import java.util.Locale;
 public final class Hebrew extends LayoutBase {
     private static final String LAYOUT_NAME = "hebrew";
 
-    public Hebrew(final LayoutCustomizer customizer) {
-        super(customizer, HebrewSymbols.class, RtlSymbolsShifted.class);
+    public Hebrew(final Locale locale) {
+        super(new HebrewCustomizer(locale), HebrewSymbols.class, RtlSymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class HebrewCustomizer extends LayoutCustomizer {
-        public HebrewCustomizer(final Locale locale) {
-            super(locale);
-        }
+    private static class HebrewCustomizer extends LayoutCustomizer {
+        HebrewCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getAlphabetKey() { return HEBREW_ALPHABET_KEY; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Hindi.java b/tests/src/com/android/inputmethod/keyboard/layout/Hindi.java
index a080cac30458553fbd0c2a1aa14fa170ad379744..82f67aca220cb985248f32b226a7245f343988e7 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Hindi.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Hindi.java
@@ -19,6 +19,7 @@ package com.android.inputmethod.keyboard.layout;
 import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.*;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/HindiCompact.java b/tests/src/com/android/inputmethod/keyboard/layout/HindiCompact.java
index 457851b0cc02a0207c244df14eda8eccd5524ef9..a2e339919fdb10051023f59f48be294c2457205f 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/HindiCompact.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/HindiCompact.java
@@ -19,9 +19,9 @@ package com.android.inputmethod.keyboard.layout;
 import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.*;
 
 import com.android.inputmethod.keyboard.layout.Hindi.HindiSymbols;
+import com.android.inputmethod.keyboard.layout.customizer.HindiCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
-import com.android.inputmethod.keyboard.layout.tests.HindiCustomizer;
 
 import java.util.Locale;
 
@@ -31,15 +31,15 @@ import java.util.Locale;
 public final class HindiCompact extends LayoutBase {
     private static final String LAYOUT_NAME = "hindi_compact";
 
-    public HindiCompact(final LayoutCustomizer customizer) {
-        super(customizer, HindiSymbols.class, SymbolsShifted.class);
+    public HindiCompact(final Locale locale) {
+        super(new HindiCompactCustomizer(locale), HindiSymbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class HindiCompactCustomizer extends HindiCustomizer {
-        public HindiCompactCustomizer(final Locale locale) { super(locale); }
+    private static class HindiCompactCustomizer extends HindiCustomizer {
+        HindiCompactCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Kannada.java b/tests/src/com/android/inputmethod/keyboard/layout/Kannada.java
index 8bee1f83bd28a8639f692dc3d681935888d815f9..4fff577d3a942c1d037e005aedc31bbccfcbefb2 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Kannada.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Kannada.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -28,15 +29,15 @@ import java.util.Locale;
 public final class Kannada extends LayoutBase {
     private static final String LAYOUT_NAME = "kannada";
 
-    public Kannada(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Kannada(final Locale locale) {
+        super(new KannadaCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class KannadaCustomizer extends LayoutCustomizer {
-        public KannadaCustomizer(final Locale locale) { super(locale); }
+    private static class KannadaCustomizer extends LayoutCustomizer {
+        KannadaCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getAlphabetKey() { return KANNADA_ALPHABET_KEY; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java b/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java
index 7e4f159aba8648d062f2ce3dc4466b56e3062eb5..20c4d03866ab4e533d346b9544a45d34818ae30a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Khmer.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -29,15 +30,15 @@ import java.util.Locale;
 public final class Khmer extends LayoutBase {
     private static final String LAYOUT_NAME = "khmer";
 
-    public Khmer(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Khmer(final Locale locale) {
+        super(new KhmerCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class KhmerCustomizer extends LayoutCustomizer {
-        public KhmerCustomizer(final Locale locale) { super(locale); }
+    private static class KhmerCustomizer extends LayoutCustomizer {
+        KhmerCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public int getNumberOfRows() { return 5; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Lao.java b/tests/src/com/android/inputmethod/keyboard/layout/Lao.java
index aaa1c8a8a51417560162a893a02cdd9682081181..091c3a611f5cc45d7aa12c7f5fa91471d5abeda0 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Lao.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Lao.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -29,15 +30,15 @@ import java.util.Locale;
 public final class Lao extends LayoutBase {
     private static final String LAYOUT_NAME = "lao";
 
-    public Lao(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Lao(final Locale locale) {
+        super(new LaoCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class LaoCustomizer extends LayoutCustomizer {
-        public LaoCustomizer(final Locale locale) { super(locale); }
+    private static class LaoCustomizer extends LayoutCustomizer {
+        LaoCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public int getNumberOfRows() { return 5; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java b/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
index b714ec794c8cb28c07ba2a70128fc68a28a0e795..285a50ce945bcb9d5b523cf1a165dba82a686e33 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/LayoutBase.java
@@ -17,11 +17,10 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
-import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.AbstractLayoutBase;
 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;
 
@@ -29,218 +28,6 @@ import java.util.Locale;
  * The base class of keyboard layout.
  */
 public abstract class LayoutBase extends AbstractLayoutBase {
-    /**
-     * This class is used to customize common keyboard layout to language specific layout.
-     */
-    public static class LayoutCustomizer {
-        private final Locale mLocale;
-
-        // Empty keys definition to remove keys by adding this.
-        protected static final ExpectedKey[] EMPTY_KEYS = joinKeys();
-
-        public LayoutCustomizer(final Locale locale) {
-            mLocale = locale;
-        }
-
-        public final Locale getLocale() {
-            return mLocale;
-        }
-
-        public int getNumberOfRows() {
-            return 4;
-        }
-
-        /**
-         * Set accented letters to a specific keyboard element.
-         * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard
-         *        layout.
-         * @param elementId the element id of keyboard
-         * @return the {@link ExpectedKeyboardBuilder} object that contains accented letters as
-         *        "more keys".
-         */
-        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder,
-                final int elementId) {
-            // This method can be overridden by an extended class to provide customized expected
-            // accented letters depending on the shift state of keyboard.
-            // This is a default behavior to call a shift-state-independent
-            // {@link #setAccentedLetters(ExpectedKeyboardBuilder)} implementation, so that
-            // <code>elementId</code> is ignored here.
-            return setAccentedLetters(builder);
-        }
-
-        /**
-         * Set accented letters to common layout.
-         * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard
-         *        layout.
-         * @return the {@link ExpectedKeyboardBuilder} object that contains accented letters as
-         *        "more keys".
-         */
-        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
-            return builder;
-        }
-
-        /**
-         * Get the function key to switch to alphabet layout.
-         * @return the {@link ExpectedKey} of the alphabet key.
-         */
-        public ExpectedKey getAlphabetKey() { return ALPHABET_KEY; }
-
-        /**
-         * Get the function key to switch to symbols layout.
-         * @return the {@link ExpectedKey} of the symbols key.
-         */
-        public ExpectedKey getSymbolsKey() { return SYMBOLS_KEY; }
-
-        /**
-         * Get the function key to switch to symbols shift layout.
-         * @param isPhone true if requesting phone's key.
-         * @return the {@link ExpectedKey} of the symbols shift key.
-         */
-        public ExpectedKey getSymbolsShiftKey(boolean isPhone) {
-            return isPhone ? SYMBOLS_SHIFT_KEY : TABLET_SYMBOLS_SHIFT_KEY;
-        }
-
-        /**
-         * Get the function key to switch from symbols shift to symbols layout.
-         * @return the {@link ExpectedKey} of the back to symbols key.
-         */
-        public ExpectedKey getBackToSymbolsKey() { return BACK_TO_SYMBOLS_KEY; }
-
-        /**
-         * Get the currency key.
-         * @return the {@link ExpectedKey} of the currency key.
-         */
-        public ExpectedKey getCurrencyKey() { return Symbols.CURRENCY_DOLLAR; }
-
-        /**
-         * Get other currencies keys.
-         * @return the array of {@link ExpectedKey} that represents other currency keys.
-         */
-        public ExpectedKey[] getOtherCurrencyKeys() {
-            return SymbolsShifted.CURRENCIES_OTHER_THAN_DOLLAR;
-        }
-
-        /**
-         * Get "more keys" of double quotation mark.
-         * @return the array of {@link ExpectedKey} of more double quotation marks in natural order.
-         */
-        public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_9LR; }
-
-        /**
-         * Get "more keys" of single quotation mark.
-         * @return the array of {@link ExpectedKey} of more single quotation marks in natural order.
-         */
-        public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_9LR; }
-
-        /**
-         * Get double angle quotation marks in natural order.
-         * @return the array of {@link ExpectedKey} of double angle quotation marks in natural
-         *         order.
-         */
-        public ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_LR; }
-
-        /**
-         * Get single angle quotation marks in natural order.
-         * @return the array of {@link ExpectedKey} of single angle quotation marks in natural
-         *         order.
-         */
-        public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_LR; }
-
-        /**
-         * Get the left shift keys.
-         * @param isPhone true if requesting phone's keys.
-         * @return the array of {@link ExpectedKey} that should be placed at left edge of the
-         *         keyboard.
-         */
-        public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
-            return joinKeys(SHIFT_KEY);
-        }
-
-        /**
-         * Get the right shift keys.
-         * @param isPhone true if requesting phone's keys.
-         * @return the array of {@link ExpectedKey} that should be placed at right edge of the
-         *         keyboard.
-         */
-        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
-            return isPhone ? EMPTY_KEYS : joinKeys(EXCLAMATION_AND_QUESTION_MARKS, SHIFT_KEY);
-        }
-
-        /**
-         * Get the enter key.
-         * @param isPhone true if requesting phone's key.
-         * @return the array of {@link ExpectedKey} that should be placed as an enter key.
-         */
-        public ExpectedKey getEnterKey(final boolean isPhone) {
-            return isPhone ? key(ENTER_KEY, EMOJI_ACTION_KEY) : ENTER_KEY;
-        }
-
-        /**
-         * Get the emoji key.
-         * @param isPhone true if requesting phone's key.
-         * @return the array of {@link ExpectedKey} that should be placed as an emoji key.
-         */
-        public ExpectedKey getEmojiKey(final boolean isPhone) {
-            return EMOJI_NORMAL_KEY;
-        }
-
-        /**
-         * Get the space keys.
-         * @param isPhone true if requesting phone's keys.
-         * @return the array of {@link ExpectedKey} that should be placed at the center of the
-         *         keyboard.
-         */
-        public ExpectedKey[] getSpaceKeys(final boolean isPhone) {
-            return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY);
-        }
-
-        /**
-         * Get the keys left to the spacebar.
-         * @param isPhone true if requesting phone's keys.
-         * @return the array of {@link ExpectedKey} that should be placed at left of the spacebar.
-         */
-        public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
-            // U+002C: "," COMMA
-            return joinKeys(key("\u002C", SETTINGS_KEY));
-        }
-
-        /**
-         * Get the keys right to the spacebar.
-         * @param isPhone true if requesting phone's keys.
-         * @return the array of {@link ExpectedKey} that should be placed at right of the spacebar.
-         */
-        public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
-            final ExpectedKey periodKey = key(".", getPunctuationMoreKeys(isPhone));
-            return joinKeys(periodKey);
-        }
-
-        /**
-         * Get "more keys" for the punctuation key (usually the period key).
-         * @param isPhone true if requesting phone's keys.
-         * @return the array of {@link ExpectedKey} that are "more keys" of the punctuation key.
-         */
-        public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) {
-            return isPhone ? PHONE_PUNCTUATION_MORE_KEYS : TABLET_PUNCTUATION_MORE_KEYS;
-        }
-    }
-
-    /**
-     * The layout customize class for countries that use Euro.
-     */
-    public static class EuroCustomizer extends LayoutCustomizer {
-        public EuroCustomizer(final Locale locale) {
-            super(locale);
-        }
-
-        @Override
-        public final ExpectedKey getCurrencyKey() { return Symbols.CURRENCY_EURO; }
-
-        @Override
-        public final ExpectedKey[] getOtherCurrencyKeys() {
-            return SymbolsShifted.CURRENCIES_OTHER_THAN_EURO;
-        }
-    }
-
     private final LayoutCustomizer mCustomizer;
     private final Symbols mSymbols;
     private final SymbolsShifted mSymbolsShifted;
@@ -276,77 +63,6 @@ public abstract class LayoutBase extends AbstractLayoutBase {
      */
     public final LayoutCustomizer getCustomizer() { return mCustomizer; }
 
-    // Icon ids.
-    private static final int ICON_DELETE = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_DELETE_KEY);
-    private static final int ICON_SPACE = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_SPACE_KEY);
-    private static final int ICON_TAB = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_TAB_KEY);
-    private static final int ICON_SHORTCUT = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_SHORTCUT_KEY);
-    private static final int ICON_SETTINGS = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_SETTINGS_KEY);
-    private static final int ICON_LANGUAGE_SWITCH = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_LANGUAGE_SWITCH_KEY);
-    private static final int ICON_ENTER = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_ENTER_KEY);
-    private static final int ICON_EMOJI_ACTION = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_EMOJI_ACTION_KEY);
-    private static final int ICON_EMOJI_NORMAL = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_EMOJI_NORMAL_KEY);
-    private static final int ICON_SHIFT = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_SHIFT_KEY);
-    private static final int ICON_SHIFTED_SHIFT = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_SHIFT_KEY_SHIFTED);
-    private static final int ICON_ZWNJ = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_ZWNJ_KEY);
-    private static final int ICON_ZWJ = KeyboardIconsSet.getIconId(
-            KeyboardIconsSet.NAME_ZWJ_KEY);
-
-    // Functional keys.
-    public static final ExpectedKey DELETE_KEY = key(ICON_DELETE, Constants.CODE_DELETE);
-    public static final ExpectedKey TAB_KEY = key(ICON_TAB, Constants.CODE_TAB);
-    public static final ExpectedKey SHORTCUT_KEY = key(ICON_SHORTCUT, Constants.CODE_SHORTCUT);
-    public static final ExpectedKey SETTINGS_KEY = key(ICON_SETTINGS, Constants.CODE_SETTINGS);
-    public static final ExpectedKey LANGUAGE_SWITCH_KEY = key(
-            ICON_LANGUAGE_SWITCH, Constants.CODE_LANGUAGE_SWITCH);
-    public static final ExpectedKey ENTER_KEY = key(ICON_ENTER, Constants.CODE_ENTER);
-    public static final ExpectedKey EMOJI_ACTION_KEY = key(ICON_EMOJI_ACTION, Constants.CODE_EMOJI);
-    public static final ExpectedKey EMOJI_NORMAL_KEY = key(ICON_EMOJI_NORMAL, Constants.CODE_EMOJI);
-    public static final ExpectedKey SPACE_KEY = key(ICON_SPACE, Constants.CODE_SPACE);
-    static final ExpectedKey CAPSLOCK_MORE_KEY = key(" ", Constants.CODE_CAPSLOCK);
-    public static final ExpectedKey SHIFT_KEY = key(ICON_SHIFT,
-            Constants.CODE_SHIFT, CAPSLOCK_MORE_KEY);
-    public static final ExpectedKey SHIFTED_SHIFT_KEY = key(ICON_SHIFTED_SHIFT,
-            Constants.CODE_SHIFT, CAPSLOCK_MORE_KEY);
-    static final ExpectedKey ALPHABET_KEY = key("ABC", Constants.CODE_SWITCH_ALPHA_SYMBOL);
-    static final ExpectedKey SYMBOLS_KEY = key("?123", Constants.CODE_SWITCH_ALPHA_SYMBOL);
-    static final ExpectedKey BACK_TO_SYMBOLS_KEY = key("?123", Constants.CODE_SHIFT);
-    static final ExpectedKey SYMBOLS_SHIFT_KEY = key("= \\ <", Constants.CODE_SHIFT);
-    static final ExpectedKey TABLET_SYMBOLS_SHIFT_KEY = key("~ [ <", Constants.CODE_SHIFT);
-
-    // U+00A1: "¡" INVERTED EXCLAMATION MARK
-    // U+00BF: "¿" INVERTED QUESTION MARK
-    public static final ExpectedKey[] EXCLAMATION_AND_QUESTION_MARKS = joinKeys(
-            key("!", moreKey("\u00A1")), key("?", moreKey("\u00BF")));
-    // U+200C: ZERO WIDTH NON-JOINER
-    // U+200D: ZERO WIDTH JOINER
-    static final ExpectedKey ZWNJ_KEY = key(ICON_ZWNJ, "\u200C");
-    static final ExpectedKey ZWJ_KEY = key(ICON_ZWJ, "\u200D");
-    // Domain key
-    public static final ExpectedKey DOMAIN_KEY =
-            key(".com", joinMoreKeys(".net", ".org", ".gov", ".edu")).preserveCase();
-
-    // Punctuation more keys for phone form factor.
-    public static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
-            ",", "?", "!", "#", ")", "(", "/", ";",
-            "'", "@", ":", "-", "\"", "+", "%", "&");
-    // Punctuation more keys for tablet form factor.
-    public static final ExpectedKey[] TABLET_PUNCTUATION_MORE_KEYS = joinKeys(
-            ",", "'", "#", ")", "(", "/", ";",
-            "@", ":", "-", "\"", "+", "%", "&");
-
     /**
      * Helper method to create alphabet layout adding special function keys.
      * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Malayalam.java b/tests/src/com/android/inputmethod/keyboard/layout/Malayalam.java
index b44b888e185d69be92622fea89855b042b652c70..55c2e8b981329d7607f56353ca99de412457d182 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Malayalam.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Malayalam.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -28,15 +29,15 @@ import java.util.Locale;
 public final class Malayalam extends LayoutBase {
     private static final String LAYOUT_NAME = "malayalam";
 
-    public Malayalam(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Malayalam(final Locale locale) {
+        super(new MalayalamCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class MalayalamCustomizer extends LayoutCustomizer {
-        public MalayalamCustomizer(final Locale locale) { super(locale); }
+    private static class MalayalamCustomizer extends LayoutCustomizer {
+        MalayalamCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getAlphabetKey() { return MALAYALAM_ALPHABET_KEY; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Marathi.java b/tests/src/com/android/inputmethod/keyboard/layout/Marathi.java
index 615ec89bf83bcdbafc4acc462e3cdc3000a8d841..af26ec555b9663156e8585c1e0d4bf01f78278ec 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Marathi.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Marathi.java
@@ -19,9 +19,9 @@ package com.android.inputmethod.keyboard.layout;
 import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.*;
 
 import com.android.inputmethod.keyboard.layout.Hindi.HindiSymbols;
+import com.android.inputmethod.keyboard.layout.customizer.DevanagariCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
-import com.android.inputmethod.keyboard.layout.tests.DevanagariCustomizer;
 
 import java.util.Locale;
 
@@ -31,20 +31,37 @@ import java.util.Locale;
 public final class Marathi extends LayoutBase {
     private static final String LAYOUT_NAME = "marathi";
 
-    public Marathi(final LayoutCustomizer customizer) {
-        super(customizer, HindiSymbols.class, SymbolsShifted.class);
+    public Marathi(final Locale locale) {
+        super(new MarathiCustomizer(locale), HindiSymbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class MarathiCustomizer extends DevanagariCustomizer {
-        public MarathiCustomizer(final Locale locale) { super(locale); }
+    private static class MarathiCustomizer extends DevanagariCustomizer {
+        MarathiCustomizer(final Locale locale) { super(locale); }
+
+        @Override
+        public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
+
+        @Override
+        public ExpectedKey[] getOtherCurrencyKeys() {
+            return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
+        }
 
         @Override
         public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
             return EMPTY_KEYS;
         }
+
+        @Override
+        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+            return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
+        }
+
+        // U+20B9: "₹" INDIAN RUPEE SIGN
+        private static final ExpectedKey CURRENCY_RUPEE = key("\u20B9",
+                Symbols.CURRENCY_GENERIC_MORE_KEYS);
     }
 
     @Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Mongolian.java b/tests/src/com/android/inputmethod/keyboard/layout/Mongolian.java
index 3c6c05841ea111fb7050655b0819821cb8db4229..288a17e101b8ffb87f5aea91422e7cacee21f213 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Mongolian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Mongolian.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
-import com.android.inputmethod.keyboard.layout.EastSlavic.EastSlavicCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -25,17 +25,15 @@ import java.util.Locale;
 public final class Mongolian extends LayoutBase {
     private static final String LAYOUT_NAME = "mongolian";
 
-    public Mongolian(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Mongolian(final Locale locale) {
+        super(new MongolianCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class MongolianMNCustomizer extends EastSlavicCustomizer {
-        public MongolianMNCustomizer(final Locale locale) {
-            super(locale);
-        }
+    private static class MongolianCustomizer extends EastSlavicCustomizer {
+        MongolianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getCurrencyKey() { return CURRENCY_TUGRIK; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Myanmar.java b/tests/src/com/android/inputmethod/keyboard/layout/Myanmar.java
index 3c70d3266f1f26d8cc45e919f025decbda56ca48..f7b3590f3b19f35759e72fa0606a202e60ab2e7a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Myanmar.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Myanmar.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -29,15 +30,15 @@ import java.util.Locale;
 public final class Myanmar extends LayoutBase {
     private static final String LAYOUT_NAME = "myanmar";
 
-    public Myanmar(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Myanmar(final Locale locale) {
+        super(new MyanmarCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class MyanmarCustomizer extends LayoutCustomizer {
-        public MyanmarCustomizer(final Locale locale) { super(locale); }
+    private static class MyanmarCustomizer extends LayoutCustomizer {
+        MyanmarCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public int getNumberOfRows() { return 5; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/NepaliRomanized.java b/tests/src/com/android/inputmethod/keyboard/layout/NepaliRomanized.java
index fec226109c6e8b2c004e42dab473e0e11f2cb33e..640b63dd6a88914cdc10f6a91ee7430580400a60 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/NepaliRomanized.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/NepaliRomanized.java
@@ -20,9 +20,9 @@ import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.
 
 import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.layout.Hindi.HindiSymbols;
+import com.android.inputmethod.keyboard.layout.customizer.NepaliCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
-import com.android.inputmethod.keyboard.layout.tests.DevanagariCustomizer;
 
 import java.util.Locale;
 
@@ -32,28 +32,20 @@ import java.util.Locale;
 public final class NepaliRomanized extends LayoutBase {
     private static final String LAYOUT_NAME = "nepali_romanized";
 
-    public NepaliRomanized(final LayoutCustomizer customizer) {
-        super(customizer, HindiSymbols.class, SymbolsShifted.class);
+    public NepaliRomanized(final Locale locale) {
+        super(new NepaliRomanizedCustomizer(locale), HindiSymbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class NepaliRomanizedCustomizer extends DevanagariCustomizer {
-        public NepaliRomanizedCustomizer(final Locale locale) { super(locale); }
+    private static class NepaliRomanizedCustomizer extends NepaliCustomizer {
+        NepaliRomanizedCustomizer(final Locale locale) { super(locale); }
 
         @Override
-        public ExpectedKey getCurrencyKey() { return CURRENCY_NEPALI; }
-
-        @Override
-        public ExpectedKey[] getSpaceKeys(final boolean isPhone) {
-            return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY, key(ZWNJ_KEY, ZWJ_KEY));
+        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+            return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
         }
-
-        // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
-        private static final ExpectedKey CURRENCY_NEPALI = key("\u0930\u0941\u002E",
-                Symbols.DOLLAR_SIGN, Symbols.CENT_SIGN, Symbols.EURO_SIGN, Symbols.POUND_SIGN,
-                Symbols.YEN_SIGN, Symbols.PESO_SIGN);
     }
 
     @Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/NepaliTraditional.java b/tests/src/com/android/inputmethod/keyboard/layout/NepaliTraditional.java
index 4d6cdedbf9e0d27b1d5f505b2d1561db6c99a3fc..17e226f7745e3261d04b4f8f74a89ea929abdb1a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/NepaliTraditional.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/NepaliTraditional.java
@@ -20,7 +20,7 @@ import static com.android.inputmethod.keyboard.layout.DevanagariLetterConstants.
 
 import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.layout.Hindi.HindiSymbols;
-import com.android.inputmethod.keyboard.layout.NepaliRomanized.NepaliRomanizedCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.NepaliCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -32,15 +32,15 @@ import java.util.Locale;
 public final class NepaliTraditional extends LayoutBase {
     private static final String LAYOUT_NAME = "nepali_traditional";
 
-    public NepaliTraditional(final LayoutCustomizer customizer) {
-        super(customizer, HindiSymbols.class, SymbolsShifted.class);
+    public NepaliTraditional(final Locale locale) {
+        super(new NepaliTraditionalCustomizer(locale), HindiSymbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class NepaliTraditionalCustomizer extends NepaliRomanizedCustomizer {
-        public NepaliTraditionalCustomizer(final Locale locale) { super(locale); }
+    private static class NepaliTraditionalCustomizer extends NepaliCustomizer {
+        NepaliTraditionalCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getRightShiftKeys(final boolean isPhone) { return EMPTY_KEYS; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Nordic.java b/tests/src/com/android/inputmethod/keyboard/layout/Nordic.java
index c791c404dcbc0f05d124488e1742fc1192a7965e..4f718e64fb97aaecf652dc3acd0f144ae7f8b149 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Nordic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Nordic.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/PcQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/PcQwerty.java
index 3f7340fd0d096bc74bbb9eb1c6861209e57ec85a..0085ac6a8d22b3f4c71e843028360168ef930b94 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/PcQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/PcQwerty.java
@@ -17,11 +17,10 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
-import java.util.Locale;
-
 /**
  * The PC QWERTY alphabet keyboard.
  */
@@ -35,35 +34,6 @@ public final class PcQwerty extends LayoutBase {
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class PcQwertyCustomizer extends LayoutCustomizer {
-        public PcQwertyCustomizer(final Locale locale) { super(locale); }
-
-        @Override
-        public int getNumberOfRows() { return 5; }
-
-        @Override
-        public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
-            return joinKeys(SHIFT_KEY);
-        }
-
-        @Override
-        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
-            return joinKeys(SHIFT_KEY);
-        }
-
-        @Override
-        public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
-            return joinKeys(SETTINGS_KEY);
-        }
-
-        @Override
-        public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
-            return isPhone
-                    ? joinKeys(key(ENTER_KEY, EMOJI_ACTION_KEY))
-                    : joinKeys(EMOJI_NORMAL_KEY);
-        }
-    }
-
     @Override
     ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
         final LayoutCustomizer customizer = getCustomizer();
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
index d790a1e53bc911cfdb3177cca482575d4443b999..508df0c17238a2918268c9496ec073d0a5ee785f 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Qwerty.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Qwertz.java b/tests/src/com/android/inputmethod/keyboard/layout/Qwertz.java
index 26ba6cffb5e305dbbc9cd304384e9186c798ec9e..cc41fbf2013b339c77cb224ea3ce5d16108d9aea 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Qwertz.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Qwertz.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/SerbianQwertz.java b/tests/src/com/android/inputmethod/keyboard/layout/SerbianQwertz.java
index b23fe768ecc5f449934b14c603215455e9ff7f30..a4936288af6fe29ade7e401cfc7eb69451e4e081 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/SerbianQwertz.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/SerbianQwertz.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java b/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java
index 354141d5a5084c6179cd5cb7c2e51c5659c609bd..cdd9ea7aeed34babb6c98c932c96ff608bdbcb14 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Sinhala.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -29,15 +30,15 @@ import java.util.Locale;
 public final class Sinhala extends LayoutBase {
     private static final String LAYOUT_NAME = "sinhala";
 
-    public Sinhala(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Sinhala(final Locale locale) {
+        super(new SinhalaCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class SinhalaCustomizer extends LayoutCustomizer {
-        public SinhalaCustomizer(final Locale locale) { super(locale); }
+    private static class SinhalaCustomizer extends LayoutCustomizer {
+        SinhalaCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getAlphabetKey() { return SINHALA_ALPHABET_KEY; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/SouthSlavic.java b/tests/src/com/android/inputmethod/keyboard/layout/SouthSlavic.java
index be8b435d4ae2471e18e79126db9aeebdac7e7916..ad827875480ed46ed686e5ffd4437b3aaeb6982b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/SouthSlavic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/SouthSlavic.java
@@ -16,11 +16,9 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 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";
@@ -32,26 +30,6 @@ public final class SouthSlavic extends LayoutBase {
     @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; }
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Spanish.java b/tests/src/com/android/inputmethod/keyboard/layout/Spanish.java
index 225b9f6040c0e8e8cc43349f380e56b4675ecb68..fc6f1ea95250beba4f3d20edb90b5c90bbb1f91e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Spanish.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Spanish.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Swiss.java b/tests/src/com/android/inputmethod/keyboard/layout/Swiss.java
index 01a602054225d6c921def8be5241d808909a7df1..57e3725a5f3e3826dd9be41cd4a0bd239a2b64b2 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Swiss.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Swiss.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java b/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
index 8030897214d0682c7e6ed8b79efbb340366a8c38..7ad7b5442d4c21a0d1f8b09a29d360c316d5da99 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Symbols.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.AbstractLayoutBase;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
@@ -41,13 +41,13 @@ public class Symbols extends AbstractLayoutBase {
                 customizer.getSingleQuoteMoreKeys(), customizer.getSingleAngleQuoteKeys())));
         if (isPhone) {
             builder.addKeysOnTheLeftOfRow(3, customizer.getSymbolsShiftKey(isPhone))
-                    .addKeysOnTheRightOfRow(3, LayoutBase.DELETE_KEY)
+                    .addKeysOnTheRightOfRow(3, DELETE_KEY)
                     .addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey())
                     .addKeysOnTheRightOfRow(4, customizer.getEnterKey(isPhone));
         } else {
             // Tablet symbols keyboard has extra two keys at the left edge of the 3rd row.
             builder.addKeysOnTheLeftOfRow(3, (Object[])joinKeys("\\", "="));
-            builder.addKeysOnTheRightOfRow(1, LayoutBase.DELETE_KEY)
+            builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
                     .addKeysOnTheRightOfRow(2, customizer.getEnterKey(isPhone))
                     .addKeysOnTheLeftOfRow(3, customizer.getSymbolsShiftKey(isPhone))
                     .addKeysOnTheRightOfRow(3, customizer.getSymbolsShiftKey(isPhone))
@@ -167,7 +167,7 @@ public class Symbols extends AbstractLayoutBase {
                     // U+00BF: "¿" INVERTED QUESTION MARK
                     key("?", moreKey("\u00BF")))
             .setKeysOfRow(4,
-                    key(","), key("_"), LayoutBase.SPACE_KEY, key("/"),
+                    key(","), key("_"), SPACE_KEY, key("/"),
                     // U+2026: "…" HORIZONTAL ELLIPSIS
                     key(".", moreKey("\u2026")))
             .build();
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java b/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
index 19cb6075a7d0eadbb2d04a39caaf20427ee1f467..64262167d04e95cfd68b5a06b2a64510af1d5e46 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/SymbolsShifted.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.keyboard.layout.expected.AbstractLayoutBase;
@@ -37,7 +37,7 @@ public class SymbolsShifted extends AbstractLayoutBase {
         builder.replaceKeyOfLabel(OTHER_CURRENCIES, (Object[])customizer.getOtherCurrencyKeys());
         if (isPhone) {
             builder.addKeysOnTheLeftOfRow(3, customizer.getBackToSymbolsKey())
-                    .addKeysOnTheRightOfRow(3, LayoutBase.DELETE_KEY)
+                    .addKeysOnTheRightOfRow(3, DELETE_KEY)
                     .addKeysOnTheLeftOfRow(4, customizer.getAlphabetKey())
                     .addKeysOnTheRightOfRow(4, customizer.getEnterKey(isPhone));
         } else {
@@ -45,7 +45,7 @@ public class SymbolsShifted extends AbstractLayoutBase {
             // U+00BF: "¿" INVERTED QUESTION MARK
             // U+00A1: "¡" INVERTED EXCLAMATION MARK
             builder.addKeysOnTheRightOfRow(3, (Object[])joinKeys("\u00A1", "\u00BF"));
-            builder.addKeysOnTheRightOfRow(1, LayoutBase.DELETE_KEY)
+            builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
                     .addKeysOnTheRightOfRow(2, customizer.getEnterKey(isPhone))
                     .addKeysOnTheLeftOfRow(3, customizer.getBackToSymbolsKey())
                     .addKeysOnTheRightOfRow(3, customizer.getBackToSymbolsKey())
@@ -122,7 +122,7 @@ public class SymbolsShifted extends AbstractLayoutBase {
                     // U+2264: "≤" LESS-THAN OR EQUAL TO
                     // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
                     key("<", joinMoreKeys("\u2039", "\u2264", "\u00AB")),
-                    LayoutBase.SPACE_KEY,
+                    SPACE_KEY,
                     // U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
                     // U+2265: "≥" GREATER-THAN EQUAL TO
                     // U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Tamil.java b/tests/src/com/android/inputmethod/keyboard/layout/Tamil.java
index 597b6fa554e44e4b2dbaa2d8255144391e9e8add..1413e366aebe48eaf3dbd202fe2a08e5ab8aa487 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Tamil.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Tamil.java
@@ -16,11 +16,9 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 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 Tamil keyboard.
@@ -35,29 +33,6 @@ public final class Tamil extends LayoutBase {
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class TamilCustomizer extends LayoutCustomizer {
-        public TamilCustomizer(final Locale locale) { super(locale); }
-
-        @Override
-        public ExpectedKey getAlphabetKey() { return TAMIL_ALPHABET_KEY; }
-
-        @Override
-        public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
-            return EMPTY_KEYS;
-        }
-
-        @Override
-        public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
-            return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
-        }
-
-        // U+0BA4: "த" TAMIL LETTER TA
-        // U+0BAE/U+0BBF: "மி" TAMIL LETTER MA/TAMIL VOWEL SIGN I
-        // U+0BB4/U+0BCD: "ழ்" TAMIL LETTER LLLA/TAMIL SIGN VIRAMA
-        private static final ExpectedKey TAMIL_ALPHABET_KEY = key(
-                "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD", Constants.CODE_SWITCH_ALPHA_SYMBOL);
-    }
-
     @Override
     ExpectedKey[][] getCommonAlphabetLayout(boolean isPhone) { return ALPHABET_COMMON; }
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Telugu.java b/tests/src/com/android/inputmethod/keyboard/layout/Telugu.java
index cc8224c5489a315e2052578a590f5d6cc9524b9c..84c5df6226f11242679ec4cf708cb37da86e9d03 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Telugu.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Telugu.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -28,15 +29,15 @@ import java.util.Locale;
 public final class Telugu extends LayoutBase {
     private static final String LAYOUT_NAME = "telugu";
 
-    public Telugu(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Telugu(final Locale locale) {
+        super(new TeluguCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class TeluguCustomizer extends LayoutCustomizer {
-        public TeluguCustomizer(final Locale locale) { super(locale); }
+    private static class TeluguCustomizer extends LayoutCustomizer {
+        TeluguCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getAlphabetKey() { return TELUGU_ALPHABET_KEY; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Thai.java b/tests/src/com/android/inputmethod/keyboard/layout/Thai.java
index cfda2947c9744f1fcf63eb4f85f726e77b0f407f..1463336c4de5109b09ed0f5df271fd588d747f59 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Thai.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Thai.java
@@ -17,6 +17,7 @@
 package com.android.inputmethod.keyboard.layout;
 
 import com.android.inputmethod.keyboard.KeyboardId;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 import com.android.inputmethod.latin.Constants;
@@ -29,15 +30,15 @@ import java.util.Locale;
 public final class Thai extends LayoutBase {
     private static final String LAYOUT_NAME = "thai";
 
-    public Thai(final LayoutCustomizer customizer) {
-        super(customizer, Symbols.class, SymbolsShifted.class);
+    public Thai(final Locale locale) {
+        super(new ThaiCustomizer(locale), Symbols.class, SymbolsShifted.class);
     }
 
     @Override
     public String getName() { return LAYOUT_NAME; }
 
-    public static class ThaiCustomizer extends LayoutCustomizer {
-        public ThaiCustomizer(final Locale locale) { super(locale); }
+    private static class ThaiCustomizer extends LayoutCustomizer {
+        ThaiCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public int getNumberOfRows() { return 5; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/Uzbek.java b/tests/src/com/android/inputmethod/keyboard/layout/Uzbek.java
index df391a54ae7066cbdcd72794bf3fc07f3f1f651b..f37fd22415f61d8cb681e98b350f61062d56991e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/Uzbek.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/Uzbek.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.keyboard.layout;
 
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/BengaliCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/BengaliCustomizer.java
similarity index 80%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/BengaliCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/BengaliCustomizer.java
index 7964b64eefd70d49be4ba36256679cc3a7ab745e..d255516b6e6ad654c12b5cfb3fb0f1abc9e9a9d2 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/BengaliCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/BengaliCustomizer.java
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase;
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.latin.Constants;
@@ -37,12 +35,12 @@ public class BengaliCustomizer extends LayoutCustomizer {
 
     @Override
     public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
-        return isPhone ? EMPTY_KEYS : LayoutBase.EXCLAMATION_AND_QUESTION_MARKS;
+        return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
     }
 
     // U+0995: "क" BENGALI LETTER KA
     // U+0996: "ख" BENGALI LETTER KHA
     // U+0997: "ग" BENGALI LETTER GA
-    private static final ExpectedKey BENGALI_ALPHABET_KEY = LayoutBase.key(
+    private static final ExpectedKey BENGALI_ALPHABET_KEY = key(
             "\u0995\u0996\u0997", Constants.CODE_SWITCH_ALPHA_SYMBOL);
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/DanishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/DanishCustomizer.java
similarity index 96%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/DanishCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/DanishCustomizer.java
index 2c5df60456abc196ea16f6a90347efce1536c424..3d91194f29fb15c359b96cfa40375fe201a24f5b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/DanishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/DanishCustomizer.java
@@ -14,17 +14,16 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
 import com.android.inputmethod.keyboard.layout.Nordic;
 import com.android.inputmethod.keyboard.layout.Symbols;
-import com.android.inputmethod.keyboard.layout.LayoutBase.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class DanishCustomizer extends EuroCustomizer {
+public class DanishCustomizer extends EuroCustomizer {
     public DanishCustomizer(final Locale locale) { super(locale); }
 
     @Override
@@ -110,4 +109,4 @@ class DanishCustomizer extends EuroCustomizer {
                 // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
                 .setMoreKeysOf("n", "\u00F1", "\u0144");
     }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/DevanagariCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/DevanagariCustomizer.java
similarity index 62%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/DevanagariCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/DevanagariCustomizer.java
index a31591d324465228bbc251284580b1a5be86abb1..d4e5e58858811f674a878df9e04703ca1c8c9975 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/DevanagariCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/DevanagariCustomizer.java
@@ -14,12 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.Hindi;
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
-import com.android.inputmethod.keyboard.layout.Symbols;
-import com.android.inputmethod.keyboard.layout.SymbolsShifted;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.latin.Constants;
 
@@ -37,34 +33,17 @@ public class DevanagariCustomizer extends LayoutCustomizer {
     @Override
     public ExpectedKey getBackToSymbolsKey() { return HINDI_BACK_TO_SYMBOLS_KEY; }
 
-    @Override
-    public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
-
-    @Override
-    public ExpectedKey[] getOtherCurrencyKeys() {
-        return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
-    }
-
-    @Override
-    public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
-        return isPhone ? EMPTY_KEYS : Hindi.EXCLAMATION_AND_QUESTION_MARKS;
-    }
-
     // U+0915: "क" DEVANAGARI LETTER KA
     // U+0916: "ख" DEVANAGARI LETTER KHA
     // U+0917: "ग" DEVANAGARI LETTER GA
-    private static final ExpectedKey HINDI_ALPHABET_KEY = Hindi.key(
+    private static final ExpectedKey HINDI_ALPHABET_KEY = key(
             "\u0915\u0916\u0917", Constants.CODE_SWITCH_ALPHA_SYMBOL);
     // U+0967: "१" DEVANAGARI DIGIT ONE
     // U+0968: "२" DEVANAGARI DIGIT TWO
     // U+0969: "३" DEVANAGARI DIGIT THREE
     private static final String HINDI_SYMBOLS_LABEL = "?\u0967\u0968\u0969";
-    private static final ExpectedKey HINDI_SYMBOLS_KEY = Hindi.key(HINDI_SYMBOLS_LABEL,
+    private static final ExpectedKey HINDI_SYMBOLS_KEY = key(HINDI_SYMBOLS_LABEL,
             Constants.CODE_SWITCH_ALPHA_SYMBOL);
-    private static final ExpectedKey HINDI_BACK_TO_SYMBOLS_KEY = Hindi.key(HINDI_SYMBOLS_LABEL,
+    private static final ExpectedKey HINDI_BACK_TO_SYMBOLS_KEY = key(HINDI_SYMBOLS_LABEL,
             Constants.CODE_SHIFT);
-
-    // U+20B9: "₹" INDIAN RUPEE SIGN
-    private static final ExpectedKey CURRENCY_RUPEE = Hindi.key("\u20B9",
-            Symbols.CURRENCY_GENERIC_MORE_KEYS);
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/customizer/DutchCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/DutchCustomizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..825afb64bfd4fc21a05f96d3d4754378f7f730c7
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/DutchCustomizer.java
@@ -0,0 +1,89 @@
+/*
+ * 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.customizer;
+
+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;
+
+public class DutchCustomizer extends EuroCustomizer {
+    public DutchCustomizer(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+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
+                // 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+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", "\u00E4", "\u00E2", "\u00E0", "\u00E6", "\u00E3", "\u00E5",
+                        "\u0101")
+                // 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+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
+                // 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", "\u00EB", "\u00EA", "\u00E8", "\u0119", "\u0117", "\u0113")
+                // U+0133: "ij" LATIN SMALL LIGATURE IJ
+                .setMoreKeysOf("y", "\u0133")
+                // 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", "\u00FA", "\u00FC", "\u00FB", "\u00F9", "\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
+                // U+0133: "ij" LATIN SMALL LIGATURE IJ
+                .setMoreKeysOf("i",
+                        "\u00ED", "\u00EF", "\u00EC", "\u00EE", "\u012F", "\u012B", "\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
+                .setMoreKeysOf("o",
+                        "\u00F3", "\u00F6", "\u00F4", "\u00F2", "\u00F5", "\u0153", "\u00F8",
+                        "\u014D")
+                // 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/customizer/DvorakCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/DvorakCustomizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..b7b018793e0911794badfb0947a6efdc41a60914
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/DvorakCustomizer.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.customizer;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey.ExpectedAdditionalMoreKey;
+
+import java.util.Locale;
+
+public class DvorakCustomizer extends LayoutCustomizer {
+    public DvorakCustomizer(final Locale locale) { super(locale); }
+
+    @Override
+    public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
+        return isPhone ? joinKeys(SHIFT_KEY): joinKeys(SHIFT_KEY, key("q"));
+    }
+
+    @Override
+    public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+        return isPhone ? EMPTY_KEYS : joinKeys(key("z"), SHIFT_KEY);
+    }
+
+    @Override
+    public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
+        // U+00A1: "¡" INVERTED EXCLAMATION MARK
+        return isPhone ? joinKeys(key("q", SETTINGS_KEY))
+                : joinKeys(key("!", joinMoreKeys("\u00A1", SETTINGS_KEY)));
+    }
+
+    @Override
+    public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
+        final ExpectedAdditionalMoreKey[] punctuationMoreKeys =
+                convertToAdditionalMoreKeys(getPunctuationMoreKeys(isPhone));
+        // U+00BF: "¿" INVERTED QUESTION MARK
+        return isPhone
+                ? joinKeys(key("z", punctuationMoreKeys))
+                : joinKeys(key("?", joinMoreKeys(punctuationMoreKeys, "\u00BF")));
+    }
+
+    private static ExpectedAdditionalMoreKey[] convertToAdditionalMoreKeys(
+            final ExpectedKey ... moreKeys) {
+        final ExpectedAdditionalMoreKey[] additionalMoreKeys =
+                new ExpectedAdditionalMoreKey[moreKeys.length];
+        for (int index = 0; index < moreKeys.length; index++) {
+            additionalMoreKeys[index] = ExpectedAdditionalMoreKey.newInstance(moreKeys[index]);
+        }
+        return additionalMoreKeys;
+    }
+
+    public static class EnglishDvorakCustomizer extends DvorakCustomizer {
+        private final EnglishCustomizer mEnglishCustomizer;
+
+        public EnglishDvorakCustomizer(final Locale locale) {
+            super(locale);
+            mEnglishCustomizer = new EnglishCustomizer(locale);
+        }
+
+        @Override
+        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+            return mEnglishCustomizer.setAccentedLetters(builder);
+        }
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/customizer/EastSlavicCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/EastSlavicCustomizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..03fc973f05e131361e5c273f9476ec96e98c66f7
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/EastSlavicCustomizer.java
@@ -0,0 +1,40 @@
+/*
+ * 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.customizer;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+public class EastSlavicCustomizer extends LayoutCustomizer {
+    public EastSlavicCustomizer(final Locale locale) { super(locale); }
+
+    @Override
+    public final ExpectedKey getAlphabetKey() { return EAST_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 EAST_SLAVIC_ALPHABET_KEY = key(
+            "\u0410\u0411\u0412", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/EnglishCustomizer.java
similarity index 93%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/EnglishCustomizer.java
index 3e82f65bf26c85765b77c37bf7823ff6be2e763f..9a9c6bb2f26c8960af4bae4c7daec34840b15588 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/EnglishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/EnglishCustomizer.java
@@ -14,15 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class EnglishCustomizer extends LayoutCustomizer {
-    EnglishCustomizer(final Locale locale) { super(locale); }
+public class EnglishCustomizer extends LayoutCustomizer {
+    public EnglishCustomizer(final Locale locale) { super(locale); }
 
     @Override
     public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/EstonianEECustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/EstonianEECustomizer.java
similarity index 96%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/EstonianEECustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/EstonianEECustomizer.java
index d0b87726f5c321d3b41b9a9e5e46c52be10456f4..a7d611a3e3f5cef73d86a745427978e2f37ed65b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/EstonianEECustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/EstonianEECustomizer.java
@@ -14,10 +14,9 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
 import com.android.inputmethod.keyboard.KeyboardId;
-import com.android.inputmethod.keyboard.layout.LayoutBase.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Nordic;
 import com.android.inputmethod.keyboard.layout.Symbols;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
@@ -25,10 +24,8 @@ import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class EstonianEECustomizer extends EuroCustomizer {
-    public EstonianEECustomizer(final Locale locale) {
-        super(locale);
-    }
+public class EstonianEECustomizer extends EuroCustomizer {
+    public EstonianEECustomizer(final Locale locale) { super(locale); }
 
     @Override
     public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
@@ -167,4 +164,4 @@ class EstonianEECustomizer extends EuroCustomizer {
                 // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
                 .setMoreKeysOf("n", "\u0146", "\u00F1", "\u0144");
     }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/customizer/EuroCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/EuroCustomizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee0236d881fc5e680b5a0af667f4b97c9f6c5001
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/EuroCustomizer.java
@@ -0,0 +1,40 @@
+/*
+ * 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.customizer;
+
+import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.SymbolsShifted;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+
+import java.util.Locale;
+
+/**
+ * The layout customize class for countries that use Euro.
+ */
+public class EuroCustomizer extends LayoutCustomizer {
+    public EuroCustomizer(final Locale locale) {
+        super(locale);
+    }
+
+    @Override
+    public final ExpectedKey getCurrencyKey() { return Symbols.CURRENCY_EURO; }
+
+    @Override
+    public final ExpectedKey[] getOtherCurrencyKeys() {
+        return SymbolsShifted.CURRENCIES_OTHER_THAN_EURO;
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/FinnishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/FinnishCustomizer.java
similarity index 95%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/FinnishCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/FinnishCustomizer.java
index 912aec4a0a07ca668616368498e5576b0cf72ee5..a792f91432c59621f333bb16620ed9ca9c20add4 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/FinnishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/FinnishCustomizer.java
@@ -14,15 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
 import com.android.inputmethod.keyboard.layout.Nordic;
-import com.android.inputmethod.keyboard.layout.LayoutBase.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class FinnishCustomizer extends EuroCustomizer {
+public class FinnishCustomizer extends EuroCustomizer {
     public FinnishCustomizer(final Locale locale) { super(locale); }
 
     protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
@@ -80,4 +79,4 @@ class FinnishCustomizer extends EuroCustomizer {
                 // U+017C: "ż" LATIN SMALL LETTER Z WITH DOT ABOVE
                 .setMoreKeysOf("z", "\u017E", "\u017A", "\u017C");
     }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/FrenchCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/FrenchCustomizer.java
similarity index 84%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/FrenchCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/FrenchCustomizer.java
index ab90267d01299b08ea9b542919a238848f8688a0..d7798cc565c657b4c6b2b23a4c4b14961f4801f3 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/FrenchCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/FrenchCustomizer.java
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class FrenchCustomizer extends LayoutCustomizer {
-    FrenchCustomizer(final Locale locale) { super(locale); }
+public class FrenchCustomizer extends LayoutCustomizer {
+    public FrenchCustomizer(final Locale locale) { super(locale); }
 
     @Override
     public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
@@ -86,4 +86,21 @@ class FrenchCustomizer extends LayoutCustomizer {
                 .setMoreKeysOf("c", "\u00E7", "\u0107", "\u010D")
                 .setAdditionalMoreKeysPositionOf("c", 2);
     }
+
+    public static final class FrenchEuroCustomizer extends FrenchCustomizer {
+        private final EuroCustomizer mEuroCustomizer;
+
+        public FrenchEuroCustomizer(final Locale locale) {
+            super(locale);
+            mEuroCustomizer = new EuroCustomizer(locale);
+        }
+
+        @Override
+        public final ExpectedKey getCurrencyKey() { return mEuroCustomizer.getCurrencyKey(); }
+
+        @Override
+        public final ExpectedKey[] getOtherCurrencyKeys() {
+            return mEuroCustomizer.getOtherCurrencyKeys();
+        }
+    }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/GermanCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/GermanCustomizer.java
similarity index 86%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/GermanCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/GermanCustomizer.java
index 6d38937aa7288311d833826da17bfbdc316e01b9..e0e4c78b1e53d40e14baed108cf9f11805212130 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/GermanCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/GermanCustomizer.java
@@ -14,16 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
 import com.android.inputmethod.keyboard.layout.Symbols;
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class GermanCustomizer extends LayoutCustomizer {
+public class GermanCustomizer extends LayoutCustomizer {
     public GermanCustomizer(final Locale locale) { super(locale); }
 
     @Override
@@ -86,4 +85,21 @@ class GermanCustomizer extends LayoutCustomizer {
                 // U+0144: "Å„" LATIN SMALL LETTER N WITH ACUTE
                 .setMoreKeysOf("n", "\u00F1", "\u0144");
     }
+
+    public static class GermanEuroCustomizer extends GermanCustomizer {
+        private final EuroCustomizer mEuroCustomizer;
+
+        public GermanEuroCustomizer(final Locale locale) {
+            super(locale);
+            mEuroCustomizer = new EuroCustomizer(locale);
+        }
+
+        @Override
+        public ExpectedKey getCurrencyKey() { return mEuroCustomizer.getCurrencyKey(); }
+
+        @Override
+        public ExpectedKey[] getOtherCurrencyKeys() {
+            return mEuroCustomizer.getOtherCurrencyKeys();
+        }
+    }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/HindiCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/HindiCustomizer.java
similarity index 65%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/HindiCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/HindiCustomizer.java
index cb53bdc243bdfbc6c2bf3dbca010d4927748d56d..c7fe9dbd54f6536e4afbc97d15c78866ea5b654b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/HindiCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/HindiCustomizer.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.SymbolsShifted;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -24,11 +25,24 @@ import java.util.Locale;
 public class HindiCustomizer extends DevanagariCustomizer {
     public HindiCustomizer(final Locale locale) { super(locale); }
 
+    @Override
+    public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
+
+    @Override
+    public ExpectedKey[] getOtherCurrencyKeys() {
+        return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
+    }
+
+    @Override
+    public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+        return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
+    }
+
     @Override
     public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
         // U+0964: "।" DEVANAGARI DANDA
-        final ExpectedKey periodKey = LayoutBase.key("\u0964", getPunctuationMoreKeys(isPhone));
-        return LayoutBase.joinKeys(periodKey);
+        final ExpectedKey periodKey = key("\u0964", getPunctuationMoreKeys(isPhone));
+        return joinKeys(periodKey);
     }
 
     @Override
@@ -36,12 +50,16 @@ public class HindiCustomizer extends DevanagariCustomizer {
         return isPhone ? HINDI_PHONE_PUNCTUATION_MORE_KEYS : HINDI_TABLET_PUNCTUATION_MORE_KEYS;
     }
 
+    // U+20B9: "₹" INDIAN RUPEE SIGN
+    private static final ExpectedKey CURRENCY_RUPEE = key("\u20B9",
+            Symbols.CURRENCY_GENERIC_MORE_KEYS);
+
     // Punctuation more keys for phone form factor.
-    private static final ExpectedKey[] HINDI_PHONE_PUNCTUATION_MORE_KEYS = LayoutBase.joinKeys(
+    private static final ExpectedKey[] HINDI_PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
             ",", ".", "?", "!", "#", ")", "(", "/", ";",
             "'", "@", ":", "-", "\"", "+", "%", "&");
     // Punctuation more keys for tablet form factor.
-    private static final ExpectedKey[] HINDI_TABLET_PUNCTUATION_MORE_KEYS = LayoutBase.joinKeys(
+    private static final ExpectedKey[] HINDI_TABLET_PUNCTUATION_MORE_KEYS = joinKeys(
             ",", ".", "'", "#", ")", "(", "/", ";",
             "@", ":", "-", "\"", "+", "%", "&");
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/ItalianCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/ItalianCustomizer.java
similarity index 95%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/ItalianCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/ItalianCustomizer.java
index 735070946ee5fad65368135a7a559657e7f2f766..3b547fdc4061aa4f599c7bc28faab4f2d2db917e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/ItalianCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/ItalianCustomizer.java
@@ -14,14 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class ItalianCustomizer extends LayoutCustomizer {
+public class ItalianCustomizer extends LayoutCustomizer {
     public ItalianCustomizer(final Locale locale) { super(locale); }
 
     @Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/customizer/LayoutCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/LayoutCustomizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..27f55342ebfea1ebcbe3b978997a3b2348934fcf
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/LayoutCustomizer.java
@@ -0,0 +1,214 @@
+/*
+ * 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.customizer;
+
+import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.SymbolsShifted;
+import com.android.inputmethod.keyboard.layout.expected.AbstractLayoutBase;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+
+import java.util.Locale;
+
+/**
+ * This class is used to customize common keyboard layout to language specific layout.
+ */
+public class LayoutCustomizer extends AbstractLayoutBase {
+    private final Locale mLocale;
+
+    // Empty keys definition to remove keys by adding this.
+    protected static final ExpectedKey[] EMPTY_KEYS = joinKeys();
+
+    public LayoutCustomizer(final Locale locale) {  mLocale = locale; }
+
+    public final Locale getLocale() { return mLocale; }
+
+    public int getNumberOfRows() { return 4; }
+
+    /**
+     * Set accented letters to a specific keyboard element.
+     * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard
+     *        layout.
+     * @param elementId the element id of keyboard
+     * @return the {@link ExpectedKeyboardBuilder} object that contains accented letters as
+     *        "more keys".
+     */
+    public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder,
+            final int elementId) {
+        // This method can be overridden by an extended class to provide customized expected
+        // accented letters depending on the shift state of keyboard.
+        // This is a default behavior to call a shift-state-independent
+        // {@link #setAccentedLetters(ExpectedKeyboardBuilder)} implementation, so that
+        // <code>elementId</code> is ignored here.
+        return setAccentedLetters(builder);
+    }
+
+    /**
+     * Set accented letters to common layout.
+     * @param builder the {@link ExpectedKeyboardBuilder} object that contains common keyboard
+     *        layout.
+     * @return the {@link ExpectedKeyboardBuilder} object that contains accented letters as
+     *        "more keys".
+     */
+    public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
+        return builder;
+    }
+
+    /**
+     * Get the function key to switch to alphabet layout.
+     * @return the {@link ExpectedKey} of the alphabet key.
+     */
+    public ExpectedKey getAlphabetKey() { return ALPHABET_KEY; }
+
+    /**
+     * Get the function key to switch to symbols layout.
+     * @return the {@link ExpectedKey} of the symbols key.
+     */
+    public ExpectedKey getSymbolsKey() { return SYMBOLS_KEY; }
+
+    /**
+     * Get the function key to switch to symbols shift layout.
+     * @param isPhone true if requesting phone's key.
+     * @return the {@link ExpectedKey} of the symbols shift key.
+     */
+    public ExpectedKey getSymbolsShiftKey(boolean isPhone) {
+        return isPhone ? SYMBOLS_SHIFT_KEY : TABLET_SYMBOLS_SHIFT_KEY;
+    }
+
+    /**
+     * Get the function key to switch from symbols shift to symbols layout.
+     * @return the {@link ExpectedKey} of the back to symbols key.
+     */
+    public ExpectedKey getBackToSymbolsKey() { return BACK_TO_SYMBOLS_KEY; }
+
+    /**
+     * Get the currency key.
+     * @return the {@link ExpectedKey} of the currency key.
+     */
+    public ExpectedKey getCurrencyKey() { return Symbols.CURRENCY_DOLLAR; }
+
+    /**
+     * Get other currencies keys.
+     * @return the array of {@link ExpectedKey} that represents other currency keys.
+     */
+    public ExpectedKey[] getOtherCurrencyKeys() {
+        return SymbolsShifted.CURRENCIES_OTHER_THAN_DOLLAR;
+    }
+
+    /**
+     * Get "more keys" of double quotation mark.
+     * @return the array of {@link ExpectedKey} of more double quotation marks in natural order.
+     */
+    public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_9LR; }
+
+    /**
+     * Get "more keys" of single quotation mark.
+     * @return the array of {@link ExpectedKey} of more single quotation marks in natural order.
+     */
+    public ExpectedKey[] getSingleQuoteMoreKeys() { return Symbols.SINGLE_QUOTES_9LR; }
+
+    /**
+     * Get double angle quotation marks in natural order.
+     * @return the array of {@link ExpectedKey} of double angle quotation marks in natural
+     *         order.
+     */
+    public ExpectedKey[] getDoubleAngleQuoteKeys() { return Symbols.DOUBLE_ANGLE_QUOTES_LR; }
+
+    /**
+     * Get single angle quotation marks in natural order.
+     * @return the array of {@link ExpectedKey} of single angle quotation marks in natural
+     *         order.
+     */
+    public ExpectedKey[] getSingleAngleQuoteKeys() { return Symbols.SINGLE_ANGLE_QUOTES_LR; }
+
+    /**
+     * Get the left shift keys.
+     * @param isPhone true if requesting phone's keys.
+     * @return the array of {@link ExpectedKey} that should be placed at left edge of the
+     *         keyboard.
+     */
+    public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
+        return joinKeys(SHIFT_KEY);
+    }
+
+    /**
+     * Get the right shift keys.
+     * @param isPhone true if requesting phone's keys.
+     * @return the array of {@link ExpectedKey} that should be placed at right edge of the
+     *         keyboard.
+     */
+    public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+        return isPhone ? EMPTY_KEYS : joinKeys(EXCLAMATION_AND_QUESTION_MARKS, SHIFT_KEY);
+    }
+
+    /**
+     * Get the enter key.
+     * @param isPhone true if requesting phone's key.
+     * @return the array of {@link ExpectedKey} that should be placed as an enter key.
+     */
+    public ExpectedKey getEnterKey(final boolean isPhone) {
+        return isPhone ? key(ENTER_KEY, EMOJI_ACTION_KEY) : ENTER_KEY;
+    }
+
+    /**
+     * Get the emoji key.
+     * @param isPhone true if requesting phone's key.
+     * @return the array of {@link ExpectedKey} that should be placed as an emoji key.
+     */
+    public ExpectedKey getEmojiKey(final boolean isPhone) {
+        return EMOJI_NORMAL_KEY;
+    }
+
+    /**
+     * Get the space keys.
+     * @param isPhone true if requesting phone's keys.
+     * @return the array of {@link ExpectedKey} that should be placed at the center of the
+     *         keyboard.
+     */
+    public ExpectedKey[] getSpaceKeys(final boolean isPhone) {
+        return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY);
+    }
+
+    /**
+     * Get the keys left to the spacebar.
+     * @param isPhone true if requesting phone's keys.
+     * @return the array of {@link ExpectedKey} that should be placed at left of the spacebar.
+     */
+    public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
+        // U+002C: "," COMMA
+        return joinKeys(key("\u002C", SETTINGS_KEY));
+    }
+
+    /**
+     * Get the keys right to the spacebar.
+     * @param isPhone true if requesting phone's keys.
+     * @return the array of {@link ExpectedKey} that should be placed at right of the spacebar.
+     */
+    public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
+        final ExpectedKey periodKey = key(".", getPunctuationMoreKeys(isPhone));
+        return joinKeys(periodKey);
+    }
+
+    /**
+     * Get "more keys" for the punctuation key (usually the period key).
+     * @param isPhone true if requesting phone's keys.
+     * @return the array of {@link ExpectedKey} that are "more keys" of the punctuation key.
+     */
+    public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) {
+        return isPhone ? PHONE_PUNCTUATION_MORE_KEYS : TABLET_PUNCTUATION_MORE_KEYS;
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/customizer/NepaliCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/NepaliCustomizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a00d80a0208550ee9834819f58fc0711a7cd790
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/NepaliCustomizer.java
@@ -0,0 +1,45 @@
+/*
+ * 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.customizer;
+
+import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.SymbolsShifted;
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+
+import java.util.Locale;
+
+public class NepaliCustomizer extends DevanagariCustomizer {
+    public NepaliCustomizer(final Locale locale) { super(locale); }
+
+    @Override
+    public ExpectedKey getCurrencyKey() { return CURRENCY_NEPALI; }
+
+    @Override
+    public ExpectedKey[] getOtherCurrencyKeys() {
+        return SymbolsShifted.CURRENCIES_OTHER_GENERIC;
+    }
+
+    @Override
+    public ExpectedKey[] getSpaceKeys(final boolean isPhone) {
+        return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY, key(ZWNJ_KEY, ZWJ_KEY));
+    }
+
+    // U+0930/U+0941/U+002E "रु." NEPALESE RUPEE SIGN
+    private static final ExpectedKey CURRENCY_NEPALI = key("\u0930\u0941\u002E",
+            Symbols.DOLLAR_SIGN, Symbols.CENT_SIGN, Symbols.EURO_SIGN, Symbols.POUND_SIGN,
+            Symbols.YEN_SIGN, Symbols.PESO_SIGN);
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/NoLanguageCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/NoLanguageCustomizer.java
similarity index 97%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/NoLanguageCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/NoLanguageCustomizer.java
index 9edbcab69504a7592fbf0f9e1ada161dfdd04920..b6bf5bfebd39374faab6a314c7267d4b57101809 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/NoLanguageCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/NoLanguageCustomizer.java
@@ -14,15 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class NoLanguageCustomizer extends LayoutCustomizer {
-    NoLanguageCustomizer(final Locale locale) { super(locale); }
+public class NoLanguageCustomizer extends LayoutCustomizer {
+    public NoLanguageCustomizer(final Locale locale) { super(locale); }
 
     @Override
     public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/NorwegianCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/NorwegianCustomizer.java
similarity index 95%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/NorwegianCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/NorwegianCustomizer.java
index 4be7a57c5be81657d65f0658b5e6a83ca8028ab6..6cc44e578a6728f459a62fa580f2b8108d46d31f 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/NorwegianCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/NorwegianCustomizer.java
@@ -14,17 +14,16 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
 import com.android.inputmethod.keyboard.layout.Nordic;
 import com.android.inputmethod.keyboard.layout.Symbols;
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class NorwegianCustomizer extends LayoutCustomizer {
+public class NorwegianCustomizer extends LayoutCustomizer {
     public NorwegianCustomizer(final Locale locale) { super(locale); }
 
     @Override
@@ -93,4 +92,4 @@ class NorwegianCustomizer extends LayoutCustomizer {
                 // U+016B: "Å«" LATIN SMALL LETTER U WITH MACRON
                 .setMoreKeysOf("u", "\u00FC", "\u00FB", "\u00F9", "\u00FA", "\u016B");
     }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/customizer/PcQwertyCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/PcQwertyCustomizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a0f764ae91be567be420d87a55dcc0f72a29111
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/PcQwertyCustomizer.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.customizer;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+
+import java.util.Locale;
+
+public class PcQwertyCustomizer extends LayoutCustomizer {
+    public PcQwertyCustomizer(final Locale locale) { super(locale); }
+
+    @Override
+    public int getNumberOfRows() { return 5; }
+
+    @Override
+    public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
+        return joinKeys(SHIFT_KEY);
+    }
+
+    @Override
+    public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+        return joinKeys(SHIFT_KEY);
+    }
+
+    @Override
+    public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
+        return joinKeys(SETTINGS_KEY);
+    }
+
+    @Override
+    public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
+        return isPhone
+                ? joinKeys(key(ENTER_KEY, EMOJI_ACTION_KEY))
+                : joinKeys(EMOJI_NORMAL_KEY);
+    }
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/PortugueseCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/PortugueseCustomizer.java
similarity index 94%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/PortugueseCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/PortugueseCustomizer.java
index 629e8cb8b338a2448ff2ce231198f9c0da6d19ec..4fc64cc6293038d776abb4306b4376085e1c0956 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/PortugueseCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/PortugueseCustomizer.java
@@ -14,15 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class PortugueseCustomizer extends LayoutCustomizer {
-    PortugueseCustomizer(final Locale locale) { super(locale); }
+public class PortugueseCustomizer extends LayoutCustomizer {
+    public PortugueseCustomizer(final Locale locale) { super(locale); }
 
     @Override
     public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/SerbianLatinCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/SerbianLatinCustomizer.java
similarity index 90%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/SerbianLatinCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/SerbianLatinCustomizer.java
index 3660ce4b7e284f11f4e5e23acf6b65874c344b04..4d03c8ba66c103b84352460de3ce1310398c6e59 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/SerbianLatinCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/SerbianLatinCustomizer.java
@@ -14,22 +14,20 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase;
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.SerbianQwertz;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class SerbianLatinCustomizer extends LayoutCustomizer {
+public class SerbianLatinCustomizer extends LayoutCustomizer {
     public SerbianLatinCustomizer(final Locale locale) { super(locale); }
 
     @Override
     public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
-        return isPhone ? EMPTY_KEYS : LayoutBase.EXCLAMATION_AND_QUESTION_MARKS;
+        return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
     }
 
     protected void setSerbianKeys(final ExpectedKeyboardBuilder builder) {
@@ -79,4 +77,4 @@ class SerbianLatinCustomizer extends LayoutCustomizer {
                 // U+00EC: "ì" LATIN SMALL LETTER I WITH GRAVE
                 .setMoreKeysOf("i", "\u00EC");
     }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/customizer/SouthSlavicLayoutCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/SouthSlavicLayoutCustomizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..cc41d37ca47f7f56f071d23481772ac397d986bc
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/SouthSlavicLayoutCustomizer.java
@@ -0,0 +1,43 @@
+/*
+ * 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.customizer;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+public 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);
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/SpanishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/SpanishCustomizer.java
similarity index 89%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/SpanishCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/SpanishCustomizer.java
index 8974ad6ec20ad9ac34dcee167b47f94dd85e360c..1284f054ee9e1015c1dcc41a824f2f71f400eb0d 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/SpanishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/SpanishCustomizer.java
@@ -14,28 +14,24 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-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.AbstractLayoutBase;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class SpanishCustomizer extends LayoutCustomizer {
-    SpanishCustomizer(final Locale locale) { super(locale); }
+public class SpanishCustomizer extends LayoutCustomizer {
+    public SpanishCustomizer(final Locale locale) { super(locale); }
 
     @Override
     public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) {
-        return isPhone ? PHONE_PUNCTUATION_MORE_KEYS
-                : LayoutBase.TABLET_PUNCTUATION_MORE_KEYS;
+        return isPhone ? SPANISH_PHONE_PUNCTUATION_MORE_KEYS : TABLET_PUNCTUATION_MORE_KEYS;
     }
 
     // Punctuation more keys for phone form factor.
-    private static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = AbstractLayoutBase.joinKeys(
+    private static final ExpectedKey[] SPANISH_PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
             // U+00A1: "¡" INVERTED EXCLAMATION MARK
             // U+00BF: "¿" INVERTED QUESTION MARK
             ",", "?", "!", "#", ")", "(", "/", ";", "\u00A1",
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/SwedishCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/SwedishCustomizer.java
similarity index 96%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/SwedishCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/SwedishCustomizer.java
index af4a971bde3c1b6253497ee8d96436f43594dec9..f4ff594588fa785f3e7ef8f1b580f5c1ef522d66 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/SwedishCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/SwedishCustomizer.java
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase.EuroCustomizer;
-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;
@@ -25,7 +23,7 @@ import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class SwedishCustomizer extends LayoutCustomizer {
+public class SwedishCustomizer extends LayoutCustomizer {
     private final LayoutCustomizer mEuroCustomizer;
 
     public SwedishCustomizer(final Locale locale) {
@@ -142,4 +140,4 @@ class SwedishCustomizer extends LayoutCustomizer {
                 // U+0148: "ň" LATIN SMALL LETTER N WITH CARON
                 .setMoreKeysOf("n", "\u0144", "\u00F1", "\u0148");
     }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/customizer/TamilCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/TamilCustomizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..91fd21ef5ca74f004a82404c0336bb22a768e9c0
--- /dev/null
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/TamilCustomizer.java
@@ -0,0 +1,45 @@
+/*
+ * 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.customizer;
+
+import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.latin.Constants;
+
+import java.util.Locale;
+
+public class TamilCustomizer extends LayoutCustomizer {
+    public TamilCustomizer(final Locale locale) { super(locale); }
+
+    @Override
+    public ExpectedKey getAlphabetKey() { return TAMIL_ALPHABET_KEY; }
+
+    @Override
+    public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) {
+        return EMPTY_KEYS;
+    }
+
+    @Override
+    public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
+        return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
+    }
+
+    // U+0BA4: "த" TAMIL LETTER TA
+    // U+0BAE/U+0BBF: "மி" TAMIL LETTER MA/TAMIL VOWEL SIGN I
+    // U+0BB4/U+0BCD: "ழ்" TAMIL LETTER LLLA/TAMIL SIGN VIRAMA
+    private static final ExpectedKey TAMIL_ALPHABET_KEY = key(
+            "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TurkicCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/TurkicCustomizer.java
similarity index 95%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/TurkicCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/TurkicCustomizer.java
index 1a98f6ccfcefd04415b85a16f44e256f6437a0b3..3fd3aa21964b3ad4818eadc17891e0be7769b666 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TurkicCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/TurkicCustomizer.java
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -24,7 +23,7 @@ import java.util.Locale;
 /**
  * Turkic languages layout customizer.
  */
-class TurkicCustomizer extends LayoutCustomizer {
+public class TurkicCustomizer extends LayoutCustomizer {
     public TurkicCustomizer(final Locale locale) { super(locale); }
 
     @Override
@@ -82,4 +81,4 @@ class TurkicCustomizer extends LayoutCustomizer {
                 // U+00F1: "ñ" LATIN SMALL LETTER N WITH TILDE
                 .setMoreKeysOf("n", "\u0148", "\u00F1");
     }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/UzbekCustomizer.java b/tests/src/com/android/inputmethod/keyboard/layout/customizer/UzbekCustomizer.java
similarity index 89%
rename from tests/src/com/android/inputmethod/keyboard/layout/tests/UzbekCustomizer.java
rename to tests/src/com/android/inputmethod/keyboard/layout/customizer/UzbekCustomizer.java
index 6da0b0e456a52b65c3bb4123c7a5f812aaf72e26..99486163e271d7e7440f2a5594e9fb79925f232f 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/UzbekCustomizer.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/customizer/UzbekCustomizer.java
@@ -14,17 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.inputmethod.keyboard.layout.tests;
+package com.android.inputmethod.keyboard.layout.customizer;
 
 import com.android.inputmethod.keyboard.layout.Nordic;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
 
-class UzbekCustomizer extends TurkicCustomizer {
-    public UzbekCustomizer(final Locale locale) {
-        super(locale);
-    }
+public class UzbekCustomizer extends TurkicCustomizer {
+    public UzbekCustomizer(final Locale locale) { super(locale); }
 
     protected void setUzbekKeys(final ExpectedKeyboardBuilder builder) {
         builder
@@ -41,4 +39,4 @@ class UzbekCustomizer extends TurkicCustomizer {
         setUzbekKeys(builder);
         return super.setAccentedLetters(builder);
     }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java
index 3556cb4bf1629f6a5687ee6a0e366503f9b68e8d..b15ef5d26530b7d84b995b976bb3072261a4ac88 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/expected/AbstractLayoutBase.java
@@ -16,7 +16,9 @@
 
 package com.android.inputmethod.keyboard.layout.expected;
 
+import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey.ExpectedAdditionalMoreKey;
+import com.android.inputmethod.latin.Constants;
 
 /**
  * Base class to create an expected keyboard for unit test.
@@ -102,4 +104,75 @@ public abstract class AbstractLayoutBase {
     public static ExpectedKey[] joinKeys(final Object ... keys) {
         return ExpectedKeyboardBuilder.joinKeys(keys);
     }
+
+    // Icon ids.
+    private static final int ICON_DELETE = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_DELETE_KEY);
+    private static final int ICON_SPACE = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_SPACE_KEY);
+    private static final int ICON_TAB = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_TAB_KEY);
+    private static final int ICON_SHORTCUT = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_SHORTCUT_KEY);
+    private static final int ICON_SETTINGS = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_SETTINGS_KEY);
+    private static final int ICON_LANGUAGE_SWITCH = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_LANGUAGE_SWITCH_KEY);
+    private static final int ICON_ENTER = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_ENTER_KEY);
+    private static final int ICON_EMOJI_ACTION = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_EMOJI_ACTION_KEY);
+    private static final int ICON_EMOJI_NORMAL = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_EMOJI_NORMAL_KEY);
+    private static final int ICON_SHIFT = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_SHIFT_KEY);
+    private static final int ICON_SHIFTED_SHIFT = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_SHIFT_KEY_SHIFTED);
+    private static final int ICON_ZWNJ = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_ZWNJ_KEY);
+    private static final int ICON_ZWJ = KeyboardIconsSet.getIconId(
+            KeyboardIconsSet.NAME_ZWJ_KEY);
+
+    // Functional keys.
+    protected static final ExpectedKey DELETE_KEY = key(ICON_DELETE, Constants.CODE_DELETE);
+    protected static final ExpectedKey TAB_KEY = key(ICON_TAB, Constants.CODE_TAB);
+    protected static final ExpectedKey SHORTCUT_KEY = key(ICON_SHORTCUT, Constants.CODE_SHORTCUT);
+    protected static final ExpectedKey SETTINGS_KEY = key(ICON_SETTINGS, Constants.CODE_SETTINGS);
+    protected static final ExpectedKey LANGUAGE_SWITCH_KEY = key(
+            ICON_LANGUAGE_SWITCH, Constants.CODE_LANGUAGE_SWITCH);
+    protected static final ExpectedKey ENTER_KEY = key(ICON_ENTER, Constants.CODE_ENTER);
+    protected static final ExpectedKey EMOJI_ACTION_KEY = key(ICON_EMOJI_ACTION, Constants.CODE_EMOJI);
+    protected static final ExpectedKey EMOJI_NORMAL_KEY = key(ICON_EMOJI_NORMAL, Constants.CODE_EMOJI);
+    protected static final ExpectedKey SPACE_KEY = key(ICON_SPACE, Constants.CODE_SPACE);
+    protected static final ExpectedKey CAPSLOCK_MORE_KEY = key(" ", Constants.CODE_CAPSLOCK);
+    protected static final ExpectedKey SHIFT_KEY = key(ICON_SHIFT,
+            Constants.CODE_SHIFT, CAPSLOCK_MORE_KEY);
+    protected static final ExpectedKey SHIFTED_SHIFT_KEY = key(ICON_SHIFTED_SHIFT,
+            Constants.CODE_SHIFT, CAPSLOCK_MORE_KEY);
+    protected static final ExpectedKey ALPHABET_KEY = key("ABC", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+    protected static final ExpectedKey SYMBOLS_KEY = key("?123", Constants.CODE_SWITCH_ALPHA_SYMBOL);
+    protected static final ExpectedKey BACK_TO_SYMBOLS_KEY = key("?123", Constants.CODE_SHIFT);
+    protected static final ExpectedKey SYMBOLS_SHIFT_KEY = key("= \\ <", Constants.CODE_SHIFT);
+    protected static final ExpectedKey TABLET_SYMBOLS_SHIFT_KEY = key("~ [ <", Constants.CODE_SHIFT);
+
+    // U+00A1: "¡" INVERTED EXCLAMATION MARK
+    // U+00BF: "¿" INVERTED QUESTION MARK
+    protected static final ExpectedKey[] EXCLAMATION_AND_QUESTION_MARKS = joinKeys(
+            key("!", moreKey("\u00A1")), key("?", moreKey("\u00BF")));
+    // U+200C: ZERO WIDTH NON-JOINER
+    // U+200D: ZERO WIDTH JOINER
+    protected static final ExpectedKey ZWNJ_KEY = key(ICON_ZWNJ, "\u200C");
+    protected static final ExpectedKey ZWJ_KEY = key(ICON_ZWJ, "\u200D");
+    // Domain key
+    protected static final ExpectedKey DOMAIN_KEY =
+            key(".com", joinMoreKeys(".net", ".org", ".gov", ".edu")).preserveCase();
+
+    // Punctuation more keys for phone form factor.
+    protected static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
+            ",", "?", "!", "#", ")", "(", "/", ";",
+            "'", "@", ":", "-", "\"", "+", "%", "&");
+    // Punctuation more keys for tablet form factor.
+    protected static final ExpectedKey[] TABLET_PUNCTUATION_MORE_KEYS = joinKeys(
+            ",", "'", "#", ")", "(", "/", ";",
+            "@", ":", "-", "\"", "+", "%", "&");
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsAfrikaans.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsAfrikaans.java
index cd2259888746aee52a9b17ff2c4af7427f5384dc..f534cd6fc4ff8309a4a991a5cf1549a8f35c9a03 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsAfrikaans.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsAfrikaans.java
@@ -19,8 +19,8 @@ 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.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArabic.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArabic.java
index fd76708278ff1e9e6bebc89503adce6d3ed24bbd..a9be163d1ec9dd7ac3bd7a2990ecd54887410a6d 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArabic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArabic.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Arabic;
-import com.android.inputmethod.keyboard.layout.Arabic.ArabicCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 
 import java.util.Locale;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public class TestsArabic extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("ar");
-    private static final LayoutBase LAYOUT = new Arabic(new ArabicCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Arabic(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArmenianAMPhonetic.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArmenianAMPhonetic.java
index 327e9438f7e258df5b91012e8f72aaace7abb66a..8ef97d21efb12088c8a5df37d381ec405f3aba0e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArmenianAMPhonetic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsArmenianAMPhonetic.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.ArmenianPhonetic;
-import com.android.inputmethod.keyboard.layout.ArmenianPhonetic.ArmenianPhoneticCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 
 import java.util.Locale;
@@ -30,8 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsArmenianAMPhonetic extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("hy", "AM");
-    private static final LayoutBase LAYOUT = new ArmenianPhonetic(
-            new ArmenianPhoneticCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new ArmenianPhonetic(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsAzerbaijaniAZ.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsAzerbaijaniAZ.java
index 8e0e2bbbd6ef4d10bfd7ce92c1c13eadaaaac69b..a10023c6999b16f71dfa3444f6d4d97a1529fe7a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsAzerbaijaniAZ.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsAzerbaijaniAZ.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.TurkicCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBasqueES.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBasqueES.java
index bef18c5d5ff6c95072543addf72cd7bf9b0bc50c..103fac168109fcce2eefef68228e0c93e1201ae2 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBasqueES.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBasqueES.java
@@ -19,8 +19,9 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.SpanishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -39,7 +40,7 @@ public class TestsBasqueES extends LayoutTestsBase {
     private static class BasqueESCustomizer extends EuroCustomizer {
         private final SpanishCustomizer mSpanishCustomizer;
 
-        public BasqueESCustomizer(final Locale locale) {
+        BasqueESCustomizer(final Locale locale) {
             super(locale);
             mSpanishCustomizer = new SpanishCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBelarusianBY.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBelarusianBY.java
index c5238d54f8c31ab6e7d29c61a4159bf38913dfae..0b239336303ec9d8521fb99b000ce470db37d4d1 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBelarusianBY.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBelarusianBY.java
@@ -19,9 +19,9 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.EastSlavic;
-import com.android.inputmethod.keyboard.layout.EastSlavic.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsBelarusianBY extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class BelarusianBYCustomizer extends EastSlavicCustomizer {
-        public BelarusianBYCustomizer(final Locale locale) { super(locale); }
+        BelarusianBYCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliBD.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliBD.java
index 0334d5d2360ee0beeb14c2ef6e6ace67e086a52a..62625890e58ebffae8fd2925cba591268e0118d5 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliBD.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliBD.java
@@ -21,6 +21,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 import com.android.inputmethod.keyboard.layout.BengaliAkkhor;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.BengaliCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -37,11 +38,11 @@ public final class TestsBengaliBD extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class BengaliBDCustomzier extends BengaliCustomizer {
-        public BengaliBDCustomzier(final Locale locale) { super(locale); }
+        BengaliBDCustomzier(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
-            return isPhone ? EMPTY_KEYS : LayoutBase.EXCLAMATION_AND_QUESTION_MARKS;
+            return isPhone ? EMPTY_KEYS : EXCLAMATION_AND_QUESTION_MARKS;
         }
 
         @Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliIN.java
index 91a976c7c75bdd8d48677c63c03e05d7096bbd6f..022b0850d748c12c552b30ccaf48d71bbcc9bd42 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliIN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBengaliIN.java
@@ -21,6 +21,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 import com.android.inputmethod.keyboard.layout.Bengali;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.BengaliCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -37,7 +38,7 @@ public final class TestsBengaliIN extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class BengaliINCustomzier extends BengaliCustomizer {
-        public BengaliINCustomzier(final Locale locale) { super(locale); }
+        BengaliINCustomzier(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getLeftShiftKeys(final boolean isPhone) { return EMPTY_KEYS; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarian.java
index ded8d7243670202ebe2700e6b95706d9ba3957d2..15308271cacb45f8066a07190b15691b29646d48 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarian.java
@@ -19,7 +19,6 @@ 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;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @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));
+    private static final LayoutBase LAYOUT = new Bulgarian(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
index 22b2011ee3e01df4a55eefcabc1f15a1d616b783..558b1d44a70b5a88a16b0da0667a37a1d1e46587 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarianBds.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsBulgarianBds.java
@@ -19,7 +19,6 @@ 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;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @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));
+    private static final LayoutBase LAYOUT = new BulgarianBds(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
index 151a0a6270415d2f5cfd7f67d5424cdee9c44cb4..a323ffda46818f8440bb36a7ff368cded31967e8 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCatalan.java
@@ -19,8 +19,8 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -38,20 +38,20 @@ public class TestsCatalan extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class CatalanCustomizer extends EuroCustomizer {
-        public CatalanCustomizer(final Locale locale) { super(locale); }
+        CatalanCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) {
-            return isPhone ? PHONE_PUNCTUATION_MORE_KEYS
-                    : TABLET_PUNCTUATION_MORE_KEYS;
+            return isPhone ? CATALAN_PHONE_PUNCTUATION_MORE_KEYS
+                    : CATALAN_TABLET_PUNCTUATION_MORE_KEYS;
         }
 
         // U+00B7: "·" MIDDLE DOT
-        private static final ExpectedKey[] PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
+        private static final ExpectedKey[] CATALAN_PHONE_PUNCTUATION_MORE_KEYS = joinKeys(
                 ",", "?", "!", "\u00B7", "#", ")", "(", "/", ";",
                 "'", "@", ":", "-", "\"", "+", "%", "&");
 
-        private static final ExpectedKey[] TABLET_PUNCTUATION_MORE_KEYS = joinKeys(
+        private static final ExpectedKey[] CATALAN_TABLET_PUNCTUATION_MORE_KEYS = joinKeys(
                 ",", "'", "\u00B7", "#", ")", "(", "/", ";",
                 "@", ":", "-", "\"", "+", "%", "&");
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCroatian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCroatian.java
index 8575ef219ddf8224369c60176d04a615b17972d6..d8af75bca7b618afdc453725182800c78a384924 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCroatian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCroatian.java
@@ -19,9 +19,9 @@ 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.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsCroatian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class CroatianCustomizer extends LayoutCustomizer {
-        public CroatianCustomizer(final Locale locale) { super(locale); }
+        CroatianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_L9R; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCzech.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCzech.java
index f4794707fddc917e766d0a8e1a4eeaf382955845..f05b8ebf2edf60f0c7b45160076fe34fecdc3024 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCzech.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsCzech.java
@@ -19,9 +19,9 @@ 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.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsCzech extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class CzechCustomizer extends LayoutCustomizer {
-        public CzechCustomizer(final Locale locale) { super(locale); }
+        CzechCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanish.java
index bf43e5296facd1177c0427d454972d8d28c2b8cb..fb7338d1ba1e20fd2c5dfe93f227435898753353 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanish.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanish.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Nordic;
+import com.android.inputmethod.keyboard.layout.customizer.DanishCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanishQwertz.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanishQwertz.java
index 886b3de7e1a5f23a282789fab95107e99434b07c..718bf8aecada160a619bb979991640a44da82e2c 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanishQwertz.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDanishQwertz.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwertz;
+import com.android.inputmethod.keyboard.layout.customizer.DanishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -36,9 +37,7 @@ public final class TestsDanishQwertz extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class DanishQwertyCustomizer extends DanishCustomizer {
-        public DanishQwertyCustomizer(final Locale locale) {
-            super(locale);
-        }
+        DanishQwertyCustomizer(final Locale locale) { super(locale); }
 
         @Override
         protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDutch.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDutch.java
index 1730f66be63829fcc3c35462110229991db3dcc3..12bd1b176b6f69fb086bae80abfe99c2a5748d1d 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDutch.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDutch.java
@@ -19,11 +19,8 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Qwerty;
-import com.android.inputmethod.keyboard.layout.Symbols;
-import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
-import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.keyboard.layout.customizer.DutchCustomizer;
 
 import java.util.Locale;
 
@@ -37,70 +34,4 @@ public final class TestsDutch extends LayoutTestsBase {
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
-
-    static class DutchCustomizer extends EuroCustomizer {
-        public DutchCustomizer(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+00E1: "á" LATIN SMALL LETTER A WITH ACUTE
-                    // 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+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", "\u00E4", "\u00E2", "\u00E0", "\u00E6", "\u00E3", "\u00E5",
-                            "\u0101")
-                    // 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+00E8: "è" LATIN SMALL LETTER E WITH GRAVE
-                    // 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", "\u00EB", "\u00EA", "\u00E8", "\u0119", "\u0117", "\u0113")
-                    // U+0133: "ij" LATIN SMALL LIGATURE IJ
-                    .setMoreKeysOf("y", "\u0133")
-                    // 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", "\u00FA", "\u00FC", "\u00FB", "\u00F9", "\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
-                    // U+0133: "ij" LATIN SMALL LIGATURE IJ
-                    .setMoreKeysOf("i",
-                            "\u00ED", "\u00EF", "\u00EC", "\u00EE", "\u012F", "\u012B", "\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
-                    .setMoreKeysOf("o",
-                            "\u00F3", "\u00F6", "\u00F4", "\u00F2", "\u00F5", "\u0153", "\u00F8",
-                            "\u014D")
-                    // 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/TestsDutchBE.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDutchBE.java
index 31adf7a8d4ba14650029fb4bb2f3421c3c4bbfc1..146411858fb739e6faa95c82351d4e7c3e7c28b6 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDutchBE.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDutchBE.java
@@ -20,7 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Azerty;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
-import com.android.inputmethod.keyboard.layout.tests.TestsDutch.DutchCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.DutchCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakEmail.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakEmail.java
index b25b8467463282490cb2fb73b30eb41c39ee0ba8..3966ebc065e163bb15e85e4436b8db07015a0792 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakEmail.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakEmail.java
@@ -25,8 +25,9 @@ import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
 import com.android.inputmethod.keyboard.layout.Dvorak;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.customizer.DvorakCustomizer.EnglishDvorakCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
-import com.android.inputmethod.keyboard.layout.tests.TestsEnglishDvorak.EnglishDvorakCustomizer;
 
 import java.util.Locale;
 
@@ -60,23 +61,23 @@ public class TestsDvorakEmail extends LayoutTestsBase {
 
         @Override
         public ExpectedKey getEnterKey(final boolean isPhone) {
-            return isPhone ? LayoutBase.ENTER_KEY : super.getEnterKey(isPhone);
+            return isPhone ? ENTER_KEY : super.getEnterKey(isPhone);
         }
 
         @Override
         public ExpectedKey getEmojiKey(final boolean isPhone) {
-            return LayoutBase.DOMAIN_KEY;
+            return DOMAIN_KEY;
         }
 
         @Override
         public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
             return isPhone ? super.getKeysLeftToSpacebar(isPhone)
-                    : joinKeys(key("@", LayoutBase.SETTINGS_KEY));
+                    : joinKeys(key("@", SETTINGS_KEY));
         }
     }
 
     private static class DvorakEmail extends Dvorak {
-        public DvorakEmail(final LayoutCustomizer customizer) {
+        DvorakEmail(final LayoutCustomizer customizer) {
             super(customizer);
         }
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakUrl.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakUrl.java
index ba22f375dc6cf1c0b05d25f78ebad4e86ce67364..67e0d91af431f69fd2a2adc5fc511d55a6724479 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakUrl.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsDvorakUrl.java
@@ -25,8 +25,9 @@ import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
 import com.android.inputmethod.keyboard.layout.Dvorak;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.customizer.DvorakCustomizer.EnglishDvorakCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
-import com.android.inputmethod.keyboard.layout.tests.TestsEnglishDvorak.EnglishDvorakCustomizer;
 
 import java.util.Locale;
 
@@ -54,31 +55,27 @@ public class TestsDvorakUrl extends LayoutTestsBase {
     }
 
     private static class DvorakUrlCustomizer extends EnglishDvorakCustomizer {
-        DvorakUrlCustomizer(final Locale locale) {
-            super(locale);
-        }
+        DvorakUrlCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getEnterKey(final boolean isPhone) {
-            return isPhone ? LayoutBase.ENTER_KEY : super.getEnterKey(isPhone);
+            return isPhone ? ENTER_KEY : super.getEnterKey(isPhone);
         }
 
         @Override
         public ExpectedKey getEmojiKey(final boolean isPhone) {
-            return LayoutBase.DOMAIN_KEY;
+            return DOMAIN_KEY;
         }
 
         @Override
         public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
             return isPhone ? super.getKeysLeftToSpacebar(isPhone)
-                    : joinKeys(key("/", LayoutBase.SETTINGS_KEY));
+                    : joinKeys(key("/", SETTINGS_KEY));
         }
     }
 
     private static class DvorakEmail extends Dvorak {
-        public DvorakEmail(final LayoutCustomizer customizer) {
-            super(customizer);
-        }
+        DvorakEmail(final LayoutCustomizer customizer) { super(customizer); }
 
         @Override
         protected ExpectedKey getRow1_1Key(final boolean isPhone, final int elementId) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishDvorak.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishDvorak.java
index e647f8aeaaf31ac2d1835fe64b7f1e19a7587730..2b25f813cf0aa234d1ad57edd4c164e11abb6301 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishDvorak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishDvorak.java
@@ -19,9 +19,8 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Dvorak;
-import com.android.inputmethod.keyboard.layout.Dvorak.DvorakCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
-import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
+import com.android.inputmethod.keyboard.layout.customizer.DvorakCustomizer.EnglishDvorakCustomizer;
 
 import java.util.Locale;
 
@@ -35,18 +34,4 @@ public class TestsEnglishDvorak extends LayoutTestsBase {
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
-
-    public static class EnglishDvorakCustomizer extends DvorakCustomizer {
-        private final EnglishCustomizer mEnglishCustomizer;
-
-        EnglishDvorakCustomizer(final Locale locale) {
-            super(locale);
-            mEnglishCustomizer = new EnglishCustomizer(locale);
-        }
-
-        @Override
-        public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
-            return mEnglishCustomizer.setAccentedLetters(builder);
-        }
-    }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishIN.java
index c80b25024895106c712efe8ae1b81322cee9c604..54759cef1e9b82d2c99447ec415a4b86d1cb7a54 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishIN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishIN.java
@@ -22,6 +22,7 @@ import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted;
+import com.android.inputmethod.keyboard.layout.customizer.EnglishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -38,7 +39,7 @@ public final class TestsEnglishIN extends TestsEnglishUS {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class EnglishINCustomizer extends EnglishCustomizer {
-        public EnglishINCustomizer(final Locale locale) { super(locale); }
+        EnglishINCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishUK.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishUK.java
index c0dcbdc06a34ffc3dc919cc75bb585eade575d16..714a6001a25634ff6600b28cd85cfe0df317eecd 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishUK.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishUK.java
@@ -21,6 +21,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.EnglishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -37,7 +38,7 @@ public final class TestsEnglishUK extends TestsEnglishUS {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class EnglishUKCustomizer extends EnglishCustomizer {
-        public EnglishUKCustomizer(final Locale locale) { super(locale); }
+        EnglishUKCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getCurrencyKey() { return CURRENCY_POUND; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishUS.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishUS.java
index 6ea8f60005b6928c302f004eb485d0807069499a..570ee9d0b57ad39add4772054f7ca14622bab814 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishUS.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEnglishUS.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.EnglishCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEsperanto.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEsperanto.java
index 6a44187c9cc9a95ec24796530cdca2dec7675748..a6792e28e7539229ffb00e3d3d784102b16a6e26 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEsperanto.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEsperanto.java
@@ -19,8 +19,8 @@ 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.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -37,7 +37,7 @@ public class TestsEsperanto extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class EsperantoCustomizer extends LayoutCustomizer {
-        public EsperantoCustomizer(final Locale locale) { super(locale); }
+        EsperantoCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java
index 28c2eb3010a3b95fd42e31a2f18cf0774c7d268d..8cb67e223af59c7329ddafa66aa0f2f64bd9532c 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEE.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Nordic;
+import com.android.inputmethod.keyboard.layout.customizer.EstonianEECustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEEQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEEQwerty.java
index ab8960b667e6bd394056e229c513107da1eeb6d7..fb7c24371a39d621aba3feba795d4c84673c1b53 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEEQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsEstonianEEQwerty.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.EstonianEECustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -36,9 +37,7 @@ public final class TestsEstonianEEQwerty extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class EstonianEEQwertyCustomizer extends EstonianEECustomizer {
-        public EstonianEEQwertyCustomizer(final Locale locale) {
-            super(locale);
-        }
+        EstonianEEQwertyCustomizer(final Locale locale) { super(locale); }
 
         @Override
         protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnish.java
index 05def96bec33ac5e088408c89a0a61a407a8fc82..3d42f30fd57d7c21d8bdca51769a62cbe346e95e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnish.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnish.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Nordic;
+import com.android.inputmethod.keyboard.layout.customizer.FinnishCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnishQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnishQwerty.java
index c3df9d1158f32722ed09c4d5d9b62612ac6815f9..c81b2a2bc31c8f2366b30568e7dd47a403bb26bf 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnishQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFinnishQwerty.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.FinnishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -36,9 +37,7 @@ public final class TestsFinnishQwerty extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class FinnishQwertyCustomizer extends FinnishCustomizer {
-        public FinnishQwertyCustomizer(final Locale locale) {
-            super(locale);
-        }
+        FinnishQwertyCustomizer(final Locale locale) { super(locale); }
 
         @Override
         protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrench.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrench.java
index 7ced1fb7bb8857343f5d3e43ab4d2468a5686839..ca663f4f6fd8b7a95310143cf9a72d6ce0e5fcf9 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrench.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrench.java
@@ -20,8 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Azerty;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
-import com.android.inputmethod.keyboard.layout.LayoutBase.EuroCustomizer;
-import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.customizer.FrenchCustomizer.FrenchEuroCustomizer;
 
 import java.util.Locale;
 
@@ -35,21 +34,4 @@ public final class TestsFrench extends LayoutTestsBase {
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
-
-    static final class FrenchEuroCustomizer extends FrenchCustomizer {
-        private final EuroCustomizer mEuroCustomizer;
-
-        public FrenchEuroCustomizer(final Locale locale) {
-            super(locale);
-            mEuroCustomizer = new EuroCustomizer(locale);
-        }
-
-        @Override
-        public final ExpectedKey getCurrencyKey() { return mEuroCustomizer.getCurrencyKey(); }
-
-        @Override
-        public final ExpectedKey[] getOtherCurrencyKeys() {
-            return mEuroCustomizer.getOtherCurrencyKeys();
-        }
-    }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCA.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCA.java
index 9b3cd1ee2dff7c562d7266d07d278afcf7b9e228..12c94b14123f20af8e487e163f0f27853b94cbda 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCA.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCA.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.FrenchCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCH.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCH.java
index 2598aa3bf6f59645689212e5474d6ae608d890ca..2461157e6792b5ba6761a939dfb9255b3c920611 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCH.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchCH.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Swiss;
+import com.android.inputmethod.keyboard.layout.customizer.FrenchCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -36,7 +37,7 @@ public final class TestsFrenchCH extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class FrenchCHCustomizer extends FrenchCustomizer {
-        public FrenchCHCustomizer(final Locale locale) { super(locale); }
+        FrenchCHCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchDvorak.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchDvorak.java
index 33d1445a43f2fc881f621663bd6d1df8428e647b..40530638bee451899ce79b2ddf4c0878077773ab 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchDvorak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchDvorak.java
@@ -19,11 +19,11 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Dvorak;
-import com.android.inputmethod.keyboard.layout.Dvorak.DvorakCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.customizer.DvorakCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.FrenchCustomizer.FrenchEuroCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
-import com.android.inputmethod.keyboard.layout.tests.TestsFrench.FrenchEuroCustomizer;
 
 import java.util.Locale;
 
@@ -41,7 +41,7 @@ public final class TestsFrenchDvorak extends LayoutTestsBase {
     private static class FrenchDvorakCustomizer extends DvorakCustomizer {
         private final FrenchEuroCustomizer mFrenchEuroCustomizer;
 
-        public FrenchDvorakCustomizer(final Locale locale) {
+        FrenchDvorakCustomizer(final Locale locale) {
             super(locale);
             mFrenchEuroCustomizer = new FrenchEuroCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchQwertz.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchQwertz.java
index 6ab28704a6f2a806afb81ab1bbe6e793391b2663..67edacea7ad037af8b372346558588d2ca98c9d9 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchQwertz.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsFrenchQwertz.java
@@ -20,7 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwertz;
-import com.android.inputmethod.keyboard.layout.tests.TestsFrench.FrenchEuroCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.FrenchCustomizer.FrenchEuroCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGalicianES.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGalicianES.java
index 1472828a47bbd638f6a3554c3e2fa45799703ff2..c37fff254a280e232973a3842d107c151ee3d298 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGalicianES.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGalicianES.java
@@ -19,8 +19,9 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.SpanishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -39,7 +40,7 @@ public class TestsGalicianES extends LayoutTestsBase {
     private static class GalicianESCustomizer extends EuroCustomizer {
         private final SpanishCustomizer mSpanishCustomizer;
 
-        public GalicianESCustomizer(final Locale locale) {
+        GalicianESCustomizer(final Locale locale) {
             super(locale);
             mSpanishCustomizer = new SpanishCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGeorgianGE.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGeorgianGE.java
index f25942fb55b6388815350a5c82159f4e8ac891c3..f6e3080c741d02de21ce2b5946b93f9b1a033935 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGeorgianGE.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGeorgianGE.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Georgian;
-import com.android.inputmethod.keyboard.layout.Georgian.GeorgianCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 
 import java.util.Locale;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsGeorgianGE extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("ka", "GE");
-    private static final LayoutBase LAYOUT = new Georgian(new GeorgianCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Georgian(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGerman.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGerman.java
index 6f75711978a39c02dbb776f99db1e45820b1006b..52c5a0688700cd890bed5d5bd0d0e1785b6847a6 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGerman.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGerman.java
@@ -19,9 +19,8 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Qwertz;
-import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
+import com.android.inputmethod.keyboard.layout.customizer.GermanCustomizer.GermanEuroCustomizer;
 
 import java.util.Locale;
 
@@ -35,21 +34,4 @@ public final class TestsGerman extends LayoutTestsBase {
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
-
-    static class GermanEuroCustomizer extends GermanCustomizer {
-        final EuroCustomizer mEuroCustomizer;
-
-        public GermanEuroCustomizer(final Locale locale) {
-            super(locale);
-            mEuroCustomizer = new EuroCustomizer(locale);
-        }
-
-        @Override
-        public ExpectedKey getCurrencyKey() { return mEuroCustomizer.getCurrencyKey(); }
-
-        @Override
-        public ExpectedKey[] getOtherCurrencyKeys() {
-            return mEuroCustomizer.getOtherCurrencyKeys();
-        }
-    }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanCH.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanCH.java
index 7deb00bb45d3e5521c4df3a3041f5b5c7a738b7e..10981d9207c2ce8df4c1c68be9f1de3d7ee98c88 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanCH.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanCH.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Swiss;
+import com.android.inputmethod.keyboard.layout.customizer.GermanCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -36,7 +37,7 @@ public final class TestsGermanCH extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class GermanCHCustomizer extends GermanCustomizer {
-        public GermanCHCustomizer(final Locale locale) { super(locale); }
+        GermanCHCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanDvorak.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanDvorak.java
index b28d5cfcf7bc59120b93ca9aa689ce38c76dc7ce..36d1cb8c4f48f014940fd65770ca0459b8fb8e34 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanDvorak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanDvorak.java
@@ -19,10 +19,11 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Dvorak;
-import com.android.inputmethod.keyboard.layout.Dvorak.DvorakCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Symbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted;
+import com.android.inputmethod.keyboard.layout.customizer.DvorakCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.GermanCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,10 +40,10 @@ public final class TestsGermanDvorak extends LayoutTestsBase {
     @Override
     LayoutBase getLayout() { return LAYOUT; }
 
-    static class GermanDvorakCustomizer extends DvorakCustomizer {
-        final GermanCustomizer mGermanCustomizer;
+    private static class GermanDvorakCustomizer extends DvorakCustomizer {
+        private final GermanCustomizer mGermanCustomizer;
 
-        public GermanDvorakCustomizer(final Locale locale) {
+        GermanDvorakCustomizer(final Locale locale) {
             super(locale);
             mGermanCustomizer = new GermanCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanQwerty.java
index 19ae5a3f5077a9d7da19a1bb4fe8df686cbe2ac2..6db942f2ac12b8ec7c9f16b5bd51e3dcfe0df218 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGermanQwerty.java
@@ -20,7 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
-import com.android.inputmethod.keyboard.layout.tests.TestsGerman.GermanEuroCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.GermanCustomizer.GermanEuroCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGreek.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGreek.java
index 4acb119ac2ef30f24e6336d6cde797d029eb53c0..fd21d522c166b4e36a4944f2de53671d331d78c7 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGreek.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsGreek.java
@@ -19,7 +19,6 @@ 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;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public class TestsGreek extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("el");
-    private static final LayoutBase LAYOUT = new Greek(new GreekCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Greek(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHebrew.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHebrew.java
index c0243a8704182f37f131e1e7aa12a78347a1ff29..cc63048815e87035aacacb9562d21bf434060715 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHebrew.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHebrew.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Hebrew;
-import com.android.inputmethod.keyboard.layout.Hebrew.HebrewCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 
 import java.util.Locale;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public class TestsHebrew extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("iw");
-    private static final LayoutBase LAYOUT = new Hebrew(new HebrewCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Hebrew(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindi.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindi.java
index abea51a8df3ded3a8d63b959f80655924729e5a9..53652fce0209523038590f62b5ad9e08ab23cffe 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindi.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindi.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Hindi;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.customizer.HindiCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java
index 2e676df26cda52e811ff773933a61ba20194dc56..cfe3e9ea53baee40ace4cb795247cedbdbc820f8 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHindiCompact.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.HindiCompact;
-import com.android.inputmethod.keyboard.layout.HindiCompact.HindiCompactCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 
 import java.util.Locale;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsHindiCompact extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("hi");
-    private static final LayoutBase LAYOUT = new HindiCompact(new HindiCompactCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new HindiCompact(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHinglish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHinglish.java
index 2a6e46f96e62a6048c6b285cbb38c914127dc734..613b3bbc24da6f23db87c2c3f87ad67c68b938ef 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHinglish.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHinglish.java
@@ -19,10 +19,10 @@ 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.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -39,7 +39,7 @@ public final class TestsHinglish extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class HinglishCustomizer extends LayoutCustomizer {
-        public HinglishCustomizer(final Locale locale) { super(locale); }
+        HinglishCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHungarian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHungarian.java
index efc95dcf99616d8a63adb60c071981b184610533..a32e2b551b4d0b3504b9611d40b84a36c1f3dc48 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHungarian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsHungarian.java
@@ -19,9 +19,9 @@ 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.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsHungarian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class HungarianCustomizer extends LayoutCustomizer {
-        public HungarianCustomizer(final Locale locale) { super(locale); }
+        HungarianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_L9R; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsIcelandic.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsIcelandic.java
index 62b111e6a2bdf1844be220cf420c3fb03ae6fa5f..8eabf1815db6b7887fa1ac64ea32d18684e6dcef 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsIcelandic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsIcelandic.java
@@ -19,9 +19,9 @@ 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.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsIcelandic extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class IcelandicCustomizer extends LayoutCustomizer {
-        public IcelandicCustomizer(final Locale locale) { super(locale); }
+        IcelandicCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsIndonesian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsIndonesian.java
index 9b23bfe2b0dc4b347d49c1336785e35d21c1eae1..83711714d63449063908c5bd188f239fca1bd846 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsIndonesian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsIndonesian.java
@@ -19,8 +19,8 @@ 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.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsItalian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsItalian.java
index f3c610c8b256f761531ced26c3ab9fe105c7497f..2acc9679bf5e48676f3342935a2a21d5a1ad6985 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsItalian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsItalian.java
@@ -19,8 +19,9 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.ItalianCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -39,7 +40,7 @@ public final class TestsItalian extends LayoutTestsBase {
     private static class ItalianITCustomizer extends EuroCustomizer {
         private final ItalianCustomizer mItalianCustomizer;
 
-        public ItalianITCustomizer(final Locale locale) {
+        ItalianITCustomizer(final Locale locale) {
             super(locale);
             mItalianCustomizer = new ItalianCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsItalianCH.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsItalianCH.java
index d32f9e9572685ce6978665bd0080443571342922..f98545a50ad3df2887382287c5da3c06b8a549cb 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsItalianCH.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsItalianCH.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Swiss;
+import com.android.inputmethod.keyboard.layout.customizer.ItalianCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -36,7 +37,7 @@ public final class TestsItalianCH extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class ItalianCHCustomizer extends ItalianCustomizer {
-        public ItalianCHCustomizer(final Locale locale) { super(locale); }
+        ItalianCHCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKannadaIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKannadaIN.java
index d1866e803c2a756cc73c630974b1675d31abcf5b..a0ff1d0ac7da250ea93ecd6eec971db3b128211a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKannadaIN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKannadaIN.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Kannada;
-import com.android.inputmethod.keyboard.layout.Kannada.KannadaCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 
 import java.util.Locale;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsKannadaIN extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("kn", "IN");
-    private static final LayoutBase LAYOUT = new Kannada(new KannadaCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Kannada(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKazakh.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKazakh.java
index d255a0fa9fc32fee784343581ade8fc9e8f52140..66ece29ee419714c861fe4578cd2ab649bcfb03c 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKazakh.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKazakh.java
@@ -19,8 +19,8 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.EastSlavic;
-import com.android.inputmethod.keyboard.layout.EastSlavic.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.customizer.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -37,7 +37,7 @@ public final class TestsKazakh extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class KazakhCustomizer extends EastSlavicCustomizer {
-        public KazakhCustomizer(final Locale locale) { super(locale); }
+        KazakhCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKhmerKH.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKhmerKH.java
index df2f40d86eea319ef54cd15a71c7040930606c76..dde9b87f6a1e667d6931bb74e145a8bfad456928 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKhmerKH.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKhmerKH.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Khmer;
-import com.android.inputmethod.keyboard.layout.Khmer.KhmerCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 
 import java.util.Locale;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsKhmerKH extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("km", "KH");
-    private static final LayoutBase LAYOUT = new Khmer(new KhmerCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Khmer(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKyrgyz.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKyrgyz.java
index 9797b4ba9408dd9d27aca233271d10b1e1bf9b07..3faf2f6be267e9130d1f7203f7ac6939e8ea3b44 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKyrgyz.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsKyrgyz.java
@@ -19,8 +19,8 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.EastSlavic;
-import com.android.inputmethod.keyboard.layout.EastSlavic.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.customizer.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -37,7 +37,7 @@ public final class TestsKyrgyz extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class KyrgyzCustomizer extends EastSlavicCustomizer {
-        public KyrgyzCustomizer(final Locale locale) { super(locale); }
+        KyrgyzCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLaoLA.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLaoLA.java
index 34ad1fb7fd3a9df3e6f5caa70c156d35ccc93211..ffa337285589fa60d09ebfad47919be88afea5a0 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLaoLA.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLaoLA.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Lao;
-import com.android.inputmethod.keyboard.layout.Lao.LaoCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 
 import java.util.Locale;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsLaoLA extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("lo", "LA");
-    private static final LayoutBase LAYOUT = new Lao(new LaoCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Lao(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLatvian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLatvian.java
index dc1736c6db0f7b62f84fae7b67489b894b12246c..dbab16a12f2035705ab9ea30998592b78bd67b00 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLatvian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLatvian.java
@@ -19,9 +19,9 @@ 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.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsLatvian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class LatvianCustomizer extends LayoutCustomizer {
-        public LatvianCustomizer(final Locale locale) { super(locale); }
+        LatvianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLithuanian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLithuanian.java
index 55ac37a3712239cb71bc2ba61c1f9725e1f423be..248014a0d1643efe5bcca9ca2448258dcaea70c2 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLithuanian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsLithuanian.java
@@ -19,9 +19,9 @@ 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.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsLithuanian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class LithuanianCustomizer extends LayoutCustomizer {
-        public LithuanianCustomizer(final Locale locale) { super(locale); }
+        LithuanianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMacedonian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMacedonian.java
index 1d7d8565020d011d23f7684a615ed9d898a9a6fe..46b1c39d504ff16f2f41aa8cbee189e1182e41b4 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMacedonian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMacedonian.java
@@ -20,8 +20,8 @@ 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.customizer.SouthSlavicLayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsMacedonian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class MacedonianCustomizer extends SouthSlavicLayoutCustomizer {
-        public MacedonianCustomizer(final Locale locale) { super(locale); }
+        MacedonianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMalayMY.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMalayMY.java
index 9792af9d0abc2dd8a6b38acf8ab31462235e2b63..a6e6cd50cc0ac61e2b254da84bdd1ced8bf228c9 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMalayMY.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMalayMY.java
@@ -19,8 +19,8 @@ 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.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMalayalamIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMalayalamIN.java
index b494ad37bd209bc35e76c4ab2be69703f776d6a8..e3fcb5332aae905b5752c96311b0ebc5c58e96b1 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMalayalamIN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMalayalamIN.java
@@ -20,7 +20,6 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Malayalam;
-import com.android.inputmethod.keyboard.layout.Malayalam.MalayalamCustomizer;
 
 import java.util.Locale;
 
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsMalayalamIN extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("ml", "IN");
-    private static final LayoutBase LAYOUT = new Malayalam(new MalayalamCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Malayalam(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java
index b937629b0b4c671ea6990f80f8eff43c85e47052..3e54f6e3d50de1fd0bd0681d39e847ac41439c23 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMarathiIN.java
@@ -20,7 +20,6 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Marathi;
-import com.android.inputmethod.keyboard.layout.Marathi.MarathiCustomizer;
 
 import java.util.Locale;
 
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsMarathiIN extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("mr", "IN");
-    private static final LayoutBase LAYOUT = new Marathi(new MarathiCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Marathi(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMongolianMN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMongolianMN.java
index e28e962f926d7518b01eceaa375b9bcbf5755540..6dafe778950a06a118dd93c55d45b345bdfea55d 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMongolianMN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMongolianMN.java
@@ -20,7 +20,6 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Mongolian;
-import com.android.inputmethod.keyboard.layout.Mongolian.MongolianMNCustomizer;
 
 import java.util.Locale;
 
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsMongolianMN extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("mn", "MN");
-    private static final LayoutBase LAYOUT = new Mongolian(new MongolianMNCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Mongolian(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java
index e6d3b3b928a016b310812bf88f7ff8beac5ae1c1..b581e4a1238d74781a677505cac99f4b874ba7c3 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsMyanmarMM.java
@@ -20,7 +20,6 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Myanmar;
-import com.android.inputmethod.keyboard.layout.Myanmar.MyanmarCustomizer;
 
 import java.util.Locale;
 
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsMyanmarMM extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("my", "MM");
-    private static final LayoutBase LAYOUT = new Myanmar(new MyanmarCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Myanmar(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNepaliRomanized.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNepaliRomanized.java
index 971976aece14f818f159d8e9270b4692a7e76115..f646db379d601c932eaeac0062ae4be3d9ac6b1a 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNepaliRomanized.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNepaliRomanized.java
@@ -20,7 +20,6 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.NepaliRomanized;
-import com.android.inputmethod.keyboard.layout.NepaliRomanized.NepaliRomanizedCustomizer;
 
 import java.util.Locale;
 
@@ -30,8 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsNepaliRomanized extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("ne", "NP");
-    private static final LayoutBase LAYOUT = new NepaliRomanized(
-            new NepaliRomanizedCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new NepaliRomanized(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNepaliTraditional.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNepaliTraditional.java
index 724c4304ffc6fadfb2b72fb2542ce6af814633bc..99d87b143c630506c5dad41b9222d33fba73e2a2 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNepaliTraditional.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNepaliTraditional.java
@@ -20,7 +20,6 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.NepaliTraditional;
-import com.android.inputmethod.keyboard.layout.NepaliTraditional.NepaliTraditionalCustomizer;
 
 import java.util.Locale;
 
@@ -30,8 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsNepaliTraditional extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("ne", "NP");
-    private static final LayoutBase LAYOUT = new NepaliTraditional(
-            new NepaliTraditionalCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new NepaliTraditional(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguage.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguage.java
index 3ed63153a212dcdf318d1508e38f2d1e3c315f00..149d520c7e71d813d34182137c73e14a89e485fc 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguage.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguage.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.NoLanguageCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguageColemak.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguageColemak.java
index 8d627e3b4358947d0eb7ff581d6d5181855268d3..979947f2f0aa56e87b08b28765170b9831615c21 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguageColemak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguageColemak.java
@@ -20,7 +20,8 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Colemak;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
-import com.android.inputmethod.keyboard.layout.LayoutBase.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.NoLanguageCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -39,7 +40,7 @@ public final class TestsNoLanguageColemak extends LayoutTestsBase {
     private static class NoLanguageColemakCustomizer extends LayoutCustomizer {
         private final NoLanguageCustomizer mNoLanguageCustomizer;
 
-        public NoLanguageColemakCustomizer(final Locale locale) {
+        NoLanguageColemakCustomizer(final Locale locale) {
             super(locale);
             mNoLanguageCustomizer = new NoLanguageCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguageDvorak.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguageDvorak.java
index 9bf47ed42809a16bee49ff8c6d808bb2a550afa6..5423193945a18dd74bad540b128866946f7e8b87 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguageDvorak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguageDvorak.java
@@ -19,8 +19,9 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Dvorak;
-import com.android.inputmethod.keyboard.layout.Dvorak.DvorakCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.customizer.DvorakCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.NoLanguageCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -39,7 +40,7 @@ public final class TestsNoLanguageDvorak extends LayoutTestsBase {
     private static class NoLanguageDvorakCustomizer extends DvorakCustomizer {
         private final NoLanguageCustomizer mNoLanguageCustomizer;
 
-        public NoLanguageDvorakCustomizer(final Locale locale) {
+        NoLanguageDvorakCustomizer(final Locale locale) {
             super(locale);
             mNoLanguageCustomizer = new NoLanguageCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguagePcQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguagePcQwerty.java
index cd8d43ca82bf40060a9292bb3576d3dc86396573..20b587b730ac1d755fc111080da954057787233e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguagePcQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNoLanguagePcQwerty.java
@@ -20,7 +20,8 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.PcQwerty;
-import com.android.inputmethod.keyboard.layout.PcQwerty.PcQwertyCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.NoLanguageCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.PcQwertyCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -39,7 +40,7 @@ public final class TestsNoLanguagePcQwerty extends LayoutTestsBase {
     private static class NoLanguagePcQwertyCustomizer extends PcQwertyCustomizer {
         private final NoLanguageCustomizer mNoLanguageCustomizer;
 
-        public NoLanguagePcQwertyCustomizer(final Locale locale) {
+        NoLanguagePcQwertyCustomizer(final Locale locale) {
             super(locale);
             mNoLanguageCustomizer = new NoLanguageCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegian.java
index 6c1921ab4d03d0d9fe110375438f3082034b7849..910512c983b506d2ab1cc2581fb5a7e109b52f80 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegian.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Nordic;
+import com.android.inputmethod.keyboard.layout.customizer.NorwegianCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegianColemak.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegianColemak.java
index a481796edc6d1849dcee90b5f5f5d76bce69f685..689c38e17196ca7057f4ff4aa340e26de904db52 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegianColemak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsNorwegianColemak.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Colemak;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
+import com.android.inputmethod.keyboard.layout.customizer.NorwegianCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -36,9 +37,7 @@ public final class TestsNorwegianColemak extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class NorwegianColemakCustomizer extends NorwegianCustomizer {
-        public NorwegianColemakCustomizer(final Locale locale) {
-            super(locale);
-        }
+        NorwegianColemakCustomizer(final Locale locale) { super(locale); }
 
         @Override
         protected void setNordicKeys(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPersian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPersian.java
index b7d75c9f0850516e6cb270b8d2c0c196e15f3b29..8ea8075c4d3f43c1e93211b709a1a798cc27ae12 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPersian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPersian.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.Farsi;
-import com.android.inputmethod.keyboard.layout.Farsi.FarsiCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 
 import java.util.Locale;
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public class TestsPersian extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("fa");
-    private static final LayoutBase LAYOUT = new Farsi(new FarsiCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Farsi(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPolish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPolish.java
index 04f88c3fc1016214851ec3fc86c0bd0439a79548..4f1170afea6e70321cb9fe5d96bdbc1110d1cfdb 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPolish.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPolish.java
@@ -19,9 +19,9 @@ 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.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsPolish extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class PolishCustomizer extends LayoutCustomizer {
-        public PolishCustomizer(final Locale locale) { super(locale); }
+        PolishCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_L9R; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPortugueseBR.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPortugueseBR.java
index 8a984a7658efb0b59dcabfd9efce045a563450fb..7fadaac7e692324d3ff159359ea0834a0ad5c1f6 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPortugueseBR.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPortugueseBR.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.PortugueseCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPortuguesePT.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPortuguesePT.java
index e15e811db7c6601212b69f12b446a0029be1eeac..5936e8dce454aa8bab1e0c8891fe1bdab4732b21 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPortuguesePT.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsPortuguesePT.java
@@ -19,8 +19,9 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.PortugueseCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -39,7 +40,7 @@ public final class TestsPortuguesePT extends TestsPortugueseBR {
     private static class PortuguesePTCustomizer extends PortugueseCustomizer {
         private final EuroCustomizer mEuroCustomizer;
 
-        public PortuguesePTCustomizer(final Locale locale) {
+        PortuguesePTCustomizer(final Locale locale) {
             super(locale);
             mEuroCustomizer = new EuroCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyEmail.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyEmail.java
index f89863279356d2e10b2c2004da28c8ae522347be..cc204def8ee6c8f0e5e9631890b1b6308c2480e8 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyEmail.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyEmail.java
@@ -24,6 +24,7 @@ import android.view.inputmethod.InputMethodSubtype;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.EnglishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -52,23 +53,21 @@ public class TestsQwertyEmail extends LayoutTestsBase {
     }
 
     private static class EnglishEmailCustomizer extends EnglishCustomizer {
-        EnglishEmailCustomizer(final Locale locale) {
-            super(locale);
-        }
+        EnglishEmailCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getEnterKey(final boolean isPhone) {
-            return isPhone ? LayoutBase.ENTER_KEY : super.getEnterKey(isPhone);
+            return isPhone ? ENTER_KEY : super.getEnterKey(isPhone);
         }
 
         @Override
         public ExpectedKey getEmojiKey(final boolean isPhone) {
-            return LayoutBase.DOMAIN_KEY;
+            return DOMAIN_KEY;
         }
 
         @Override
         public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
-            return joinKeys(key("@", LayoutBase.SETTINGS_KEY));
+            return joinKeys(key("@", SETTINGS_KEY));
         }
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyUrl.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyUrl.java
index 0b69c7bc298be3e25cf9d47faadebaf5d4aa2fb3..acd09d25a33edcd2fc87cc1632a0c8c2676c0a89 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyUrl.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsQwertyUrl.java
@@ -24,6 +24,7 @@ import android.view.inputmethod.InputMethodSubtype;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.EnglishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -52,23 +53,21 @@ public class TestsQwertyUrl extends LayoutTestsBase {
     }
 
     private static class EnglishUrlCustomizer extends EnglishCustomizer {
-        EnglishUrlCustomizer(final Locale locale) {
-            super(locale);
-        }
+        EnglishUrlCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getEnterKey(final boolean isPhone) {
-            return isPhone ? LayoutBase.ENTER_KEY : super.getEnterKey(isPhone);
+            return isPhone ? ENTER_KEY : super.getEnterKey(isPhone);
         }
 
         @Override
         public ExpectedKey getEmojiKey(final boolean isPhone) {
-            return LayoutBase.DOMAIN_KEY;
+            return DOMAIN_KEY;
         }
 
         @Override
         public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
-            return joinKeys(key("/", LayoutBase.SETTINGS_KEY));
+            return joinKeys(key("/", SETTINGS_KEY));
         }
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsRomanian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsRomanian.java
index d7b858ea5b0beb45c4210adf21e535d44012dafc..af4fbca840efcf6f8b06dcee086928817e978909 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsRomanian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsRomanian.java
@@ -19,9 +19,9 @@ 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.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsRomanian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class RomanianCustomizer extends LayoutCustomizer {
-        public RomanianCustomizer(final Locale locale) { super(locale); }
+        RomanianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_L9R; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsRussian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsRussian.java
index 9919207edeff69bea690a57dd6e44e567e222519..75ef48154f7e914edf7ad3ff71635aa183a15c4c 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsRussian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsRussian.java
@@ -19,9 +19,9 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.EastSlavic;
-import com.android.inputmethod.keyboard.layout.EastSlavic.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsRussian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class RussianCustomizer extends EastSlavicCustomizer {
-        public RussianCustomizer(final Locale locale) { super(locale); }
+        RussianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbian.java
index 41f1690f3a967829df5af902c72c0dbbcb07c603..9495706b2ba0467dc2691e9b66d25268ec82e514 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbian.java
@@ -20,8 +20,8 @@ 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.customizer.SouthSlavicLayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsSerbian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class SerbianCustomizer extends SouthSlavicLayoutCustomizer {
-        public SerbianCustomizer(final Locale locale) { super(locale); }
+        SerbianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatin.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatin.java
index 70f4bcefdad5939b8c8b7c4b07db8fe49cadbf64..7490d30ab57a1365b8c70a43f4ebdfb43722dea5 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatin.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatin.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.SerbianQwertz;
+import com.android.inputmethod.keyboard.layout.customizer.SerbianLatinCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatinQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatinQwerty.java
index d8ef51b45fe4fc64324f856133eb09d78801ef6b..6d9351c9d47be498e79eb5b43c908deb7052a84b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatinQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSerbianLatinQwerty.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.SerbianLatinCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -37,14 +38,12 @@ public final class TestsSerbianLatinQwerty extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class SerbianLatinQwertyCustomizer extends SerbianLatinCustomizer {
-        public SerbianLatinQwertyCustomizer(final Locale locale) {
-            super(locale);
-        }
+        SerbianLatinQwertyCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getRightShiftKeys(final boolean isPhone) {
             return isPhone ? EMPTY_KEYS
-                    : joinKeys(LayoutBase.EXCLAMATION_AND_QUESTION_MARKS, LayoutBase.SHIFT_KEY);
+                    : joinKeys(EXCLAMATION_AND_QUESTION_MARKS, SHIFT_KEY);
         }
 
         @Override
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSinhalaLK.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSinhalaLK.java
index 8b861359b09e96040455ccc5f3c357912a767100..c55c17c53fbe7a39ab158e74bd89fb6e80ad82e2 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSinhalaLK.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSinhalaLK.java
@@ -20,7 +20,6 @@ import android.test.suitebuilder.annotation.Suppress;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Sinhala;
-import com.android.inputmethod.keyboard.layout.Sinhala.SinhalaCustomizer;
 
 import java.util.Locale;
 
@@ -30,7 +29,7 @@ import java.util.Locale;
 @Suppress
 public final class TestsSinhalaLK extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("si", "LK");
-    private static final LayoutBase LAYOUT = new Sinhala(new SinhalaCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Sinhala(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSlovak.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSlovak.java
index bdaf0cad1d45c9548873a7eee7121b769663e4e6..c944716440ef576db1b0640a9b62f5e0848cd44b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSlovak.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSlovak.java
@@ -19,9 +19,9 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsSlovak extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class SlovakCustomizer extends EuroCustomizer {
-        public SlovakCustomizer(final Locale locale) { super(locale); }
+        SlovakCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSlovenian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSlovenian.java
index cdb1beeba56d333ae28a10b8379e772b4b45d61d..e49a27b94451e272b549d74e883b056eecf5fe09 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSlovenian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSlovenian.java
@@ -19,9 +19,9 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -39,7 +39,7 @@ public final class TestsSlovenian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class SlovenianCustomizer extends EuroCustomizer {
-        public SlovenianCustomizer(final Locale locale) { super(locale); }
+        SlovenianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getDoubleQuoteMoreKeys() { return Symbols.DOUBLE_QUOTES_R9L; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish.java
index 12e8676aeff784dfa2517005c6d2926324a97f05..6c8693199fcbca3b300a9bfe4dce14e783191c4b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish.java
@@ -19,8 +19,9 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.SpanishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -39,7 +40,7 @@ public class TestsSpanish extends LayoutTestsBase {
     private static class SpanishESCustomizer extends SpanishCustomizer {
         private final EuroCustomizer mEuroCustomizer;
 
-        public SpanishESCustomizer(final Locale locale) {
+        SpanishESCustomizer(final Locale locale) {
             super(locale);
             mEuroCustomizer = new EuroCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish419.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish419.java
index 75aad136fa5f90279de9351a4387da8d93ee4ce7..828f4c4bcf4fcb769c72d6a54e8275c6674ac811 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish419.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanish419.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.customizer.SpanishCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanishUS.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanishUS.java
index c3ac0a0c0a2391eb2a509235fff50b313459a289..b5bfbe47f899443284f6948973e0273a4f079da1 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanishUS.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSpanishUS.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.customizer.SpanishCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSplitLayoutQwertyEnglishUS.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSplitLayoutQwertyEnglishUS.java
index b3340aacee507f7c1643b59baa188a9a37ecdd95..c401d3d3648c4d051ff7e39572c832b504f6a41b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSplitLayoutQwertyEnglishUS.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSplitLayoutQwertyEnglishUS.java
@@ -23,6 +23,7 @@ import android.view.inputmethod.InputMethodSubtype;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.EnglishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -47,18 +48,14 @@ public class TestsSplitLayoutQwertyEnglishUS extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class EnglishSplitCustomizer extends EnglishCustomizer {
-        EnglishSplitCustomizer(Locale locale) {
-            super(locale);
-        }
+        EnglishSplitCustomizer(Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getSpaceKeys(final boolean isPhone) {
             if (isPhone) {
                 return super.getSpaceKeys(isPhone);
-            } else {
-                return LayoutBase.joinKeys(
-                        LayoutBase.LANGUAGE_SWITCH_KEY, LayoutBase.SPACE_KEY, LayoutBase.SPACE_KEY);
             }
+            return joinKeys(LANGUAGE_SWITCH_KEY, SPACE_KEY, SPACE_KEY);
         }
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwahili.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwahili.java
index 13b974194861b41893ca1d17737d6aa6673aec15..a8ab966acdff8fd45f17a9077febcc2ad956c0aa 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwahili.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwahili.java
@@ -19,8 +19,8 @@ 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.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -37,7 +37,7 @@ public final class TestsSwahili extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class SwahiliCustomizer extends LayoutCustomizer {
-        public SwahiliCustomizer(final Locale locale) { super(locale); }
+        SwahiliCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKeyboardBuilder setAccentedLetters(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedish.java
index 79cb3dcc704a40ecf2f7bff0fa8914f7945af35c..061001d491414435c723b402b2fbb1d0eac217f8 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedish.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedish.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Nordic;
+import com.android.inputmethod.keyboard.layout.customizer.SwedishCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedishPcQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedishPcQwerty.java
index ed74d6d740765ed216370743aa0fbe042c9a1c36..dc3d831349b4af10f27bef2e625618a05c4abca2 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedishPcQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsSwedishPcQwerty.java
@@ -19,9 +19,10 @@ 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.PcQwerty;
-import com.android.inputmethod.keyboard.layout.PcQwerty.PcQwertyCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.PcQwertyCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.SwedishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -41,7 +42,7 @@ public final class TestsSwedishPcQwerty extends LayoutTestsBase {
     private static class SwedishPcQwertyCustomizer extends SwedishCustomizer {
         private final LayoutCustomizer mPcQwertyCustomizer;
 
-        public SwedishPcQwertyCustomizer(final Locale locale) {
+        SwedishPcQwertyCustomizer(final Locale locale) {
             super(locale);
             mPcQwertyCustomizer = new PcQwertyCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTagalog.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTagalog.java
index 38d5364e5871b0f6cbbde9f0142c7fab160e10d1..ecef2d79e92ac2249c11fd984925d3d457a3a0a2 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTagalog.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTagalog.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Spanish;
+import com.android.inputmethod.keyboard.layout.customizer.SpanishCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -36,15 +37,11 @@ public class TestsTagalog extends TestsSpanish {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class TagalogCustomizer extends SpanishCustomizer {
-
-        public TagalogCustomizer(final Locale locale) {
-            super(locale);
-        }
+        TagalogCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey[] getPunctuationMoreKeys(final boolean isPhone) {
-            return isPhone ? LayoutBase.PHONE_PUNCTUATION_MORE_KEYS
-                    : LayoutBase.TABLET_PUNCTUATION_MORE_KEYS;
+            return isPhone ? PHONE_PUNCTUATION_MORE_KEYS : TABLET_PUNCTUATION_MORE_KEYS;
         }
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilIN.java
index 31df53c0bb9a9a0297a6f5724381b898cbcffa48..3297d399f0e359f5f40ff633cbee38b42109030b 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilIN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilIN.java
@@ -22,7 +22,7 @@ import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Symbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted;
 import com.android.inputmethod.keyboard.layout.Tamil;
-import com.android.inputmethod.keyboard.layout.Tamil.TamilCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.TamilCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -39,7 +39,7 @@ public final class TestsTamilIN extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class TamilINCustomizer extends TamilCustomizer {
-        public TamilINCustomizer(final Locale locale) { super(locale); }
+        TamilINCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilLK.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilLK.java
index 65ec0b036b15346622137b9ad23aaf931bf80cc3..72872ba663d984648fee94942a3508b7774993af 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilLK.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilLK.java
@@ -22,7 +22,7 @@ import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Symbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted;
 import com.android.inputmethod.keyboard.layout.Tamil;
-import com.android.inputmethod.keyboard.layout.Tamil.TamilCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.TamilCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 
 import java.util.Locale;
@@ -39,7 +39,7 @@ public final class TestsTamilLK extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class TamilLKCustomizer extends TamilCustomizer {
-        public TamilLKCustomizer(final Locale locale) { super(locale); }
+        TamilLKCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getCurrencyKey() { return CURRENCY_RUPEE; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilSG.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilSG.java
index ade7abaf9b2fa5c149bf3e7a3fbd8a5f41bf1995..a7a041b61fb6c87c4278b46409af197ef33d6c4d 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilSG.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTamilSG.java
@@ -20,7 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Tamil;
-import com.android.inputmethod.keyboard.layout.Tamil.TamilCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.TamilCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTeluguIN.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTeluguIN.java
index 04996d9aa26c2ca963d8ccf2bf7d8f8bea41637e..2b202a91de1caa488a01902b5730445ef626dc57 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTeluguIN.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTeluguIN.java
@@ -20,7 +20,6 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Telugu;
-import com.android.inputmethod.keyboard.layout.Telugu.TeluguCustomizer;
 
 import java.util.Locale;
 
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsTeluguIN extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("te", "IN");
-    private static final LayoutBase LAYOUT = new Telugu(new TeluguCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Telugu(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsThai.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsThai.java
index 3c8727290a7752ade85e92d2da83854a03d5c5c5..2c1a29efce261b865a5653900305f5be850b8bb8 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsThai.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsThai.java
@@ -20,7 +20,6 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Thai;
-import com.android.inputmethod.keyboard.layout.Thai.ThaiCustomizer;
 
 import java.util.Locale;
 
@@ -30,7 +29,7 @@ import java.util.Locale;
 @SmallTest
 public final class TestsThai extends LayoutTestsBase {
     private static final Locale LOCALE = new Locale("th");
-    private static final LayoutBase LAYOUT = new Thai(new ThaiCustomizer(LOCALE));
+    private static final LayoutBase LAYOUT = new Thai(LOCALE);
 
     @Override
     LayoutBase getLayout() { return LAYOUT; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTurkish.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTurkish.java
index bf427cdb0b9a4f008d94d54fe8f1ddf64359eff2..95f86e461e1ccb161868c798cbb81c72014689b5 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTurkish.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsTurkish.java
@@ -19,8 +19,9 @@ 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.EuroCustomizer;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.EuroCustomizer;
+import com.android.inputmethod.keyboard.layout.customizer.TurkicCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -39,7 +40,7 @@ public final class TestsTurkish extends LayoutTestsBase {
     private static class TurkishCustomizer extends EuroCustomizer {
         private final TurkicCustomizer mTurkicCustomizer;
 
-        public TurkishCustomizer(final Locale locale) {
+        TurkishCustomizer(final Locale locale) {
             super(locale);
             mTurkicCustomizer = new TurkicCustomizer(locale);
         }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUkrainian.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUkrainian.java
index a6bcacc9e00a3df7a0faadd9ac880e0cfcbfb4eb..da93d6c3b104c969dfb2485e6bc93ebe631d8976 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUkrainian.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUkrainian.java
@@ -19,10 +19,10 @@ package com.android.inputmethod.keyboard.layout.tests;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.EastSlavic;
-import com.android.inputmethod.keyboard.layout.EastSlavic.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Symbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted;
+import com.android.inputmethod.keyboard.layout.customizer.EastSlavicCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -40,7 +40,7 @@ public final class TestsUkrainian extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class UkrainianCustomizer extends EastSlavicCustomizer {
-        public UkrainianCustomizer(final Locale locale) { super(locale); }
+        UkrainianCustomizer(final Locale locale) { super(locale); }
 
         @Override
         public ExpectedKey getCurrencyKey() { return CURRENCY_HRYVNIA; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUzbek.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUzbek.java
index e8801dd58bb10bd663d4a580c3749a264c8142be..fd12a6a8206ca45238c8bd1791b5b46e4a56f1fd 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUzbek.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUzbek.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Uzbek;
+import com.android.inputmethod.keyboard.layout.customizer.UzbekCustomizer;
 
 import java.util.Locale;
 
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUzbekQwerty.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUzbekQwerty.java
index dec587f85e81e2f58c047fc87330f67d0c99480b..4c33a8cc1dac9ce07be5a5bef997292ec2d496f3 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUzbekQwerty.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsUzbekQwerty.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.UzbekCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
 import java.util.Locale;
@@ -36,9 +37,7 @@ public final class TestsUzbekQwerty extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class UzbekQwertyCustomizer extends UzbekCustomizer {
-        public UzbekQwertyCustomizer(final Locale locale) {
-            super(locale);
-        }
+        UzbekQwertyCustomizer(final Locale locale) { super(locale); }
 
         @Override
         protected void setUzbekKeys(final ExpectedKeyboardBuilder builder) {
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsVietnamese.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsVietnamese.java
index 83d86ac4d9bbb49318dcb2988ab216405dba12f3..356b04296dc6fc8eee442eb6603abd7dcdc266ab 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsVietnamese.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsVietnamese.java
@@ -19,10 +19,10 @@ 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.Qwerty;
 import com.android.inputmethod.keyboard.layout.Symbols;
 import com.android.inputmethod.keyboard.layout.SymbolsShifted;
+import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
 
@@ -40,9 +40,7 @@ public final class TestsVietnamese extends LayoutTestsBase {
     LayoutBase getLayout() { return LAYOUT; }
 
     private static class VietnameseCustomizer extends LayoutCustomizer {
-        public VietnameseCustomizer(final Locale locale) {
-            super(locale);
-        }
+        VietnameseCustomizer(final Locale locale) { super(locale);  }
 
         @Override
         public ExpectedKey getCurrencyKey() { return CURRENCY_DONG; }
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsZulu.java b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsZulu.java
index e048e92c200e9a2752fdd56e1fe9e0349c45e98c..abf3cad9c1a917071eef719f0d51af69e345df8e 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsZulu.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/tests/TestsZulu.java
@@ -20,6 +20,7 @@ import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.inputmethod.keyboard.layout.LayoutBase;
 import com.android.inputmethod.keyboard.layout.Qwerty;
+import com.android.inputmethod.keyboard.layout.customizer.EnglishCustomizer;
 
 import java.util.Locale;