Merge "Make forceCommit true for gesture shortcut score."
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png
deleted file mode 100644
index 3e25180..0000000
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png
deleted file mode 100644
index bad360f..0000000
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal_off.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png
deleted file mode 100644
index 49f5198..0000000
--- a/java/res/drawable-hdpi/btn_keyboard_key_normal_on.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png
deleted file mode 100644
index e784edd..0000000
--- a/java/res/drawable-hdpi/btn_keyboard_key_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png
deleted file mode 100644
index a4731cf..0000000
--- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_off.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png
deleted file mode 100644
index 03e163c..0000000
--- a/java/res/drawable-hdpi/btn_keyboard_key_pressed_on.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-hdpi/ic_subtype_mic_dark.png b/java/res/drawable-hdpi/ic_subtype_mic_dark.png
deleted file mode 100644
index eacbcd2..0000000
--- a/java/res/drawable-hdpi/ic_subtype_mic_dark.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal.9.png
deleted file mode 100644
index 12bc979..0000000
--- a/java/res/drawable-mdpi/btn_keyboard_key_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_off.9.png
deleted file mode 100644
index 44bd414..0000000
--- a/java/res/drawable-mdpi/btn_keyboard_key_normal_off.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png
deleted file mode 100644
index 43fdf5b..0000000
--- a/java/res/drawable-mdpi/btn_keyboard_key_normal_on.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed.9.png
deleted file mode 100644
index 1c1f3d7..0000000
--- a/java/res/drawable-mdpi/btn_keyboard_key_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png
deleted file mode 100644
index dacb675..0000000
--- a/java/res/drawable-mdpi/btn_keyboard_key_pressed_off.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png
deleted file mode 100644
index 3daa69f..0000000
--- a/java/res/drawable-mdpi/btn_keyboard_key_pressed_on.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_mic_holo_light.png b/java/res/drawable-mdpi/sym_keyboard_mic_holo_light.png
deleted file mode 100644
index 84a63dc..0000000
--- a/java/res/drawable-mdpi/sym_keyboard_mic_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal.9.png
deleted file mode 100644
index 026005d..0000000
--- a/java/res/drawable-xhdpi/btn_keyboard_key_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png
deleted file mode 100644
index 38c5f24..0000000
--- a/java/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png
deleted file mode 100644
index f1223e5..0000000
--- a/java/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png
deleted file mode 100644
index ec35db5..0000000
--- a/java/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png
deleted file mode 100644
index bd30464..0000000
--- a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png b/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png
deleted file mode 100644
index a3ff5d1..0000000
--- a/java/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xhdpi/ic_subtype_mic_dark.png b/java/res/drawable-xhdpi/ic_subtype_mic_dark.png
deleted file mode 100644
index 17581ba..0000000
--- a/java/res/drawable-xhdpi/ic_subtype_mic_dark.png
+++ /dev/null
Binary files differ
diff --git a/java/res/drawable-xxhdpi/ic_subtype_mic_dark.png b/java/res/drawable-xxhdpi/ic_subtype_mic_dark.png
deleted file mode 100644
index 811103a..0000000
--- a/java/res/drawable-xxhdpi/ic_subtype_mic_dark.png
+++ /dev/null
Binary files differ
diff --git a/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml b/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml
index bc7928d..adc3e35 100644
--- a/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml
+++ b/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml
@@ -20,7 +20,6 @@
     <dimen name="setup_welcome_description_text_size">38sp</dimen>
     <dimen name="setup_step_bullet_text_size">24sp</dimen>
     <dimen name="setup_step_triangle_indicator_height">24dp</dimen>
-    <dimen name="setup_step_indicator_height">24dp</dimen>
     <dimen name="setup_step_title_text_size">24sp</dimen>
     <dimen name="setup_step_instruction_text_size">18sp</dimen>
     <dimen name="setup_step_action_text_size">20sp</dimen>
diff --git a/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml b/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml
index aebf6d2..1ff43ff 100644
--- a/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml
+++ b/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml
@@ -20,7 +20,6 @@
     <dimen name="setup_welcome_description_text_size">22sp</dimen>
     <dimen name="setup_step_bullet_text_size">22sp</dimen>
     <dimen name="setup_step_triangle_indicator_height">24dp</dimen>
-    <dimen name="setup_step_indicator_height">24dp</dimen>
     <dimen name="setup_step_title_text_size">20sp</dimen>
     <dimen name="setup_step_instruction_text_size">16sp</dimen>
     <dimen name="setup_step_action_text_size">18sp</dimen>
diff --git a/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml b/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml
index aedf79f..a0e30cd 100644
--- a/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml
+++ b/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml
@@ -20,7 +20,6 @@
     <dimen name="setup_welcome_description_text_size">32sp</dimen>
     <dimen name="setup_step_bullet_text_size">24sp</dimen>
     <dimen name="setup_step_triangle_indicator_height">24dp</dimen>
-    <dimen name="setup_step_indicator_height">24dp</dimen>
     <dimen name="setup_step_title_text_size">24sp</dimen>
     <dimen name="setup_step_instruction_text_size">18sp</dimen>
     <dimen name="setup_step_action_text_size">20sp</dimen>
diff --git a/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml b/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml
index 6d66f46..cf2a10a 100644
--- a/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml
+++ b/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml
@@ -20,7 +20,6 @@
     <dimen name="setup_welcome_description_text_size">26sp</dimen>
     <dimen name="setup_step_bullet_text_size">22sp</dimen>
     <dimen name="setup_step_triangle_indicator_height">24dp</dimen>
-    <dimen name="setup_step_indicator_height">24dp</dimen>
     <dimen name="setup_step_title_text_size">20sp</dimen>
     <dimen name="setup_step_instruction_text_size">16sp</dimen>
     <dimen name="setup_step_action_text_size">18sp</dimen>
diff --git a/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml b/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml
index e22b741..a782ef8 100644
--- a/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml
+++ b/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml
@@ -20,7 +20,6 @@
     <dimen name="setup_welcome_description_text_size">38sp</dimen>
     <dimen name="setup_step_bullet_text_size">24sp</dimen>
     <dimen name="setup_step_triangle_indicator_height">24dp</dimen>
-    <dimen name="setup_step_indicator_height">24dp</dimen>
     <dimen name="setup_step_title_text_size">24sp</dimen>
     <dimen name="setup_step_instruction_text_size">18sp</dimen>
     <dimen name="setup_step_action_text_size">20sp</dimen>
diff --git a/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml b/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml
index 86cf3a0..9ac0f11 100644
--- a/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml
+++ b/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml
@@ -20,7 +20,6 @@
     <dimen name="setup_welcome_description_text_size">36sp</dimen>
     <dimen name="setup_step_bullet_text_size">24sp</dimen>
     <dimen name="setup_step_triangle_indicator_height">24dp</dimen>
