Merge "Fix some more tests"
diff --git a/java/res/layout/emoji_palettes_view.xml b/java/res/layout/emoji_palettes_view.xml
index 1c6da90..2ce8932 100644
--- a/java/res/layout/emoji_palettes_view.xml
+++ b/java/res/layout/emoji_palettes_view.xml
@@ -29,7 +29,7 @@
     <LinearLayout
         android:orientation="horizontal"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/suggestions_strip_height"
+        android:layout_height="@dimen/config_suggestions_strip_height"
     >
         <TabHost
             android:id="@+id/emoji_category_tabhost"
diff --git a/java/res/layout/hint_add_to_dictionary.xml b/java/res/layout/hint_add_to_dictionary.xml
index 68a9faf..d429082 100644
--- a/java/res/layout/hint_add_to_dictionary.xml
+++ b/java/res/layout/hint_add_to_dictionary.xml
@@ -23,7 +23,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:textSize="@dimen/suggestion_text_size"
+    android:textSize="@dimen/config_suggestion_text_size"
     android:gravity="center"
     android:paddingLeft="0dp"
     android:paddingTop="0dp"
diff --git a/java/res/layout/input_view.xml b/java/res/layout/input_view.xml
index 1e7a384..ed387e5 100644
--- a/java/res/layout/input_view.xml
+++ b/java/res/layout/input_view.xml
@@ -41,10 +41,10 @@
             android:id="@+id/suggestion_strip_view"
             android:layoutDirection="ltr"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/suggestions_strip_height"
+            android:layout_height="@dimen/config_suggestions_strip_height"
             android:gravity="center_vertical"
-            android:paddingRight="@dimen/suggestions_strip_padding"
-            android:paddingLeft="@dimen/suggestions_strip_padding"
+            android:paddingRight="@dimen/config_suggestions_strip_horizontal_padding"
+            android:paddingLeft="@dimen/config_suggestions_strip_horizontal_padding"
             style="?attr/suggestionStripViewStyle" />
 
         <!-- To ensure that key preview popup is correctly placed when the current system locale is
diff --git a/java/res/layout/more_suggestions.xml b/java/res/layout/more_suggestions.xml
index 2643258..0869992 100644
--- a/java/res/layout/more_suggestions.xml
+++ b/java/res/layout/more_suggestions.xml
@@ -29,8 +29,8 @@
         android:id="@+id/more_suggestions_view"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        latin:keyLetterSize="@dimen/suggestion_text_size"
-        latin:keyLabelSize="@dimen/suggestion_text_size"
-        latin:keyHintLetterRatio="@fraction/more_suggestions_info_ratio"
+        latin:keyLetterSize="@dimen/config_suggestion_text_size"
+        latin:keyLabelSize="@dimen/config_suggestion_text_size"
+        latin:keyHintLetterRatio="@fraction/config_more_suggestions_info_ratio"
         latin:keyHintLetterColor="@android:color/white" />
 </LinearLayout>
diff --git a/java/res/layout/suggestion_word.xml b/java/res/layout/suggestion_word.xml
index c82a13c..47d2bd8 100644
--- a/java/res/layout/suggestion_word.xml
+++ b/java/res/layout/suggestion_word.xml
@@ -24,12 +24,12 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:minWidth="@dimen/suggestion_min_width"
-    android:textSize="@dimen/suggestion_text_size"
+    android:minWidth="@dimen/config_suggestion_min_width"
+    android:textSize="@dimen/config_suggestion_text_size"
     android:gravity="center"
-    android:paddingLeft="@dimen/suggestion_padding"
+    android:paddingLeft="@dimen/config_suggestion_text_horizontal_padding"
     android:paddingTop="0dp"
-    android:paddingRight="@dimen/suggestion_padding"
+    android:paddingRight="@dimen/config_suggestion_text_horizontal_padding"
     android:paddingBottom="0dp"
     android:hapticFeedbackEnabled="false"
     android:focusable="false"
diff --git a/java/res/layout/user_dictionary_add_word.xml b/java/res/layout/user_dictionary_add_word.xml
index bbf9b1b..607f5c4 100644
--- a/java/res/layout/user_dictionary_add_word.xml
+++ b/java/res/layout/user_dictionary_add_word.xml
@@ -52,7 +52,7 @@
         android:hint="@string/user_dict_settings_add_word_hint"
         android:imeOptions="flagNoFullscreen"
         android:inputType="textNoSuggestions"
-        android:maxLength="@integer/user_dictionary_max_word_length" >
+        android:maxLength="@integer/config_user_dictionary_max_word_length" >
 
         <requestFocus />
     </EditText>
diff --git a/java/res/layout/user_dictionary_add_word_fullscreen.xml b/java/res/layout/user_dictionary_add_word_fullscreen.xml
index 219485b..9bcb189 100644
--- a/java/res/layout/user_dictionary_add_word_fullscreen.xml
+++ b/java/res/layout/user_dictionary_add_word_fullscreen.xml
@@ -30,7 +30,7 @@
         android:hint="@string/user_dict_settings_add_word_hint"
         android:imeOptions="flagNoFullscreen"
         android:inputType="textNoSuggestions"
-        android:maxLength="@integer/user_dictionary_max_word_length" >
+        android:maxLength="@integer/config_user_dictionary_max_word_length" >
 
         <requestFocus />
     </EditText>
@@ -61,7 +61,7 @@
             android:hint="@string/user_dict_settings_add_shortcut_hint"
             android:imeOptions="flagNoFullscreen"
             android:inputType="textNoSuggestions"
-            android:maxLength="@integer/user_dictionary_max_word_length" />
+            android:maxLength="@integer/config_user_dictionary_max_word_length" />
 
         <TextView
             android:id="@+id/user_dictionary_add_locale_label"
diff --git a/java/res/values-land/config.xml b/java/res/values-land/config.xml
index 2cfca48..b6ef4a7 100644
--- a/java/res/values-land/config.xml
+++ b/java/res/values-land/config.xml
@@ -22,66 +22,64 @@
 <resources>
     <bool name="config_use_fullscreen_mode">true</bool>
 
-    <!-- TODO: Add config_ prefix to the following resources that have been merged from dimens.xml -->
-
     <!-- Preferable keyboard height in absolute scale: 1.100in -->
-    <!-- This keyboardHeight value should match with keyboard-heights.xml -->
-    <dimen name="keyboardHeight">176.0dp</dimen>
-    <fraction name="minKeyboardHeight">45%p</fraction>
-    <!-- key_height + key_bottom_gap = popup_key_height -->
-    <dimen name="popup_key_height">44.8dp</dimen>
+    <!-- This config_default_keyboard_height value should match with keyboard-heights.xml -->
+    <dimen name="config_default_keyboard_height">176.0dp</dimen>
+    <fraction name="config_min_keyboard_height">45%p</fraction>
+    <!-- key_height + key_bottom_gap = config_more_keys_keyboard_key_height -->
+    <dimen name="config_more_keys_keyboard_key_height">44.8dp</dimen>
 
-    <fraction name="keyboard_top_padding_gb">1.818%p</fraction>
-    <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction>
-    <fraction name="key_bottom_gap_gb">5.941%p</fraction>
-    <fraction name="key_horizontal_gap_gb">0.997%p</fraction>
+    <fraction name="config_keyboard_top_padding_gb">1.818%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_gb">0.0%p</fraction>
+    <fraction name="config_key_vertical_gap_gb">5.941%p</fraction>
+    <fraction name="config_key_horizontal_gap_gb">0.997%p</fraction>
 
-    <fraction name="keyboard_top_padding_holo">2.727%p</fraction>
-    <fraction name="keyboard_bottom_padding_holo">0.0%p</fraction>
-    <fraction name="key_bottom_gap_holo">5.368%p</fraction>
-    <fraction name="key_horizontal_gap_holo">1.020%p</fraction>
+    <fraction name="config_keyboard_top_padding_holo">2.727%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_holo">0.0%p</fraction>
+    <fraction name="config_key_vertical_gap_holo">5.368%p</fraction>
+    <fraction name="config_key_horizontal_gap_holo">1.020%p</fraction>
 
     <!-- left or right padding of label alignment -->
-    <dimen name="key_label_horizontal_padding">8dp</dimen>
+    <dimen name="config_key_label_horizontal_padding">8dp</dimen>
 
-    <fraction name="key_letter_ratio">65%</fraction>
-    <fraction name="key_large_letter_ratio">74%</fraction>
-    <fraction name="key_label_ratio">40%</fraction>
-    <fraction name="key_hint_letter_ratio">30%</fraction>
-    <fraction name="key_hint_label_ratio">52%</fraction>
-    <fraction name="key_uppercase_letter_ratio">40%</fraction>
-    <fraction name="key_preview_text_ratio">90%</fraction>
-    <fraction name="spacebar_text_ratio">40.000%</fraction>
-    <dimen name="key_preview_offset_gb">0.0dp</dimen>
+    <fraction name="config_key_letter_ratio">65%</fraction>
+    <fraction name="config_key_large_letter_ratio">74%</fraction>
+    <fraction name="config_key_label_ratio">40%</fraction>
+    <fraction name="config_key_hint_letter_ratio">30%</fraction>
+    <fraction name="config_key_hint_label_ratio">52%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio">40%</fraction>
+    <fraction name="config_key_preview_text_ratio">90%</fraction>
+    <fraction name="config_language_on_spacebar_text_ratio">40.000%</fraction>
+    <dimen name="config_key_preview_offset_gb">0.0dp</dimen>
 
     <!-- For 5-row keyboard -->
-    <fraction name="key_bottom_gap_5row">3.20%p</fraction>
-    <fraction name="key_letter_ratio_5row">78%</fraction>
-    <fraction name="key_uppercase_letter_ratio_5row">48%</fraction>
+    <fraction name="config_key_vertical_gap_5row">3.20%p</fraction>
+    <fraction name="config_key_letter_ratio_5row">78%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio_5row">48%</fraction>
 
-    <dimen name="key_preview_offset_holo">1.6dp</dimen>
-    <!-- popup_key_height x -0.5 -->
-    <dimen name="more_keys_keyboard_vertical_correction_holo">-22.4dp</dimen>
+    <dimen name="config_key_preview_offset_holo">1.6dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x -0.5 -->
+    <dimen name="config_more_keys_keyboard_vertical_correction_holo">-22.4dp</dimen>
 
-    <dimen name="suggestions_strip_height">36dp</dimen>
-    <dimen name="more_suggestions_row_height">36dp</dimen>
-    <integer name="max_more_suggestions_row">2</integer>
-    <fraction name="min_more_suggestions_width">60%</fraction>
+    <dimen name="config_suggestions_strip_height">36dp</dimen>
+    <dimen name="config_more_suggestions_row_height">36dp</dimen>
+    <integer name="config_max_more_suggestions_row">2</integer>
+    <fraction name="config_min_more_suggestions_width">60%</fraction>
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
-    <!-- popup_key_height x 1.2 -->
-    <dimen name="more_keys_keyboard_slide_allowance">53.76dp</dimen>
-    <!-- popup_key_height x -1.0 -->
-    <dimen name="more_keys_keyboard_vertical_correction_gb">-44.8dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x 1.2 -->
+    <dimen name="config_more_keys_keyboard_slide_allowance">53.76dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x -1.0 -->
+    <dimen name="config_more_keys_keyboard_vertical_correction_gb">-44.8dp</dimen>
 
     <!-- Gesture floating preview text parameters -->
-    <dimen name="gesture_floating_preview_text_size">23dp</dimen>
-    <dimen name="gesture_floating_preview_text_offset">54dp</dimen>
-    <dimen name="gesture_floating_preview_horizontal_padding">23dp</dimen>
-    <dimen name="gesture_floating_preview_vertical_padding">15dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_size">23dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_offset">54dp</dimen>
+    <dimen name="config_gesture_floating_preview_horizontal_padding">23dp</dimen>
+    <dimen name="config_gesture_floating_preview_vertical_padding">15dp</dimen>
 
     <!-- Emoji keyboard -->
-    <fraction name="emoji_keyboard_key_width">10%p</fraction>
-    <fraction name="emoji_keyboard_row_height">50%p</fraction>
-    <fraction name="emoji_keyboard_key_letter_size">54%p</fraction>
-    <integer name="emoji_keyboard_max_key_count">20</integer>
+    <fraction name="config_emoji_keyboard_key_width">10%p</fraction>
+    <fraction name="config_emoji_keyboard_row_height">50%p</fraction>
+    <fraction name="config_emoji_keyboard_key_letter_size">54%p</fraction>
+    <integer name="config_emoji_keyboard_max_page_key_count">20</integer>
 </resources>
diff --git a/java/res/values-sw540dp-land/config.xml b/java/res/values-sw540dp-land/config.xml
index 03c23ce..55dcd51 100644
--- a/java/res/values-sw540dp-land/config.xml
+++ b/java/res/values-sw540dp-land/config.xml
@@ -22,55 +22,53 @@
 <resources>
     <bool name="config_use_fullscreen_mode">false</bool>
 
-    <!-- TODO: Add config_ prefix to the following resources that have been merged from dimens.xml -->
-
     <!-- Preferable keyboard height in absolute scale: 45.0mm -->
-    <!-- This keyboardHeight value should match with keyboard-heights.xml -->
-    <dimen name="keyboardHeight">283.5dp</dimen>
-    <fraction name="minKeyboardHeight">45%p</fraction>
+    <!-- This config_default_keyboard_height value should match with keyboard-heights.xml -->
+    <dimen name="config_default_keyboard_height">283.5dp</dimen>
+    <fraction name="config_min_keyboard_height">45%p</fraction>
 
-    <fraction name="keyboard_top_padding_gb">2.444%p</fraction>
-    <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction>
-    <fraction name="key_bottom_gap_gb">5.200%p</fraction>
-    <fraction name="key_horizontal_gap_gb">1.447%p</fraction>
+    <fraction name="config_keyboard_top_padding_gb">2.444%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_gb">0.0%p</fraction>
+    <fraction name="config_key_vertical_gap_gb">5.200%p</fraction>
+    <fraction name="config_key_horizontal_gap_gb">1.447%p</fraction>
 
-    <fraction name="keyboard_top_padding_holo">2.727%p</fraction>
-    <fraction name="keyboard_bottom_padding_holo">0.0%p</fraction>
-    <fraction name="key_bottom_gap_holo">4.5%p</fraction>
-    <fraction name="key_horizontal_gap_holo">0.9%p</fraction>
+    <fraction name="config_keyboard_top_padding_holo">2.727%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_holo">0.0%p</fraction>
+    <fraction name="config_key_vertical_gap_holo">4.5%p</fraction>
+    <fraction name="config_key_horizontal_gap_holo">0.9%p</fraction>
 
-    <dimen name="popup_key_height">81.9dp</dimen>
+    <dimen name="config_more_keys_keyboard_key_height">81.9dp</dimen>
 
     <!-- left or right padding of label alignment -->
-    <dimen name="key_label_horizontal_padding">18dp</dimen>
+    <dimen name="config_key_label_horizontal_padding">18dp</dimen>
 
-    <fraction name="key_letter_ratio">50%</fraction>
-    <fraction name="key_large_letter_ratio">48%</fraction>
-    <fraction name="key_label_ratio">32%</fraction>
-    <fraction name="key_hint_letter_ratio">23%</fraction>
-    <fraction name="key_hint_label_ratio">34%</fraction>
-    <fraction name="key_uppercase_letter_ratio">29%</fraction>
-    <fraction name="spacebar_text_ratio">30.0%</fraction>
-    <dimen name="key_uppercase_letter_padding">4dp</dimen>
+    <fraction name="config_key_letter_ratio">50%</fraction>
+    <fraction name="config_key_large_letter_ratio">48%</fraction>
+    <fraction name="config_key_label_ratio">32%</fraction>
+    <fraction name="config_key_hint_letter_ratio">23%</fraction>
+    <fraction name="config_key_hint_label_ratio">34%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio">29%</fraction>
+    <fraction name="config_language_on_spacebar_text_ratio">30.0%</fraction>
+    <dimen name="config_key_shifted_letter_hint_padding">4dp</dimen>
 
     <!-- For 5-row keyboard -->
-    <fraction name="key_bottom_gap_5row">3.20%p</fraction>
-    <fraction name="key_letter_ratio_5row">62%</fraction>
-    <fraction name="key_uppercase_letter_ratio_5row">36%</fraction>
+    <fraction name="config_key_vertical_gap_5row">3.20%p</fraction>
+    <fraction name="config_key_letter_ratio_5row">62%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio_5row">36%</fraction>
 
