merge in jb-mr1-release history after reset to jb-mr1-dev
diff --git a/java/NOTICE b/java/NOTICE
index 7340b9e..aa32554 100644
--- a/java/NOTICE
+++ b/java/NOTICE
@@ -188,3 +188,5 @@
 
    END OF TERMS AND CONDITIONS
 
+
+Includes Dictionaries © Lexiteria LLC.  Used by permission.
diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml
index 6ce0ee7..8d9c36e 100644
--- a/java/res/values-bg/strings.xml
+++ b/java/res/values-bg/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Изскачащ прозорец при натискане на клавиш"</string>
     <string name="general_category" msgid="1859088467017573195">"Общи"</string>
     <string name="correction_category" msgid="2236750915056607613">"Корекция на текста"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"Писане с жест"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"Въвеждане чрез жест"</string>
     <string name="misc_category" msgid="6894192814868233453">"Други опции"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Разширени настройки"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Опции за експерти"</string>
@@ -61,7 +61,7 @@
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Много агресивно"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Предложения за следващата дума"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Използване на предишната дума при даване на предложения"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Активиране на писането с жест"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Активиране на въвеждането чрез жест"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Въвеждане на дума чрез плъзгане на пръст през буквите"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Следа на жестовете: Показване"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамична плаваща визуализация"</string>
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index 95d8ff3..bc9b0c3 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -51,7 +51,7 @@
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Mostrar sugerencias de correcciones"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Mostrar palabras sugeridas al escribir"</string>
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Mostrar siempre"</string>
-    <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Mostrar en modo retrato"</string>
+    <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Mostrar en modo de retrato"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Ocultar siempre"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Corrección automática"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"La barra espaciadora y las teclas de puntuación insertan automáticamente la palabra corregida"</string>
@@ -62,7 +62,7 @@
     <string name="bigram_prediction" msgid="1084449187723948550">"Sugerencias para la palabra siguiente"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Usa la palabra anterior para hacer sugerencias"</string>
     <string name="gesture_input" msgid="826951152254563827">"Habilitar escritura gestual"</string>
-    <string name="gesture_input_summary" msgid="9180350639305731231">"Introduce una palabra al deslizarte sobre las letras"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"Ingresa una palabra al deslizarte sobre las letras."</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar recorrido de gesto"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Vista previa dinámica flotante"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Mira la palabra sugerida mientras haces gestos"</string>
diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml
index 31f7047..58393b0 100644
--- a/java/res/values-fr/strings.xml
+++ b/java/res/values-fr/strings.xml
@@ -61,8 +61,8 @@
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Très exigeante"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Suggestions pour le mot suivant"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utiliser le mot précédent pour les suggestions"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Activer saisie gestuelle"</string>
-    <string name="gesture_input_summary" msgid="9180350639305731231">"Saisir un mot en traçant les lettres sans interruption"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Activer la saisie gestuelle"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"Saisir un mot en faisant glisser le doigt sur les lettres"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Afficher le tracé du geste"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Aperçu flottant dynamique"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Afficher le mot suggéré lors des gestes"</string>
diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml
index 1e68162..bae1fc2 100644
--- a/java/res/values-hr/strings.xml
+++ b/java/res/values-hr/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Povećanja na pritisak tipke"</string>
     <string name="general_category" msgid="1859088467017573195">"Općenito"</string>
     <string name="correction_category" msgid="2236750915056607613">"Ispravak teksta"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"Tipkanje pokretom"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"Pisanje kretnjama"</string>
     <string name="misc_category" msgid="6894192814868233453">"Ostale opcije"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Napredne postavke"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Opcije za stručnjake"</string>
@@ -45,7 +45,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Predlaži imena kontakata"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Upotreba imena iz Kontakata za prijedloge i ispravke"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Automatsko pisanje velikih slova"</string>
-    <string name="auto_cap_summary" msgid="7934452761022946874">"Kapitaliziraj prvu riječ svake rečenice"</string>
+    <string name="auto_cap_summary" msgid="7934452761022946874">"Napiši velikim slovom prvu riječ svake rečenice"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Rječnici-dodaci"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Glavni rječnik"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Pokaži prijedloge ispravka"</string>
@@ -60,8 +60,8 @@
     <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivno"</string>
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Vrlo agresivno"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Prijedlozi za sljedeću riječ"</string>
-    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Koristi prethodnu riječ u izradi prijedloga"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Omogući tipkanje pokretom"</string>
+    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Koristi se prethodnom riječi u izradi prijedloga"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Omogući pisanje kretnjama"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Unesi riječ klizanjem preko slova"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Prikaži trag pokreta"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamički plutajući pregled"</string>
diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml
index c4a16d7..d1b7157 100644
--- a/java/res/values-hu/strings.xml
+++ b/java/res/values-hu/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Legyen nagyobb billentyű lenyomásakor"</string>
     <string name="general_category" msgid="1859088467017573195">"Általános"</string>
     <string name="correction_category" msgid="2236750915056607613">"Szövegjavítás"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"Gépelés kézmozdulatokkal"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"Kézmozdulatokkal történő gépelés"</string>
     <string name="misc_category" msgid="6894192814868233453">"Egyéb beállítások"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Speciális beállítások"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Beállítások gyakorlott felhasználóknak"</string>
@@ -60,7 +60,7 @@
     <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresszív"</string>
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Nagyon agresszív"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Következő szóra vonatkozó javaslatok"</string>
-    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Az előző szó használata javaslatok tételére"</string>
+    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Az előző szó felhasználása a javaslatoknál"</string>
     <string name="gesture_input" msgid="826951152254563827">"Kézmozdulatokkal gépelés"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Szó beírása úgy, hogy ujjait végigcsúsztatja a betűkön"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Mozdulat irányának mutatása"</string>
diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml
index 059d171..d7ae04f 100644
--- a/java/res/values-ja/strings.xml
+++ b/java/res/values-ja/strings.xml
@@ -62,7 +62,7 @@
     <string name="bigram_prediction" msgid="1084449187723948550">"次の入力候補"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"前の単語に基づいて入力候補を表示します"</string>
     <string name="gesture_input" msgid="826951152254563827">"ジェスチャー入力を有効にする"</string>
-    <string name="gesture_input_summary" msgid="9180350639305731231">"文字をスライドして単語を入力できます"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"文字間をスライドして単語を入力できます"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"ジェスチャートレイルを表示"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"動的フローティングプレビュー"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"ジェスチャーで入力候補を表示できます"</string>
diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml
index 7e808d7..2be5db2 100644
--- a/java/res/values-ko/strings.xml
+++ b/java/res/values-ko/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"키를 누를 때 팝업"</string>
     <string name="general_category" msgid="1859088467017573195">"일반"</string>
     <string name="correction_category" msgid="2236750915056607613">"텍스트 수정"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"동작으로 입력"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"제스처 타이핑"</string>
     <string name="misc_category" msgid="6894192814868233453">"기타 옵션"</string>
     <string name="advanced_settings" msgid="362895144495591463">"고급 설정"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"전문가용 옵션"</string>