-    <dimen name="setup_step_indicator_height">24dp</dimen>
     <dimen name="setup_step_title_text_size">24sp</dimen>
     <dimen name="setup_step_instruction_text_size">18sp</dimen>
     <dimen name="setup_step_action_text_size">20sp</dimen>
diff --git a/java/res/values-land/config.xml b/java/res/values-land/config.xml
index 7d93cc2..8cf7d95 100644
--- a/java/res/values-land/config.xml
+++ b/java/res/values-land/config.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configuration values for Small Phone Landscape. -->
 <resources>
     <bool name="config_use_fullscreen_mode">true</bool>
 </resources>
diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml
index c97e68f..c2b360a 100644
--- a/java/res/values-land/dimens.xml
+++ b/java/res/values-land/dimens.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configurable dimensions for Small Phone Landscape. -->
 <resources>
     <!-- Preferable keyboard height in absolute scale: 1.100in -->
     <!-- This keyboardHeight value should match with keyboard-heights.xml -->
diff --git a/java/res/values-land/setup-dimens-small-phone-land.xml b/java/res/values-land/setup-dimens-small-phone-land.xml
index 088e656..de93eee 100644
--- a/java/res/values-land/setup-dimens-small-phone-land.xml
+++ b/java/res/values-land/setup-dimens-small-phone-land.xml
@@ -20,7 +20,6 @@
     <dimen name="setup_welcome_description_text_size">18sp</dimen>
     <dimen name="setup_step_bullet_text_size">18sp</dimen>
     <dimen name="setup_step_triangle_indicator_height">18dp</dimen>
-    <dimen name="setup_step_indicator_height">18dp</dimen>
     <dimen name="setup_step_title_text_size">18sp</dimen>
     <dimen name="setup_step_instruction_text_size">14sp</dimen>
     <dimen name="setup_step_action_text_size">16sp</dimen>
diff --git a/java/res/values-port/setup-dimens-small-phone-port.xml b/java/res/values-port/setup-dimens-small-phone-port.xml
index 8ac72ea..cf2751f 100644
--- a/java/res/values-port/setup-dimens-small-phone-port.xml
+++ b/java/res/values-port/setup-dimens-small-phone-port.xml
@@ -20,7 +20,6 @@
     <dimen name="setup_welcome_description_text_size">20sp</dimen>
     <dimen name="setup_step_bullet_text_size">18sp</dimen>
     <dimen name="setup_step_triangle_indicator_height">18dp</dimen>
-    <dimen name="setup_step_indicator_height">18dp</dimen>
     <dimen name="setup_step_title_text_size">18sp</dimen>
     <dimen name="setup_step_instruction_text_size">14sp</dimen>
     <dimen name="setup_step_action_text_size">16sp</dimen>
diff --git a/java/res/values-sw540dp-land/config.xml b/java/res/values-sw540dp-land/config.xml
index b3cd727..796f148 100644
--- a/java/res/values-sw540dp-land/config.xml
+++ b/java/res/values-sw540dp-land/config.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configuration values for Large Phone and Small Tablet Landscape. -->
 <resources>
     <bool name="config_use_fullscreen_mode">false</bool>
 </resources>
diff --git a/java/res/values-sw540dp-land/dimens.xml b/java/res/values-sw540dp-land/dimens.xml
index 0024937..35b2009 100644
--- a/java/res/values-sw540dp-land/dimens.xml
+++ b/java/res/values-sw540dp-land/dimens.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configurable dimensions for Large Phone and Small Tablet Landscape. -->
 <resources>
     <!-- Preferable keyboard height in absolute scale: 45.0mm -->
     <!-- This keyboardHeight value should match with keyboard-heights.xml -->
diff --git a/java/res/values-hdpi/config.xml b/java/res/values-sw540dp/config-screen-metrics.xml
similarity index 76%
rename from java/res/values-hdpi/config.xml
rename to java/res/values-sw540dp/config-screen-metrics.xml
index 4cf3562..1205aaa 100644
--- a/java/res/values-hdpi/config.xml
+++ b/java/res/values-sw540dp/config-screen-metrics.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2011, The Android Open Source Project
+** Copyright 2013, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -20,11 +20,10 @@
 
 <resources>
     <!--  Screen metrics for logging.
-            0 = "mdpi phone screen"
-            1 = "hdpi phone screen"
-            2 = "mdpi 11 inch tablet screen"
-            3 = "xhdpi phone screen?"
-            4 = ?
+            0 = "small phone screen"
+            1 = "large phone screen"
+            2 = "large tablet screen"
+            3 = "small tablet screen"
     -->
     <integer name="log_screen_metrics">1</integer>
 </resources>
diff --git a/java/res/values-sw540dp/config.xml b/java/res/values-sw540dp/config.xml
index b1e5783..6ef53b6 100644
--- a/java/res/values-sw540dp/config.xml
+++ b/java/res/values-sw540dp/config.xml
@@ -18,14 +18,12 @@
 */
 -->
 
+<!-- Configuration values for Large Phone and Small Tablet Portrait. -->
 <resources>
     <bool name="config_enable_show_option_of_key_preview_popup">false</bool>
     <!-- Whether or not Popup on key press is enabled by default -->
     <bool name="config_default_key_preview_popup">false</bool>
     <bool name="config_default_sound_enabled">true</bool>
-    <bool name="config_auto_correction_spacebar_led_enabled">false</bool>
-    <!-- The language is never displayed if == 0, always displayed if < 0 -->
-    <integer name="config_delay_before_fadeout_language_on_spacebar">1200</integer>
     <integer name="config_max_more_keys_column">5</integer>
     <!--
         Configuration for MainKeyboardView
diff --git a/java/res/values-sw540dp/dimens.xml b/java/res/values-sw540dp/dimens.xml
index 801b7ac..79e923a 100644
--- a/java/res/values-sw540dp/dimens.xml
+++ b/java/res/values-sw540dp/dimens.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configurable dimensions for Large Phone and Small Tablet Portrait. -->
 <resources>
     <!-- Preferable keyboard height in absolute scale: 48.0mm -->
     <!-- This keyboardHeight value should match with keyboard-heights.xml -->
@@ -80,8 +81,6 @@
     <dimen name="suggestion_text_size">22dp</dimen>
     <dimen name="more_suggestions_hint_text_size">33dp</dimen>
 
-    <!-- Gesture trail parameters -->
-    <dimen name="gesture_trail_width">2.5dp</dimen>
     <!-- Gesture floating preview text parameters -->
     <dimen name="gesture_floating_preview_text_size">28dp</dimen>
     <dimen name="gesture_floating_preview_text_offset">87dp</dimen>