-    <dimen name="suggestions_strip_padding">252.0dp</dimen>
-    <integer name="max_more_suggestions_row">5</integer>
-    <fraction name="min_more_suggestions_width">50%</fraction>
+    <dimen name="config_suggestions_strip_horizontal_padding">252.0dp</dimen>
+    <integer name="config_max_more_suggestions_row">5</integer>
+    <fraction name="config_min_more_suggestions_width">50%</fraction>
 
     <!-- Gesture floating preview text parameters -->
-    <dimen name="gesture_floating_preview_text_size">26dp</dimen>
-    <dimen name="gesture_floating_preview_text_offset">76dp</dimen>
-    <dimen name="gesture_floating_preview_horizontal_padding">26dp</dimen>
-    <dimen name="gesture_floating_preview_vertical_padding">17dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_size">26dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_offset">76dp</dimen>
+    <dimen name="config_gesture_floating_preview_horizontal_padding">26dp</dimen>
+    <dimen name="config_gesture_floating_preview_vertical_padding">17dp</dimen>
 
     <!-- Emoji keyboard -->
-    <fraction name="emoji_keyboard_key_width">10%p</fraction>
-    <fraction name="emoji_keyboard_row_height">33%p</fraction>
-    <fraction name="emoji_keyboard_key_letter_size">70%p</fraction>
-    <integer name="emoji_keyboard_max_key_count">30</integer>
+    <fraction name="config_emoji_keyboard_key_width">10%p</fraction>
+    <fraction name="config_emoji_keyboard_row_height">33%p</fraction>
+    <fraction name="config_emoji_keyboard_key_letter_size">70%p</fraction>
+    <integer name="config_emoji_keyboard_max_page_key_count">30</integer>
 </resources>
diff --git a/java/res/values-sw540dp/config.xml b/java/res/values-sw540dp/config.xml
index f7322d2..8d0b7f4 100644
--- a/java/res/values-sw540dp/config.xml
+++ b/java/res/values-sw540dp/config.xml
@@ -34,79 +34,77 @@
          false -->
     <bool name="config_show_more_keys_keyboard_at_touched_point">true</bool>
 
-    <!-- TODO: Add config_ prefix to the following resources that have been merged from dimens.xml -->
-
     <!-- Preferable keyboard height in absolute scale: 48.0mm -->
-    <!-- This keyboardHeight value should match with keyboard-heights.xml -->
-    <dimen name="keyboardHeight">302.4dp</dimen>
-    <fraction name="maxKeyboardHeight">46%p</fraction>
-    <fraction name="minKeyboardHeight">-35.0%p</fraction>
+    <!-- This config_default_keyboard_height value should match with keyboard-heights.xml -->
+    <dimen name="config_default_keyboard_height">302.4dp</dimen>
+    <fraction name="config_max_keyboard_height">46%p</fraction>
+    <fraction name="config_min_keyboard_height">-35.0%p</fraction>
 
-    <dimen name="popup_key_height">63.0dp</dimen>
+    <dimen name="config_more_keys_keyboard_key_height">63.0dp</dimen>
 
-    <fraction name="keyboard_top_padding_gb">2.291%p</fraction>
-    <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction>
-    <fraction name="key_bottom_gap_gb">4.625%p</fraction>
-    <fraction name="key_horizontal_gap_gb">2.113%p</fraction>
+    <fraction name="config_keyboard_top_padding_gb">2.291%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_gb">0.0%p</fraction>
+    <fraction name="config_key_vertical_gap_gb">4.625%p</fraction>
+    <fraction name="config_key_horizontal_gap_gb">2.113%p</fraction>
 
-    <fraction name="keyboard_top_padding_holo">2.335%p</fraction>
-    <fraction name="keyboard_bottom_padding_holo">4.0%p</fraction>
-    <fraction name="key_bottom_gap_holo">4.5%p</fraction>
-    <fraction name="key_horizontal_gap_holo">1.565%p</fraction>
+    <fraction name="config_keyboard_top_padding_holo">2.335%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_holo">4.0%p</fraction>
+    <fraction name="config_key_vertical_gap_holo">4.5%p</fraction>
+    <fraction name="config_key_horizontal_gap_holo">1.565%p</fraction>
 
-    <dimen name="more_keys_keyboard_key_horizontal_padding">6dp</dimen>
+    <dimen name="config_more_keys_keyboard_key_horizontal_padding">6dp</dimen>
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
-    <!-- popup_key_height x 1.2 -->
-    <dimen name="more_keys_keyboard_slide_allowance">98.3dp</dimen>
-    <!-- popup_key_height x -1.0 -->
-    <dimen name="more_keys_keyboard_vertical_correction_gb">-81.9dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x 1.2 -->
+    <dimen name="config_more_keys_keyboard_slide_allowance">98.3dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x -1.0 -->
+    <dimen name="config_more_keys_keyboard_vertical_correction_gb">-81.9dp</dimen>
 
     <!-- left or right padding of label alignment -->
-    <dimen name="key_label_horizontal_padding">6dp</dimen>
-    <dimen name="key_hint_letter_padding">3dp</dimen>
-    <dimen name="key_uppercase_letter_padding">3dp</dimen>
+    <dimen name="config_key_label_horizontal_padding">6dp</dimen>
+    <dimen name="config_key_hint_letter_padding">3dp</dimen>
+    <dimen name="config_key_shifted_letter_hint_padding">3dp</dimen>
 
-    <fraction name="key_letter_ratio">42%</fraction>
-    <fraction name="key_large_letter_ratio">45%</fraction>
-    <fraction name="key_label_ratio">25%</fraction>
-    <fraction name="key_large_label_ratio">32%</fraction>
-    <fraction name="key_hint_letter_ratio">23%</fraction>
-    <fraction name="key_hint_label_ratio">28%</fraction>
-    <fraction name="key_uppercase_letter_ratio">22%</fraction>
-    <fraction name="key_preview_text_ratio">50%</fraction>
-    <fraction name="spacebar_text_ratio">28.0%</fraction>
-    <dimen name="key_preview_height">94.5dp</dimen>
-    <dimen name="key_preview_offset_gb">16.0dp</dimen>
+    <fraction name="config_key_letter_ratio">42%</fraction>
+    <fraction name="config_key_large_letter_ratio">45%</fraction>
+    <fraction name="config_key_label_ratio">25%</fraction>
+    <fraction name="config_key_large_label_ratio">32%</fraction>
+    <fraction name="config_key_hint_letter_ratio">23%</fraction>
+    <fraction name="config_key_hint_label_ratio">28%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio">22%</fraction>
+    <fraction name="config_key_preview_text_ratio">50%</fraction>
+    <fraction name="config_language_on_spacebar_text_ratio">28.0%</fraction>
+    <dimen name="config_key_preview_height">94.5dp</dimen>
+    <dimen name="config_key_preview_offset_gb">16.0dp</dimen>
 
     <!-- For 5-row keyboard -->
-    <fraction name="key_bottom_gap_5row">3.20%p</fraction>
-    <fraction name="key_letter_ratio_5row">52%</fraction>
-    <fraction name="key_uppercase_letter_ratio_5row">27%</fraction>
+    <fraction name="config_key_vertical_gap_5row">3.20%p</fraction>
+    <fraction name="config_key_letter_ratio_5row">52%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio_5row">27%</fraction>
 
-    <dimen name="key_preview_offset_holo">8.0dp</dimen>
-    <!-- popup_key_height x -0.5 -->
-    <dimen name="more_keys_keyboard_vertical_correction_holo">-31.5dp</dimen>
+    <dimen name="config_key_preview_offset_holo">8.0dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x -0.5 -->
+    <dimen name="config_more_keys_keyboard_vertical_correction_holo">-31.5dp</dimen>
 
-    <dimen name="suggestions_strip_height">44dp</dimen>
-    <dimen name="more_suggestions_row_height">44dp</dimen>
-    <integer name="max_more_suggestions_row">6</integer>
-    <fraction name="min_more_suggestions_width">90%</fraction>
-    <dimen name="suggestions_strip_padding">94.5dp</dimen>
-    <dimen name="suggestion_min_width">48.0dp</dimen>
-    <dimen name="suggestion_padding">12dp</dimen>
-    <dimen name="suggestion_text_size">22dp</dimen>
-    <dimen name="more_suggestions_hint_text_size">33dp</dimen>
+    <dimen name="config_suggestions_strip_height">44dp</dimen>
+    <dimen name="config_more_suggestions_row_height">44dp</dimen>
+    <integer name="config_max_more_suggestions_row">6</integer>
+    <fraction name="config_min_more_suggestions_width">90%</fraction>
+    <dimen name="config_suggestions_strip_horizontal_padding">94.5dp</dimen>
+    <dimen name="config_suggestion_min_width">48.0dp</dimen>
+    <dimen name="config_suggestion_text_horizontal_padding">12dp</dimen>
+    <dimen name="config_suggestion_text_size">22dp</dimen>
+    <dimen name="config_more_suggestions_hint_text_size">33dp</dimen>
 
     <!-- Gesture floating preview text parameters -->
-    <dimen name="gesture_floating_preview_text_size">28dp</dimen>
-    <dimen name="gesture_floating_preview_text_offset">87dp</dimen>
-    <dimen name="gesture_floating_preview_horizontal_padding">28dp</dimen>
-    <dimen name="gesture_floating_preview_vertical_padding">19dp</dimen>
-    <dimen name="gesture_floating_preview_round_radius">3dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_size">28dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_offset">87dp</dimen>
+    <dimen name="config_gesture_floating_preview_horizontal_padding">28dp</dimen>
+    <dimen name="config_gesture_floating_preview_vertical_padding">19dp</dimen>
+    <dimen name="config_gesture_floating_preview_round_radius">3dp</dimen>
 
     <!-- Emoji keyboard -->
-    <fraction name="emoji_keyboard_key_width">12.5%p</fraction>
-    <fraction name="emoji_keyboard_row_height">33%p</fraction>
-    <fraction name="emoji_keyboard_key_letter_size">60%p</fraction>
-    <integer name="emoji_keyboard_max_key_count">24</integer>
+    <fraction name="config_emoji_keyboard_key_width">12.5%p</fraction>
+    <fraction name="config_emoji_keyboard_row_height">33%p</fraction>
+    <fraction name="config_emoji_keyboard_key_letter_size">60%p</fraction>
+    <integer name="config_emoji_keyboard_max_page_key_count">24</integer>
 </resources>
diff --git a/java/res/values-sw768dp-land/config.xml b/java/res/values-sw768dp-land/config.xml
index 3e6e77b..b27d4c0 100644
--- a/java/res/values-sw768dp-land/config.xml
+++ b/java/res/values-sw768dp-land/config.xml
@@ -22,56 +22,54 @@
 <resources>
     <bool name="config_use_fullscreen_mode">false</bool>
 
-    <!-- TODO: Add config_ prefix to the following resources that have been merged from dimens.xml -->
-
     <!-- Preferable keyboard height in absolute scale: 58.0mm -->
-    <!-- This keyboardHeight value should match with keyboard-heights.xml -->
-    <dimen name="keyboardHeight">365.4dp</dimen>
-    <fraction name="minKeyboardHeight">45%p</fraction>
+    <!-- This config_default_keyboard_height value should match with keyboard-heights.xml -->
+    <dimen name="config_default_keyboard_height">365.4dp</dimen>
+    <fraction name="config_min_keyboard_height">45%p</fraction>
 
-    <fraction name="keyboard_top_padding_gb">1.896%p</fraction>
-    <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction>
-    <fraction name="key_bottom_gap_gb">3.896%p</fraction>
-    <fraction name="key_horizontal_gap_gb">1.195%p</fraction>
+    <fraction name="config_keyboard_top_padding_gb">1.896%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_gb">0.0%p</fraction>
+    <fraction name="config_key_vertical_gap_gb">3.896%p</fraction>
+    <fraction name="config_key_horizontal_gap_gb">1.195%p</fraction>
 
-    <fraction name="keyboard_top_padding_holo">1.896%p</fraction>
-    <fraction name="keyboard_bottom_padding_holo">0.0%p</fraction>
-    <fraction name="key_bottom_gap_holo">3.690%p</fraction>
-    <fraction name="key_horizontal_gap_holo">1.030%p</fraction>
+    <fraction name="config_keyboard_top_padding_holo">1.896%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_holo">0.0%p</fraction>
+    <fraction name="config_key_vertical_gap_holo">3.690%p</fraction>
+    <fraction name="config_key_horizontal_gap_holo">1.030%p</fraction>
 
-    <dimen name="popup_key_height">81.9dp</dimen>
+    <dimen name="config_more_keys_keyboard_key_height">81.9dp</dimen>
 
     <!-- left or right padding of label alignment -->
-    <dimen name="key_label_horizontal_padding">18dp</dimen>
+    <dimen name="config_key_label_horizontal_padding">18dp</dimen>
 
-    <fraction name="key_letter_ratio">43%</fraction>
-    <fraction name="key_large_letter_ratio">42%</fraction>
-    <fraction name="key_label_ratio">28%</fraction>
-    <fraction name="key_hint_letter_ratio">23%</fraction>
-    <fraction name="key_hint_label_ratio">28%</fraction>
-    <fraction name="key_uppercase_letter_ratio">24%</fraction>
-    <fraction name="spacebar_text_ratio">24.00%</fraction>
-    <dimen name="key_preview_height">107.1dp</dimen>
+    <fraction name="config_key_letter_ratio">43%</fraction>
+    <fraction name="config_key_large_letter_ratio">42%</fraction>
+    <fraction name="config_key_label_ratio">28%</fraction>
+    <fraction name="config_key_hint_letter_ratio">23%</fraction>
+    <fraction name="config_key_hint_label_ratio">28%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio">24%</fraction>
+    <fraction name="config_language_on_spacebar_text_ratio">24.00%</fraction>
+    <dimen name="config_key_preview_height">107.1dp</dimen>
 
     <!-- For 5-row keyboard -->
-    <fraction name="key_bottom_gap_5row">2.65%p</fraction>
-    <fraction name="key_letter_ratio_5row">53%</fraction>
-    <fraction name="key_uppercase_letter_ratio_5row">30%</fraction>
+    <fraction name="config_key_vertical_gap_5row">2.65%p</fraction>
+    <fraction name="config_key_letter_ratio_5row">53%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio_5row">30%</fraction>
 
-    <dimen name="key_preview_offset_holo">8.0dp</dimen>
+    <dimen name="config_key_preview_offset_holo">8.0dp</dimen>
 
-    <dimen name="suggestions_strip_padding">252.0dp</dimen>
-    <fraction name="min_more_suggestions_width">50%</fraction>
+    <dimen name="config_suggestions_strip_horizontal_padding">252.0dp</dimen>
+    <fraction name="config_min_more_suggestions_width">50%</fraction>
 
     <!-- Gesture floating preview text parameters -->
-    <dimen name="gesture_floating_preview_text_size">32dp</dimen>
-    <dimen name="gesture_floating_preview_text_offset">100dp</dimen>
-    <dimen name="gesture_floating_preview_horizontal_padding">32dp</dimen>
-    <dimen name="gesture_floating_preview_vertical_padding">21dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_size">32dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_offset">100dp</dimen>
+    <dimen name="config_gesture_floating_preview_horizontal_padding">32dp</dimen>
+    <dimen name="config_gesture_floating_preview_vertical_padding">21dp</dimen>
 
     <!-- Emoji keyboard -->
-    <fraction name="emoji_keyboard_key_width">7.69%p</fraction>
-    <fraction name="emoji_keyboard_row_height">33%p</fraction>
-    <fraction name="emoji_keyboard_key_letter_size">60%p</fraction>
-    <integer name="emoji_keyboard_max_key_count">39</integer>
+    <fraction name="config_emoji_keyboard_key_width">7.69%p</fraction>
+    <fraction name="config_emoji_keyboard_row_height">33%p</fraction>
+    <fraction name="config_emoji_keyboard_key_letter_size">60%p</fraction>
+    <integer name="config_emoji_keyboard_max_page_key_count">39</integer>
 </resources>
diff --git a/java/res/values-sw768dp/config.xml b/java/res/values-sw768dp/config.xml
index f76e76f..bc6feba 100644
--- a/java/res/values-sw768dp/config.xml
+++ b/java/res/values-sw768dp/config.xml
@@ -34,79 +34,77 @@
          false -->
     <bool name="config_show_more_keys_keyboard_at_touched_point">true</bool>
 
-    <!-- TODO: Add config_ prefix to the following resources that have been merged from dimens.xml -->
-
     <!-- Preferable keyboard height in absolute scale: 48.0mm -->
