diff --git a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
index a73e71bb29516000ac3228377837b2ee93c68a0b..61b012f2dfd9e8682daf670564af37eca7832c0c 100644
--- a/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserHistoryDictionary.java
@@ -229,6 +229,7 @@ public class UserHistoryDictionary extends ExpandableDictionary {
     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 @@ public class UserHistoryDictionary extends ExpandableDictionary {
                         } 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 9cd8c67787c6386d9ad6736b9b4f3ba75f95f515..e5516dc628bdd3caf471f3e45d0205f009f60a17 100644
--- a/java/src/com/android/inputmethod/latin/UserHistoryForgettingCurveUtils.java
+++ b/java/src/com/android/inputmethod/latin/UserHistoryForgettingCurveUtils.java
@@ -30,6 +30,7 @@ public class UserHistoryForgettingCurveUtils {
     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 @@ public class UserHistoryForgettingCurveUtils {
             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);