diff --git a/java/res/values-hdpi/config.xml b/java/res/values-sw600dp/config-screen-metrics.xml
similarity index 70%
copy from java/res/values-hdpi/config.xml
copy to java/res/values-sw600dp/config-screen-metrics.xml
index 4cf3562..e939c06 100644
--- a/java/res/values-hdpi/config.xml
+++ b/java/res/values-sw600dp/config-screen-metrics.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2011, The Android Open Source Project
+** Copyright 2013, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -20,11 +20,10 @@
 
 <resources>
     <!--  Screen metrics for logging.
-            0 = "mdpi phone screen"
-            1 = "hdpi phone screen"
-            2 = "mdpi 11 inch tablet screen"
-            3 = "xhdpi phone screen?"
-            4 = ?
+            0 = "small phone screen"
+            1 = "large phone screen"
+            2 = "large tablet screen"
+            3 = "small tablet screen"
     -->
-    <integer name="log_screen_metrics">1</integer>
+    <integer name="log_screen_metrics">3</integer>
 </resources>
diff --git a/java/res/values-sw600dp/config.xml b/java/res/values-sw600dp/config.xml
index e72e494..c2419b6 100644
--- a/java/res/values-sw600dp/config.xml
+++ b/java/res/values-sw600dp/config.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configuration values for Small Tablet Portrait. -->
 <resources>
     <bool name="config_enable_show_voice_key_option">false</bool>
 </resources>
diff --git a/java/res/values-sw768dp-land/config.xml b/java/res/values-sw768dp-land/config.xml
index b3cd727..7490e52 100644
--- a/java/res/values-sw768dp-land/config.xml
+++ b/java/res/values-sw768dp-land/config.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configuration values for Large Tablet Landscape. -->
 <resources>
     <bool name="config_use_fullscreen_mode">false</bool>
 </resources>
diff --git a/java/res/values-sw768dp-land/dimens.xml b/java/res/values-sw768dp-land/dimens.xml
index 653f5e7..47c9b15 100644
--- a/java/res/values-sw768dp-land/dimens.xml
+++ b/java/res/values-sw768dp-land/dimens.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configurable dimensions for Large Tablet Landscape. -->
 <resources>
     <!-- Preferable keyboard height in absolute scale: 58.0mm -->
     <!-- This keyboardHeight value should match with keyboard-heights.xml -->
diff --git a/java/res/values-hdpi/config.xml b/java/res/values-sw768dp/config-screen-metrics.xml
similarity index 70%
copy from java/res/values-hdpi/config.xml
copy to java/res/values-sw768dp/config-screen-metrics.xml
index 4cf3562..c555cbb 100644
--- a/java/res/values-hdpi/config.xml
+++ b/java/res/values-sw768dp/config-screen-metrics.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2011, The Android Open Source Project
+** Copyright 2013, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -20,11 +20,10 @@
 
 <resources>
     <!--  Screen metrics for logging.
-            0 = "mdpi phone screen"
-            1 = "hdpi phone screen"
-            2 = "mdpi 11 inch tablet screen"
-            3 = "xhdpi phone screen?"
-            4 = ?
+            0 = "small phone screen"
+            1 = "large phone screen"
+            2 = "large tablet screen"
+            3 = "small tablet screen"
     -->
-    <integer name="log_screen_metrics">1</integer>
+    <integer name="log_screen_metrics">2</integer>
 </resources>
diff --git a/java/res/values-sw768dp/config.xml b/java/res/values-sw768dp/config.xml
index a3f5de9..c11ee80 100644
--- a/java/res/values-sw768dp/config.xml
+++ b/java/res/values-sw768dp/config.xml
@@ -18,13 +18,13 @@
 */
 -->
 
+<!-- Configuration values for Large Tablet Portrait. -->
 <resources>
     <bool name="config_enable_show_voice_key_option">false</bool>
     <bool name="config_enable_show_option_of_key_preview_popup">false</bool>
     <!-- Whether or not Popup on key press is enabled by default -->
     <bool name="config_default_key_preview_popup">false</bool>
     <bool name="config_default_sound_enabled">true</bool>
-    <bool name="config_auto_correction_spacebar_led_enabled">false</bool>
     <integer name="config_max_more_keys_column">5</integer>
     <!--
         Configuration for MainKeyboardView
@@ -33,12 +33,4 @@
     <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if
          false -->
     <bool name="config_show_more_keys_keyboard_at_touched_point">true</bool>
-    <!--  Screen metrics for logging.
-            0 = "mdpi phone screen"
-            1 = "hdpi phone screen"
-            2 = "mdpi 11 inch tablet screen"
-            3 = "xhdpi phone screen?"
-            4 = ?
-    -->
-    <integer name="log_screen_metrics">2</integer>
 </resources>
diff --git a/java/res/values-sw768dp/dimens.xml b/java/res/values-sw768dp/dimens.xml
index 4671aa2..211a890 100644
--- a/java/res/values-sw768dp/dimens.xml
+++ b/java/res/values-sw768dp/dimens.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configurable dimensions for Large Tablet Portrait. -->
 <resources>
     <!-- Preferable keyboard height in absolute scale: 48.0mm -->
     <!-- This keyboardHeight value should match with keyboard-heights.xml -->
@@ -80,8 +81,6 @@
     <dimen name="suggestion_text_size">22dp</dimen>
     <dimen name="more_suggestions_hint_text_size">33dp</dimen>
 
-    <!-- Gesture trail parameters -->
-    <dimen name="gesture_trail_width">2.5dp</dimen>
     <!-- Gesture floating preview text parameters -->
     <dimen name="gesture_floating_preview_text_size">26dp</dimen>
     <dimen name="gesture_floating_preview_text_offset">86dp</dimen>
diff --git a/java/res/values/config-dictionary-pack.xml b/java/res/values/config-dictionary-pack.xml
new file mode 100644
index 0000000..d076af4
--- /dev/null
+++ b/java/res/values/config-dictionary-pack.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- Configuration values for Dictionary pack. -->
+<resources>
+    <!-- Settings for the dictionary pack -->
+    <bool name="allow_over_metered">false</bool>
+    <bool name="allow_over_roaming">false</bool>
+    <bool name="dict_downloads_visible_in_download_UI">false</bool>
+    <bool name="metadata_downloads_visible_in_download_UI">false</bool>
+    <bool name="display_notification_for_auto_update">false</bool>
+    <bool name="display_notification_for_user_requested_update">false</bool>
+</resources>
diff --git a/java/res/values-hdpi/config.xml b/java/res/values/config-screen-metrics.xml
similarity index 70%
copy from java/res/values-hdpi/config.xml
copy to java/res/values/config-screen-metrics.xml
index 4cf3562..7b98706 100644
--- a/java/res/values-hdpi/config.xml
+++ b/java/res/values/config-screen-metrics.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2011, The Android Open Source Project
+** Copyright 2013, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -20,11 +20,10 @@
 
 <resources>
     <!--  Screen metrics for logging.