-    <!-- This keyboardHeight value should match with keyboard-heights.xml -->
-    <dimen name="keyboardHeight">302.4dp</dimen>
-    <fraction name="maxKeyboardHeight">46%p</fraction>
-    <fraction name="minKeyboardHeight">-35.0%p</fraction>
+    <!-- This config_default_keyboard_height value should match with keyboard-heights.xml -->
+    <dimen name="config_default_keyboard_height">302.4dp</dimen>
+    <fraction name="config_max_keyboard_height">46%p</fraction>
+    <fraction name="config_min_keyboard_height">-35.0%p</fraction>
 
-    <fraction name="keyboard_top_padding_gb">2.291%p</fraction>
-    <fraction name="keyboard_bottom_padding_gb">0.0%p</fraction>
-    <fraction name="key_bottom_gap_gb">4.687%p</fraction>
-    <fraction name="key_horizontal_gap_gb">1.272%p</fraction>
+    <fraction name="config_keyboard_top_padding_gb">2.291%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_gb">0.0%p</fraction>
+    <fraction name="config_key_vertical_gap_gb">4.687%p</fraction>
+    <fraction name="config_key_horizontal_gap_gb">1.272%p</fraction>
 
-    <fraction name="keyboard_top_padding_holo">2.335%p</fraction>
-    <fraction name="keyboard_bottom_padding_holo">0.0%p</fraction>
-    <fraction name="key_bottom_gap_holo">3.312%p</fraction>
-    <fraction name="key_horizontal_gap_holo">1.066%p</fraction>
+    <fraction name="config_keyboard_top_padding_holo">2.335%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_holo">0.0%p</fraction>
+    <fraction name="config_key_vertical_gap_holo">3.312%p</fraction>
+    <fraction name="config_key_horizontal_gap_holo">1.066%p</fraction>
 
-    <dimen name="popup_key_height">63.0dp</dimen>
+    <dimen name="config_more_keys_keyboard_key_height">63.0dp</dimen>
 
-    <dimen name="more_keys_keyboard_key_horizontal_padding">12dp</dimen>
+    <dimen name="config_more_keys_keyboard_key_horizontal_padding">12dp</dimen>
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
-    <!-- popup_key_height x 1.2 -->
-    <dimen name="more_keys_keyboard_slide_allowance">98.3dp</dimen>
-    <!-- popup_key_height x -1.0 -->
-    <dimen name="more_keys_keyboard_vertical_correction_gb">-81.9dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x 1.2 -->
+    <dimen name="config_more_keys_keyboard_slide_allowance">98.3dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x -1.0 -->
+    <dimen name="config_more_keys_keyboard_vertical_correction_gb">-81.9dp</dimen>
 
     <!-- left or right padding of label alignment -->
-    <dimen name="key_label_horizontal_padding">6dp</dimen>
-    <dimen name="key_hint_letter_padding">3dp</dimen>
-    <dimen name="key_uppercase_letter_padding">3dp</dimen>
+    <dimen name="config_key_label_horizontal_padding">6dp</dimen>
+    <dimen name="config_key_hint_letter_padding">3dp</dimen>
+    <dimen name="config_key_shifted_letter_hint_padding">3dp</dimen>
 
-    <fraction name="key_letter_ratio">40%</fraction>
-    <fraction name="key_large_letter_ratio">42%</fraction>
-    <fraction name="key_label_ratio">28%</fraction>
-    <fraction name="key_large_label_ratio">28%</fraction>
-    <fraction name="key_hint_letter_ratio">23%</fraction>
-    <fraction name="key_hint_label_ratio">28%</fraction>
-    <fraction name="key_uppercase_letter_ratio">26%</fraction>
-    <fraction name="key_preview_text_ratio">50%</fraction>
-    <fraction name="spacebar_text_ratio">29.03%</fraction>
-    <dimen name="key_preview_height">94.5dp</dimen>
-    <dimen name="key_preview_offset_gb">16.0dp</dimen>
+    <fraction name="config_key_letter_ratio">40%</fraction>
+    <fraction name="config_key_large_letter_ratio">42%</fraction>
+    <fraction name="config_key_label_ratio">28%</fraction>
+    <fraction name="config_key_large_label_ratio">28%</fraction>
+    <fraction name="config_key_hint_letter_ratio">23%</fraction>
+    <fraction name="config_key_hint_label_ratio">28%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio">26%</fraction>
+    <fraction name="config_key_preview_text_ratio">50%</fraction>
+    <fraction name="config_language_on_spacebar_text_ratio">29.03%</fraction>
+    <dimen name="config_key_preview_height">94.5dp</dimen>
+    <dimen name="config_key_preview_offset_gb">16.0dp</dimen>
 
     <!-- For 5-row keyboard -->
-    <fraction name="key_bottom_gap_5row">2.95%p</fraction>
-    <fraction name="key_letter_ratio_5row">51%</fraction>
-    <fraction name="key_uppercase_letter_ratio_5row">33%</fraction>
+    <fraction name="config_key_vertical_gap_5row">2.95%p</fraction>
+    <fraction name="config_key_letter_ratio_5row">51%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio_5row">33%</fraction>
 
-    <dimen name="key_preview_offset_holo">8.0dp</dimen>
-    <!-- popup_key_height x -0.5 -->
-    <dimen name="more_keys_keyboard_vertical_correction_holo">-31.5dp</dimen>
+    <dimen name="config_key_preview_offset_holo">8.0dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x -0.5 -->
+    <dimen name="config_more_keys_keyboard_vertical_correction_holo">-31.5dp</dimen>
 
-    <dimen name="suggestions_strip_height">44dp</dimen>
-    <dimen name="more_suggestions_row_height">44dp</dimen>
-    <integer name="max_more_suggestions_row">6</integer>
-    <fraction name="min_more_suggestions_width">90%</fraction>
-    <dimen name="suggestions_strip_padding">94.5dp</dimen>
-    <dimen name="suggestion_min_width">46dp</dimen>
-    <dimen name="suggestion_padding">8dp</dimen>
-    <dimen name="suggestion_text_size">22dp</dimen>
-    <dimen name="more_suggestions_hint_text_size">33dp</dimen>
+    <dimen name="config_suggestions_strip_height">44dp</dimen>
+    <dimen name="config_more_suggestions_row_height">44dp</dimen>
+    <integer name="config_max_more_suggestions_row">6</integer>
+    <fraction name="config_min_more_suggestions_width">90%</fraction>
+    <dimen name="config_suggestions_strip_horizontal_padding">94.5dp</dimen>
+    <dimen name="config_suggestion_min_width">46dp</dimen>
+    <dimen name="config_suggestion_text_horizontal_padding">8dp</dimen>
+    <dimen name="config_suggestion_text_size">22dp</dimen>
+    <dimen name="config_more_suggestions_hint_text_size">33dp</dimen>
 
     <!-- Gesture floating preview text parameters -->
-    <dimen name="gesture_floating_preview_text_size">26dp</dimen>
-    <dimen name="gesture_floating_preview_text_offset">86dp</dimen>
-    <dimen name="gesture_floating_preview_horizontal_padding">26dp</dimen>
-    <dimen name="gesture_floating_preview_vertical_padding">17dp</dimen>
-    <dimen name="gesture_floating_preview_round_radius">3dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_size">26dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_offset">86dp</dimen>
+    <dimen name="config_gesture_floating_preview_horizontal_padding">26dp</dimen>
+    <dimen name="config_gesture_floating_preview_vertical_padding">17dp</dimen>
+    <dimen name="config_gesture_floating_preview_round_radius">3dp</dimen>
 
     <!-- Emoji keyboard -->
-    <fraction name="emoji_keyboard_key_width">10%p</fraction>
-    <fraction name="emoji_keyboard_row_height">33%p</fraction>
-    <fraction name="emoji_keyboard_key_letter_size">68%p</fraction>
-    <integer name="emoji_keyboard_max_key_count">30</integer>
+    <fraction name="config_emoji_keyboard_key_width">10%p</fraction>
+    <fraction name="config_emoji_keyboard_row_height">33%p</fraction>
+    <fraction name="config_emoji_keyboard_key_letter_size">68%p</fraction>
+    <integer name="config_emoji_keyboard_max_page_key_count">30</integer>
 </resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 4bc9481..8191ffb 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -72,9 +72,9 @@
         <attr name="autoCorrectionSpacebarLedEnabled" format="boolean" />
         <attr name="autoCorrectionSpacebarLedIcon" format="reference" />
         <!-- Size of the text for spacebar language label, in the proportion of key height. -->
-        <attr name="spacebarTextRatio" format="fraction" />
-        <attr name="spacebarTextColor" format="color" />
-        <attr name="spacebarTextShadowColor" format="color" />
+        <attr name="languageOnSpacebarTextRatio" format="fraction" />
+        <attr name="languageOnSpacebarTextColor" format="color" />
+        <attr name="languageOnSpacebarTextShadowColor" format="color" />
         <!-- Fadeout animator for spacebar language label. -->
         <attr name="languageOnSpacebarFinalAlpha" format="integer" />
         <attr name="languageOnSpacebarFadeoutAnimator" format="reference" />
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 122bc4e..2c56651 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -100,114 +100,112 @@
     <!-- Suppress showing key preview duration after batch input in millisecond -->
     <integer name="config_suppress_key_preview_after_batch_input_duration">1000</integer>
 
-    <!-- TODO: Add config_ prefix to the following resources that have been merged from dimens.xml -->
-
     <!-- Preferable keyboard height in absolute scale: 1.285in -->
-    <!-- This keyboardHeight value should match with keyboard-heights.xml -->
-    <dimen name="keyboardHeight">205.6dp</dimen>
-    <fraction name="maxKeyboardHeight">46%p</fraction>
-    <fraction name="minKeyboardHeight">-61.8%p</fraction>
+    <!-- This config_default_keyboard_height value should match with keyboard-heights.xml -->
+    <dimen name="config_default_keyboard_height">205.6dp</dimen>
+    <fraction name="config_max_keyboard_height">46%p</fraction>
+    <fraction name="config_min_keyboard_height">-61.8%p</fraction>
 
-    <dimen name="popup_key_height">52.8dp</dimen>
+    <dimen name="config_more_keys_keyboard_key_height">52.8dp</dimen>
 
-    <dimen name="more_keys_keyboard_key_horizontal_padding">8dp</dimen>
+    <dimen name="config_more_keys_keyboard_key_horizontal_padding">8dp</dimen>
 
-    <fraction name="keyboard_left_padding">0%p</fraction>
-    <fraction name="keyboard_right_padding">0%p</fraction>
+    <fraction name="config_keyboard_left_padding">0%p</fraction>
+    <fraction name="config_keyboard_right_padding">0%p</fraction>
 
-    <fraction name="keyboard_top_padding_gb">1.556%p</fraction>
-    <fraction name="keyboard_bottom_padding_gb">4.669%p</fraction>
-    <fraction name="key_bottom_gap_gb">6.495%p</fraction>
-    <fraction name="key_horizontal_gap_gb">1.971%p</fraction>
+    <fraction name="config_keyboard_top_padding_gb">1.556%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_gb">4.669%p</fraction>
+    <fraction name="config_key_vertical_gap_gb">6.495%p</fraction>
+    <fraction name="config_key_horizontal_gap_gb">1.971%p</fraction>
 
-    <fraction name="keyboard_top_padding_holo">2.335%p</fraction>
-    <fraction name="keyboard_bottom_padding_holo">4.669%p</fraction>
-    <fraction name="key_bottom_gap_holo">6.127%p</fraction>
-    <fraction name="key_horizontal_gap_holo">1.739%p</fraction>
+    <fraction name="config_keyboard_top_padding_holo">2.335%p</fraction>
+    <fraction name="config_keyboard_bottom_padding_holo">4.669%p</fraction>
+    <fraction name="config_key_vertical_gap_holo">6.127%p</fraction>
+    <fraction name="config_key_horizontal_gap_holo">1.739%p</fraction>
 
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
-    <!-- popup_key_height x 1.2 -->
-    <dimen name="more_keys_keyboard_slide_allowance">63.36dp</dimen>
-    <!-- popup_key_height x -1.0 -->
-    <dimen name="more_keys_keyboard_vertical_correction_gb">-52.8dp</dimen>
-    <dimen name="keyboard_vertical_correction">0.0dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x 1.2 -->
+    <dimen name="config_more_keys_keyboard_slide_allowance">63.36dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x -1.0 -->
+    <dimen name="config_more_keys_keyboard_vertical_correction_gb">-52.8dp</dimen>
+    <dimen name="config_keyboard_vertical_correction">0.0dp</dimen>
 
-    <fraction name="key_letter_ratio">55%</fraction>
-    <fraction name="key_large_letter_ratio">65%</fraction>
-    <fraction name="key_label_ratio">34%</fraction>
-    <fraction name="key_large_label_ratio">40%</fraction>
-    <fraction name="key_hint_letter_ratio">25%</fraction>
-    <fraction name="key_hint_label_ratio">44%</fraction>
-    <fraction name="key_uppercase_letter_ratio">35%</fraction>
-    <fraction name="key_preview_text_ratio">82%</fraction>
-    <fraction name="spacebar_text_ratio">33.735%</fraction>
-    <dimen name="key_preview_height">80dp</dimen>
-    <dimen name="key_preview_offset_gb">-8.0dp</dimen>
+    <fraction name="config_key_letter_ratio">55%</fraction>
+    <fraction name="config_key_large_letter_ratio">65%</fraction>
+    <fraction name="config_key_label_ratio">34%</fraction>
+    <fraction name="config_key_large_label_ratio">40%</fraction>
+    <fraction name="config_key_hint_letter_ratio">25%</fraction>
+    <fraction name="config_key_hint_label_ratio">44%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio">35%</fraction>
+    <fraction name="config_key_preview_text_ratio">82%</fraction>
+    <fraction name="config_language_on_spacebar_text_ratio">33.735%</fraction>
+    <dimen name="config_key_preview_height">80dp</dimen>
+    <dimen name="config_key_preview_offset_gb">-8.0dp</dimen>
 
-    <dimen name="key_label_horizontal_padding">4dp</dimen>
-    <dimen name="key_hint_letter_padding">1dp</dimen>
-    <dimen name="key_popup_hint_letter_padding">2dp</dimen>
-    <dimen name="key_uppercase_letter_padding">2dp</dimen>
+    <dimen name="config_key_label_horizontal_padding">4dp</dimen>
+    <dimen name="config_key_hint_letter_padding">1dp</dimen>
+    <dimen name="config_key_popup_hint_letter_padding">2dp</dimen>
+    <dimen name="config_key_shifted_letter_hint_padding">2dp</dimen>
 
     <!-- For 5-row keyboard -->
-    <fraction name="key_bottom_gap_5row">3.20%p</fraction>
-    <fraction name="key_letter_ratio_5row">64%</fraction>
-    <fraction name="key_uppercase_letter_ratio_5row">41%</fraction>
+    <fraction name="config_key_vertical_gap_5row">3.20%p</fraction>
+    <fraction name="config_key_letter_ratio_5row">64%</fraction>
+    <fraction name="config_key_shifted_letter_hint_ratio_5row">41%</fraction>
 
-    <dimen name="key_preview_offset_holo">8.0dp</dimen>
-    <!-- popup_key_height x -0.5 -->
-    <dimen name="more_keys_keyboard_vertical_correction_holo">-26.4dp</dimen>
+    <dimen name="config_key_preview_offset_holo">8.0dp</dimen>
+    <!-- config_more_keys_keyboard_key_height x -0.5 -->
+    <dimen name="config_more_keys_keyboard_vertical_correction_holo">-26.4dp</dimen>
 
-    <dimen name="suggestions_strip_height">40dp</dimen>
-    <dimen name="more_suggestions_key_horizontal_padding">12dp</dimen>
-    <dimen name="more_suggestions_row_height">40dp</dimen>
-    <dimen name="more_suggestions_bottom_gap">6dp</dimen>
-    <dimen name="more_suggestions_modal_tolerance">32.0dp</dimen>
-    <integer name="max_more_suggestions_row">6</integer>
-    <fraction name="min_more_suggestions_width">90%</fraction>
-    <fraction name="more_suggestions_info_ratio">18%</fraction>
-    <dimen name="suggestions_strip_padding">0dp</dimen>
-    <dimen name="suggestion_min_width">44dp</dimen>
-    <dimen name="suggestion_padding">6dp</dimen>
-    <dimen name="suggestion_text_size">18dp</dimen>
-    <dimen name="more_suggestions_hint_text_size">27dp</dimen>
-    <integer name="suggestions_count_in_strip">3</integer>
-    <fraction name="center_suggestion_percentile">36%</fraction>
+    <dimen name="config_suggestions_strip_height">40dp</dimen>
+    <dimen name="config_more_suggestions_key_horizontal_padding">12dp</dimen>
+    <dimen name="config_more_suggestions_row_height">40dp</dimen>
+    <dimen name="config_more_suggestions_bottom_gap">6dp</dimen>
+    <dimen name="config_more_suggestions_modal_tolerance">32.0dp</dimen>
+    <integer name="config_max_more_suggestions_row">6</integer>
+    <fraction name="config_min_more_suggestions_width">90%</fraction>
+    <fraction name="config_more_suggestions_info_ratio">18%</fraction>
+    <dimen name="config_suggestions_strip_horizontal_padding">0dp</dimen>
+    <dimen name="config_suggestion_min_width">44dp</dimen>
+    <dimen name="config_suggestion_text_horizontal_padding">6dp</dimen>
+    <dimen name="config_suggestion_text_size">18dp</dimen>
+    <dimen name="config_more_suggestions_hint_text_size">27dp</dimen>
+    <integer name="config_suggestions_count_in_strip">3</integer>
+    <fraction name="config_center_suggestion_percentile">36%</fraction>
 
     <!-- Gesture trail parameters -->
     <!-- Minimum distance between gesture trail sampling points. -->