@@ -59,9 +59,9 @@
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"약"</string>
     <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"중"</string>
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"강"</string>
-    <string name="bigram_prediction" msgid="1084449187723948550">"다음 추천 검색어"</string>
+    <string name="bigram_prediction" msgid="1084449187723948550">"다음 단어 추천"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"추천할 때 이전 단어를 사용"</string>
-    <string name="gesture_input" msgid="826951152254563827">"동작으로 입력 사용"</string>
+    <string name="gesture_input" msgid="826951152254563827">"제스처 타이핑 사용"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"문자를 슬라이드하여 단어 입력"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"동작 흔적 표시"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"동적 플로팅 미리보기"</string>
diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml
index a88576d..dee3479 100644
--- a/java/res/values-lt/strings.xml
+++ b/java/res/values-lt/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Iššoka paspaudus klavišą"</string>
     <string name="general_category" msgid="1859088467017573195">"Bendra"</string>
     <string name="correction_category" msgid="2236750915056607613">"Teksto taisymas"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"Įvestis gestais"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"Teksto vedimas gestais"</string>
     <string name="misc_category" msgid="6894192814868233453">"Kitos parinktys"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Išplėstiniai nustatymai"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Parinktys ekspertams"</string>
@@ -51,7 +51,7 @@
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Rodyti taisymo pasiūlymus"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Įvedant tekstą pateikti siūlomų žodžių"</string>
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Visada rodyti"</string>
-    <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Rodyti stačiuoju režimu"</string>
+    <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Rodyti portreto režimu"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Visada slėpti"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Automatinis taisymas"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"Tarpo kl. ir skyr. ženkl. aut. išt. neteis. įv. žodž."</string>
@@ -61,7 +61,7 @@
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Labai agresyviai"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Kito žodžio pasiūlymai"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Sudarant pasiūlymus naudoti ankstesnį žodį"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Įgalinti įvestį gestais"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Įgalinti teksto vedimą gestais"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Įvesti žodį slenkant raidėmis"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Rodyti gestų kelią"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinaminė slankioji peržiūra"</string>
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index 4dd1d0b..9b9d6ad 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -45,7 +45,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Cadangkan nama Kenalan"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Menggunakan nama daripada Kenalan untuk cadangan dan pembetulan"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Huruf besar auto"</string>
-    <string name="auto_cap_summary" msgid="7934452761022946874">"Besarkan huruf pertama setiap ayat"</string>
+    <string name="auto_cap_summary" msgid="7934452761022946874">"Besarkan perkataan pertama setiap ayat"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Kamus tambahan"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Kamus utama"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Tunjukkan cadangan pembetulan"</string>
@@ -65,7 +65,7 @@
     <string name="gesture_input_summary" msgid="9180350639305731231">"Input perkataan dengan meluncur melalui huruf"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Tunjukkan jejak gerak isyarat"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Pratonton terapung dinamik"</string>
-    <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Lihat perkataan dicadangkan semasa membuat gerak isyarat"</string>
+    <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Lihat perkataan yang dicadangkan semasa membuat gerak isyarat"</string>
     <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Disimpan"</string>
     <string name="label_go_key" msgid="1635148082137219148">"Pergi"</string>
     <string name="label_next_key" msgid="362972844525672568">"Seterusnya"</string>
diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml
index 414aa9a..9b73ad1 100644
--- a/java/res/values-pl/strings.xml
+++ b/java/res/values-pl/strings.xml
@@ -91,7 +91,7 @@
     <string name="spoken_description_settings" msgid="4627462689603838099">"Ustawienia"</string>
     <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string>
     <string name="spoken_description_space" msgid="2582521050049860859">"Spacja"</string>
-    <string name="spoken_description_mic" msgid="615536748882611950">"Wprowadzanie głosowe"</string>
+    <string name="spoken_description_mic" msgid="615536748882611950">"Rozpoznawanie mowy"</string>
     <string name="spoken_description_smiley" msgid="2256309826200113918">"Uśmiechnięta buźka"</string>
     <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string>
     <string name="spoken_description_search" msgid="1247236163755920808">"Szukaj"</string>
@@ -112,7 +112,7 @@
     <string name="voice_input_modes_off" msgid="3745699748218082014">"Wyłącz"</string>
     <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Mikrofon na klawiaturze głównej"</string>
     <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Mikrofon na klawiaturze z symbolami"</string>
-    <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Wprowadzanie głosowe jest wyłączone"</string>
+    <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Rozpoznawanie mowy jest wyłączone"</string>
     <string name="configure_input_method" msgid="373356270290742459">"Konfiguruj metody wprowadzania"</string>
     <string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string>
     <string name="select_language" msgid="3693815588777926848">"Języki wprowadzania"</string>
diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml
index a2054c4..098d245 100644
--- a/java/res/values-pt/strings.xml
+++ b/java/res/values-pt/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Exibir pop-up ao digitar"</string>
     <string name="general_category" msgid="1859088467017573195">"Geral"</string>
     <string name="correction_category" msgid="2236750915056607613">"Correção de texto"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"Digitação por gestos"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"Escrita com gestos"</string>
     <string name="misc_category" msgid="6894192814868233453">"Outras opções"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Configurações avançadas"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Opções para especialistas"</string>
@@ -61,7 +61,7 @@
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Muito agressivo"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Sugestões para a palavra seguinte"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Usar a palavra anterior ao fazer sugestões"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Ativar a digitação por gestos"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Ativar a escrita com gestos"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Inserir uma palavra deslizando os dedos pelas letras"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Mostrar percurso do gesto"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Visualizaç. dinâmica flutuante"</string>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 2d92c2b..44f2bb1 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Fereastră pop-up la apăsarea tastei"</string>
     <string name="general_category" msgid="1859088467017573195">"General"</string>
     <string name="correction_category" msgid="2236750915056607613">"Corectare text"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"Introducere text prin gesturi"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"Tastare gestuală"</string>
     <string name="misc_category" msgid="6894192814868233453">"Alte opţiuni"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Setări avansate"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Opţiuni pentru experţi"</string>
@@ -45,7 +45,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sugeraţi nume din Agendă"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizaţi numele din Agendă pentru sugestii şi corecţii"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalizare"</string>
-    <string name="auto_cap_summary" msgid="7934452761022946874">"Scrieţi cu majusculă primul cuvânt din fiecare propoziţie"</string>
+    <string name="auto_cap_summary" msgid="7934452761022946874">"Scrie cu majusculă primul cuvânt din fiecare propoziţie"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Dicţionare suplimentare"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Dicţionar principal"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Afişaţi sugestii de corectare"</string>
@@ -60,8 +60,8 @@
     <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"Agresivă"</string>
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Foarte exigentă"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Sugestii pentru cuvântul următor"</string>
-    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utilizaţi cuvântul anterior în efectuarea sugestiilor"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Activaţi tastarea prin gesturi"</string>
+    <string name="bigram_prediction_summary" msgid="3896362682751109677">"Utilizează cuvântul anterior pentru sugestii"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Activați tastarea gestuală"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Introduceţi un cuvânt glisând uşor între litere"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Se afişează urma gestului"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Sugestie flotantă dinamică"</string>
diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml
index c0dc117..00e574e 100644
--- a/java/res/values-ru/strings.xml
+++ b/java/res/values-ru/strings.xml
@@ -51,7 +51,7 @@
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Показать варианты исправлений"</string>
     <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Предлагать варианты слов во время ввода"</string>
     <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Всегда показывать"</string>