-            0 = "mdpi phone screen"
-            1 = "hdpi phone screen"
-            2 = "mdpi 11 inch tablet screen"
-            3 = "xhdpi phone screen?"
-            4 = ?
+            0 = "small phone screen"
+            1 = "large phone screen"
+            2 = "large tablet screen"
+            3 = "small tablet screen"
     -->
-    <integer name="log_screen_metrics">1</integer>
+    <integer name="log_screen_metrics">0</integer>
 </resources>
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 669a661..e1b1c16 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -18,12 +18,11 @@
 */
 -->
 
+<!-- Configuration values for Small Phone Portrait. -->
 <resources>
     <bool name="config_use_fullscreen_mode">false</bool>
     <bool name="config_enable_show_voice_key_option">true</bool>
     <bool name="config_enable_show_option_of_key_preview_popup">true</bool>
-    <!-- TODO: Disable the following configuration for production. -->
-    <bool name="config_enable_usability_study_mode_option">true</bool>
     <!-- Whether or not Popup on key press is enabled by default -->
     <bool name="config_default_key_preview_popup">true</bool>
     <!-- Default value for next word prediction: after entering a word and a space only, should we look
@@ -119,21 +118,4 @@
     <!-- Threshold of the normalized score of the best suggestion for the spell checker to declare
          a word to be "recommended" -->
     <string name="spellchecker_recommended_threshold_value" translatable="false">0.11</string>
-    <!--  Screen metrics for logging.
-            0 = "mdpi phone screen"
-            1 = "hdpi phone screen"
-            2 = "mdpi 11 inch tablet screen"
-            3 = "xhdpi phone screen?"
-            4 = ?
-    -->
-    <integer name="log_screen_metrics">0</integer>
-
-    <!-- Settings for the dictionary pack -->
-    <bool name="allow_over_metered">false</bool>
-    <bool name="allow_over_roaming">false</bool>
-    <bool name="dict_downloads_visible_in_download_UI">false</bool>
-    <bool name="metadata_downloads_visible_in_download_UI">false</bool>
-    <bool name="display_notification_for_auto_update">false</bool>
-    <bool name="display_notification_for_user_requested_update">false</bool>
-
 </resources>
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 4588b10..02b1380 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -18,6 +18,7 @@
 */
 -->
 
+<!-- Configurable dimensions for Small Phone Portrait. -->
 <resources>
     <!-- Preferable keyboard height in absolute scale: 1.285in -->
     <!-- This keyboardHeight value should match with keyboard-heights.xml -->
@@ -80,7 +81,6 @@
     <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>
-    <dimen name="more_suggestions_slide_allowance">16.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>
diff --git a/java/res/xml/key_symbols_period.xml b/java/res/xml/key_symbols_period.xml
deleted file mode 100644
index 6efc9de..0000000
--- a/java/res/xml/key_symbols_period.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <!-- U+2105: "℅" CARE OF
-         U+2122: "™" TRADE MARK SIGN
-         U+00AE: "®" REGISTERED SIGN
-         U+00A9: "©" COPYRIGHT SIGN
-         U+00A7: "§" SECTION SIGN
-         U+00B6: "¶" PILCROW SIGN
-         U+002C: "," COMMA
-         U+2022: "•" BULLET -->
-    <!-- U+00B0: "°" DEGREE SIGN
-         U+2032: "′" PRIME
-         U+2033: "″" DOUBLE PRIME
-         U+2191: "↑" UPWARDS ARROW
-         U+2193: "↓" DOWNWARDS ARROW
-         U+2190: "←" LEFTWARDS ARROW
-         U+2192: "→" RIGHTWARDS ARROW
-         U+2026: "…" HORIZONTAL ELLIPSIS -->
-    <!-- U+0394: "Δ" GREEK CAPITAL LETTER DELTA
-         U+03A0: "Π" GREEK CAPITAL LETTER PI
-         U+03C0: "π" GREEK SMALL LETTER PI -->
-    <Key
-        latin:keyLabel="."
-        latin:keyLabelFlags="hasPopupHint"
-        latin:moreKeys="!fixedColumnOrder!8,&#x2105;,&#x2122;,&#x00AE;,&#x00A9;,&#x00A7;,&#x00B6;,\\,,&#x2022;,&#x00B0;,&#x2032;,&#x2033;,&#x2191;,&#x2193;,&#x2190;,&#x2192;,&#x2026;,!text/more_keys_for_bullet,&#x0394;,&#x03A0;,&#x03C0;" />
-</merge>
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index ad5aedf..39fb0b5 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -195,7 +195,7 @@
     private KeyboardActionListener mListener = KeyboardActionListener.EMPTY_LISTENER;
 
     private Keyboard mKeyboard;
-    private int mPhantonSuddenMoveThreshold;
+    private int mPhantomSuddenMoveThreshold;
     private final BogusMoveEventDetector mBogusMoveEventDetector = new BogusMoveEventDetector();
 
     private boolean mIsDetectingGesture = false; // per PointerTracker.
@@ -446,8 +446,6 @@
         for (int i = 0; i < trackersSize; ++i) {
             final PointerTracker tracker = sTrackers.get(i);
             tracker.setKeyDetectorInner(keyDetector);
-            // Mark that keyboard layout has been changed.
-            tracker.mKeyboardLayoutHasBeenChanged = true;
         }
         final Keyboard keyboard = keyDetector.getKeyboard();
         sGestureHandlingEnabledByInputField = !keyboard.mId.passwordInput();
@@ -458,7 +456,7 @@
         final int trackersSize = sTrackers.size();
         for (int i = 0; i < trackersSize; ++i) {
             final PointerTracker tracker = sTrackers.get(i);
-            tracker.setReleasedKeyGraphics(tracker.mCurrentKey);
+            tracker.setReleasedKeyGraphics(tracker.getKey());
         }
     }
 
@@ -466,10 +464,7 @@
         final int trackersSize = sTrackers.size();
         for (int i = 0; i < trackersSize; ++i) {
             final PointerTracker tracker = sTrackers.get(i);
-            if (tracker.isShowingMoreKeysPanel()) {
-                tracker.mMoreKeysPanel.dismissMoreKeysPanel();
-                tracker.mMoreKeysPanel = null;
-            }
+            tracker.dismissMoreKeysPanel();
         }
     }
 