-    <dimen name="gesture_trail_min_sampling_distance">9.6dp</dimen>
+    <dimen name="config_gesture_trail_min_sampling_distance">9.6dp</dimen>
     <!-- Maximum angular threshold between gesture trails interpolation segments in degree. -->
-    <integer name="gesture_trail_max_interpolation_angular_threshold">15</integer>
+    <integer name="config_gesture_trail_max_interpolation_angular_threshold">15</integer>
     <!-- Maximum distance threshold between gesture trails interpolation segments. -->
-    <dimen name="gesture_trail_max_interpolation_distance_threshold">16.0dp</dimen>
+    <dimen name="config_gesture_trail_max_interpolation_distance_threshold">16.0dp</dimen>
     <!-- Maximum number of gesture trail interpolation segments. -->
-    <integer name="gesture_trail_max_interpolation_segments">6</integer>
-    <dimen name="gesture_trail_start_width">10.0dp</dimen>
-    <dimen name="gesture_trail_end_width">2.5dp</dimen>
+    <integer name="config_gesture_trail_max_interpolation_segments">6</integer>
+    <dimen name="config_gesture_trail_start_width">10.0dp</dimen>
+    <dimen name="config_gesture_trail_end_width">2.5dp</dimen>
     <!-- Percentages of gesture preview taril body and shadow, in proportion to the trail width.
          A negative value of the shadow ratio disables drawing shadow. -->
     <!-- TODO: May use the shadow to alleviate rugged trail drawing. -->
-    <integer name="gesture_trail_body_ratio">100</integer>
-    <integer name="gesture_trail_shadow_ratio">-1</integer>
+    <integer name="config_gesture_trail_body_ratio">100</integer>
+    <integer name="config_gesture_trail_shadow_ratio">-1</integer>
     <!-- Gesture floating preview text parameters -->
-    <dimen name="gesture_floating_preview_text_size">24dp</dimen>
-    <dimen name="gesture_floating_preview_text_offset">73dp</dimen>
-    <dimen name="gesture_floating_preview_horizontal_padding">24dp</dimen>
-    <dimen name="gesture_floating_preview_vertical_padding">16dp</dimen>
-    <dimen name="gesture_floating_preview_round_radius">2dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_size">24dp</dimen>
+    <dimen name="config_gesture_floating_preview_text_offset">73dp</dimen>
+    <dimen name="config_gesture_floating_preview_horizontal_padding">24dp</dimen>
+    <dimen name="config_gesture_floating_preview_vertical_padding">16dp</dimen>
+    <dimen name="config_gesture_floating_preview_round_radius">2dp</dimen>
 
     <!-- Emoji keyboard -->
-    <fraction name="emoji_keyboard_key_width">14.2857%p</fraction>
-    <fraction name="emoji_keyboard_row_height">33%p</fraction>
-    <fraction name="emoji_keyboard_key_letter_size">68%p</fraction>
-    <integer name="emoji_keyboard_max_key_count">21</integer>
-    <dimen name="emoji_category_page_id_height">3dp</dimen>
+    <fraction name="config_emoji_keyboard_key_width">14.2857%p</fraction>
+    <fraction name="config_emoji_keyboard_row_height">33%p</fraction>
+    <fraction name="config_emoji_keyboard_key_letter_size">68%p</fraction>
+    <integer name="config_emoji_keyboard_max_page_key_count">21</integer>
+    <dimen name="config_emoji_category_page_id_height">3dp</dimen>
 
     <!-- Inset used in Accessibility mode to avoid accidental key presses when a finger slides off the screen. -->
-    <dimen name="accessibility_edge_slop">8dp</dimen>
+    <dimen name="config_accessibility_edge_slop">8dp</dimen>
 
-    <integer name="user_dictionary_max_word_length" translatable="false">48</integer>
+    <integer name="config_user_dictionary_max_word_length" translatable="false">48</integer>
 
-    <dimen name="language_on_spacebar_horizontal_margin">1dp</dimen>
+    <dimen name="config_language_on_spacebar_horizontal_margin">1dp</dimen>
 </resources>
diff --git a/java/res/values/themes-common.xml b/java/res/values/themes-common.xml
index 56fac28..7c9b51c 100644
--- a/java/res/values/themes-common.xml
+++ b/java/res/values/themes-common.xml
@@ -25,43 +25,43 @@
         <item name="touchPositionCorrectionData">@array/touch_position_correction_data_default</item>
         <item name="rowHeight">25%p</item>
         <item name="moreKeysTemplate">@xml/kbd_more_keys_keyboard_template</item>
-        <item name="keyboardLeftPadding">@fraction/keyboard_left_padding</item>
-        <item name="keyboardRightPadding">@fraction/keyboard_right_padding</item>
+        <item name="keyboardLeftPadding">@fraction/config_keyboard_left_padding</item>
+        <item name="keyboardRightPadding">@fraction/config_keyboard_right_padding</item>
         <item name="maxMoreKeysColumn">@integer/config_max_more_keys_column</item>
     </style>
     <style name="KeyboardView">
         <item name="keyBackground">@drawable/btn_keyboard_key_klp</item>
-        <item name="keyLetterSize">@fraction/key_letter_ratio</item>
-        <item name="keyLargeLetterRatio">@fraction/key_large_letter_ratio</item>
-        <item name="keyLabelSize">@fraction/key_label_ratio</item>
-        <item name="keyLargeLabelRatio">@fraction/key_large_label_ratio</item>
-        <item name="keyHintLetterRatio">@fraction/key_hint_letter_ratio</item>
-        <item name="keyHintLabelRatio">@fraction/key_hint_label_ratio</item>
-        <item name="keyShiftedLetterHintRatio">@fraction/key_uppercase_letter_ratio</item>
+        <item name="keyLetterSize">@fraction/config_key_letter_ratio</item>
+        <item name="keyLargeLetterRatio">@fraction/config_key_large_letter_ratio</item>
+        <item name="keyLabelSize">@fraction/config_key_label_ratio</item>
+        <item name="keyLargeLabelRatio">@fraction/config_key_large_label_ratio</item>
+        <item name="keyHintLetterRatio">@fraction/config_key_hint_letter_ratio</item>
+        <item name="keyHintLabelRatio">@fraction/config_key_hint_label_ratio</item>
+        <item name="keyShiftedLetterHintRatio">@fraction/config_key_shifted_letter_hint_ratio</item>
         <item name="keyTypeface">normal</item>
-        <item name="keyLabelHorizontalPadding">@dimen/key_label_horizontal_padding</item>
-        <item name="keyHintLetterPadding">@dimen/key_hint_letter_padding</item>
-        <item name="keyPopupHintLetterPadding">@dimen/key_popup_hint_letter_padding</item>
-        <item name="keyShiftedLetterHintPadding">@dimen/key_uppercase_letter_padding</item>
-        <item name="keyPreviewTextRatio">@fraction/key_preview_text_ratio</item>
-        <item name="verticalCorrection">@dimen/keyboard_vertical_correction</item>
+        <item name="keyLabelHorizontalPadding">@dimen/config_key_label_horizontal_padding</item>
+        <item name="keyHintLetterPadding">@dimen/config_key_hint_letter_padding</item>
+        <item name="keyPopupHintLetterPadding">@dimen/config_key_popup_hint_letter_padding</item>
+        <item name="keyShiftedLetterHintPadding">@dimen/config_key_shifted_letter_hint_padding</item>
+        <item name="keyPreviewTextRatio">@fraction/config_key_preview_text_ratio</item>
+        <item name="verticalCorrection">@dimen/config_keyboard_vertical_correction</item>
         <item name="backgroundDimAlpha">128</item>
-        <item name="gestureFloatingPreviewTextSize">@dimen/gesture_floating_preview_text_size</item>
-        <item name="gestureFloatingPreviewTextOffset">@dimen/gesture_floating_preview_text_offset</item>
-        <item name="gestureFloatingPreviewHorizontalPadding">@dimen/gesture_floating_preview_horizontal_padding</item>
-        <item name="gestureFloatingPreviewVerticalPadding">@dimen/gesture_floating_preview_vertical_padding</item>
-        <item name="gestureFloatingPreviewRoundRadius">@dimen/gesture_floating_preview_round_radius</item>
-        <item name="gestureTrailMinSamplingDistance">@dimen/gesture_trail_min_sampling_distance</item>
-        <item name="gestureTrailMaxInterpolationAngularThreshold">@integer/gesture_trail_max_interpolation_angular_threshold</item>
-        <item name="gestureTrailMaxInterpolationDistanceThreshold">@dimen/gesture_trail_max_interpolation_distance_threshold</item>
-        <item name="gestureTrailMaxInterpolationSegments">@integer/gesture_trail_max_interpolation_segments</item>
+        <item name="gestureFloatingPreviewTextSize">@dimen/config_gesture_floating_preview_text_size</item>
+        <item name="gestureFloatingPreviewTextOffset">@dimen/config_gesture_floating_preview_text_offset</item>
+        <item name="gestureFloatingPreviewHorizontalPadding">@dimen/config_gesture_floating_preview_horizontal_padding</item>
+        <item name="gestureFloatingPreviewVerticalPadding">@dimen/config_gesture_floating_preview_vertical_padding</item>
+        <item name="gestureFloatingPreviewRoundRadius">@dimen/config_gesture_floating_preview_round_radius</item>
+        <item name="gestureTrailMinSamplingDistance">@dimen/config_gesture_trail_min_sampling_distance</item>
+        <item name="gestureTrailMaxInterpolationAngularThreshold">@integer/config_gesture_trail_max_interpolation_angular_threshold</item>
+        <item name="gestureTrailMaxInterpolationDistanceThreshold">@dimen/config_gesture_trail_max_interpolation_distance_threshold</item>
+        <item name="gestureTrailMaxInterpolationSegments">@integer/config_gesture_trail_max_interpolation_segments</item>
         <item name="gestureTrailFadeoutStartDelay">@integer/config_gesture_trail_fadeout_start_delay</item>
         <item name="gestureTrailFadeoutDuration">@integer/config_gesture_trail_fadeout_duration</item>
         <item name="gestureTrailUpdateInterval">@integer/config_gesture_trail_update_interval</item>
-        <item name="gestureTrailStartWidth">@dimen/gesture_trail_start_width</item>
-        <item name="gestureTrailEndWidth">@dimen/gesture_trail_end_width</item>
-        <item name="gestureTrailBodyRatio">@integer/gesture_trail_body_ratio</item>
-        <item name="gestureTrailShadowRatio">@integer/gesture_trail_shadow_ratio</item>
+        <item name="gestureTrailStartWidth">@dimen/config_gesture_trail_start_width</item>
+        <item name="gestureTrailEndWidth">@dimen/config_gesture_trail_end_width</item>
+        <item name="gestureTrailBodyRatio">@integer/config_gesture_trail_body_ratio</item>
+        <item name="gestureTrailShadowRatio">@integer/config_gesture_trail_shadow_ratio</item>
         <!-- Common attributes of MainKeyboardView -->
         <item name="keyHysteresisDistance">@dimen/config_key_hysteresis_distance</item>
         <item name="keyHysteresisDistanceForSlidingModifier">@dimen/config_key_hysteresis_distance_for_sliding_modifier</item>
@@ -76,13 +76,13 @@
         <item name="longPressShiftLockTimeout">@integer/config_longpress_shift_lock_timeout</item>
         <item name="ignoreAltCodeKeyTimeout">@integer/config_ignore_alt_code_key_timeout</item>
         <item name="keyPreviewLayout">@layout/key_preview</item>
-        <item name="keyPreviewHeight">@dimen/key_preview_height</item>
+        <item name="keyPreviewHeight">@dimen/config_key_preview_height</item>
         <item name="keyPreviewZoomInDuration">@integer/config_key_preview_zoom_in_duration</item>
         <item name="keyPreviewZoomOutDuration">@integer/config_key_preview_zoom_out_duration</item>
         <item name="keyPreviewLingerTimeout">@integer/config_key_preview_linger_timeout</item>
         <item name="moreKeysKeyboardLayout">@layout/more_keys_keyboard</item>
         <item name="showMoreKeysKeyboardAtTouchedPoint">@bool/config_show_more_keys_keyboard_at_touched_point</item>
-        <item name="spacebarTextRatio">@fraction/spacebar_text_ratio</item>
+        <item name="languageOnSpacebarTextRatio">@fraction/config_language_on_spacebar_text_ratio</item>
         <item name="languageOnSpacebarFinalAlpha">@integer/config_language_on_spacebar_final_alpha</item>
         <item name="languageOnSpacebarFadeoutAnimator">@anim/language_on_spacebar_fadeout</item>
         <!-- Remove animations for now because it could drain a non-negligible amount of battery while typing.
@@ -122,10 +122,10 @@
         parent="MainKeyboardView" />
     <style name="MoreKeysKeyboardContainer" />
     <style name="SuggestionStripView">
-        <item name="suggestionsCountInStrip">@integer/suggestions_count_in_strip</item>
-        <item name="centerSuggestionPercentile">@fraction/center_suggestion_percentile</item>
-        <item name="maxMoreSuggestionsRow">@integer/max_more_suggestions_row</item>
-        <item name="minMoreSuggestionsWidth">@fraction/min_more_suggestions_width</item>
+        <item name="suggestionsCountInStrip">@integer/config_suggestions_count_in_strip</item>
+        <item name="centerSuggestionPercentile">@fraction/config_center_suggestion_percentile</item>
+        <item name="maxMoreSuggestionsRow">@integer/config_max_more_suggestions_row</item>
+        <item name="minMoreSuggestionsWidth">@fraction/config_min_more_suggestions_width</item>
     </style>
     <style name="SuggestionWord" />
     <style name="MoreKeysKeyboardAnimation">
diff --git a/java/res/values/themes-gb.xml b/java/res/values/themes-gb.xml
index f417d84..78d47f9 100644
--- a/java/res/values/themes-gb.xml
+++ b/java/res/values/themes-gb.xml
@@ -58,10 +58,10 @@
         <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
         <item name="themeId">1</item>
         <item name="touchPositionCorrectionData">@array/touch_position_correction_data_gb</item>
-        <item name="keyboardTopPadding">@fraction/keyboard_top_padding_gb</item>
-        <item name="keyboardBottomPadding">@fraction/keyboard_bottom_padding_gb</item>
-        <item name="horizontalGap">@fraction/key_horizontal_gap_gb</item>
-        <item name="verticalGap">@fraction/key_bottom_gap_gb</item>
+        <item name="keyboardTopPadding">@fraction/config_keyboard_top_padding_gb</item>
+        <item name="keyboardBottomPadding">@fraction/config_keyboard_bottom_padding_gb</item>
+        <item name="horizontalGap">@fraction/config_key_horizontal_gap_gb</item>
+        <item name="verticalGap">@fraction/config_key_vertical_gap_gb</item>
     </style>
     <style
         name="KeyboardView.GB"
@@ -84,15 +84,15 @@
         name="MainKeyboardView.GB"
         parent="KeyboardView.GB"
     >
-        <item name="keyPreviewOffset">@dimen/key_preview_offset_gb</item>
+        <item name="keyPreviewOffset">@dimen/config_key_preview_offset_gb</item>
         <item name="gestureFloatingPreviewTextColor">@color/highlight_color_gb</item>
         <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_gb</item>
         <item name="gestureTrailColor">@color/highlight_color_gb</item>
         <item name="slidingKeyInputPreviewColor">@color/highlight_translucent_color_gb</item>
         <item name="autoCorrectionSpacebarLedEnabled">true</item>
         <item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led_gb</item>