-    <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Показывать при вертикальном положении телефона"</string>
+    <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Показать вертикально"</string>
     <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Всегда скрывать"</string>
     <string name="auto_correction" msgid="7630720885194996950">"Автоисправление"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"Автоматическое исправление опечаток при вводе знака препинания или пробела"</string>
@@ -62,10 +62,10 @@
     <string name="bigram_prediction" msgid="1084449187723948550">"Подсказка следующего слова"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Предлагать подсказки на основе предыдущего слова"</string>
     <string name="gesture_input" msgid="826951152254563827">"Включить функцию"</string>
-    <string name="gesture_input_summary" msgid="9180350639305731231">"Вводить слова, не отрывая пальца от клавиатуры"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"Вводите слова, не отрывая пальца от клавиатуры"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Рисовать линию"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Показывать подсказки"</string>
-    <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Показывать предлагаемые слова при вводе текста"</string>
+    <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Показывать подсказки при вводе текста"</string>
     <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: сохранено"</string>
     <string name="label_go_key" msgid="1635148082137219148">"Поиск"</string>
     <string name="label_next_key" msgid="362972844525672568">"Далее"</string>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index 628f591..915fe14 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Zobraziť znaky pri stlačení klávesu"</string>
     <string name="general_category" msgid="1859088467017573195">"Všeobecné"</string>
     <string name="correction_category" msgid="2236750915056607613">"Oprava textu"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"Písanie gestami"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"Písanie gest"</string>
     <string name="misc_category" msgid="6894192814868233453">"Ďalšie možnosti"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Rozšírené nastavenia"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Možnosti pre odborníkov"</string>
@@ -61,7 +61,7 @@
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Veľmi agresívne"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Návrhy ďalšieho slova"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Návrhy podľa predchádzajúceho slova"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Povoliť písanie gestami"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Povoliť písanie gest"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Vkladanie slov prejdením prstom po písmenách"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Zobrazovať stopu gesta"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamická plávajúca ukážka"</string>
diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml
index 44106dd..e986a79 100644
--- a/java/res/values-sv/strings.xml
+++ b/java/res/values-sv/strings.xml
@@ -64,7 +64,7 @@
     <string name="gesture_input" msgid="826951152254563827">"Aktivera svepskrivning"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Skriv genom att dra från tecken till tecken utan att lyfta handen"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Visa spår efter rörelse"</string>
-    <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Visa ordförslag i skrivrörelse"</string>
+    <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Visa ordförslag vid svepskrivning"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Ordförslaget visas i rörelsen medan du skriver"</string>
     <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g>: sparat"</string>
     <string name="label_go_key" msgid="1635148082137219148">"Kör"</string>
diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml
index 0b002ff..18cd0af 100644
--- a/java/res/values-tl/strings.xml
+++ b/java/res/values-tl/strings.xml
@@ -31,7 +31,7 @@
     <string name="popup_on_keypress" msgid="123894815723512944">"Popup sa keypress"</string>
     <string name="general_category" msgid="1859088467017573195">"Pangkalahatan"</string>
     <string name="correction_category" msgid="2236750915056607613">"Pagwawasto ng teksto"</string>
-    <string name="gesture_typing_category" msgid="497263612130532630">"Pag-type gamit ang galaw"</string>
+    <string name="gesture_typing_category" msgid="497263612130532630">"Gesture na pag-type"</string>
     <string name="misc_category" msgid="6894192814868233453">"Iba pang mga pagpipilian"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Mga advanced na setting"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Mga pagpipilian para sa mga dalubhasa"</string>
@@ -61,7 +61,7 @@
     <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"Napaka-agresibo"</string>
     <string name="bigram_prediction" msgid="1084449187723948550">"Mga suhestiyon sa susunod na salita"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Gamitin ang nakaraang salita sa paggawa ng mga suhestiyon"</string>
-    <string name="gesture_input" msgid="826951152254563827">"Paganahin pag-type gamit galaw"</string>
+    <string name="gesture_input" msgid="826951152254563827">"Paganahin ang gesture na pag-type"</string>
     <string name="gesture_input_summary" msgid="9180350639305731231">"Mag-input ng salita sa pamamagitan ng pag-slide sa mga titik"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Ipakita ang trail ng galaw"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dynamic na floating preview"</string>
diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml
index f57615e..a57c58a 100644
--- a/java/res/values-tr/strings.xml
+++ b/java/res/values-tr/strings.xml
@@ -62,7 +62,7 @@
     <string name="bigram_prediction" msgid="1084449187723948550">"Sonraki kelime önerileri"</string>
     <string name="bigram_prediction_summary" msgid="3896362682751109677">"Önerilerde bulunurken önceki kelimeyi kullan"</string>
     <string name="gesture_input" msgid="826951152254563827">"Hareketle yazmayı etkinleştir"</string>
-    <string name="gesture_input_summary" msgid="9180350639305731231">"Harflerin üzerinden geçerek kelime gir"</string>
+    <string name="gesture_input_summary" msgid="9180350639305731231">"Harflerin üzerinden parmağınızı kaydırarak kelime girin"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Hareket izini göster"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Dinamik kayan önizleme"</string>
     <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Hareket sırasında önerilen kelimeyi göster"</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index 9aa1650..658a4c4 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -65,7 +65,7 @@
     <string name="gesture_input_summary" msgid="9180350639305731231">"Nhập từ bằng cách trượt qua các chữ cái"</string>
     <string name="gesture_preview_trail" msgid="3802333369335722221">"Hiển thị vệt cử chỉ"</string>
     <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Xem trước nổi động"</string>
-    <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Xem từ được đề xuất trong khi tạo cử chỉ"</string>
+    <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Xem từ được đề xuất trong khi dùng cử chỉ"</string>
     <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Đã lưu"</string>
     <string name="label_go_key" msgid="1635148082137219148">"Tìm"</string>
     <string name="label_next_key" msgid="362972844525672568">"Tiếp theo"</string>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 7e8c77e..72dcb0e 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -127,6 +127,25 @@
         <attr name="ignoreAltCodeKeyTimeout" format="integer" />
         <!-- More keys keyboard will shown at touched point. -->
         <attr name="showMoreKeysKeyboardAtTouchedPoint" format="boolean" />
