merge in jb-release history after reset to jb-dev
diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml
index b015e21..34ad0a4 100644
--- a/java/res/values-es-rUS/strings.xml
+++ b/java/res/values-es-rUS/strings.xml
@@ -93,8 +93,7 @@
     <string name="spoken_description_mic" msgid="615536748882611950">"Entrada de voz"</string>
     <string name="spoken_description_smiley" msgid="2256309826200113918">"Carita sonriente"</string>
     <string name="spoken_description_return" msgid="8178083177238315647">"Volver"</string>
-    <!-- no translation found for spoken_description_search (1247236163755920808) -->
-    <skip />
+    <string name="spoken_description_search" msgid="1247236163755920808">"Buscar"</string>
     <string name="spoken_description_dot" msgid="40711082435231673">"Punto"</string>
     <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Se activó el modo Mayúscula."</string>
     <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Se activó el bloqueo de mayúsculas."</string>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 05ad4bd..bca755d 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -93,8 +93,7 @@
     <string name="spoken_description_mic" msgid="615536748882611950">"Intrare vocală"</string>
     <string name="spoken_description_smiley" msgid="2256309826200113918">"Faţă zâmbitoare"</string>
     <string name="spoken_description_return" msgid="8178083177238315647">"Enter"</string>
-    <!-- no translation found for spoken_description_search (1247236163755920808) -->
-    <skip />
+    <string name="spoken_description_search" msgid="1247236163755920808">"Căutaţi"</string>
     <string name="spoken_description_dot" msgid="40711082435231673">"Punct"</string>
     <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Tasta Shift a fost activată"</string>
     <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Tasta Caps Lock a fost activată"</string>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 49889fc..884491c 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -29,7 +29,7 @@
     <string name="android_spell_checker_settings" msgid="5822324635435443689">"Налаштування перевірки орфографії"</string>
     <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Шукати імена контактів"</string>
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Програма перевірки правопису використ. записи зі списку контактів"</string>
-    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вібр при натиску клав."</string>
+    <string name="vibrate_on_keypress" msgid="5258079494276955460">"Вібр. при натисканні клавіш"</string>
     <string name="sound_on_keypress" msgid="6093592297198243644">"Звук при натиску клав."</string>
     <string name="popup_on_keypress" msgid="123894815723512944">"Сплив. при нат.клав."</string>
     <string name="general_category" msgid="1859088467017573195">"Загальні"</string>
@@ -58,9 +58,9 @@
     <string name="auto_correction" msgid="4979925752001319458">"Автомат. виправлення"</string>
     <string name="auto_correction_summary" msgid="5625751551134658006">"Пробіл і пунктуація автоматично виправляють слова з помилками"</string>
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Вимк."</string>
-    <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="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_suggestion" msgid="8169311444438922902">"Пропозиції наступного слова"</string>
     <string name="bigram_suggestion_summary" msgid="6635527607242625713">"Використати попереднє слово для покращення пропозицій"</string>
     <string name="bigram_prediction" msgid="3216364899483135294">"Передбачення наступного слова"</string>
@@ -134,7 +134,7 @@
     <string name="remove" msgid="4486081658752944606">"Видалити"</string>
     <string name="save" msgid="7646738597196767214">"Зберегти"</string>
     <string name="subtype_locale" msgid="8576443440738143764">"Мова"</string>
-    <string name="keyboard_layout_set" msgid="4309233698194565609">"Макет"</string>
+    <string name="keyboard_layout_set" msgid="4309233698194565609">"Розкладка"</string>
     <string name="custom_input_style_note_message" msgid="8826731320846363423">"Щоб використовувати користувацький стиль введення, його потрібно ввімкнути. Увімкнути його?"</string>
     <string name="enable" msgid="5031294444630523247">"Увімкнути"</string>
     <string name="not_now" msgid="6172462888202790482">"Не зараз"</string>
diff --git a/java/res/xml-sw600dp/row_dvorak4.xml b/java/res/xml-sw600dp/row_dvorak4.xml
index 47cee45..969cc14 100644
--- a/java/res/xml-sw600dp/row_dvorak4.xml
+++ b/java/res/xml-sw600dp/row_dvorak4.xml
@@ -23,7 +23,7 @@
 >
     <Row
         latin:keyWidth="9.0%p"
-        backgroundType="functional"
+        latin:backgroundType="functional"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
diff --git a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
index a73e71b..9c54e0b 100644
--- a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
@@ -134,13 +134,13 @@
             SharedPreferences sp) {
         super(context, dicTypeId);
         mLocale = locale;
+        mPrefs = sp;
         if (sOpenHelper == null) {
             sOpenHelper = new DatabaseHelper(getContext());
         }
         if (mLocale != null && mLocale.length() > 1) {
             loadDictionary();
         }
-        mPrefs = sp;
     }
 
     @Override
@@ -229,6 +229,7 @@
     public void loadDictionaryAsync() {
         synchronized(mBigramList) {
             final long last = SettingsValues.getLastUserHistoryWriteTime(mPrefs, mLocale);
+            final boolean initializing = last == 0;
             final long now = System.currentTimeMillis();
             // Load the words that correspond to the current input locale
             final Cursor cursor = query(MAIN_COLUMN_LOCALE + "=?", new String[] { mLocale });
@@ -253,7 +254,8 @@
                         } else if (word1.length() < BinaryDictionary.MAX_WORD_LENGTH
                                 && word2.length() < BinaryDictionary.MAX_WORD_LENGTH) {
                             super.setBigramAndGetFrequency(
-                                    word1, word2, new ForgettingCurveParams(fc, now, last));
+                                    word1, word2, initializing ? new ForgettingCurveParams(true)
+                                            : new ForgettingCurveParams(fc, now, last));
                         }
                         mBigramList.addBigram(word1, word2, (byte)fc);
                         cursor.moveToNext();
diff --git a/java/src/com/android/inputmethod/latin/UserHistoryForgettingCurveUtils.java b/java/src/com/android/inputmethod/latin/UserHistoryForgettingCurveUtils.java
index 9cd8c67..e5516dc 100644
--- a/java/src/com/android/inputmethod/latin/UserHistoryForgettingCurveUtils.java
+++ b/java/src/com/android/inputmethod/latin/UserHistoryForgettingCurveUtils.java
@@ -30,6 +30,7 @@
     private static final long ELAPSED_TIME_INTERVAL_MILLIS = ELAPSED_TIME_INTERVAL_HOURS
             * DateUtils.HOUR_IN_MILLIS;
     private static final int HALF_LIFE_HOURS = 48;
+    private static final int MAX_PUSH_ELAPSED = (FC_LEVEL_MAX + 1) * (ELAPSED_TIME_MAX + 1);
 
     private UserHistoryForgettingCurveUtils() {
         // This utility class is not publicly instantiable.
@@ -94,6 +95,11 @@
             if (elapsedTimeCount <= 0) {
                 return;
             }
+            if (elapsedTimeCount >= MAX_PUSH_ELAPSED) {
+                mLastTouchedTime = now;
+                mFc = 0;
+                return;
+            }
             for (int i = 0; i < elapsedTimeCount; ++i) {
                 mLastTouchedTime += ELAPSED_TIME_INTERVAL_MILLIS;
                 mFc = pushElapsedTime(mFc);