-        <item name="spacebarTextColor">@color/spacebar_text_color_gb</item>
-        <item name="spacebarTextShadowColor">@color/spacebar_text_shadow_color_gb</item>
+        <item name="languageOnSpacebarTextColor">@color/spacebar_text_color_gb</item>
+        <item name="languageOnSpacebarTextShadowColor">@color/spacebar_text_shadow_color_gb</item>
     </style>
     <style
         name="KeyPreviewTextView.GB"
@@ -125,7 +125,7 @@
         <item name="android:background">@drawable/keyboard_popup_panel_background_gb</item>
         <item name="keyBackground">@drawable/btn_keyboard_key_popup_gb</item>
         <item name="keyTypeface">normal</item>
-        <item name="verticalCorrection">@dimen/more_keys_keyboard_vertical_correction_gb</item>
+        <item name="verticalCorrection">@dimen/config_more_keys_keyboard_vertical_correction_gb</item>
     </style>
     <style
         name="SuggestionStripView.GB"
diff --git a/java/res/values/themes-ics.xml b/java/res/values/themes-ics.xml
index b4f5af4..db8dccb 100644
--- a/java/res/values/themes-ics.xml
+++ b/java/res/values/themes-ics.xml
@@ -36,10 +36,10 @@
     >
         <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
         <item name="themeId">2</item>
-        <item name="keyboardTopPadding">@fraction/keyboard_top_padding_holo</item>
-        <item name="keyboardBottomPadding">@fraction/keyboard_bottom_padding_holo</item>
-        <item name="horizontalGap">@fraction/key_horizontal_gap_holo</item>
-        <item name="verticalGap">@fraction/key_bottom_gap_holo</item>
+        <item name="keyboardTopPadding">@fraction/config_keyboard_top_padding_holo</item>
+        <item name="keyboardBottomPadding">@fraction/config_keyboard_bottom_padding_holo</item>
+        <item name="horizontalGap">@fraction/config_key_horizontal_gap_holo</item>
+        <item name="verticalGap">@fraction/config_key_vertical_gap_holo</item>
         <item name="touchPositionCorrectionData">@array/touch_position_correction_data_holo</item>
     </style>
     <style
@@ -63,15 +63,15 @@
         name="MainKeyboardView.ICS"
         parent="KeyboardView.ICS"
     >
-        <item name="keyPreviewOffset">@dimen/key_preview_offset_holo</item>
+        <item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
         <item name="gestureFloatingPreviewTextColor">@color/highlight_color_ics</item>
         <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_holo</item>
         <item name="gestureTrailColor">@color/highlight_color_ics</item>
         <item name="slidingKeyInputPreviewColor">@color/highlight_translucent_color_ics</item>
         <item name="autoCorrectionSpacebarLedEnabled">false</item>
         <item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led_holo</item>
-        <item name="spacebarTextColor">@color/spacebar_text_color_holo</item>
-        <item name="spacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item>
+        <item name="languageOnSpacebarTextColor">@color/spacebar_text_color_holo</item>
+        <item name="languageOnSpacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item>
     </style>
     <style
         name="KeyPreviewTextView.ICS"
@@ -104,7 +104,7 @@
         <item name="android:background">@drawable/keyboard_popup_panel_background_ics</item>
         <item name="keyBackground">@drawable/btn_keyboard_key_popup_ics</item>
         <item name="keyTypeface">normal</item>
-        <item name="verticalCorrection">@dimen/more_keys_keyboard_vertical_correction_holo</item>
+        <item name="verticalCorrection">@dimen/config_more_keys_keyboard_vertical_correction_holo</item>
     </style>
     <style
         name="SuggestionStripView.ICS"
diff --git a/java/res/values/themes-klp.xml b/java/res/values/themes-klp.xml
index ef88d88..dd1f630 100644
--- a/java/res/values/themes-klp.xml
+++ b/java/res/values/themes-klp.xml
@@ -36,10 +36,10 @@
     >
         <!-- This should be aligned with KeyboardSwitcher.KEYBOARD_THEMES[] -->
         <item name="themeId">0</item>
-        <item name="keyboardTopPadding">@fraction/keyboard_top_padding_holo</item>
-        <item name="keyboardBottomPadding">@fraction/keyboard_bottom_padding_holo</item>
-        <item name="horizontalGap">@fraction/key_horizontal_gap_holo</item>
-        <item name="verticalGap">@fraction/key_bottom_gap_holo</item>
+        <item name="keyboardTopPadding">@fraction/config_keyboard_top_padding_holo</item>
+        <item name="keyboardBottomPadding">@fraction/config_keyboard_bottom_padding_holo</item>
+        <item name="horizontalGap">@fraction/config_key_horizontal_gap_holo</item>
+        <item name="verticalGap">@fraction/config_key_vertical_gap_holo</item>
         <item name="touchPositionCorrectionData">@array/touch_position_correction_data_holo</item>
     </style>
     <style
@@ -63,15 +63,15 @@
         name="MainKeyboardView.KLP"
         parent="KeyboardView.KLP"
     >
-        <item name="keyPreviewOffset">@dimen/key_preview_offset_holo</item>
+        <item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
         <item name="gestureFloatingPreviewTextColor">@color/highlight_color_klp</item>
         <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_holo</item>
         <item name="gestureTrailColor">@color/highlight_color_klp</item>
         <item name="slidingKeyInputPreviewColor">@color/highlight_translucent_color_klp</item>
         <item name="autoCorrectionSpacebarLedEnabled">false</item>
         <item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led_holo</item>
-        <item name="spacebarTextColor">@color/spacebar_text_color_holo</item>
-        <item name="spacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item>
+        <item name="languageOnSpacebarTextColor">@color/spacebar_text_color_holo</item>
+        <item name="languageOnSpacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item>
     </style>
     <style
         name="KeyPreviewTextView.KLP"
@@ -104,7 +104,7 @@
         <item name="android:background">@drawable/keyboard_popup_panel_background_klp</item>
         <item name="keyBackground">@drawable/btn_keyboard_key_popup_klp</item>
         <item name="keyTypeface">normal</item>
-        <item name="verticalCorrection">@dimen/more_keys_keyboard_vertical_correction_holo</item>
+        <item name="verticalCorrection">@dimen/config_more_keys_keyboard_vertical_correction_holo</item>
     </style>
     <style
         name="SuggestionStripView.KLP"
diff --git a/java/res/xml-sw600dp-land/kbd_more_keys_keyboard_template.xml b/java/res/xml-sw600dp-land/kbd_more_keys_keyboard_template.xml
index 4d8b446..c7d4460 100644
--- a/java/res/xml-sw600dp-land/kbd_more_keys_keyboard_template.xml
+++ b/java/res/xml-sw600dp-land/kbd_more_keys_keyboard_template.xml
@@ -20,7 +20,7 @@
 
 <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="5%p"
-    latin:rowHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/config_more_keys_keyboard_key_height"
     style="?attr/moreKeysKeyboardStyle"
     >
 </Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_more_keys_keyboard_template.xml b/java/res/xml-sw600dp/kbd_more_keys_keyboard_template.xml
index d90a588..fbe8cfc 100644
--- a/java/res/xml-sw600dp/kbd_more_keys_keyboard_template.xml
+++ b/java/res/xml-sw600dp/kbd_more_keys_keyboard_template.xml
@@ -20,7 +20,7 @@
 
 <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="8%p"
-    latin:rowHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/config_more_keys_keyboard_key_height"
     style="?attr/moreKeysKeyboardStyle"
     >
 </Keyboard>
diff --git a/java/res/xml/kbd_armenian_phonetic.xml b/java/res/xml/kbd_armenian_phonetic.xml
index 1eb3c7e..da12870 100644
--- a/java/res/xml/kbd_armenian_phonetic.xml
+++ b/java/res/xml/kbd_armenian_phonetic.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:rowHeight="20%p"
-    latin:verticalGap="@fraction/key_bottom_gap_5row"
-    latin:keyLetterSize="@fraction/key_letter_ratio_5row"
-    latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row"
+    latin:verticalGap="@fraction/config_key_vertical_gap_5row"
+    latin:keyLetterSize="@fraction/config_key_letter_ratio_5row"
+    latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row"
     latin:touchPositionCorrectionData="@array/touch_position_correction_data_default"
 >
     <include
diff --git a/java/res/xml/kbd_emoji_category1.xml b/java/res/xml/kbd_emoji_category1.xml
index c11a830..5145ea9 100644
--- a/java/res/xml/kbd_emoji_category1.xml
+++ b/java/res/xml/kbd_emoji_category1.xml
@@ -20,9 +20,9 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="@fraction/emoji_keyboard_key_width"
+    latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
     latin:keyLetterSize="90%p"
-    latin:rowHeight="@fraction/emoji_keyboard_row_height"
+    latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
 >
     <GridRows
         latin:codesArray="@array/emoji_faces"
diff --git a/java/res/xml/kbd_emoji_category2.xml b/java/res/xml/kbd_emoji_category2.xml
index d3e5890..ac8784f 100644
--- a/java/res/xml/kbd_emoji_category2.xml
+++ b/java/res/xml/kbd_emoji_category2.xml
@@ -20,9 +20,9 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="@fraction/emoji_keyboard_key_width"
+    latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
     latin:keyLetterSize="90%p"
-    latin:rowHeight="@fraction/emoji_keyboard_row_height"
+    latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
 >
     <GridRows
         latin:codesArray="@array/emoji_objects"
diff --git a/java/res/xml/kbd_emoji_category3.xml b/java/res/xml/kbd_emoji_category3.xml
index 0efafa8..88c4db9 100644
--- a/java/res/xml/kbd_emoji_category3.xml
+++ b/java/res/xml/kbd_emoji_category3.xml
@@ -20,9 +20,9 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="@fraction/emoji_keyboard_key_width"
+    latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
     latin:keyLetterSize="90%p"
-    latin:rowHeight="@fraction/emoji_keyboard_row_height"
+    latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
 >
     <GridRows
         latin:codesArray="@array/emoji_nature"
diff --git a/java/res/xml/kbd_emoji_category4.xml b/java/res/xml/kbd_emoji_category4.xml
index e529120..262384d 100644
--- a/java/res/xml/kbd_emoji_category4.xml
+++ b/java/res/xml/kbd_emoji_category4.xml
@@ -20,9 +20,9 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="@fraction/emoji_keyboard_key_width"
+    latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
     latin:keyLetterSize="90%p"
-    latin:rowHeight="@fraction/emoji_keyboard_row_height"
+    latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
 >
     <GridRows
         latin:codesArray="@array/emoji_places"
diff --git a/java/res/xml/kbd_emoji_category5.xml b/java/res/xml/kbd_emoji_category5.xml
index 1836879..bf823f9 100644
--- a/java/res/xml/kbd_emoji_category5.xml
+++ b/java/res/xml/kbd_emoji_category5.xml
@@ -20,9 +20,9 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="@fraction/emoji_keyboard_key_width"
+    latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
     latin:keyLetterSize="90%p"
-    latin:rowHeight="@fraction/emoji_keyboard_row_height"
+    latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
 >
     <GridRows
         latin:codesArray="@array/emoji_symbols"
diff --git a/java/res/xml/kbd_emoji_category6.xml b/java/res/xml/kbd_emoji_category6.xml
index b47ebfe..edb82fc 100644
--- a/java/res/xml/kbd_emoji_category6.xml
+++ b/java/res/xml/kbd_emoji_category6.xml
@@ -20,10 +20,10 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="@fraction/emoji_keyboard_key_width"
+    latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
     latin:keyLetterSize="90%p"
     latin:keyLabelSize="60%p"
-    latin:rowHeight="@fraction/emoji_keyboard_row_height"
+    latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
 >
     <GridRows
         latin:textsArray="@array/emoji_emoticons"
diff --git a/java/res/xml/kbd_emoji_recents.xml b/java/res/xml/kbd_emoji_recents.xml
index 73926ec..edf3872 100644
--- a/java/res/xml/kbd_emoji_recents.xml
+++ b/java/res/xml/kbd_emoji_recents.xml
@@ -20,10 +20,10 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:keyWidth="@fraction/emoji_keyboard_key_width"
-    latin:keyLetterSize="@fraction/emoji_keyboard_key_letter_size"
+    latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
+    latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
     latin:keyLabelSize="60%p"
-    latin:rowHeight="@fraction/emoji_keyboard_row_height"
+    latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
 >
     <GridRows
         latin:codesArray="@array/emoji_recents"
diff --git a/java/res/xml/kbd_khmer.xml b/java/res/xml/kbd_khmer.xml
index 7a2337a..d703e78 100644
--- a/java/res/xml/kbd_khmer.xml
+++ b/java/res/xml/kbd_khmer.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:rowHeight="20%p"
-    latin:verticalGap="@fraction/key_bottom_gap_5row"
-    latin:keyLetterSize="@fraction/key_letter_ratio_5row"
-    latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row"
+    latin:verticalGap="@fraction/config_key_vertical_gap_5row"
+    latin:keyLetterSize="@fraction/config_key_letter_ratio_5row"
+    latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row"
     latin:touchPositionCorrectionData="@array/touch_position_correction_data_default"
 >
     <include
diff --git a/java/res/xml/kbd_lao.xml b/java/res/xml/kbd_lao.xml
index 2bba330..6f77095 100644
--- a/java/res/xml/kbd_lao.xml
+++ b/java/res/xml/kbd_lao.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:rowHeight="20%p"
-    latin:verticalGap="@fraction/key_bottom_gap_5row"
-    latin:keyLetterSize="@fraction/key_letter_ratio_5row"
-    latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row"
+    latin:verticalGap="@fraction/config_key_vertical_gap_5row"
+    latin:keyLetterSize="@fraction/config_key_letter_ratio_5row"
+    latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row"
     latin:touchPositionCorrectionData="@array/touch_position_correction_data_default"
 >
     <include
diff --git a/java/res/xml/kbd_more_keys_keyboard_template.xml b/java/res/xml/kbd_more_keys_keyboard_template.xml
index 537973d..7104ec7 100644
--- a/java/res/xml/kbd_more_keys_keyboard_template.xml
+++ b/java/res/xml/kbd_more_keys_keyboard_template.xml
@@ -20,7 +20,7 @@
 
 <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
-    latin:rowHeight="@dimen/popup_key_height"
+    latin:rowHeight="@dimen/config_more_keys_keyboard_key_height"
     style="?attr/moreKeysKeyboardStyle"
     >
 </Keyboard>
diff --git a/java/res/xml/kbd_pcqwerty.xml b/java/res/xml/kbd_pcqwerty.xml
index 5155bc5..0456964 100644
--- a/java/res/xml/kbd_pcqwerty.xml
+++ b/java/res/xml/kbd_pcqwerty.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:rowHeight="20%p"
-    latin:verticalGap="@fraction/key_bottom_gap_5row"
-    latin:keyLetterSize="@fraction/key_letter_ratio_5row"
-    latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row"
+    latin:verticalGap="@fraction/config_key_vertical_gap_5row"
+    latin:keyLetterSize="@fraction/config_key_letter_ratio_5row"
+    latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row"
     latin:touchPositionCorrectionData="@array/touch_position_correction_data_default"
 >
     <include
diff --git a/java/res/xml/kbd_suggestions_pane_template.xml b/java/res/xml/kbd_suggestions_pane_template.xml
index 21316e6..5b4f606 100644
--- a/java/res/xml/kbd_suggestions_pane_template.xml
+++ b/java/res/xml/kbd_suggestions_pane_template.xml
@@ -20,6 +20,6 @@
 
 <Keyboard xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:keyWidth="10%p"
-    latin:rowHeight="@dimen/more_suggestions_row_height"
+    latin:rowHeight="@dimen/config_more_suggestions_row_height"
     >
 </Keyboard>