+        <!-- Static threshold for gesture after fast typing (msec) -->
+        <attr name="gestureStaticTimeThresholdAfterFastTyping" format="integer" />
+        <!-- Static threshold for starting gesture detection (keyWidth%/sec) -->
+        <attr name="gestureDetectFastMoveSpeedThreshold" format="fraction" />
+        <!-- Dynamic threshold for gesture after fast typing (msec) -->
+        <attr name="gestureDynamicThresholdDecayDuration" format="integer" />
+        <!-- Time based threshold values for gesture detection (msec) -->
+        <attr name="gestureDynamicTimeThresholdFrom" format="integer" />
+        <attr name="gestureDynamicTimeThresholdTo" format="integer" />
+        <!-- Distance based threshold values for gesture detection (keyWidth%/sec) -->
+        <attr name="gestureDynamicDistanceThresholdFrom" format="fraction" />
+        <attr name="gestureDynamicDistanceThresholdTo" format="fraction" />
+        <!-- Parameter for gesture sampling (keyWidth%/sec) -->
+        <attr name="gestureSamplingMinimumDistance" format="fraction" />
+        <!-- Parameters for gesture recognition (msec) and (keyWidth%/sec) -->
+        <attr name="gestureRecognitionMinimumTime" format="integer" />
+        <attr name="gestureRecognitionSpeedThreshold" format="fraction" />
+        <!-- Suppress showing key preview duration after batch input in millisecond -->
+        <attr name="suppressKeyPreviewAfterBatchInputDuration" format="integer" />
     </declare-styleable>
 
     <declare-styleable name="SuggestionStripView">
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 8e2d43e..7c57f1f 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -69,6 +69,25 @@
     <!-- 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">false</bool>
+    <!-- Static threshold for gesture after fast typing (msec) -->
+    <integer name="config_gesture_static_time_threshold_after_fast_typing">1000</integer>
+    <!-- Static threshold for starting gesture detection (keyWidth%/sec) -->
+    <fraction name="config_gesture_detect_fast_move_speed_threshold">150%</fraction>
+    <!-- Dynamic threshold for gesture after fast typing (msec) -->
+    <integer name="config_gesture_dynamic_threshold_decay_duration">450</integer>
+    <!-- Time based threshold values for gesture detection (msec) -->
+    <integer name="config_gesture_dynamic_time_threshold_from">300</integer>
+    <integer name="config_gesture_dynamic_time_threshold_to">20</integer>
+    <!-- Distance based threshold values for gesture detection (keyWidth%/sec) -->
+    <fraction name="config_gesture_dynamic_distance_threshold_from">600%</fraction>
+    <fraction name="config_gesture_dynamic_distance_threshold_to">35%</fraction>
+    <!-- Parameter for gesture sampling (keyWidth%/sec) -->
+    <fraction name="config_gesture_sampling_minimum_distance">16.6666%</fraction>
+    <!-- Parameters for gesture recognition (msec) and (keyWidth%/sec) -->
+    <integer name="config_gesture_recognition_minimum_time">100</integer>
+    <fraction name="config_gesture_recognition_speed_threshold">550%</fraction>
+    <!-- Suppress showing key preview duration after batch input in millisecond -->
+    <integer name="config_suppress_key_preview_after_batch_input_duration">1000</integer>
     <!--
         Configuration for auto correction
      -->
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index 9d3d716..589962c 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -94,6 +94,18 @@
         <item name="languageOnSpacebarFadeoutAnimator">@anim/language_on_spacebar_fadeout</item>
         <item name="altCodeKeyWhileTypingFadeoutAnimator">@anim/alt_code_key_while_typing_fadeout</item>
         <item name="altCodeKeyWhileTypingFadeinAnimator">@anim/alt_code_key_while_typing_fadein</item>
+        <!-- Common attributes of MainKeyboardView for gesture typing detection and recognition -->
+        <item name="gestureStaticTimeThresholdAfterFastTyping">@integer/config_gesture_static_time_threshold_after_fast_typing</item>
+        <item name="gestureDetectFastMoveSpeedThreshold">@fraction/config_gesture_detect_fast_move_speed_threshold</item>
+        <item name="gestureDynamicThresholdDecayDuration">@integer/config_gesture_dynamic_threshold_decay_duration</item>
+        <item name="gestureDynamicTimeThresholdFrom">@integer/config_gesture_dynamic_time_threshold_from</item>
+        <item name="gestureDynamicTimeThresholdTo">@integer/config_gesture_dynamic_time_threshold_to</item>
+        <item name="gestureDynamicDistanceThresholdFrom">@fraction/config_gesture_dynamic_distance_threshold_from</item>
+        <item name="gestureDynamicDistanceThresholdTo">@fraction/config_gesture_dynamic_distance_threshold_to</item>
+        <item name="gestureSamplingMinimumDistance">@fraction/config_gesture_sampling_minimum_distance</item>
+        <item name="gestureRecognitionMinimumTime">@integer/config_gesture_recognition_minimum_time</item>
+        <item name="gestureRecognitionSpeedThreshold">@fraction/config_gesture_recognition_speed_threshold</item>
+        <item name="suppressKeyPreviewAfterBatchInputDuration">@integer/config_suppress_key_preview_after_batch_input_duration</item>
     </style>
     <style
         name="MainKeyboardView"
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index b41631e..20d7847 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -82,6 +82,17 @@
  * @attr ref R.styleable#MainKeyboardView_longPressShiftKeyTimeout
  * @attr ref R.styleable#MainKeyboardView_ignoreAltCodeKeyTimeout
  * @attr ref R.styleable#MainKeyboardView_showMoreKeysKeyboardAtTouchPoint