@@ -604,6 +599,8 @@
         }
         mKeyDetector = keyDetector;
         mKeyboard = keyDetector.getKeyboard();
+        // Mark that keyboard layout has been changed.
+        mKeyboardLayoutHasBeenChanged = true;
         final int keyWidth = mKeyboard.mMostCommonKeyWidth;
         final int keyHeight = mKeyboard.mMostCommonKeyHeight;
         mGestureStrokeWithPreviewPoints.setKeyboardGeometry(keyWidth, mKeyboard.mOccupiedHeight);
@@ -614,7 +611,7 @@
             }
             // Keep {@link #mCurrentKey} that comes from previous keyboard.
         }
-        mPhantonSuddenMoveThreshold = (int)(keyWidth * PHANTOM_SUDDEN_MOVE_THRESHOLD);
+        mPhantomSuddenMoveThreshold = (int)(keyWidth * PHANTOM_SUDDEN_MOVE_THRESHOLD);
         mBogusMoveEventDetector.setKeyboardGeometry(keyWidth, keyHeight);
     }
 
@@ -958,6 +955,13 @@
         return (mMoreKeysPanel != null);
     }
 
+    private void dismissMoreKeysPanel() {
+        if (isShowingMoreKeysPanel()) {
+            mMoreKeysPanel.dismissMoreKeysPanel();
+            mMoreKeysPanel = null;
+        }
+    }
+
     private void onDownEventInternal(final int x, final int y, final long eventTime) {
         Key key = onDownKey(x, y, eventTime);
         // Key selection by dragging finger is allowed when 1) key selection by dragging finger is
@@ -1134,7 +1138,7 @@
         // successive up and down events.
         // TODO: Should find a way to balance gesture detection and this hack.
         else if (sNeedsPhantomSuddenMoveEventHack
-                && getDistance(x, y, lastX, lastY) >= mPhantonSuddenMoveThreshold) {
+                && getDistance(x, y, lastX, lastY) >= mPhantomSuddenMoveThreshold) {
             processPhantomSuddenMoveHack(key, x, y, eventTime, oldKey, lastX, lastY);
         }
         // HACK: On some devices, quick successive proximate touches may be reported as a bogus
@@ -1382,28 +1386,28 @@
         if (key == null) return;
         if (!key.isLongPressEnabled()) return;
         // Caveat: Please note that isLongPressEnabled() can be true even if the current key
-        // doesn't have its more keys. (e.g. spacebar, globe key)
+        // doesn't have its more keys. (e.g. spacebar, globe key) If we are in the dragging finger
+        // mode, we will disable long press timer of such key.
         // We always need to start the long press timer if the key has its more keys regardless of
         // whether or not we are in the dragging finger mode.
         if (mIsInDraggingFinger && key.getMoreKeys() == null) return;
-        final int delay;
-        switch (key.getCode()) {
-        case Constants.CODE_SHIFT:
-            delay = sParams.mLongPressShiftLockTimeout;
-            break;
-        default:
-            final int longpressTimeout = Settings.getInstance().getCurrent().mKeyLongpressTimeout;
-            if (mIsInSlidingKeyInput) {
-                // We use longer timeout for sliding finger input started from the modifier key.
-                delay = longpressTimeout * MULTIPLIER_FOR_LONG_PRESS_TIMEOUT_IN_SLIDING_INPUT;
-            } else {
-                delay = longpressTimeout;
-            }
-            break;
-        }
+
+        final int delay = getLongPressTimeout(key.getCode());
         mTimerProxy.startLongPressTimer(this, delay);
     }
 