diff --git a/java/res/xml/kbd_thai.xml b/java/res/xml/kbd_thai.xml
index 294bffb..7e65217 100644
--- a/java/res/xml/kbd_thai.xml
+++ b/java/res/xml/kbd_thai.xml
@@ -21,9 +21,9 @@
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     latin:rowHeight="20%p"
-    latin:verticalGap="@fraction/key_bottom_gap_5row"
-    latin:keyLetterSize="@fraction/key_letter_ratio_5row"
-    latin:keyShiftedLetterHintRatio="@fraction/key_uppercase_letter_ratio_5row"
+    latin:verticalGap="@fraction/config_key_vertical_gap_5row"
+    latin:keyLetterSize="@fraction/config_key_letter_ratio_5row"
+    latin:keyShiftedLetterHintRatio="@fraction/config_key_shifted_letter_hint_ratio_5row"
     latin:touchPositionCorrectionData="@array/touch_position_correction_data_default"
 >
     <include
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
index 73896df..c601cf1 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
@@ -82,7 +82,7 @@
     private void initInternal(final InputMethodService inputMethod) {
         mInputMethod = inputMethod;
         mEdgeSlop = inputMethod.getResources().getDimensionPixelSize(
-                R.dimen.accessibility_edge_slop);
+                R.dimen.config_accessibility_edge_slop);
     }
 
     /**
diff --git a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java b/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
index 561a801..ff0d538 100644
--- a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
+++ b/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
@@ -149,7 +149,7 @@
         public EmojiCategory(final SharedPreferences prefs, final Resources res,
                 final KeyboardLayoutSet layoutSet) {
             mPrefs = prefs;
-            mMaxPageKeyCount = res.getInteger(R.integer.emoji_keyboard_max_key_count);
+            mMaxPageKeyCount = res.getInteger(R.integer.config_emoji_keyboard_max_page_key_count);
             mLayoutSet = layoutSet;
             for (int i = 0; i < sCategoryName.length; ++i) {
                 mCategoryNameToIdMap.put(sCategoryName[i], i);
@@ -427,7 +427,7 @@
         final int width = ResourceUtils.getDefaultKeyboardWidth(res)
                 + getPaddingLeft() + getPaddingRight();
         final int height = ResourceUtils.getDefaultKeyboardHeight(res)
-                + res.getDimensionPixelSize(R.dimen.suggestions_strip_height)
+                + res.getDimensionPixelSize(R.dimen.config_suggestions_strip_height)
                 + getPaddingTop() + getPaddingBottom();
         setMeasuredDimension(width, height);
     }
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index e4051e8..b67d4e7 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -48,8 +48,6 @@
 import com.android.inputmethod.accessibility.AccessibilityUtils;
 import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
 import com.android.inputmethod.annotations.ExternallyReferenced;
-import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy;
-import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
 import com.android.inputmethod.keyboard.internal.DrawingHandler;
 import com.android.inputmethod.keyboard.internal.GestureFloatingPreviewText;
 import com.android.inputmethod.keyboard.internal.GestureTrailsPreview;
@@ -83,9 +81,9 @@
  *
  * @attr ref R.styleable#MainKeyboardView_autoCorrectionSpacebarLedEnabled
  * @attr ref R.styleable#MainKeyboardView_autoCorrectionSpacebarLedIcon
- * @attr ref R.styleable#MainKeyboardView_spacebarTextRatio
- * @attr ref R.styleable#MainKeyboardView_spacebarTextColor
- * @attr ref R.styleable#MainKeyboardView_spacebarTextShadowColor
+ * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarTextRatio
+ * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarTextColor
+ * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarTextShadowColor
  * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarFinalAlpha
  * @attr ref R.styleable#MainKeyboardView_languageOnSpacebarFadeoutAnimator
  * @attr ref R.styleable#MainKeyboardView_altCodeKeyWhileTypingFadeoutAnimator
@@ -119,9 +117,8 @@
  * @attr ref R.styleable#MainKeyboardView_gestureRecognitionSpeedThreshold
  * @attr ref R.styleable#MainKeyboardView_suppressKeyPreviewAfterBatchInputDuration
  */
-public final class MainKeyboardView extends KeyboardView implements PointerTracker.KeyEventHandler,
-        PointerTracker.DrawingProxy, MoreKeysPanel.Controller, DrawingHandler.Callbacks,
-        TimerHandler.Callbacks {
+public final class MainKeyboardView extends KeyboardView implements PointerTracker.DrawingProxy,
+        MoreKeysPanel.Controller, DrawingHandler.Callbacks, TimerHandler.Callbacks {
     private static final String TAG = MainKeyboardView.class.getSimpleName();
 
     /** Listener for {@link KeyboardActionListener}. */
@@ -136,10 +133,10 @@
     private boolean mNeedsToDisplayLanguage;
     private boolean mHasMultipleEnabledIMEsOrSubtypes;
     private int mLanguageOnSpacebarAnimAlpha = Constants.Color.ALPHA_OPAQUE;
-    private final float mSpacebarTextRatio;
-    private float mSpacebarTextSize;
-    private final int mSpacebarTextColor;
-    private final int mSpacebarTextShadowColor;
+    private final float mLanguageOnSpacebarTextRatio;
+    private float mLanguageOnSpacebarTextSize;
+    private final int mLanguageOnSpacebarTextColor;
+    private final int mLanguageOnSpacebarTextShadowColor;
     // The minimum x-scale to fit the language name on spacebar.
     private static final float MINIMUM_XSCALE_OF_LANGUAGE_NAME = 0.8f;
     // Stuff to draw auto correction LED on spacebar.
@@ -213,7 +210,27 @@
     public MainKeyboardView(final Context context, final AttributeSet attrs, final int defStyle) {
         super(context, attrs, defStyle);
 
-        PointerTracker.init(getResources());
+        mPreviewPlacerView = new PreviewPlacerView(context, attrs);
+
+        final TypedArray mainKeyboardViewAttr = context.obtainStyledAttributes(
+                attrs, R.styleable.MainKeyboardView, defStyle, R.style.MainKeyboardView);
+        final int ignoreAltCodeKeyTimeout = mainKeyboardViewAttr.getInt(
+                R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0);
+        final int gestureRecognitionUpdateTime = mainKeyboardViewAttr.getInt(
+                R.styleable.MainKeyboardView_gestureRecognitionUpdateTime, 0);
+        mKeyTimerHandler = new TimerHandler(
+                this, ignoreAltCodeKeyTimeout, gestureRecognitionUpdateTime);
+
+        final float keyHysteresisDistance = mainKeyboardViewAttr.getDimension(
+                R.styleable.MainKeyboardView_keyHysteresisDistance, 0.0f);
+        final float keyHysteresisDistanceForSlidingModifier = mainKeyboardViewAttr.getDimension(
+                R.styleable.MainKeyboardView_keyHysteresisDistanceForSlidingModifier, 0.0f);
+        mKeyDetector = new KeyDetector(
+                keyHysteresisDistance, keyHysteresisDistanceForSlidingModifier);
+
+        PointerTracker.init(mainKeyboardViewAttr, mKeyTimerHandler, this /* DrawingProxy */,
+                mKeyDetector);
+
         final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
         final boolean forceNonDistinctMultitouch = prefs.getBoolean(
                 DebugSettings.PREF_FORCE_NON_DISTINCT_MULTITOUCH, false);
@@ -221,12 +238,8 @@
                 .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT)
                 && !forceNonDistinctMultitouch;
         mNonDistinctMultitouchHelper = hasDistinctMultitouch ? null
-                : new NonDistinctMultitouchHelper();
+                : new NonDistinctMultitouchHelper(PointerTracker.getPointerTracker(0));
 
-        mPreviewPlacerView = new PreviewPlacerView(context, attrs);
-
-        final TypedArray mainKeyboardViewAttr = context.obtainStyledAttributes(
-                attrs, R.styleable.MainKeyboardView, defStyle, R.style.MainKeyboardView);
         final int backgroundDimAlpha = mainKeyboardViewAttr.getInt(
                 R.styleable.MainKeyboardView_backgroundDimAlpha, 0);
         mBackgroundDimAlphaPaint.setColor(Color.BLACK);
@@ -235,12 +248,12 @@
                 R.styleable.MainKeyboardView_autoCorrectionSpacebarLedEnabled, false);
         mAutoCorrectionSpacebarLedIcon = mainKeyboardViewAttr.getDrawable(
                 R.styleable.MainKeyboardView_autoCorrectionSpacebarLedIcon);
-        mSpacebarTextRatio = mainKeyboardViewAttr.getFraction(
-                R.styleable.MainKeyboardView_spacebarTextRatio, 1, 1, 1.0f);
-        mSpacebarTextColor = mainKeyboardViewAttr.getColor(
-                R.styleable.MainKeyboardView_spacebarTextColor, 0);
-        mSpacebarTextShadowColor = mainKeyboardViewAttr.getColor(
-                R.styleable.MainKeyboardView_spacebarTextShadowColor, 0);
+        mLanguageOnSpacebarTextRatio = mainKeyboardViewAttr.getFraction(
+                R.styleable.MainKeyboardView_languageOnSpacebarTextRatio, 1, 1, 1.0f);
+        mLanguageOnSpacebarTextColor = mainKeyboardViewAttr.getColor(
+                R.styleable.MainKeyboardView_languageOnSpacebarTextColor, 0);
+        mLanguageOnSpacebarTextShadowColor = mainKeyboardViewAttr.getColor(
+                R.styleable.MainKeyboardView_languageOnSpacebarTextShadowColor, 0);
         mLanguageOnSpacebarFinalAlpha = mainKeyboardViewAttr.getInt(
                 R.styleable.MainKeyboardView_languageOnSpacebarFinalAlpha,
                 Constants.Color.ALPHA_OPAQUE);
@@ -251,18 +264,6 @@
         final int altCodeKeyWhileTypingFadeinAnimatorResId = mainKeyboardViewAttr.getResourceId(
                 R.styleable.MainKeyboardView_altCodeKeyWhileTypingFadeinAnimator, 0);
 
-        final float keyHysteresisDistance = mainKeyboardViewAttr.getDimension(
-                R.styleable.MainKeyboardView_keyHysteresisDistance, 0.0f);
-        final float keyHysteresisDistanceForSlidingModifier = mainKeyboardViewAttr.getDimension(
-                R.styleable.MainKeyboardView_keyHysteresisDistanceForSlidingModifier, 0.0f);
-        mKeyDetector = new KeyDetector(
-                keyHysteresisDistance, keyHysteresisDistanceForSlidingModifier);
-        final int ignoreAltCodeKeyTimeout = mainKeyboardViewAttr.getInt(
-                R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0);
-        final int gestureRecognitionUpdateTime = mainKeyboardViewAttr.getInt(
-                R.styleable.MainKeyboardView_gestureRecognitionUpdateTime, 0);
-        mKeyTimerHandler = new TimerHandler(
-                this, ignoreAltCodeKeyTimeout, gestureRecognitionUpdateTime);
         mKeyPreviewOffset = mainKeyboardViewAttr.getDimensionPixelOffset(
                 R.styleable.MainKeyboardView_keyPreviewOffset, 0);
         mKeyPreviewHeight = mainKeyboardViewAttr.getDimensionPixelSize(
@@ -285,7 +286,6 @@
 
         mGestureFloatingPreviewTextLingerTimeout = mainKeyboardViewAttr.getInt(
                 R.styleable.MainKeyboardView_gestureFloatingPreviewTextLingerTimeout, 0);
-        PointerTracker.setParameters(mainKeyboardViewAttr);
 
         mGestureFloatingPreviewText = new GestureFloatingPreviewText(
                 mPreviewPlacerView, mainKeyboardViewAttr);
@@ -311,8 +311,8 @@
 
         mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER;
 
-        mLanguageOnSpacebarHorizontalMargin =
-                (int) getResources().getDimension(R.dimen.language_on_spacebar_horizontal_margin);
+        mLanguageOnSpacebarHorizontalMargin = (int)getResources().getDimension(
+                R.dimen.config_language_on_spacebar_horizontal_margin);
     }
 
     @Override
@@ -400,28 +400,16 @@
         PointerTracker.setKeyboardActionListener(listener);
     }
 