+ * @attr ref R.styleable#MainKeyboardView_gestureStaticTimeThresholdAfterFastTyping
+ * @attr ref R.styleable#MainKeyboardView_gestureDetectFastMoveSpeedThreshold
+ * @attr ref R.styleable#MainKeyboardView_gestureDynamicThresholdDecayDuration
+ * @attr ref R.styleable#MainKeyboardView_gestureDynamicTimeThresholdFrom
+ * @attr ref R.styleable#MainKeyboardView_gestureDynamicTimeThresholdTo
+ * @attr ref R.styleable#MainKeyboardView_gestureDynamicDistanceThresholdFrom
+ * @attr ref R.styleable#MainKeyboardView_gestureDynamicDistanceThresholdTo
+ * @attr ref R.styleable#MainKeyboardView_gestureSamplingMinimumDistance
+ * @attr ref R.styleable#MainKeyboardView_gestureRecognitionMinimumTime
+ * @attr ref R.styleable#MainKeyboardView_gestureRecognitionSpeedThreshold
+ * @attr ref R.styleable#MainKeyboardView_suppressKeyPreviewAfterBatchInputDuration
  */
 public final class MainKeyboardView extends KeyboardView implements PointerTracker.KeyEventHandler,
         SuddenJumpingTouchEventHandler.ProcessMotionEvent {
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index ad7d0a3..7aeddc2 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -23,6 +23,7 @@
 
 import com.android.inputmethod.accessibility.AccessibilityUtils;
 import com.android.inputmethod.keyboard.internal.GestureStroke;
+import com.android.inputmethod.keyboard.internal.GestureStroke.GestureStrokeParams;
 import com.android.inputmethod.keyboard.internal.GestureStrokeWithPreviewPoints;
 import com.android.inputmethod.keyboard.internal.PointerTrackerQueue;
 import com.android.inputmethod.latin.CollectionUtils;
@@ -47,9 +48,6 @@
     private static boolean sGestureHandlingEnabledByInputField = false;
     private static boolean sGestureHandlingEnabledByUser = false;
 
-    // TODO: Move this to resource.
-    private static final int SUPPRESS_KEY_PREVIEW_AFTER_LAST_BATCH_INPUT_DURATION = 1000; // msec
-
     public interface KeyEventHandler {
         /**
          * Get KeyDetector object that is used for this PointerTracker.
@@ -125,6 +123,7 @@
         public final int mTouchNoiseThresholdTime;
         public final float mTouchNoiseThresholdDistance;
         public final int mTouchNoiseThresholdDistanceSquared;
+        public final int mSuppressKeyPreviewAfterBatchInputDuration;
 
         public static final PointerTrackerParams DEFAULT = new PointerTrackerParams();
 
@@ -133,9 +132,10 @@
             mTouchNoiseThresholdTime = 0;
             mTouchNoiseThresholdDistance = 0.0f;
             mTouchNoiseThresholdDistanceSquared = 0;
+            mSuppressKeyPreviewAfterBatchInputDuration = 0;
         }
 
-        public PointerTrackerParams(TypedArray mainKeyboardViewAttr) {
+        public PointerTrackerParams(final TypedArray mainKeyboardViewAttr) {
             mSlidingKeyInputEnabled = mainKeyboardViewAttr.getBoolean(
                     R.styleable.MainKeyboardView_slidingKeyInputEnable, false);
             mTouchNoiseThresholdTime = mainKeyboardViewAttr.getInt(
@@ -145,11 +145,14 @@
             mTouchNoiseThresholdDistance = touchNouseThresholdDistance;
             mTouchNoiseThresholdDistanceSquared =
                     (int)(touchNouseThresholdDistance * touchNouseThresholdDistance);
+            mSuppressKeyPreviewAfterBatchInputDuration = mainKeyboardViewAttr.getInt(
+                    R.styleable.MainKeyboardView_suppressKeyPreviewAfterBatchInputDuration, 0);
         }
     }
 
     // Parameters for pointer handling.
     private static PointerTrackerParams sParams;
+    private static GestureStrokeParams sGestureStrokeParams;
     private static boolean sNeedsPhantomSuddenMoveEventHack;
 
     private static final ArrayList<PointerTracker> sTrackers = CollectionUtils.newArrayList();
@@ -168,13 +171,80 @@
     private boolean mIsDetectingGesture = false; // per PointerTracker.
     private static boolean sInGesture = false;
     private static long sGestureFirstDownTime;
-    private static long sLastBatchInputTime;
-    private static long sLastLetterTypingUpTime;
+    private static TimeRecorder sTimeRecorder;
     private static final InputPointers sAggregratedPointers = new InputPointers(
             GestureStroke.DEFAULT_CAPACITY);
     private static int sLastRecognitionPointSize = 0; // synchronized using sAggregratedPointers
     private static long sLastRecognitionTime = 0; // synchronized using sAggregratedPointers
 
+    static final class TimeRecorder {
+        private final int mSuppressKeyPreviewAfterBatchInputDuration;
+        private final int mStaticTimeThresholdAfterFastTyping; // msec
+        private long mLastTypingTime;
+        private long mLastLetterTypingTime;
+        private long mLastBatchInputTime;
+
+        public TimeRecorder(final PointerTrackerParams pointerTrackerParams,
+                final GestureStrokeParams gestureStrokeParams) {
+            mSuppressKeyPreviewAfterBatchInputDuration =
+                    pointerTrackerParams.mSuppressKeyPreviewAfterBatchInputDuration;
+            mStaticTimeThresholdAfterFastTyping =
+                    gestureStrokeParams.mStaticTimeThresholdAfterFastTyping;
+        }
+
+        private void recordTyping(final long eventTime) {
+            mLastTypingTime = eventTime;
+        }
+
+        private void recordLetterTyping(final long eventTime) {
+            mLastLetterTypingTime = eventTime;
+            // Reset gesture typing time
+            mLastBatchInputTime = 0;
+        }
+
+        private void recordGestureTyping(final long eventTime) {
+            mLastBatchInputTime = eventTime;
+            // Reset typing time.
+            mLastTypingTime = 0;
+        }
+
+        private boolean isInTyping() {
+            return mLastTypingTime != 0;
+        }
+
+        private boolean isInBatchInput() {
+            return mLastBatchInputTime != 0;
+        }
+
+        public void onCodeInput(final int code, final long eventTime) {
+            if (Keyboard.isLetterCode(code) && code != Keyboard.CODE_SPACE) {
+                if (isInTyping()
+                        && eventTime - mLastTypingTime < mStaticTimeThresholdAfterFastTyping) {
+                    recordLetterTyping(eventTime);
+                }
+            } else {
+                if (eventTime - mLastLetterTypingTime < mStaticTimeThresholdAfterFastTyping) {
+                    // This non-letter typing should be treated as a part of fast typing.
+                    recordLetterTyping(eventTime);
+                }
+            }
+            recordTyping(eventTime);
+        }
+
+        public void onEndBatchInput(final long eventTime) {
+            recordGestureTyping(eventTime);
+        }
+
+        public long getLastLetterTypingTime() {
+            return mLastLetterTypingTime;
+        }
+
+        public boolean needsToSuppressKeyPreviewPopup(final long eventTime) {
+            return !isInTyping() && isInBatchInput()
+                    && eventTime - mLastBatchInputTime < mSuppressKeyPreviewAfterBatchInputDuration;
+        }
+    }
+
     // The position and time at which first down event occurred.
     private long mDownTime;
     private long mUpTime;
@@ -222,10 +292,14 @@
         }
         sNeedsPhantomSuddenMoveEventHack = needsPhantomSuddenMoveEventHack;
         sParams = PointerTrackerParams.DEFAULT;
+        sGestureStrokeParams = GestureStrokeParams.DEFAULT;
+        sTimeRecorder = new TimeRecorder(sParams, sGestureStrokeParams);
     }
 
     public static void setParameters(final TypedArray mainKeyboardViewAttr) {
         sParams = new PointerTrackerParams(mainKeyboardViewAttr);
+        sGestureStrokeParams = new GestureStrokeParams(mainKeyboardViewAttr);
+        sTimeRecorder = new TimeRecorder(sParams, sGestureStrokeParams);
     }
 
     private static void updateGestureHandlingMode() {
@@ -296,7 +370,8 @@
             throw new NullPointerException();
         }
         mPointerId = id;
-        mGestureStrokeWithPreviewPoints = new GestureStrokeWithPreviewPoints(id);
+        mGestureStrokeWithPreviewPoints = new GestureStrokeWithPreviewPoints(
+                id, sGestureStrokeParams);
         setKeyDetectorInner(handler.getKeyDetector());
         mListener = handler.getKeyboardActionListener();
         mDrawingProxy = handler.getDrawingProxy();
@@ -331,7 +406,7 @@
     // Note that we need primaryCode argument because the keyboard may in shifted state and the
     // primaryCode is different from {@link Key#mCode}.
     private void callListenerOnCodeInput(final Key key, final int primaryCode, final int x,
-            final int y) {
+            final int y, final long eventTime) {
         final boolean ignoreModifierKey = mIgnoreModifierKey && key.isModifier();
         final boolean altersCode = key.altCodeWhileTyping() && mTimerProxy.isTypingState();
         final int code = altersCode ? key.getAltCode() : primaryCode;
@@ -351,7 +426,7 @@
         }
         // Even if the key is disabled, it should respond if it is in the altCodeWhileTyping state.
         if (key.isEnabled() || altersCode) {
-            sLastBatchInputTime = 0; // reset time
+            sTimeRecorder.onCodeInput(code, eventTime);
             if (code == Keyboard.CODE_OUTPUT_TEXT) {
                 mListener.onTextInput(key.getOutputText());
             } else if (code != Keyboard.CODE_UNSPECIFIED) {
@@ -466,10 +541,7 @@
 
     private static boolean needsToSuppressKeyPreviewPopup(final long eventTime) {
         if (!sShouldHandleGesture) return false;
-        if (sLastBatchInputTime == 0) return false;
-        final long elapsedTimeAfterTheLastBatchInput = eventTime - sLastBatchInputTime;
-        return elapsedTimeAfterTheLastBatchInput
-                < SUPPRESS_KEY_PREVIEW_AFTER_LAST_BATCH_INPUT_DURATION;
+        return sTimeRecorder.needsToSuppressKeyPreviewPopup(eventTime);
     }
 
     private void setPressedKeyGraphics(final Key key, final long eventTime) {
@@ -587,10 +659,11 @@
     private void mayUpdateBatchInput(final long eventTime, final Key key) {
         if (key != null) {
             synchronized (sAggregratedPointers) {
-                mGestureStrokeWithPreviewPoints.appendIncrementalBatchPoints(sAggregratedPointers);
+                final GestureStroke stroke = mGestureStrokeWithPreviewPoints;
+                stroke.appendIncrementalBatchPoints(sAggregratedPointers);
                 final int size = sAggregratedPointers.getPointerSize();
                 if (size > sLastRecognitionPointSize
-                        && GestureStroke.hasRecognitionTimePast(eventTime, sLastRecognitionTime)) {
+                        && stroke.hasRecognitionTimePast(eventTime, sLastRecognitionTime)) {
                     sLastRecognitionPointSize = size;
                     sLastRecognitionTime = eventTime;
                     if (DEBUG_LISTENER) {
@@ -614,7 +687,7 @@
                             mPointerId, sAggregratedPointers.getPointerSize()));
                 }
                 sInGesture = false;
-                sLastBatchInputTime = eventTime;
+                sTimeRecorder.onEndBatchInput(eventTime);
                 mListener.onEndBatchInput(sAggregratedPointers);
             }
         }
@@ -692,7 +765,7 @@
                 sGestureFirstDownTime = eventTime;
             }
             mGestureStrokeWithPreviewPoints.onDownEvent(x, y, eventTime, sGestureFirstDownTime,
-                    sLastLetterTypingUpTime);
+                    sTimeRecorder.getLastLetterTypingTime());
         }
     }
 
@@ -933,11 +1006,7 @@
             return;
         }
         if (currentKey != null && !currentKey.isRepeatable()) {
-            detectAndSendKey(currentKey, mKeyX, mKeyY);
-            final int code = currentKey.mCode;
-            if (Keyboard.isLetterCode(code) && code != Keyboard.CODE_SPACE) {
-                sLastLetterTypingUpTime = eventTime;
-            }
+            detectAndSendKey(currentKey, mKeyX, mKeyY, eventTime);
         }
     }
 
@@ -988,7 +1057,7 @@
 
     public void onRegisterKey(final Key key) {
         if (key != null) {
-            detectAndSendKey(key, key.mX, key.mY);
+            detectAndSendKey(key, key.mX, key.mY, SystemClock.uptimeMillis());
             mTimerProxy.startTypingStateTimer(key);
         }
     }
@@ -1014,14 +1083,14 @@
         }
     }
 
-    private void detectAndSendKey(final Key key, final int x, final int y) {
+    private void detectAndSendKey(final Key key, final int x, final int y, final long eventTime) {
         if (key == null) {
             callListenerOnCancelInput();
             return;
         }
 
         final int code = key.mCode;
-        callListenerOnCodeInput(key, code, x, y);
+        callListenerOnCodeInput(key, code, x, y, eventTime);
         callListenerOnRelease(key, code, false);
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
index c0e92df..9b1a201 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
@@ -14,10 +14,13 @@
 
 package com.android.inputmethod.keyboard.internal;
 
+import android.content.res.TypedArray;
 import android.util.Log;
 
 import com.android.inputmethod.latin.InputPointers;
+import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.ResizableIntArray;
+import com.android.inputmethod.latin.ResourceUtils;
 
 public class GestureStroke {
     private static final String TAG = GestureStroke.class.getSimpleName();
@@ -31,6 +34,8 @@
     private final ResizableIntArray mXCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
     private final ResizableIntArray mYCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
 
+    private final GestureStrokeParams mParams;
+
     private int mKeyWidth; // pixel
     // Static threshold for starting gesture detection
     private int mDetectFastMoveSpeedThreshold; // pixel /sec
@@ -51,53 +56,100 @@
     private int mIncrementalRecognitionSize;
     private int mLastIncrementalBatchSize;
 
-    // TODO: Move some of these to resource.
+    public static final class GestureStrokeParams {
+        // Static threshold for gesture after fast typing
+        public final int mStaticTimeThresholdAfterFastTyping; // msec
+        // Static threshold for starting gesture detection
+        public final float mDetectFastMoveSpeedThreshold; // keyWidth/sec
+        // Dynamic threshold for gesture after fast typing
+        public final int mDynamicThresholdDecayDuration; // msec
+        // Time based threshold values
+        public final int mDynamicTimeThresholdFrom; // msec
+        public final int mDynamicTimeThresholdTo; // msec
+        // Distance based threshold values
+        public final float mDynamicDistanceThresholdFrom; // keyWidth
+        public final float mDynamicDistanceThresholdTo; // keyWidth
+        // Parameters for gesture sampling
+        public final float mSamplingMinimumDistance; // keyWidth
+        // Parameters for gesture recognition
+        public final int mRecognitionMinimumTime; // msec
+        public final float mRecognitionSpeedThreshold; // keyWidth/sec
 
-    // Static threshold for gesture after fast typing
-    public static final int GESTURE_STATIC_TIME_THRESHOLD_AFTER_FAST_TYPING = 350; // msec
+        // Default GestureStroke parameters for test.
+        public static final GestureStrokeParams FOR_TEST = new GestureStrokeParams();
+        public static final GestureStrokeParams DEFAULT = FOR_TEST;
 
-    // Static threshold for starting gesture detection
-    private static final float DETECT_FAST_MOVE_SPEED_THRESHOLD = 1.5f; // keyWidth / sec
+        private GestureStrokeParams() {
+            // These parameter values are default and intended for testing.
+            mStaticTimeThresholdAfterFastTyping = 350; // msec
+            mDetectFastMoveSpeedThreshold = 1.5f; // keyWidth / sec
+            mDynamicThresholdDecayDuration = 450; // msec
+            mDynamicTimeThresholdFrom = 300; // msec
+            mDynamicTimeThresholdTo = 20; // msec
+            mDynamicDistanceThresholdFrom = 6.0f; // keyWidth
+            mDynamicDistanceThresholdTo = 0.35f; // keyWidth
+            // The following parameters' change will affect the result of regression test.
+            mSamplingMinimumDistance = 1.0f / 6.0f; // keyWidth
+            mRecognitionMinimumTime = 100; // msec
+            mRecognitionSpeedThreshold = 5.5f; // keyWidth / sec
+        }
 
-    // Dynamic threshold for gesture after fast typing
-    private static final int GESTURE_DYNAMIC_THRESHOLD_DECAY_DURATION = 450; // msec
-    // Time based threshold values
-    private static final int GESTURE_DYNAMIC_TIME_THRESHOLD_FROM = 300; // msec
-    private static final int GESTURE_DYNAMIC_TIME_THRESHOLD_TO = 20; // msec
-    // Distance based threshold values
-    private static final float GESTURE_DYNAMIC_DISTANCE_THRESHOLD_FROM = 6.0f; // keyWidth
-    private static final float GESTURE_DYNAMIC_DISTANCE_THRESHOLD_TO = 0.35f; // keyWidth
-
-    // Parameters for gesture sampling
-    private static final float GESTURE_SAMPLING_MINIMUM_DISTANCE = 1.0f / 6.0f; // keyWidth
-
-    // Parameters for gesture recognition
-    private static final int GESTURE_RECOGNITION_MINIMUM_TIME = 100; // msec
-    private static final float GESTURE_RECOGNITION_SPEED_THRESHOLD = 5.5f; // keyWidth / sec
+        public GestureStrokeParams(final TypedArray mainKeyboardViewAttr) {
+            mStaticTimeThresholdAfterFastTyping = mainKeyboardViewAttr.getInt(
+                    R.styleable.MainKeyboardView_gestureStaticTimeThresholdAfterFastTyping,
+                    DEFAULT.mStaticTimeThresholdAfterFastTyping);
+            mDetectFastMoveSpeedThreshold = ResourceUtils.getFraction(mainKeyboardViewAttr,
+                    R.styleable.MainKeyboardView_gestureDetectFastMoveSpeedThreshold,
+                    DEFAULT.mDetectFastMoveSpeedThreshold);
+            mDynamicThresholdDecayDuration = mainKeyboardViewAttr.getInt(
+                    R.styleable.MainKeyboardView_gestureDynamicThresholdDecayDuration,
+                    DEFAULT.mDynamicThresholdDecayDuration);
+            mDynamicTimeThresholdFrom = mainKeyboardViewAttr.getInt(
+                    R.styleable.MainKeyboardView_gestureDynamicTimeThresholdFrom,
+                    DEFAULT.mDynamicTimeThresholdFrom);
+            mDynamicTimeThresholdTo = mainKeyboardViewAttr.getInt(
+                    R.styleable.MainKeyboardView_gestureDynamicTimeThresholdTo,
+                    DEFAULT.mDynamicTimeThresholdTo);
+            mDynamicDistanceThresholdFrom = ResourceUtils.getFraction(mainKeyboardViewAttr,
+                    R.styleable.MainKeyboardView_gestureDynamicDistanceThresholdFrom,
+                    DEFAULT.mDynamicDistanceThresholdFrom);
+            mDynamicDistanceThresholdTo = ResourceUtils.getFraction(mainKeyboardViewAttr,
+                    R.styleable.MainKeyboardView_gestureDynamicDistanceThresholdTo,
+                    DEFAULT.mDynamicDistanceThresholdTo);
+            mSamplingMinimumDistance = ResourceUtils.getFraction(mainKeyboardViewAttr,
+                    R.styleable.MainKeyboardView_gestureSamplingMinimumDistance,
+                    DEFAULT.mSamplingMinimumDistance);
+            mRecognitionMinimumTime = mainKeyboardViewAttr.getInt(
+                    R.styleable.MainKeyboardView_gestureRecognitionMinimumTime,
+                    DEFAULT.mRecognitionMinimumTime);
+            mRecognitionSpeedThreshold = ResourceUtils.getFraction(mainKeyboardViewAttr,
+                    R.styleable.MainKeyboardView_gestureRecognitionSpeedThreshold,
+                    DEFAULT.mRecognitionSpeedThreshold);
+        }
+    }
 
     private static final int MSEC_PER_SEC = 1000;
 
-    public GestureStroke(final int pointerId) {
+    public GestureStroke(final int pointerId, final GestureStrokeParams params) {
         mPointerId = pointerId;
+        mParams = params;
     }
 
     public void setKeyboardGeometry(final int keyWidth) {
         mKeyWidth = keyWidth;
         // TODO: Find an appropriate base metric for these length. Maybe diagonal length of the key?
-        mDetectFastMoveSpeedThreshold = (int)(keyWidth * DETECT_FAST_MOVE_SPEED_THRESHOLD);
+        mDetectFastMoveSpeedThreshold = (int)(keyWidth * mParams.mDetectFastMoveSpeedThreshold);
         mGestureDynamicDistanceThresholdFrom =
-                (int)(keyWidth * GESTURE_DYNAMIC_DISTANCE_THRESHOLD_FROM);
-        mGestureDynamicDistanceThresholdTo =
-                (int)(keyWidth * GESTURE_DYNAMIC_DISTANCE_THRESHOLD_TO);
-        mGestureSamplingMinimumDistance = (int)(keyWidth * GESTURE_SAMPLING_MINIMUM_DISTANCE);
-        mGestureRecognitionSpeedThreshold =
-                (int)(keyWidth * GESTURE_RECOGNITION_SPEED_THRESHOLD);
+                (int)(keyWidth * mParams.mDynamicDistanceThresholdFrom);
+        mGestureDynamicDistanceThresholdTo = (int)(keyWidth * mParams.mDynamicDistanceThresholdTo);
+        mGestureSamplingMinimumDistance = (int)(keyWidth * mParams.mSamplingMinimumDistance);
+        mGestureRecognitionSpeedThreshold = (int)(keyWidth * mParams.mRecognitionSpeedThreshold);
         if (DEBUG) {
             Log.d(TAG, String.format(
                     "[%d] setKeyboardGeometry: keyWidth=%3d tT=%3d >> %3d tD=%3d >> %3d",
                     mPointerId, keyWidth,
-                    GESTURE_DYNAMIC_TIME_THRESHOLD_FROM,
-                    GESTURE_DYNAMIC_TIME_THRESHOLD_TO,
+                    mParams.mDynamicTimeThresholdFrom,
+                    mParams.mDynamicTimeThresholdTo,
                     mGestureDynamicDistanceThresholdFrom,
                     mGestureDynamicDistanceThresholdTo));
         }
@@ -107,7 +159,7 @@
             final long gestureFirstDownTime, final long lastTypingTime) {
         reset();
         final long elapsedTimeAfterTyping = downTime - lastTypingTime;
-        if (elapsedTimeAfterTyping < GESTURE_STATIC_TIME_THRESHOLD_AFTER_FAST_TYPING) {
+        if (elapsedTimeAfterTyping < mParams.mStaticTimeThresholdAfterFastTyping) {
             mAfterFastTyping = true;
         }
         if (DEBUG) {
@@ -119,23 +171,23 @@
     }
 
     private int getGestureDynamicDistanceThreshold(final int deltaTime) {
-        if (!mAfterFastTyping || deltaTime >= GESTURE_DYNAMIC_THRESHOLD_DECAY_DURATION) {
+        if (!mAfterFastTyping || deltaTime >= mParams.mDynamicThresholdDecayDuration) {
             return mGestureDynamicDistanceThresholdTo;
         }
         final int decayedThreshold =
                 (mGestureDynamicDistanceThresholdFrom - mGestureDynamicDistanceThresholdTo)
-                * deltaTime / GESTURE_DYNAMIC_THRESHOLD_DECAY_DURATION;
+                * deltaTime / mParams.mDynamicThresholdDecayDuration;
         return mGestureDynamicDistanceThresholdFrom - decayedThreshold;
     }
 
     private int getGestureDynamicTimeThreshold(final int deltaTime) {
-        if (!mAfterFastTyping || deltaTime >= GESTURE_DYNAMIC_THRESHOLD_DECAY_DURATION) {
-            return GESTURE_DYNAMIC_TIME_THRESHOLD_TO;
+        if (!mAfterFastTyping || deltaTime >= mParams.mDynamicThresholdDecayDuration) {
+            return mParams.mDynamicTimeThresholdTo;
         }
         final int decayedThreshold =
-                (GESTURE_DYNAMIC_TIME_THRESHOLD_FROM - GESTURE_DYNAMIC_TIME_THRESHOLD_TO)
-                * deltaTime / GESTURE_DYNAMIC_THRESHOLD_DECAY_DURATION;
-        return GESTURE_DYNAMIC_TIME_THRESHOLD_FROM - decayedThreshold;
+                (mParams.mDynamicTimeThresholdFrom - mParams.mDynamicTimeThresholdTo)
+                * deltaTime / mParams.mDynamicThresholdDecayDuration;
+        return mParams.mDynamicTimeThresholdFrom - decayedThreshold;
     }
 
     public boolean isStartOfAGesture() {
@@ -249,9 +301,9 @@
         }
     }
 
-    public static final boolean hasRecognitionTimePast(
+    public final boolean hasRecognitionTimePast(
             final long currentTime, final long lastRecognitionTime) {
-        return currentTime > lastRecognitionTime + GESTURE_RECOGNITION_MINIMUM_TIME;
+        return currentTime > lastRecognitionTime + mParams.mRecognitionMinimumTime;
     }
 
     public void appendAllBatchPoints(final InputPointers out) {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java
index 05e0a2e..8192c90 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java
@@ -33,8 +33,8 @@
     // TODO: Move this to resource.
     private static final float MIN_PREVIEW_SAMPLE_LENGTH_RATIO_TO_KEY_WIDTH = 0.1f;
 
-    public GestureStrokeWithPreviewPoints(final int pointerId) {
-        super(pointerId);
+    public GestureStrokeWithPreviewPoints(final int pointerId, final GestureStrokeParams params) {
+        super(pointerId, params);
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
index 0b11594..46b363c 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
@@ -200,6 +200,7 @@
                 outputStream.flush();
                 outputStream.close();
                 final File finalFile = new File(finalFileName);
+                finalFile.delete();
                 if (!outputFile.renameTo(finalFile)) {
                     throw new IOException("Can't move the file to its final name");
                 }
diff --git a/native/jni/src/correction.cpp b/native/jni/src/correction.cpp
index 49e3e3c..524abe9 100644
--- a/native/jni/src/correction.cpp
+++ b/native/jni/src/correction.cpp
@@ -764,13 +764,23 @@
         }
     }
 
+    int additionalProximityCount = 0;
+    // Demote additional proximity characters
+    for (int i = 0; i < outputLength; ++i) {
+        const int squaredDistance = correction->mDistances[i];
+        if (squaredDistance == ADDITIONAL_PROXIMITY_CHAR_DISTANCE_INFO) {
+            ++additionalProximityCount;
+        }
+    }
+
     const bool performTouchPositionCorrection =
             CALIBRATE_SCORE_BY_TOUCH_COORDINATES
                     && proximityInfoState->touchPositionCorrectionEnabled()
-                    && skippedCount == 0 && excessiveCount == 0 && transposedCount == 0;
+                    && skippedCount == 0 && excessiveCount == 0 && transposedCount == 0
+                    && additionalProximityCount == 0;
+
     // Score calibration by touch coordinates is being done only for pure-fat finger typing error
     // cases.
-    int additionalProximityCount = 0;
     // TODO: Remove this constraint.
     if (performTouchPositionCorrection) {
         for (int i = 0; i < outputLength; ++i) {
@@ -789,9 +799,9 @@
                 const float x = static_cast<float>(squaredDistance)
                         / ProximityInfoState::NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR;
                 const float factor = max((x < R1)
-                    ? (A * (R1 - x) + B * x) / R1
-                    : (B * (R2 - x) + C * (x - R1)) / (R2 - R1), MIN);
-                // factor is piecewise linear function like:
+                        ? (A * (R1 - x) + B * x) / R1
+                        : (B * (R2 - x) + C * (x - R1)) / (R2 - R1), MIN);
+                // factor is a piecewise linear function like:
                 // A -_                  .
                 //     ^-_               .
                 // B      \              .
@@ -799,22 +809,12 @@
                 // C         ------------.
                 //                       .
                 // 0   R1 R2             .
-                multiplyRate((int)(factor * 100), &finalFreq);
+                multiplyRate((int)(factor * 100.0f), &finalFreq);
             } else if (squaredDistance == PROXIMITY_CHAR_WITHOUT_DISTANCE_INFO) {
                 multiplyRate(WORDS_WITH_PROXIMITY_CHARACTER_DEMOTION_RATE, &finalFreq);
-            } else if (squaredDistance == ADDITIONAL_PROXIMITY_CHAR_DISTANCE_INFO) {
-                ++additionalProximityCount;
-                multiplyRate(WORDS_WITH_ADDITIONAL_PROXIMITY_CHARACTER_DEMOTION_RATE, &finalFreq);
             }
         }
     } else {
-        // Demote additional proximity characters
-        for (int i = 0; i < outputLength; ++i) {
-            const int squaredDistance = correction->mDistances[i];
-            if (squaredDistance == ADDITIONAL_PROXIMITY_CHAR_DISTANCE_INFO) {
-                ++additionalProximityCount;
-            }
-        }
         // Promotion for a word with proximity characters
         for (int i = 0; i < adjustedProximityMatchedCount; ++i) {
             // A word with proximity corrections