+    private int getLongPressTimeout(final int code) {
+        if (code == Constants.CODE_SHIFT) {
+            return sParams.mLongPressShiftLockTimeout;
+        }
+        final int longpressTimeout = Settings.getInstance().getCurrent().mKeyLongpressTimeout;
+        if (mIsInSlidingKeyInput) {
+            // We use longer timeout for sliding finger input started from the modifier key.
+            return longpressTimeout * MULTIPLIER_FOR_LONG_PRESS_TIMEOUT_IN_SLIDING_INPUT;
+        }
+        return longpressTimeout;
+    }
+
     private void detectAndSendKey(final Key key, final int x, final int y, final long eventTime) {
         if (key == null) {
             callListenerOnCancelInput();
@@ -1422,7 +1426,7 @@
         // Don't start key repeat when we are in the dragging finger mode.
         if (mIsInDraggingFinger) return;
         final int startRepeatCount = 1;
-        mTimerProxy.startKeyRepeatTimer(this, startRepeatCount, sParams.mKeyRepeatStartTimeout);
+        startKeyRepeatTimer(startRepeatCount);
     }
 
     public void onKeyRepeat(final int code, final int repeatCount) {
@@ -1434,11 +1438,17 @@
         mCurrentRepeatingKeyCode = code;
         mIsDetectingGesture = false;
         final int nextRepeatCount = repeatCount + 1;
-        mTimerProxy.startKeyRepeatTimer(this, nextRepeatCount, sParams.mKeyRepeatInterval);
+        startKeyRepeatTimer(nextRepeatCount);
         callListenerOnPressAndCheckKeyboardLayoutChange(key, repeatCount);
         callListenerOnCodeInput(key, code, mKeyX, mKeyY, SystemClock.uptimeMillis());
     }
 
+    private void startKeyRepeatTimer(final int repeatCount) {
+        final int delay =
+                (repeatCount == 1) ? sParams.mKeyRepeatStartTimeout : sParams.mKeyRepeatInterval;
+        mTimerProxy.startKeyRepeatTimer(this, repeatCount, delay);
+    }
+
     private void printTouchEvent(final String title, final int x, final int y,
             final long eventTime) {
         final Key key = mKeyDetector.detectHitKey(x, y);
diff --git a/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java
index fda97da..b75fc37 100644
--- a/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/AbstractDictDecoder.java
@@ -32,6 +32,10 @@
  * A base class of the binary dictionary decoder.
  */
 public abstract class AbstractDictDecoder implements DictDecoder {
+    private static final int SUCCESS = 0;
+    private static final int ERROR_CANNOT_READ = 1;
+    private static final int ERROR_WRONG_FORMAT = 2;
+
     protected FileHeader readHeader(final DictBuffer dictBuffer)
             throws IOException, UnsupportedFormatException {
         if (dictBuffer == null) {
@@ -204,4 +208,25 @@
             return readLength;
         }
     }
+
+    /**
+     * Check whether the header contains the expected information. This is a no-error method,
+     * that will return an error code and never throw a checked exception.
+     * @return an error code, either ERROR_* or SUCCESS.
+     */
+    private int checkHeader() {
+        try {
+            readHeader();
+        } catch (IOException e) {
+            return ERROR_CANNOT_READ;
+        } catch (UnsupportedFormatException e) {
+            return ERROR_WRONG_FORMAT;
+        }
+        return SUCCESS;
+    }
+
+    @Override
+    public boolean hasValidRawBinaryDictionary() {
+        return checkHeader() == SUCCESS;
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
index 8a8ceaa..17c609f 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
@@ -24,12 +24,9 @@
 import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.TreeMap;
@@ -639,32 +636,10 @@
     /**
      * Basic test to find out whether the file is a binary dictionary or not.
      *
-     * Concretely this only tests the magic number.
-     *
      * @param file The file to test.
      * @return true if it's a binary dictionary, false otherwise
      */
     public static boolean isBinaryDictionary(final File file) {
-        FileInputStream inStream = null;
-        try {
-            inStream = new FileInputStream(file);
-            final ByteBuffer buffer = inStream.getChannel().map(
-                    FileChannel.MapMode.READ_ONLY, 0, file.length());
-            final int version = getFormatVersion(new ByteBufferDictBuffer(buffer));
-            return (version >= FormatSpec.MINIMUM_SUPPORTED_VERSION
-                    && version <= FormatSpec.MAXIMUM_SUPPORTED_VERSION);
-        } catch (FileNotFoundException e) {
-            return false;
-        } catch (IOException e) {
-            return false;
-        } finally {
-            if (inStream != null) {
-                try {
-                    inStream.close();
-                } catch (IOException e) {
-                    // do nothing
-                }
-            }
-        }
+        return FormatSpec.getDictDecoder(file).hasValidRawBinaryDictionary();
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java
index 9154398..b4838f0 100644
--- a/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/DictDecoder.java
@@ -128,7 +128,8 @@
      * Opens the dictionary file and makes DictBuffer.
      */
     @UsedForTesting
-    public void openDictBuffer() throws FileNotFoundException, IOException;
+    public void openDictBuffer() throws FileNotFoundException, IOException,
+            UnsupportedFormatException;
     @UsedForTesting
     public boolean isDictBufferOpen();
 
@@ -229,4 +230,9 @@
     }
 
     public void skipPtNode(final FormatOptions formatOptions);
+
+    /**
+     * @return whether this decoder has a valid binary dictionary that it can decode.
+     */
+    public boolean hasValidRawBinaryDictionary();
 }
diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java b/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java
index f0fed3f..8833c35 100644
--- a/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java
+++ b/java/src/com/android/inputmethod/latin/makedict/Ver4DictDecoder.java
@@ -103,7 +103,7 @@
         mDictBuffer = mFrequencyBuffer = null;
     }
 
-    protected File getFile(final int fileType) {
+    protected File getFile(final int fileType) throws UnsupportedFormatException {
         if (fileType == FILETYPE_TRIE) {
             return new File(mDictDirectory,
                     mDictDirectory.getName() + FormatSpec.TRIE_FILE_EXTENSION);
@@ -122,12 +122,16 @@
                     mDictDirectory.getName() + FormatSpec.SHORTCUT_FILE_EXTENSION
                             + FormatSpec.SHORTCUT_CONTENT_ID);
         } else {
-            throw new RuntimeException("Unsupported kind of file : " + fileType);
+            throw new UnsupportedFormatException("Unsupported kind of file : " + fileType);
         }
     }
 
     @Override
-    public void openDictBuffer() throws FileNotFoundException, IOException {
+    public void openDictBuffer() throws FileNotFoundException, IOException,
+            UnsupportedFormatException {
+        if (!mDictDirectory.isDirectory()) {
+            throw new UnsupportedFormatException("Format 4 dictionary needs a directory");
+        }
         mDictBuffer = mBufferFactory.getDictionaryBuffer(getFile(FILETYPE_TRIE));
         mFrequencyBuffer = mBufferFactory.getDictionaryBuffer(getFile(FILETYPE_FREQUENCY));
         mTerminalAddressTableBuffer = mBufferFactory.getDictionaryBuffer(
diff --git a/java/src/com/android/inputmethod/latin/makedict/Ver4DictUpdater.java b/java/src/com/android/inputmethod/latin/makedict/Ver4DictUpdater.java
index 65860ee..883709f 100644
--- a/java/src/com/android/inputmethod/latin/makedict/Ver4DictUpdater.java
+++ b/java/src/com/android/inputmethod/latin/makedict/Ver4DictUpdater.java
@@ -45,7 +45,8 @@
     private final File mFrequencyFile;
 
     @UsedForTesting
-    public Ver4DictUpdater(final File dictDirectory, final int factoryType) {
+    public Ver4DictUpdater(final File dictDirectory, final int factoryType)
+            throws UnsupportedFormatException {
         // DictUpdater must have an updatable DictBuffer.
         super(dictDirectory, ((factoryType & MASK_DICTBUFFER) == USE_BYTEARRAY)
                 ? USE_BYTEARRAY : USE_WRITABLE_BYTEBUFFER);
@@ -664,7 +665,8 @@
         frequencyStream.close();
     }
 
-    private void insertTerminalPosition(final int posOfTerminal) throws IOException {
+    private void insertTerminalPosition(final int posOfTerminal) throws IOException,
+            UnsupportedFormatException {
         final OutputStream terminalPosStream = new FileOutputStream(
                 getFile(FILETYPE_TERMINAL_ADDRESS_TABLE), true /* append */);
         BinaryDictEncoderUtils.writeUIntToStream(terminalPosStream, posOfTerminal,
@@ -702,7 +704,7 @@
         updater.insertShortcuts(terminalId, shortcuts);
     }
 
-    private void openBuffersAndStream() throws IOException {
+    private void openBuffersAndStream() throws IOException, UnsupportedFormatException {
         openDictBuffer();
         mDictStream = new FileOutputStream(getFile(FILETYPE_TRIE), true /* append */);
     }
diff --git a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
index 8b94883..5edac23 100644
--- a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
+++ b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
@@ -28,6 +28,7 @@
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.makedict.DictDecoder;
 import com.android.inputmethod.latin.makedict.FormatSpec;
+import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
 import com.android.inputmethod.latin.settings.Settings;
 import com.android.inputmethod.latin.utils.CollectionUtils;
 import com.android.inputmethod.latin.utils.UserHistoryDictIOUtils;
@@ -222,6 +223,8 @@
             UserHistoryDictIOUtils.readDictionaryBinary(dictDecoder, listener);
         } catch (IOException e) {
             Log.d(TAG, "IOException on opening a bytebuffer", e);
+        } catch (UnsupportedFormatException e) {
+            Log.d(TAG, "Unsupported format, can't read the dictionary", e);
         } finally {
             if (PROFILE_SAVE_RESTORE) {
                 final long diff = System.currentTimeMillis() - now;
@@ -291,6 +294,8 @@
             UserHistoryDictIOUtils.readDictionaryBinary(dictDecoder, listener);
         } catch (IOException e) {
             Log.d(TAG, "IOException on opening a bytebuffer", e);
+        } catch (UnsupportedFormatException e) {
+            Log.d(TAG, "Unsupported format, can't read the dictionary", e);
         }
     }
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_gc_event_listeners.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_gc_event_listeners.cpp
index c582a6e..22d4f7a 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_gc_event_listeners.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_gc_event_listeners.cpp
@@ -127,8 +127,7 @@
                     ptNodeParams->getHeadPos(), writingPos));
     mValidPtNodeCount++;
     // Writes current PtNode.
-    return mPtNodeWriter->writeNewTerminalPtNodeAndAdvancePosition(ptNodeParams,
-            0 /* timestamp */, &writingPos);
+    return mPtNodeWriter->writePtNodeAndAdvancePosition(ptNodeParams, &writingPos);
 }
 
 bool DynamicPatriciaTrieGcEventListeners::TraversePolicyToUpdateAllPositionFields
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_node_writer.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_node_writer.cpp
index d925a7e..2225543 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_node_writer.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_node_writer.cpp
@@ -174,8 +174,7 @@
         // Then, Mark as the PtNode having bigram list in the flags.
         const PatriciaTrieReadingUtils::NodeFlags updatedFlags =
                 PatriciaTrieReadingUtils::createAndGetFlags(newPtNodeParams.isBlacklisted(),
-                        newPtNodeParams.isNotAWord(),
-                        newPtNodeParams.getProbability() != NOT_A_PROBABILITY,
+                        newPtNodeParams.isNotAWord(), newPtNodeParams.isTerminal(),
                         newPtNodeParams.getShortcutPos() != NOT_A_DICT_POS, true /* hasBigrams */,
                         newPtNodeParams.getCodePointCount() > 1, CHILDREN_POSITION_FIELD_SIZE);
         writingPos = newNodePos;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.cpp
index 0222080..473ab0d 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.cpp
@@ -26,9 +26,8 @@
 void ProbabilityDictContent::getProbabilityEntry(const int terminalId,
         ProbabilityEntry *const outProbabilityEntry) const {
     if (terminalId < 0 || terminalId >= mSize) {
+        // This method can be called with invalid terminal id during GC.
         outProbabilityEntry->setProbability(0 /* flags */, NOT_A_PROBABILITY);
-        AKLOGE("Terminal id (%d) is not in the probability dict content. mSize: %d", terminalId,
-                mSize);
         return;
     }
     const BufferWithExtendableBuffer *const buffer = getBuffer();
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/terminal_position_lookup_table.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/terminal_position_lookup_table.cpp
index a89e242..c38aeb4 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/terminal_position_lookup_table.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/terminal_position_lookup_table.cpp
@@ -44,9 +44,6 @@
         }
         mSize++;
     }
-    if (terminalPtNodePos == NOT_A_DICT_POS) {
-        return true;
-    }
     const int terminalPos = (terminalPtNodePos != NOT_A_DICT_POS) ?
             terminalPtNodePos + mHeaderRegionSize : Ver4DictConstants::NOT_A_TERMINAL_ADDRESS;
     return getWritableBuffer()->writeUint(terminalPos,
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
index 145eeb0..9aa6e60 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
@@ -51,7 +51,7 @@
             &writingPos)) {
         return false;
     }
-    if (toBeUpdatedPtNodeParams->getTerminalId() != NOT_A_DICT_POS) {
+    if (toBeUpdatedPtNodeParams->isTerminal()) {
         // The PtNode is a terminal. Delete entry from the terminal position lookup table.
         return mBuffers->getUpdatableTerminalPositionLookupTable()->setTerminalPtNodePosition(
                 toBeUpdatedPtNodeParams->getTerminalId(), NOT_A_DICT_POS /* ptNodePos */);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
index a7b729b..e8368af 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
@@ -143,29 +143,12 @@
     Ver4PatriciaTrieNodeWriter newPtNodeWriter(buffersToWrite->getWritableTrieBuffer(),
             buffersToWrite, &newPtNodeReader, &newBigramPolicy, &newShortcutPolicy,
             false /* needsToDecayWhenUpdating */);
-
-    DynamicPatriciaTrieReadingHelper newDictReadingHelper(buffersToWrite->getTrieBuffer(),
-            &newPtNodeReader);
-    newDictReadingHelper.initWithPtNodeArrayPos(rootPtNodeArrayPos);
-    DynamicPatriciaTrieGcEventListeners::TraversePolicyToUpdateAllPositionFields
-            traversePolicyToUpdateAllPositionFields(&newPtNodeWriter, &dictPositionRelocationMap);
-    if (!newDictReadingHelper.traverseAllPtNodesInPtNodeArrayLevelPreorderDepthFirstManner(
-            &traversePolicyToUpdateAllPositionFields)) {
-        return false;
-    }
-
     // Re-assign terminal IDs for valid terminal PtNodes.
     TerminalPositionLookupTable::TerminalIdMap terminalIdMap;
     if(!buffersToWrite->getUpdatableTerminalPositionLookupTable()->runGCTerminalIds(
             &terminalIdMap)) {
         return false;
     }
-    TraversePolicyToUpdateAllTerminalIds traversePolicyToUpdateAllTerminalIds(&newPtNodeWriter,
-            &terminalIdMap);
-    if (!newDictReadingHelper.traverseAllPtNodesInPostorderDepthFirstManner(
-            &traversePolicyToUpdateAllTerminalIds)) {
-        return false;
-    }
     // Run GC for probability dict content.
     if (!buffersToWrite->getUpdatableProbabilityDictContent()->runGC(&terminalIdMap,
             mBuffers->getProbabilityDictContent())) {
@@ -181,6 +164,22 @@
             mBuffers->getShortcutDictContent())) {
         return false;
     }
+    DynamicPatriciaTrieReadingHelper newDictReadingHelper(buffersToWrite->getTrieBuffer(),
+            &newPtNodeReader);
+    newDictReadingHelper.initWithPtNodeArrayPos(rootPtNodeArrayPos);
+    DynamicPatriciaTrieGcEventListeners::TraversePolicyToUpdateAllPositionFields
+            traversePolicyToUpdateAllPositionFields(&newPtNodeWriter, &dictPositionRelocationMap);
+    if (!newDictReadingHelper.traverseAllPtNodesInPtNodeArrayLevelPreorderDepthFirstManner(
+            &traversePolicyToUpdateAllPositionFields)) {
+        return false;
+    }
+    newDictReadingHelper.initWithPtNodeArrayPos(rootPtNodeArrayPos);
+    TraversePolicyToUpdateAllTerminalIds traversePolicyToUpdateAllTerminalIds(&newPtNodeWriter,
+            &terminalIdMap);
+    if (!newDictReadingHelper.traverseAllPtNodesInPostorderDepthFirstManner(
+            &traversePolicyToUpdateAllTerminalIds)) {
+        return false;
+    }
     *outUnigramCount = traversePolicyToUpdateAllPositionFields.getUnigramCount();
     return true;
 }
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
index 48d36b6..c4749df 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
@@ -29,6 +29,7 @@
 import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode;
 import com.android.inputmethod.latin.makedict.FusionDictionary.PtNodeArray;
 import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;
+import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
 import com.android.inputmethod.latin.utils.ByteArrayDictBuffer;
 import com.android.inputmethod.latin.utils.CollectionUtils;
 
@@ -563,7 +564,8 @@
         try {
             dictDecoder.openDictBuffer();
         } catch (IOException e) {
-            // ignore
+            Log.e(TAG, "IOException while opening the buffer", e);
+        } catch (UnsupportedFormatException e) {
             Log.e(TAG, "IOException while opening the buffer", e);
         }
         assertTrue("Can't get the buffer", dictDecoder.isDictBufferOpen());
@@ -639,7 +641,8 @@
         }
     }
 
-    private void runTestDeleteWord(final FormatOptions formatOptions) {
+    private void runTestDeleteWord(final FormatOptions formatOptions)
+            throws IOException, UnsupportedFormatException {
         final String dictName = "testDeleteWord";
         final String dictVersion = Long.toString(System.currentTimeMillis());
         final File file = BinaryDictUtils.getDictFile(dictName, dictVersion, formatOptions,
@@ -652,25 +655,20 @@
         timeWritingDictToFile(file, dict, formatOptions);
 
         final DictUpdater dictUpdater = BinaryDictUtils.getDictUpdater(file, formatOptions);
+        MoreAsserts.assertNotEqual(FormatSpec.NOT_VALID_WORD,
+                dictUpdater.getTerminalPosition(sWords.get(0)));
+        dictUpdater.deleteWord(sWords.get(0));
+        assertEquals(FormatSpec.NOT_VALID_WORD,
+                dictUpdater.getTerminalPosition(sWords.get(0)));
 
-        try {
-            MoreAsserts.assertNotEqual(FormatSpec.NOT_VALID_WORD,
-                    dictUpdater.getTerminalPosition(sWords.get(0)));
-            dictUpdater.deleteWord(sWords.get(0));
-            assertEquals(FormatSpec.NOT_VALID_WORD,
-                    dictUpdater.getTerminalPosition(sWords.get(0)));
-
-            MoreAsserts.assertNotEqual(FormatSpec.NOT_VALID_WORD,
-                    dictUpdater.getTerminalPosition(sWords.get(5)));
-            dictUpdater.deleteWord(sWords.get(5));
-            assertEquals(FormatSpec.NOT_VALID_WORD,
-                    dictUpdater.getTerminalPosition(sWords.get(5)));
-        } catch (IOException e) {
-        } catch (UnsupportedFormatException e) {
-        }
+        MoreAsserts.assertNotEqual(FormatSpec.NOT_VALID_WORD,
+                dictUpdater.getTerminalPosition(sWords.get(5)));
+        dictUpdater.deleteWord(sWords.get(5));
+        assertEquals(FormatSpec.NOT_VALID_WORD,
+                dictUpdater.getTerminalPosition(sWords.get(5)));
     }
 
-    public void testDeleteWord() {
+    public void testDeleteWord() throws IOException, UnsupportedFormatException {
         runTestDeleteWord(BinaryDictUtils.VERSION3_WITH_DYNAMIC_UPDATE);
         runTestDeleteWord(BinaryDictUtils.VERSION4_WITH_DYNAMIC_UPDATE);
     }
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictUtils.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictUtils.java
index f476738..5ec3725 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictUtils.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictUtils.java
@@ -73,13 +73,14 @@
         }
     }
 
-    public static DictUpdater getDictUpdater(final File file, final FormatOptions formatOptions) {
+    public static DictUpdater getDictUpdater(final File file, final FormatOptions formatOptions)
+            throws UnsupportedFormatException {
         if (formatOptions.mVersion == FormatSpec.VERSION4) {
             return new Ver4DictUpdater(file, DictDecoder.USE_WRITABLE_BYTEBUFFER);
         } else if (formatOptions.mVersion == 3) {
             return new Ver3DictUpdater(file, DictDecoder.USE_WRITABLE_BYTEBUFFER);
         } else {
-            throw new RuntimeException("The format option has a wrong version : "
+            throw new UnsupportedFormatException("The format option has a wrong version : "
                     + formatOptions.mVersion);
         }
     }
diff --git a/tests/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtilsTests.java
index 1944fd3..660e53e 100644
--- a/tests/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtilsTests.java
@@ -26,6 +26,7 @@
 import com.android.inputmethod.latin.makedict.FormatSpec;
 import com.android.inputmethod.latin.makedict.FusionDictionary;
 import com.android.inputmethod.latin.makedict.FusionDictionary.PtNode;
+import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
 import com.android.inputmethod.latin.makedict.Ver3DictDecoder;
 import com.android.inputmethod.latin.makedict.Ver3DictEncoder;
 import com.android.inputmethod.latin.personalization.UserHistoryDictionaryBigramList;
@@ -142,15 +143,10 @@
         UserHistoryDictIOUtils.writeDictionary(dictEncoder, this, bigramList, FORMAT_OPTIONS);
     }
 
-    private void readDictFromFile(final File file, final OnAddWordListener listener) {
+    private void readDictFromFile(final File file, final OnAddWordListener listener)
+            throws IOException, FileNotFoundException, UnsupportedFormatException {
         final DictDecoder dictDecoder = FormatSpec.getDictDecoder(file, DictDecoder.USE_BYTEARRAY);
-        try {
-            dictDecoder.openDictBuffer();
-        } catch (FileNotFoundException e) {
-            Log.e(TAG, "file not found", e);
-        } catch (IOException e) {
-            Log.e(TAG, "IOException", e);
-        }
+        dictDecoder.openDictBuffer();
         UserHistoryDictIOUtils.readDictionaryBinary(dictDecoder, listener);
     }
 
@@ -169,7 +165,8 @@
         checkWordsInFusionDict(fusionDict, addedWords);
     }
 
-    public void testReadAndWrite() {
+    public void testReadAndWrite() throws IOException, FileNotFoundException,
+            UnsupportedFormatException {
         final Context context = getContext();
 
         File file = null;