-    /**
-     * Returns the {@link KeyboardActionListener} object.
-     * @return the listener attached to this keyboard
-     */
-    @Override
-    public KeyboardActionListener getKeyboardActionListener() {
-        return mKeyboardActionListener;
+    // TODO: We should reconsider which coordinate system should be used to represent keyboard
+    // event.
+    public int getKeyX(final int x) {
+        return Constants.isValidCoordinate(x) ? mKeyDetector.getTouchX(x) : x;
     }
 
-    @Override
-    public KeyDetector getKeyDetector() {
-        return mKeyDetector;
-    }
-
-    @Override
-    public DrawingProxy getDrawingProxy() {
-        return this;
-    }
-
-    @Override
-    public TimerProxy getTimerProxy() {
-        return mKeyTimerHandler;
+    // TODO: We should reconsider which coordinate system should be used to represent keyboard
+    // event.
+    public int getKeyY(final int y) {
+        return Constants.isValidCoordinate(y) ? mKeyDetector.getTouchY(y) : y;
     }
 
     /**
@@ -439,13 +427,14 @@
         mKeyDetector.setKeyboard(
                 keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection());
         PointerTracker.setKeyDetector(mKeyDetector);
+        PointerTracker.setKeyboardActionListener(mKeyboardActionListener);
         mMoreKeysKeyboardCache.clear();
 
         mSpaceKey = keyboard.getKey(Constants.CODE_SPACE);
         mSpaceIcon = (mSpaceKey != null)
                 ? mSpaceKey.getIcon(keyboard.mIconsSet, Constants.Color.ALPHA_OPAQUE) : null;
         final int keyHeight = keyboard.mMostCommonKeyHeight - keyboard.mVerticalGap;
-        mSpacebarTextSize = keyHeight * mSpacebarTextRatio;
+        mLanguageOnSpacebarTextSize = keyHeight * mLanguageOnSpacebarTextRatio;
         if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
             final int orientation = getContext().getResources().getConfiguration().orientation;
             ResearchLogger.mainKeyboardView_setKeyboard(keyboard, orientation);
@@ -997,7 +986,7 @@
                 mKeyTimerHandler.cancelKeyRepeatTimer();
             }
             // Non distinct multitouch screen support
-            mNonDistinctMultitouchHelper.processMotionEvent(me, this);
+            mNonDistinctMultitouchHelper.processMotionEvent(me, mKeyDetector);
             return true;
         }
         return processMotionEvent(me);
@@ -1014,8 +1003,8 @@
 
         final int index = me.getActionIndex();
         final int id = me.getPointerId(index);
-        final PointerTracker tracker = PointerTracker.getPointerTracker(id, this);
-        tracker.processMotionEvent(me, this);
+        final PointerTracker tracker = PointerTracker.getPointerTracker(id);
+        tracker.processMotionEvent(me, mKeyDetector);
         return true;
     }
 
@@ -1044,7 +1033,7 @@
     @Override
     public boolean dispatchHoverEvent(final MotionEvent event) {
         if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) {
-            final PointerTracker tracker = PointerTracker.getPointerTracker(0, this);
+            final PointerTracker tracker = PointerTracker.getPointerTracker(0);
             return AccessibleKeyboardViewProxy.getInstance().dispatchHoverEvent(event, tracker);
         }
 
@@ -1190,17 +1179,17 @@
         if (mNeedsToDisplayLanguage) {
             paint.setTextAlign(Align.CENTER);
             paint.setTypeface(Typeface.DEFAULT);
-            paint.setTextSize(mSpacebarTextSize);
+            paint.setTextSize(mLanguageOnSpacebarTextSize);
             final InputMethodSubtype subtype = getKeyboard().mId.mSubtype;
             final String language = layoutLanguageOnSpacebar(paint, subtype, width);
             // Draw language text with shadow
             final float descent = paint.descent();
             final float textHeight = -paint.ascent() + descent;
             final float baseline = height / 2 + textHeight / 2;
-            paint.setColor(mSpacebarTextShadowColor);
+            paint.setColor(mLanguageOnSpacebarTextShadowColor);
             paint.setAlpha(mLanguageOnSpacebarAnimAlpha);
             canvas.drawText(language, width / 2, baseline - descent - 1, paint);
-            paint.setColor(mSpacebarTextColor);
+            paint.setColor(mLanguageOnSpacebarTextColor);
             paint.setAlpha(mLanguageOnSpacebarAnimAlpha);
             canvas.drawText(language, width / 2, baseline - descent, paint);
         }
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
index fca727b..6705243 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
@@ -298,7 +298,7 @@
                 height = keyPreviewDrawParams.mPreviewVisibleHeight + mParams.mVerticalGap;
             } else {
                 final float padding = context.getResources().getDimension(
-                        R.dimen.more_keys_keyboard_key_horizontal_padding)
+                        R.dimen.config_more_keys_keyboard_key_horizontal_padding)
                         + (parentKey.hasLabelsInMoreKeys()
                                 ? mParams.mDefaultKeyWidth * LABEL_PADDING_RATIO : 0.0f);
                 width = getMaxKeyWidth(parentKey, mParams.mDefaultKeyWidth, padding,
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
index 8492d93..a7c4685 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
@@ -52,7 +52,7 @@
 
         final Resources res = context.getResources();
         mKeyDetector = new MoreKeysDetector(
-                res.getDimension(R.dimen.more_keys_keyboard_slide_allowance));
+                res.getDimension(R.dimen.config_more_keys_keyboard_slide_allowance));
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 39fb0b5..f4329b4 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -55,33 +55,6 @@
     private static boolean sGestureHandlingEnabledByInputField = false;
     private static boolean sGestureHandlingEnabledByUser = false;
 
-    public interface KeyEventHandler {
-        /**
-         * Get KeyDetector object that is used for this PointerTracker.
-         * @return the KeyDetector object that is used for this PointerTracker
-         */
-        public KeyDetector getKeyDetector();
-
-        /**
-         * Get KeyboardActionListener object that is used to register key code and so on.
-         * @return the KeyboardActionListner for this PointerTracke
-         */
-        public KeyboardActionListener getKeyboardActionListener();
-
-        /**
-         * Get DrawingProxy object that is used for this PointerTracker.
-         * @return the DrawingProxy object that is used for this PointerTracker
-         */
-        public DrawingProxy getDrawingProxy();
-
-        /**
-         * Get TimerProxy object that handles key repeat and long press timer event for this
-         * PointerTracker.
-         * @return the TimerProxy object that handles key repeat and long press timer event.
-         */
-        public TimerProxy getTimerProxy();
-    }
-
     public interface DrawingProxy {
         public void invalidateKey(Key key);
         public void showKeyPreview(Key key);
@@ -142,18 +115,6 @@
         public final int mKeyRepeatInterval;
         public final int mLongPressShiftLockTimeout;
 
-        public static final PointerTrackerParams DEFAULT = new PointerTrackerParams();
-
-        private PointerTrackerParams() {
-            mKeySelectionByDraggingFinger = false;
-            mTouchNoiseThresholdTime = 0;
-            mTouchNoiseThresholdDistance = 0;
-            mSuppressKeyPreviewAfterBatchInputDuration = 0;
-            mKeyRepeatStartTimeout = 0;
-            mKeyRepeatInterval = 0;
-            mLongPressShiftLockTimeout = 0;
-        }
-
         public PointerTrackerParams(final TypedArray mainKeyboardViewAttr) {
             mKeySelectionByDraggingFinger = mainKeyboardViewAttr.getBoolean(
                     R.styleable.MainKeyboardView_keySelectionByDraggingFinger, false);
@@ -189,10 +150,11 @@
 
     public final int mPointerId;
 
-    private DrawingProxy mDrawingProxy;
-    private TimerProxy mTimerProxy;
+    private static DrawingProxy sDrawingProxy;
+    private static TimerProxy sTimerProxy;
+    private static KeyDetector sDefaultKeyDetector;
     private KeyDetector mKeyDetector;
-    private KeyboardActionListener mListener = KeyboardActionListener.EMPTY_LISTENER;
+    private static KeyboardActionListener sListener = KeyboardActionListener.EMPTY_LISTENER;
 
     private Keyboard mKeyboard;
     private int mPhantomSuddenMoveThreshold;
@@ -377,22 +339,26 @@
         return needsTheHack;
     }
 
-    public static void init(final Resources res) {
-        sNeedsPhantomSuddenMoveEventHack = Boolean.parseBoolean(
-                ResourceUtils.getDeviceOverrideValue(
-                        res, R.array.phantom_sudden_move_event_device_list));
-        sNeedsProximateBogusDownMoveUpEventHack = needsProximateBogusDownMoveUpEventHack(res);
-        sParams = PointerTrackerParams.DEFAULT;
-        sGestureStrokeParams = GestureStrokeParams.DEFAULT;
-        sGesturePreviewParams = GestureStrokePreviewParams.DEFAULT;
-        sTimeRecorder = new TimeRecorder(sParams, sGestureStrokeParams);
-    }
-
-    public static void setParameters(final TypedArray mainKeyboardViewAttr) {
+    // TODO: Add PointerTrackerFactory singleton and move some class static methods into it.
+    public static void init(final TypedArray mainKeyboardViewAttr, final TimerProxy timerProxy,
+            final DrawingProxy drawingProxy, final KeyDetector defaultKeyDetector) {
         sParams = new PointerTrackerParams(mainKeyboardViewAttr);
         sGestureStrokeParams = new GestureStrokeParams(mainKeyboardViewAttr);
         sGesturePreviewParams = new GestureStrokePreviewParams(mainKeyboardViewAttr);
         sTimeRecorder = new TimeRecorder(sParams, sGestureStrokeParams);
+
+        final Resources res = mainKeyboardViewAttr.getResources();
+        sNeedsPhantomSuddenMoveEventHack = Boolean.parseBoolean(
+                ResourceUtils.getDeviceOverrideValue(
+                        res, R.array.phantom_sudden_move_event_device_list));
+        sNeedsProximateBogusDownMoveUpEventHack = needsProximateBogusDownMoveUpEventHack(res);
+        sGestureStrokeParams = GestureStrokeParams.DEFAULT;
+        sGesturePreviewParams = GestureStrokePreviewParams.DEFAULT;
+        sTimeRecorder = new TimeRecorder(sParams, sGestureStrokeParams);
+
+        sTimerProxy = timerProxy;
+        sDrawingProxy = drawingProxy;
+        sDefaultKeyDetector = defaultKeyDetector;
     }
 
     private static void updateGestureHandlingMode() {
@@ -413,12 +379,12 @@
         updateGestureHandlingMode();
     }
 
-    public static PointerTracker getPointerTracker(final int id, final KeyEventHandler handler) {
+    public static PointerTracker getPointerTracker(final int id) {
         final ArrayList<PointerTracker> trackers = sTrackers;
 
         // Create pointer trackers until we can get 'id+1'-th tracker, if needed.
         for (int i = trackers.size(); i <= id; i++) {
-            final PointerTracker tracker = new PointerTracker(i, handler);
+            final PointerTracker tracker = new PointerTracker(i);
             trackers.add(tracker);
         }
 
@@ -434,11 +400,7 @@
     }
 
     public static void setKeyboardActionListener(final KeyboardActionListener listener) {
-        final int trackersSize = sTrackers.size();
-        for (int i = 0; i < trackersSize; ++i) {
-            final PointerTracker tracker = sTrackers.get(i);
-            tracker.mListener = listener;
-        }
+        sListener = listener;
     }
 
     public static void setKeyDetector(final KeyDetector keyDetector) {
@@ -468,21 +430,11 @@
         }
     }
 
-    private PointerTracker(final int id, final KeyEventHandler handler) {
-        if (handler == null) {
-            throw new NullPointerException();
-        }
+    private PointerTracker(final int id) {
         mPointerId = id;
         mGestureStrokeWithPreviewPoints = new GestureStrokeWithPreviewPoints(
                 id, sGestureStrokeParams, sGesturePreviewParams);
-        setKeyEventHandler(handler);
-    }
-
-    private void setKeyEventHandler(final KeyEventHandler handler) {
-        setKeyDetectorInner(handler.getKeyDetector());
-        mListener = handler.getKeyboardActionListener();
-        mDrawingProxy = handler.getDrawingProxy();
-        mTimerProxy = handler.getTimerProxy();
+        setKeyDetectorInner(sDefaultKeyDetector);
     }
 
     // Returns true if keyboard has been changed by this callback.
@@ -507,10 +459,10 @@
             return false;
         }
         if (key.isEnabled()) {
-            mListener.onPressKey(key.getCode(), repeatCount, getActivePointerTrackerCount() == 1);
+            sListener.onPressKey(key.getCode(), repeatCount, getActivePointerTrackerCount() == 1);
             final boolean keyboardLayoutHasBeenChanged = mKeyboardLayoutHasBeenChanged;
             mKeyboardLayoutHasBeenChanged = false;
-            mTimerProxy.startTypingStateTimer(key);
+            sTimerProxy.startTypingStateTimer(key);
             return keyboardLayoutHasBeenChanged;
         }
         return false;
@@ -521,7 +473,7 @@
     private void callListenerOnCodeInput(final Key key, final int primaryCode, final int x,
             final int y, final long eventTime) {
         final boolean ignoreModifierKey = mIsInDraggingFinger && key.isModifier();
-        final boolean altersCode = key.altCodeWhileTyping() && mTimerProxy.isTypingState();
+        final boolean altersCode = key.altCodeWhileTyping() && sTimerProxy.isTypingState();
         final int code = altersCode ? key.getAltCode() : primaryCode;
         if (DEBUG_LISTENER) {
             final String output = code == Constants.CODE_OUTPUT_TEXT
@@ -541,9 +493,9 @@
         if (key.isEnabled() || altersCode) {
             sTimeRecorder.onCodeInput(code, eventTime);
             if (code == Constants.CODE_OUTPUT_TEXT) {
-                mListener.onTextInput(key.getOutputText());
+                sListener.onTextInput(key.getOutputText());
             } else if (code != Constants.CODE_UNSPECIFIED) {
-                mListener.onCodeInput(code, x, y);
+                sListener.onCodeInput(code, x, y);
             }
         }
     }
@@ -571,7 +523,7 @@
             return;
         }
         if (key.isEnabled()) {
-            mListener.onReleaseKey(primaryCode, withSliding);
+            sListener.onReleaseKey(primaryCode, withSliding);
         }
     }
 
@@ -579,7 +531,7 @@
         if (DEBUG_LISTENER) {
             Log.d(TAG, String.format("[%d] onFinishSlidingInput", mPointerId));
         }
-        mListener.onFinishSlidingInput();
+        sListener.onFinishSlidingInput();
     }
 
     private void callListenerOnCancelInput() {
@@ -589,7 +541,7 @@
         if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
             ResearchLogger.pointerTracker_callListenerOnCancelInput();
         }
-        mListener.onCancelInput();
+        sListener.onCancelInput();
     }
 
     private void setKeyDetectorInner(final KeyDetector keyDetector) {
@@ -606,7 +558,7 @@
         mGestureStrokeWithPreviewPoints.setKeyboardGeometry(keyWidth, mKeyboard.mOccupiedHeight);
         final Key newKey = mKeyDetector.detectHitKey(mKeyX, mKeyY);
         if (newKey != mCurrentKey) {
-            if (mDrawingProxy != null) {
+            if (sDrawingProxy != null) {
                 setReleasedKeyGraphics(mCurrentKey);
             }
             // Keep {@link #mCurrentKey} that comes from previous keyboard.
@@ -634,7 +586,7 @@
     }
 
     private void setReleasedKeyGraphics(final Key key) {
-        mDrawingProxy.dismissKeyPreview(key);
+        sDrawingProxy.dismissKeyPreview(key);
         if (key == null) {
             return;
         }
@@ -675,14 +627,14 @@
         }
 
         // Even if the key is disabled, it should respond if it is in the altCodeWhileTyping state.
-        final boolean altersCode = key.altCodeWhileTyping() && mTimerProxy.isTypingState();
+        final boolean altersCode = key.altCodeWhileTyping() && sTimerProxy.isTypingState();
         final boolean needsToUpdateGraphics = key.isEnabled() || altersCode;
         if (!needsToUpdateGraphics) {
             return;
         }
 
         if (!key.noKeyPreview() && !sInGesture && !needsToSuppressKeyPreviewPopup(eventTime)) {
-            mDrawingProxy.showKeyPreview(key);
+            sDrawingProxy.showKeyPreview(key);
         }
         updatePressKeyGraphics(key);
 
@@ -694,7 +646,7 @@
             }
         }
 
-        if (key.altCodeWhileTyping() && mTimerProxy.isTypingState()) {
+        if (key.altCodeWhileTyping() && sTimerProxy.isTypingState()) {
             final int altCode = key.getAltCode();
             final Key altKey = mKeyboard.getKey(altCode);
             if (altKey != null) {
@@ -708,14 +660,14 @@
         }
     }
 
-    private void updateReleaseKeyGraphics(final Key key) {
+    private static void updateReleaseKeyGraphics(final Key key) {
         key.onReleased();
-        mDrawingProxy.invalidateKey(key);
+        sDrawingProxy.invalidateKey(key);
     }
 
-    private void updatePressKeyGraphics(final Key key) {
+    private static void updatePressKeyGraphics(final Key key) {
         key.onPressed();
-        mDrawingProxy.invalidateKey(key);
+        sDrawingProxy.invalidateKey(key);
     }
 
     public GestureStrokeWithPreviewPoints getGestureStrokeWithPreviewPoints() {
@@ -786,12 +738,12 @@
             sAggregratedPointers.reset();
             sLastRecognitionPointSize = 0;
             sLastRecognitionTime = 0;
-            mListener.onStartBatchInput();
+            sListener.onStartBatchInput();
             dismissAllMoreKeysPanels();
         }
-        mTimerProxy.cancelLongPressTimer();
+        sTimerProxy.cancelLongPressTimer();
         // A gesture floating preview text will be shown at the oldest pointer/finger on the screen.
-        mDrawingProxy.showGestureTrail(
+        sDrawingProxy.showGestureTrail(
                 this, isOldestTrackerInQueue() /* showsFloatingPreviewText */);
     }
 
@@ -809,7 +761,7 @@
             return;
         }
         // A gesture floating preview text will be shown at the oldest pointer/finger on the screen.
-        mDrawingProxy.showGestureTrail(
+        sDrawingProxy.showGestureTrail(
                 this, isOldestTrackerInQueue() /* showsFloatingPreviewText */);
     }
 
@@ -824,8 +776,8 @@
                     Log.d(TAG, String.format("[%d] onUpdateBatchInput: batchPoints=%d", mPointerId,
                             size));
                 }
-                mTimerProxy.startUpdateBatchInputTimer(this);
-                mListener.onUpdateBatchInput(sAggregratedPointers);
+                sTimerProxy.startUpdateBatchInputTimer(this);
+                sListener.onUpdateBatchInput(sAggregratedPointers);
                 // The listener may change the size of the pointers (when auto-committing
                 // for example), so we need to get the size from the pointers again.
                 sLastRecognitionPointSize = sAggregratedPointers.getPointerSize();
@@ -840,13 +792,13 @@
             if (getActivePointerTrackerCount() == 1) {
                 sInGesture = false;
                 sTimeRecorder.onEndBatchInput(eventTime);
-                mTimerProxy.cancelAllUpdateBatchInputTimers();
+                sTimerProxy.cancelAllUpdateBatchInputTimers();
                 if (!mIsTrackingForActionDisabled) {
                     if (DEBUG_LISTENER) {
                         Log.d(TAG, String.format("[%d] onEndBatchInput   : batchPoints=%d",
                                 mPointerId, sAggregratedPointers.getPointerSize()));
                     }
-                    mListener.onEndBatchInput(sAggregratedPointers);
+                    sListener.onEndBatchInput(sAggregratedPointers);
                 }
             }
         }
@@ -854,7 +806,7 @@
             return;
         }
         // A gesture floating preview text will be shown at the oldest pointer/finger on the screen.
-        mDrawingProxy.showGestureTrail(
+        sDrawingProxy.showGestureTrail(
                 this, isOldestTrackerInQueue() /* showsFloatingPreviewText */);
     }
 
@@ -868,17 +820,17 @@
         if (DEBUG_LISTENER) {
             Log.d(TAG, String.format("[%d] onCancelBatchInput", mPointerId));
         }
-        mListener.onCancelBatchInput();
+        sListener.onCancelBatchInput();
     }
 
