diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index 9d8bdb2..9d30ccd 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -107,6 +107,10 @@
 
     Locale getLocale();
 
+    boolean usesContacts();
+
+    String getAccount();
+
     void resetDictionaries(
             final Context context,
             final Locale newLocale,
@@ -162,7 +166,7 @@
 
     boolean isValidSuggestionWord(final String word);
 
-    void clearUserHistoryDictionary(final Context context);
+    boolean clearUserHistoryDictionary(final Context context);
 
     String dump(final Context context);
 
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
index 6508eb2..6649d55 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
@@ -234,6 +234,16 @@
         return mDictionaryGroup.mLocale;
     }
 
+    @Override
+    public boolean usesContacts() {
+        return mDictionaryGroup.getSubDict(Dictionary.TYPE_CONTACTS) != null;
+    }
+
+    @Override
+    public String getAccount() {
+        return null;
+    }
+
     @Nullable
     private static ExpandableBinaryDictionary getSubDict(final String dictType,
             final Context context, final Locale locale, final File dictFile,
@@ -660,16 +670,18 @@
         return maxFreq;
     }
 
-    private void clearSubDictionary(final String dictName) {
+    private boolean clearSubDictionary(final String dictName) {
         final ExpandableBinaryDictionary dictionary = mDictionaryGroup.getSubDict(dictName);
-        if (dictionary != null) {
-            dictionary.clear();
+        if (dictionary == null) {
+            return false;
         }
+        dictionary.clear();
+        return true;
     }
 
     @Override
-    public void clearUserHistoryDictionary(final Context context) {
-        clearSubDictionary(Dictionary.TYPE_USER_HISTORY);
+    public boolean clearUserHistoryDictionary(final Context context) {
+        return clearSubDictionary(Dictionary.TYPE_USER_HISTORY);
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
index a093ec6..26c5e00 100644
--- a/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
+++ b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
@@ -29,13 +29,14 @@
 import android.view.inputmethod.InputMethodManager;
 import android.view.inputmethod.InputMethodSubtype;
 
-import com.android.inputmethod.dictionarypack.CommonPreferences;
 import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
 import com.android.inputmethod.latin.settings.Settings;
 import com.android.inputmethod.latin.setup.SetupActivity;
 import com.android.inputmethod.latin.utils.UncachedInputMethodManagerUtils;
 
+import java.util.Locale;
+
 /**
  * This class detects the {@link Intent#ACTION_MY_PACKAGE_REPLACED} broadcast intent when this IME
  * package has been replaced by a newer version of the same package. This class also detects
@@ -76,6 +77,22 @@
             richImm.setAdditionalInputMethodSubtypes(additionalSubtypes);
             toggleAppIcon(context);
             downloadLatestDictionaries(context);
+            // TODO: This is only for dogfood builds. Remove this from the final release.
+            DictionaryFacilitator keyboardFacilitator =
+                    DictionaryFacilitatorProvider.getDictionaryFacilitator(false);
+            boolean historyCleared = keyboardFacilitator.clearUserHistoryDictionary(context);
+            Locale keyboardLocale = keyboardFacilitator.getLocale();
+            if (historyCleared && keyboardLocale != null) {
+                keyboardFacilitator.resetDictionaries(
+                        context,
+                        keyboardLocale,
+                        keyboardFacilitator.usesContacts(),
+                        true /* history */,
+                        true /* force */,
+                        keyboardFacilitator.getAccount(),
+                        "" /* prefix */,
+                        null /* listener */);
+            }
         } else if (Intent.ACTION_BOOT_COMPLETED.equals(intentAction)) {
             Log.i(TAG, "Boot has been completed");
             toggleAppIcon(context);