-    public void processMotionEvent(final MotionEvent me, final KeyEventHandler handler) {
+    public void processMotionEvent(final MotionEvent me, final KeyDetector keyDetector) {
         final int action = me.getActionMasked();
         final long eventTime = me.getEventTime();
         if (action == MotionEvent.ACTION_MOVE) {
             final int pointerCount = me.getPointerCount();
             for (int index = 0; index < pointerCount; index++) {
                 final int id = me.getPointerId(index);
-                final PointerTracker tracker = getPointerTracker(id, handler);
+                final PointerTracker tracker = getPointerTracker(id);
                 final int x = (int)me.getX(index);
                 final int y = (int)me.getY(index);
                 tracker.onMoveEvent(x, y, eventTime, me);
@@ -891,7 +843,7 @@
         switch (action) {
         case MotionEvent.ACTION_DOWN:
         case MotionEvent.ACTION_POINTER_DOWN:
-            onDownEvent(x, y, eventTime, handler);
+            onDownEvent(x, y, eventTime, keyDetector);
             break;
         case MotionEvent.ACTION_UP:
         case MotionEvent.ACTION_POINTER_UP:
@@ -904,11 +856,11 @@
     }
 
     private void onDownEvent(final int x, final int y, final long eventTime,
-            final KeyEventHandler handler) {
+            final KeyDetector keyDetector) {
         if (DEBUG_EVENT) {
             printTouchEvent("onDownEvent:", x, y, eventTime);
         }
-        setKeyEventHandler(handler);
+        setKeyDetectorInner(keyDetector);
         // Naive up-to-down noise filter.
         final long deltaT = eventTime - mUpTime;
         if (deltaT < sParams.mTouchNoiseThresholdTime) {
@@ -998,7 +950,7 @@
     private void resetKeySelectionByDraggingFinger() {
         mIsInDraggingFinger = false;
         mIsInSlidingKeyInput = false;
-        mDrawingProxy.dismissSlidingKeyInputPreview();
+        sDrawingProxy.dismissSlidingKeyInputPreview();
     }
 
     private void onGestureMoveEvent(final int x, final int y, final long eventTime,
@@ -1009,7 +961,7 @@
             final boolean onValidArea = mGestureStrokeWithPreviewPoints.addPointOnKeyboard(
                     x, y, gestureTime, isMajorEvent);
             if (mGestureStrokeWithPreviewPoints.getLength() > beforeLength) {
-                mTimerProxy.startUpdateBatchInputTimer(this);
+                sTimerProxy.startUpdateBatchInputTimer(this);
             }
             // If the move event goes out from valid batch input area, cancel batch input.
             if (!onValidArea) {
@@ -1055,7 +1007,7 @@
             mMoreKeysPanel.onMoveEvent(translatedX, translatedY, mPointerId, eventTime);
             onMoveKey(x, y);
             if (mIsInSlidingKeyInput) {
-                mDrawingProxy.showSlidingKeyInputPreview(this);
+                sDrawingProxy.showSlidingKeyInputPreview(this);
             }
             return;
         }
@@ -1120,7 +1072,7 @@
         setReleasedKeyGraphics(oldKey);
         callListenerOnRelease(oldKey, oldKey.getCode(), true /* withSliding */);
         startKeySelectionByDraggingFinger(oldKey);
-        mTimerProxy.cancelKeyTimers();
+        sTimerProxy.cancelKeyTimers();
     }
 
     private void dragFingerFromOldKeyToNewKey(final Key key, final int x, final int y,
@@ -1212,7 +1164,7 @@
             }
         }
         if (mIsInSlidingKeyInput) {
-            mDrawingProxy.showSlidingKeyInputPreview(this);
+            sDrawingProxy.showSlidingKeyInputPreview(this);
         }
     }
 
@@ -1221,7 +1173,7 @@
             printTouchEvent("onUpEvent  :", x, y, eventTime);
         }
 
-        mTimerProxy.cancelUpdateBatchInputTimer(this);
+        sTimerProxy.cancelUpdateBatchInputTimer(this);
         if (!sInGesture) {
             if (mCurrentKey != null && mCurrentKey.isModifier()) {
                 // Before processing an up event of modifier key, all pointers already being
@@ -1251,7 +1203,7 @@
     }
 
     private void onUpEventInternal(final int x, final int y, final long eventTime) {
-        mTimerProxy.cancelKeyTimers();
+        sTimerProxy.cancelKeyTimers();
         final boolean isInDraggingFinger = mIsInDraggingFinger;
         final boolean isInSlidingKeyInput = mIsInSlidingKeyInput;
         resetKeySelectionByDraggingFinger();
@@ -1330,7 +1282,7 @@
     }
 
     private void onCancelEventInternal() {
-        mTimerProxy.cancelKeyTimers();
+        sTimerProxy.cancelKeyTimers();
         setReleasedKeyGraphics(mCurrentKey);
         resetKeySelectionByDraggingFinger();
         if (isShowingMoreKeysPanel()) {
@@ -1393,7 +1345,7 @@
         if (mIsInDraggingFinger && key.getMoreKeys() == null) return;
 
         final int delay = getLongPressTimeout(key.getCode());
-        mTimerProxy.startLongPressTimer(this, delay);
+        sTimerProxy.startLongPressTimer(this, delay);
     }
 
     private int getLongPressTimeout(final int code) {
@@ -1446,7 +1398,7 @@
     private void startKeyRepeatTimer(final int repeatCount) {
         final int delay =
                 (repeatCount == 1) ? sParams.mKeyRepeatStartTimeout : sParams.mKeyRepeatInterval;
-        mTimerProxy.startKeyRepeatTimer(this, repeatCount, delay);
+        sTimerProxy.startKeyRepeatTimer(this, repeatCount, delay);
     }
 
     private void printTouchEvent(final String title, final int x, final int y,
diff --git a/java/src/com/android/inputmethod/keyboard/internal/EmojiLayoutParams.java b/java/src/com/android/inputmethod/keyboard/internal/EmojiLayoutParams.java
index 0796f8e..12e0632 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/EmojiLayoutParams.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/EmojiLayoutParams.java
@@ -40,16 +40,16 @@
     public EmojiLayoutParams(final Resources res) {
         final int defaultKeyboardHeight = ResourceUtils.getDefaultKeyboardHeight(res);
         final int defaultKeyboardWidth = ResourceUtils.getDefaultKeyboardWidth(res);
-        mKeyVerticalGap = (int) res.getFraction(R.fraction.key_bottom_gap_holo,
+        mKeyVerticalGap = (int) res.getFraction(R.fraction.config_key_vertical_gap_holo,
                 defaultKeyboardHeight, defaultKeyboardHeight);
-        mBottomPadding = (int) res.getFraction(R.fraction.keyboard_bottom_padding_holo,
+        mBottomPadding = (int) res.getFraction(R.fraction.config_keyboard_bottom_padding_holo,
                 defaultKeyboardHeight, defaultKeyboardHeight);
-        mTopPadding = (int) res.getFraction(R.fraction.keyboard_top_padding_holo,
+        mTopPadding = (int) res.getFraction(R.fraction.config_keyboard_top_padding_holo,
                 defaultKeyboardHeight, defaultKeyboardHeight);
-        mKeyHorizontalGap = (int) (res.getFraction(R.fraction.key_horizontal_gap_holo,
+        mKeyHorizontalGap = (int) (res.getFraction(R.fraction.config_key_horizontal_gap_holo,
                 defaultKeyboardWidth, defaultKeyboardWidth));
         mEmojiCategoryPageIdViewHeight =
-                (int) (res.getDimension(R.dimen.emoji_category_page_id_height));
+                (int) (res.getDimension(R.dimen.config_emoji_category_page_id_height));
         final int baseheight = defaultKeyboardHeight - mBottomPadding - mTopPadding
                 + mKeyVerticalGap;
         mEmojiActionBarHeight = baseheight / DEFAULT_KEYBOARD_ROWS
diff --git a/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java b/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java
index a0935b9..111eb6d 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/NonDistinctMultitouchHelper.java
@@ -20,18 +20,24 @@
 import android.view.MotionEvent;
 
 import com.android.inputmethod.keyboard.Key;
+import com.android.inputmethod.keyboard.KeyDetector;
 import com.android.inputmethod.keyboard.PointerTracker;
-import com.android.inputmethod.keyboard.PointerTracker.KeyEventHandler;
 import com.android.inputmethod.latin.utils.CoordinateUtils;
 
 public final class NonDistinctMultitouchHelper {
     private static final String TAG = NonDistinctMultitouchHelper.class.getSimpleName();
 
+    // Use only main (id=0) pointer tracker.
+    private final PointerTracker mMainTracker;
     private int mOldPointerCount = 1;
     private Key mOldKey;
     private int[] mLastCoords = CoordinateUtils.newInstance();
 
-    public void processMotionEvent(final MotionEvent me, final KeyEventHandler keyEventHandler) {
+    public NonDistinctMultitouchHelper(final PointerTracker mainTracker) {
+        mMainTracker = mainTracker;
+    }
+
+    public void processMotionEvent(final MotionEvent me, final KeyDetector keyDetector) {
         final int pointerCount = me.getPointerCount();
         final int oldPointerCount = mOldPointerCount;
         mOldPointerCount = pointerCount;
@@ -41,8 +47,7 @@
             return;
         }
 
-        // Use only main (id=0) pointer tracker.
-        final PointerTracker mainTracker = PointerTracker.getPointerTracker(0, keyEventHandler);
+        final PointerTracker mainTracker = mMainTracker;
         final int action = me.getActionMasked();
         final int index = me.getActionIndex();
         final long eventTime = me.getEventTime();
@@ -51,12 +56,12 @@
         // In single-touch.
         if (oldPointerCount == 1 && pointerCount == 1) {
             if (me.getPointerId(index) == mainTracker.mPointerId) {
-                mainTracker.processMotionEvent(me, keyEventHandler);
+                mainTracker.processMotionEvent(me, keyDetector);
                 return;
             }
             // Inject a copied event.
             injectMotionEvent(action, me.getX(index), me.getY(index), downTime, eventTime,
-                    mainTracker, keyEventHandler);
+                    mainTracker, keyDetector);
             return;
         }
 
@@ -70,7 +75,7 @@
             mOldKey = mainTracker.getKeyOn(x, y);
             // Inject an artifact up event for the old key.
             injectMotionEvent(MotionEvent.ACTION_UP, x, y, downTime, eventTime,
-                    mainTracker, keyEventHandler);
+                    mainTracker, keyDetector);
             return;
         }
 
@@ -85,11 +90,11 @@
                 // Inject an artifact down event for the new key.
                 // An artifact up event for the new key will usually be injected as a single-touch.
                 injectMotionEvent(MotionEvent.ACTION_DOWN, x, y, downTime, eventTime,
-                        mainTracker, keyEventHandler);
+                        mainTracker, keyDetector);
                 if (action == MotionEvent.ACTION_UP) {
                     // Inject an artifact up event for the new key also.
                     injectMotionEvent(MotionEvent.ACTION_UP, x, y, downTime, eventTime,
-                            mainTracker, keyEventHandler);
+                            mainTracker, keyDetector);
                 }
             }
             return;
@@ -101,11 +106,11 @@
 
     private static void injectMotionEvent(final int action, final float x, final float y,
             final long downTime, final long eventTime, final PointerTracker tracker,
-            final KeyEventHandler handler) {
+            final KeyDetector keyDetector) {
         final MotionEvent me = MotionEvent.obtain(
                 downTime, eventTime, action, x, y, 0 /* metaState */);
         try {
-            tracker.processMotionEvent(me, handler);
+            tracker.processMotionEvent(me, keyDetector);
         } finally {
             me.recycle();
         }
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 16d860f..6f9dd67 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -68,7 +68,6 @@
 import com.android.inputmethod.compat.SuggestionSpanUtils;
 import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
 import com.android.inputmethod.event.EventInterpreter;
-import com.android.inputmethod.keyboard.KeyDetector;
 import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.keyboard.KeyboardActionListener;
 import com.android.inputmethod.keyboard.KeyboardId;
@@ -2284,16 +2283,11 @@
             resetComposingState(false /* alsoResetLastComposedWord */);
         }
         if (isComposingWord) {
-            final int keyX, keyY;
-            if (Constants.isValidCoordinate(x) && Constants.isValidCoordinate(y)) {
-                final KeyDetector keyDetector =
-                        mKeyboardSwitcher.getMainKeyboardView().getKeyDetector();
-                keyX = keyDetector.getTouchX(x);
-                keyY = keyDetector.getTouchY(y);
-            } else {
-                keyX = x;
-                keyY = y;
-            }
+            final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+            // TODO: We should reconsider which coordinate system should be used to represent
+            // keyboard event.
+            final int keyX = mainKeyboardView.getKeyX(x);
+            final int keyY = mainKeyboardView.getKeyY(y);
             mWordComposer.add(primaryCode, keyX, keyY);
             // If it's the first letter, make note of auto-caps state
             if (mWordComposer.size() == 1) {
diff --git a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java
index 0e1a33a..52012c8 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java
@@ -66,7 +66,8 @@
             clearKeys();
             mDivider = res.getDrawable(R.drawable.more_suggestions_divider);
             mDividerWidth = mDivider.getIntrinsicWidth();
-            final float padding = res.getDimension(R.dimen.more_suggestions_key_horizontal_padding);
+            final float padding = res.getDimension(
+                    R.dimen.config_more_suggestions_key_horizontal_padding);
 
             int row = 0;
             int index = fromIndex;
diff --git a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java
index 0ebe377..549ff0d 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java
@@ -54,7 +54,7 @@
 
     public void adjustVerticalCorrectionForModalMode() {
         // Set vertical correction to zero (Reset more keys keyboard sliding allowance
-        // {@link R#dimen.more_keys_keyboard_slide_allowance}).
+        // {@link R#dimen.config_more_keys_keyboard_slide_allowance}).
         mKeyDetector.setKeyboard(getKeyboard(), -getPaddingLeft(), -getPaddingTop());
     }
 
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index faa5560..72281e6 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
@@ -119,7 +119,8 @@
         mDividerWidth = dividerView.getMeasuredWidth();
 
         final Resources res = wordView.getResources();
-        mSuggestionsStripHeight = res.getDimensionPixelSize(R.dimen.suggestions_strip_height);
+        mSuggestionsStripHeight = res.getDimensionPixelSize(
+                R.dimen.config_suggestions_strip_height);
 
         final TypedArray a = context.obtainStyledAttributes(attrs,
                 R.styleable.SuggestionStripView, defStyle, R.style.SuggestionStripView);
@@ -145,15 +146,17 @@
         a.recycle();
 
         mMoreSuggestionsHint = getMoreSuggestionsHint(res,
-                res.getDimension(R.dimen.more_suggestions_hint_text_size), mColorAutoCorrect);
+                res.getDimension(R.dimen.config_more_suggestions_hint_text_size),
+                mColorAutoCorrect);
         mCenterPositionInStrip = mSuggestionsCountInStrip / 2;
         // Assuming there are at least three suggestions. Also, note that the suggestions are
         // laid out according to script direction, so this is left of the center for LTR scripts
         // and right of the center for RTL scripts.
         mTypedWordPositionWhenAutocorrect = mCenterPositionInStrip - 1;
         mMoreSuggestionsBottomGap = res.getDimensionPixelOffset(
-                R.dimen.more_suggestions_bottom_gap);
-        mMoreSuggestionsRowHeight = res.getDimensionPixelSize(R.dimen.more_suggestions_row_height);
+                R.dimen.config_more_suggestions_bottom_gap);
+        mMoreSuggestionsRowHeight = res.getDimensionPixelSize(
+                R.dimen.config_more_suggestions_row_height);
 
         final LayoutInflater inflater = LayoutInflater.from(context);
         mWordToSaveView = (TextView)inflater.inflate(R.layout.suggestion_word, null);
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index 75f17c5..aa87aff 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -112,7 +112,7 @@
 
         final Resources res = context.getResources();
         mMoreSuggestionsModalTolerance = res.getDimensionPixelOffset(
-                R.dimen.more_suggestions_modal_tolerance);
+                R.dimen.config_more_suggestions_modal_tolerance);
         mMoreSuggestionsSlidingDetector = new GestureDetector(
                 context, mMoreSuggestionsSlidingListener);
     }
diff --git a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
index 22c9244..deb28a0 100644
--- a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java
@@ -227,19 +227,19 @@
         final String keyboardHeightString = getDeviceOverrideValue(res, R.array.keyboard_heights);
         final float keyboardHeight;
         if (TextUtils.isEmpty(keyboardHeightString)) {
-            keyboardHeight = res.getDimension(R.dimen.keyboardHeight);
+            keyboardHeight = res.getDimension(R.dimen.config_default_keyboard_height);
         } else {
             keyboardHeight = Float.parseFloat(keyboardHeightString) * dm.density;
         }
         final float maxKeyboardHeight = res.getFraction(
-                R.fraction.maxKeyboardHeight, dm.heightPixels, dm.heightPixels);
+                R.fraction.config_max_keyboard_height, dm.heightPixels, dm.heightPixels);
         float minKeyboardHeight = res.getFraction(
-                R.fraction.minKeyboardHeight, dm.heightPixels, dm.heightPixels);
+                R.fraction.config_min_keyboard_height, dm.heightPixels, dm.heightPixels);
         if (minKeyboardHeight < 0.0f) {
             // Specified fraction was negative, so it should be calculated against display
             // width.
             minKeyboardHeight = -res.getFraction(
-                    R.fraction.minKeyboardHeight, dm.widthPixels, dm.widthPixels);
+                    R.fraction.config_min_keyboard_height, dm.widthPixels, dm.widthPixels);
         }
         // Keyboard height will not exceed maxKeyboardHeight and will not be less than
         // minKeyboardHeight.
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.cpp
index 2a78354..a871e2b 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.cpp
@@ -189,7 +189,7 @@
         // Update has next flag in the last written entry.
         const BigramEntry bigramEntry = getBigramEntry(lastEntryPos).updateHasNextAndGetEntry(
                 false /* hasNext */);
-        if (!writeBigramEntry(&bigramEntry, writingPos)) {
+        if (!writeBigramEntry(&bigramEntry, lastEntryPos)) {
             AKLOGE("Cannot write bigram entry to set hasNext flag after GC. pos: %d", writingPos);
             return false;
         }