diff --git a/java-overridable/src/com/android/inputmethod/latin/personalization/ContextualDictionaryUpdater.java b/java-overridable/src/com/android/inputmethod/latin/personalization/ContextualDictionaryUpdater.java
deleted file mode 100644
index fe1d846..0000000
--- a/java-overridable/src/com/android/inputmethod/latin/personalization/ContextualDictionaryUpdater.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-package com.android.inputmethod.latin.personalization;
-
-import android.content.Context;
-
-import com.android.inputmethod.latin.DictionaryFacilitator;
-
-@SuppressWarnings("unused")
-public class ContextualDictionaryUpdater {
-    public ContextualDictionaryUpdater(final Context context,
-            final DictionaryFacilitator dictionaryFacilitator,
-            final Runnable onUpdateRunnable) {
-    }
-
-    public void onLoadSettings(final boolean usePersonalizedDicts) {
-    }
-
-    public void onStartInputView(final String  packageName) {
-    }
-
-    public void onDestroy() {
-    }
-}
diff --git a/java-overridable/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdater.java b/java-overridable/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdater.java
deleted file mode 100644
index 64bace3..0000000
--- a/java-overridable/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryUpdater.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-package com.android.inputmethod.latin.personalization;
-
-import android.content.Context;
-
-import com.android.inputmethod.latin.DictionaryFacilitator;
-
-@SuppressWarnings("unused")
-public class PersonalizationDictionaryUpdater {
-    final Context mContext;
-    final DictionaryFacilitator mDictionaryFacilitator;
-    boolean mDictCleared = false;
-
-    public PersonalizationDictionaryUpdater(final Context context,
-            final DictionaryFacilitator dictionaryFacilitator) {
-        mContext = context;
-        mDictionaryFacilitator = dictionaryFacilitator;
-    }
-
-    public void onLoadSettings(final boolean usePersonalizedDicts) {
-        if (!mDictCleared) {
-            // Clear and never update the personalization dictionary.
-            PersonalizationHelper.removeAllPersonalizationDictionaries(mContext);
-            mDictionaryFacilitator.clearPersonalizationDictionary();
-            mDictCleared = true;
-        }
-    }
-
-    public void onDestroy() {
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index a0a1d93..74ff6e6 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -17,21 +17,18 @@
 package com.android.inputmethod.latin;
 
 import android.content.Context;
-import android.view.inputmethod.InputMethodSubtype;
 import android.util.Pair;
+import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.ExpandableBinaryDictionary.UpdateEntriesForInputEventsCallback;
-import com.android.inputmethod.latin.personalization.PersonalizationDataChunk;
 import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
-import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
 import com.android.inputmethod.latin.utils.SuggestionResults;
 
 import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Locale;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
@@ -120,8 +117,6 @@
 
     boolean hasPersonalizationDictionary();
 
-    void flushPersonalizationDictionary();
-
     void waitForLoadingMainDictionaries(final long timeout, final TimeUnit unit)
             throws InterruptedException;
 
@@ -152,21 +147,6 @@
 
     void clearUserHistoryDictionary();
 
-    // This method gets called only when the IME receives a notification to remove the
-    // personalization dictionary.
-    void clearPersonalizationDictionary();
-
-    void clearContextualDictionary();
-
-    void addEntriesToPersonalizationDictionary(
-            final PersonalizationDataChunk personalizationDataChunk,
-            final SpacingAndPunctuations spacingAndPunctuations,
-            final UpdateEntriesForInputEventsCallback callback);
-
-    @UsedForTesting
-    void addPhraseToContextualDictionary(final String[] phrase, final int probability,
-            final int bigramProbabilityForWords, final int bigramProbabilityForPhrases);
-
     void dumpDictionaryForDebug(final String dictName);
 
     ArrayList<Pair<String, DictionaryStats>> getStatsOfEnabledSubDicts();
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
index 1675011..dc63298 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
@@ -23,16 +23,11 @@
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.latin.ExpandableBinaryDictionary.UpdateEntriesForInputEventsCallback;
 import com.android.inputmethod.latin.NgramContext.WordInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 import com.android.inputmethod.latin.common.Constants;
-import com.android.inputmethod.latin.personalization.ContextualDictionary;
-import com.android.inputmethod.latin.personalization.PersonalizationDataChunk;
-import com.android.inputmethod.latin.personalization.PersonalizationDictionary;
 import com.android.inputmethod.latin.personalization.UserHistoryDictionary;
 import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
-import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
 import com.android.inputmethod.latin.utils.DistracterFilter;
 import com.android.inputmethod.latin.utils.DistracterFilterCheckingExactMatchesAndSuggestions;
 import com.android.inputmethod.latin.utils.DistracterFilterCheckingIsInDictionary;
@@ -83,16 +78,13 @@
     // To synchronize assigning mDictionaryGroup to ensure closing dictionaries.
     private final Object mLock = new Object();
     private final DistracterFilter mDistracterFilter;
-    private final PersonalizationHelperForDictionaryFacilitator mPersonalizationHelper;
 
     private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS =
             new String[] {
                 Dictionary.TYPE_MAIN,
                 Dictionary.TYPE_USER_HISTORY,
-                Dictionary.TYPE_PERSONALIZATION,
                 Dictionary.TYPE_USER,
                 Dictionary.TYPE_CONTACTS,
-                Dictionary.TYPE_CONTEXTUAL
             };
 
     public static final Map<String, Class<? extends ExpandableBinaryDictionary>>
@@ -100,10 +92,8 @@
 
     static {
         DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER_HISTORY, UserHistoryDictionary.class);
-        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_PERSONALIZATION, PersonalizationDictionary.class);
         DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER, UserBinaryDictionary.class);
         DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_CONTACTS, ContactsBinaryDictionary.class);
-        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_CONTEXTUAL, ContextualDictionary.class);
     }
 
     private static final String DICT_FACTORY_METHOD_NAME = "getDictionary";
@@ -257,23 +247,18 @@
 
     public DictionaryFacilitatorImpl() {
         mDistracterFilter = DistracterFilter.EMPTY_DISTRACTER_FILTER;
-        mPersonalizationHelper = null;
     }
 
     public DictionaryFacilitatorImpl(final Context context) {
         mDistracterFilter = new DistracterFilterCheckingExactMatchesAndSuggestions(context);
-        mPersonalizationHelper =
-                new PersonalizationHelperForDictionaryFacilitator(context, mDistracterFilter);
     }
 
     public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) {
         mDistracterFilter.updateEnabledSubtypes(enabledSubtypes);
-        mPersonalizationHelper.updateEnabledSubtypes(enabledSubtypes);
     }
 
     // TODO: remove this, it's confusing with seamless multiple language switching
     public void setIsMonolingualUser(final boolean isMonolingualUser) {
-        mPersonalizationHelper.setIsMonolingualUser(isMonolingualUser);
     }
 
     public boolean isActive() {
@@ -586,9 +571,6 @@
             }
         }
         mDistracterFilter.close();
-        if (mPersonalizationHelper != null) {
-            mPersonalizationHelper.close();
-        }
     }
 
     @UsedForTesting
@@ -630,20 +612,6 @@
         return false;
     }
 
-    public void flushPersonalizationDictionary() {
-        final HashSet<ExpandableBinaryDictionary> personalizationDictsUsedForSuggestion =
-                new HashSet<>();
-        final DictionaryGroup[] dictionaryGroups = mDictionaryGroups;
-        for (final DictionaryGroup dictionaryGroup : dictionaryGroups) {
-            final ExpandableBinaryDictionary personalizationDictUsedForSuggestion =
-                    dictionaryGroup.getSubDict(Dictionary.TYPE_PERSONALIZATION);
-            personalizationDictsUsedForSuggestion.add(personalizationDictUsedForSuggestion);
-        }
-        mPersonalizationHelper.flushPersonalizationDictionariesToUpdate(
-                personalizationDictsUsedForSuggestion);
-        mDistracterFilter.close();
-    }
-
     public void waitForLoadingMainDictionaries(final long timeout, final TimeUnit unit)
             throws InterruptedException {
         mLatchForWaitingLoadingMainDictionaries.await(timeout, unit);
@@ -861,64 +829,10 @@
         clearSubDictionary(Dictionary.TYPE_USER_HISTORY);
     }
 
-    // This method gets called only when the IME receives a notification to remove the
-    // personalization dictionary.
-    public void clearPersonalizationDictionary() {
-        clearSubDictionary(Dictionary.TYPE_PERSONALIZATION);
-        mPersonalizationHelper.clearDictionariesToUpdate();
-    }
-
     public void clearContextualDictionary() {
         clearSubDictionary(Dictionary.TYPE_CONTEXTUAL);
     }
 
-    public void addEntriesToPersonalizationDictionary(
-            final PersonalizationDataChunk personalizationDataChunk,
-            final SpacingAndPunctuations spacingAndPunctuations,
-            final UpdateEntriesForInputEventsCallback callback) {
-        mPersonalizationHelper.updateEntriesOfPersonalizationDictionaries(
-                getMostProbableLocale(), personalizationDataChunk, spacingAndPunctuations,
-                callback);
-    }
-
-    @UsedForTesting
-    public void addPhraseToContextualDictionary(final String[] phrase, final int probability,
-            final int bigramProbabilityForWords, final int bigramProbabilityForPhrases) {
-        // TODO: we're inserting the phrase into the dictionary for the active language. Rethink
-        // this a bit from a theoretical point of view.
-        final ExpandableBinaryDictionary contextualDict =
-                getDictionaryGroupForMostProbableLanguage().getSubDict(Dictionary.TYPE_CONTEXTUAL);
-        if (contextualDict == null) {
-            return;
-        }
-        NgramContext ngramContext = NgramContext.BEGINNING_OF_SENTENCE;
-        for (int i = 0; i < phrase.length; i++) {
-            final String[] subPhrase = Arrays.copyOfRange(phrase, i /* start */, phrase.length);
-            final String subPhraseStr = TextUtils.join(Constants.WORD_SEPARATOR, subPhrase);
-            contextualDict.addUnigramEntryWithCheckingDistracter(
-                    subPhraseStr, probability, null /* shortcutTarget */,
-                    Dictionary.NOT_A_PROBABILITY /* shortcutFreq */,
-                    false /* isNotAWord */, false /* isPossiblyOffensive */,
-                    BinaryDictionary.NOT_A_VALID_TIMESTAMP,
-                    DistracterFilter.EMPTY_DISTRACTER_FILTER);
-            contextualDict.addNgramEntry(ngramContext, subPhraseStr,
-                    bigramProbabilityForPhrases, BinaryDictionary.NOT_A_VALID_TIMESTAMP);
-
-            if (i < phrase.length - 1) {
-                contextualDict.addUnigramEntryWithCheckingDistracter(
-                        phrase[i], probability, null /* shortcutTarget */,
-                        Dictionary.NOT_A_PROBABILITY /* shortcutFreq */,
-                        false /* isNotAWord */, false /* isPossiblyOffensive */,
-                        BinaryDictionary.NOT_A_VALID_TIMESTAMP,
-                        DistracterFilter.EMPTY_DISTRACTER_FILTER);
-                contextualDict.addNgramEntry(ngramContext, phrase[i],
-                        bigramProbabilityForWords, BinaryDictionary.NOT_A_VALID_TIMESTAMP);
-            }
-            ngramContext =
-                    ngramContext.getNextNgramContext(new NgramContext.WordInfo(phrase[i]));
-        }
-    }
-
     public void dumpDictionaryForDebug(final String dictName) {
         final DictionaryGroup[] dictionaryGroups = mDictionaryGroups;
         for (final DictionaryGroup dictionaryGroup : dictionaryGroups) {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 622cdb0..15827fc 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -81,9 +81,7 @@
 import com.android.inputmethod.latin.define.DebugFlags;
 import com.android.inputmethod.latin.define.ProductionFlags;
 import com.android.inputmethod.latin.inputlogic.InputLogic;
-import com.android.inputmethod.latin.personalization.ContextualDictionaryUpdater;
 import com.android.inputmethod.latin.personalization.DictionaryDecayBroadcastReciever;
-import com.android.inputmethod.latin.personalization.PersonalizationDictionaryUpdater;
 import com.android.inputmethod.latin.personalization.PersonalizationHelper;
 import com.android.inputmethod.latin.settings.Settings;
 import com.android.inputmethod.latin.settings.SettingsActivity;
@@ -139,19 +137,8 @@
     private static final String SCHEME_PACKAGE = "package";
 
     final Settings mSettings;
-  private final DictionaryFacilitator mDictionaryFacilitator =
+    private final DictionaryFacilitator mDictionaryFacilitator =
       DictionaryFacilitatorProvider.newDictionaryFacilitator(this /* context */);
-    // TODO: Move from LatinIME.
-    private final PersonalizationDictionaryUpdater mPersonalizationDictionaryUpdater =
-            new PersonalizationDictionaryUpdater(this /* context */, mDictionaryFacilitator);
-    private final ContextualDictionaryUpdater mContextualDictionaryUpdater =
-            new ContextualDictionaryUpdater(this /* context */, mDictionaryFacilitator,
-                    new Runnable() {
-                        @Override
-                        public void run() {
-                            mHandler.postUpdateSuggestionStrip(SuggestedWords.INPUT_STYLE_NONE);
-                        }
-                    });
     final InputLogic mInputLogic = new InputLogic(this /* LatinIME */,
             this /* SuggestionStripViewAccessor */, mDictionaryFacilitator);
     // We expect to have only one decoder in almost all cases, hence the default capacity of 1.
@@ -642,11 +629,9 @@
 
     private void refreshPersonalizationDictionarySession(
             final SettingsValues currentSettingsValues) {
+        // TODO: Remove all existing personalized dictionaries.
         mDictionaryFacilitator.setIsMonolingualUser(
                 mRichImm.isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes());
-        mPersonalizationDictionaryUpdater.onLoadSettings(
-                currentSettingsValues.mUsePersonalizedDicts);
-        mContextualDictionaryUpdater.onLoadSettings(currentSettingsValues.mUsePersonalizedDicts);
         final boolean shouldKeepUserHistoryDictionaries;
         if (currentSettingsValues.mUsePersonalizedDicts) {
             shouldKeepUserHistoryDictionaries = true;
@@ -730,8 +715,6 @@
     @Override
     public void onDestroy() {
         mDictionaryFacilitator.closeDictionaries();
-        mPersonalizationDictionaryUpdater.onDestroy();
-        mContextualDictionaryUpdater.onDestroy();
         mSettings.onDestroy();
         NetworkConnectivityUtils.onDestroy(this /* context */);
         unregisterReceiver(mRingerModeChangeReceiver);
@@ -1050,8 +1033,6 @@
                 currentSettingsValues.mGestureTrailEnabled,
                 currentSettingsValues.mGestureFloatingPreviewTextEnabled);
 
-        // Contextual dictionary should be updated for the current application.
-        mContextualDictionaryUpdater.onStartInputView(editorInfo.packageName);
         if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
     }
 
@@ -1943,7 +1924,6 @@
     @UsedForTesting
     /* package for test */ void clearPersonalizedDictionariesForTest() {
         mDictionaryFacilitator.clearUserHistoryDictionary();
-        mDictionaryFacilitator.clearPersonalizationDictionary();
     }
 
     @UsedForTesting
diff --git a/java/src/com/android/inputmethod/latin/PersonalizationHelperForDictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/PersonalizationHelperForDictionaryFacilitator.java
deleted file mode 100644
index 8926c06..0000000
--- a/java/src/com/android/inputmethod/latin/PersonalizationHelperForDictionaryFacilitator.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-package com.android.inputmethod.latin;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import android.content.Context;
-import android.view.inputmethod.InputMethodSubtype;
-
-import com.android.inputmethod.latin.ExpandableBinaryDictionary.UpdateEntriesForInputEventsCallback;
-import com.android.inputmethod.latin.personalization.PersonalizationDataChunk;
-import com.android.inputmethod.latin.personalization.PersonalizationDictionary;
-import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
-import com.android.inputmethod.latin.utils.DistracterFilter;
-import com.android.inputmethod.latin.utils.DistracterFilterCheckingIsInDictionary;
-import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
-import com.android.inputmethod.latin.utils.WordInputEventForPersonalization;
-
-/**
- * Class for managing and updating personalization dictionaries.
- */
-public class PersonalizationHelperForDictionaryFacilitator {
-    private final Context mContext;
-    private final DistracterFilter mDistracterFilter;
-    private final HashMap<String, HashSet<Locale>> mLangToLocalesMap = new HashMap<>();
-    private final HashMap<Locale, ExpandableBinaryDictionary> mPersonalizationDictsToUpdate =
-            new HashMap<>();
-    private boolean mIsMonolingualUser = false;
-
-    PersonalizationHelperForDictionaryFacilitator(final Context context,
-            final DistracterFilter distracterFilter) {
-        mContext = context;
-        mDistracterFilter = distracterFilter;
-    }
-
-    public void close() {
-        mLangToLocalesMap.clear();
-        for (final ExpandableBinaryDictionary dict : mPersonalizationDictsToUpdate.values()) {
-            dict.close();
-        }
-        mPersonalizationDictsToUpdate.clear();
-    }
-
-    public void clearDictionariesToUpdate() {
-        for (final ExpandableBinaryDictionary dict : mPersonalizationDictsToUpdate.values()) {
-            dict.clear();
-        }
-        mPersonalizationDictsToUpdate.clear();
-    }
-
-    public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) {
-        for (final InputMethodSubtype subtype : enabledSubtypes) {
-            final Locale locale = SubtypeLocaleUtils.getSubtypeLocale(subtype);
-            final String language = locale.getLanguage();
-            final HashSet<Locale> locales = mLangToLocalesMap.get(language);
-            if (locales != null) {
-                locales.add(locale);
-            } else {
-                final HashSet<Locale> localeSet = new HashSet<>();
-                localeSet.add(locale);
-                mLangToLocalesMap.put(language, localeSet);
-            }
-        }
-    }
-
-    public void setIsMonolingualUser(final boolean isMonolingualUser) {
-        mIsMonolingualUser = isMonolingualUser;
-    }
-
-    /**
-     * Flush personalization dictionaries to dictionary files. Close dictionaries after writing
-     * files except the dictionaries that is used for generating suggestions.
-     *
-     * @param personalizationDictsUsedForSuggestion the personalization dictionaries used for
-     * generating suggestions that won't be closed.
-     */
-    public void flushPersonalizationDictionariesToUpdate(
-            final HashSet<ExpandableBinaryDictionary> personalizationDictsUsedForSuggestion) {
-        for (final ExpandableBinaryDictionary personalizationDict :
-                mPersonalizationDictsToUpdate.values()) {
-            personalizationDict.asyncFlushBinaryDictionary();
-            if (!personalizationDictsUsedForSuggestion.contains(personalizationDict)) {
-                // Close if the dictionary is not being used for suggestion.
-                personalizationDict.close();
-            }
-        }
-        mDistracterFilter.close();
-        mPersonalizationDictsToUpdate.clear();
-    }
-
-    private ExpandableBinaryDictionary getPersonalizationDictToUpdate(final Context context,
-            final Locale locale) {
-        ExpandableBinaryDictionary personalizationDict = mPersonalizationDictsToUpdate.get(locale);
-        if (personalizationDict != null) {
-            return personalizationDict;
-        }
-        personalizationDict = PersonalizationDictionary.getDictionary(context, locale,
-                null /* dictFile */, "" /* dictNamePrefix */, null /* account */);
-        mPersonalizationDictsToUpdate.put(locale, personalizationDict);
-        return personalizationDict;
-    }
-
-    private void updateEntriesOfPersonalizationDictionariesForLocale(final Locale locale,
-            final PersonalizationDataChunk personalizationDataChunk,
-            final SpacingAndPunctuations spacingAndPunctuations,
-            final UpdateEntriesForInputEventsCallback callback) {
-        final ExpandableBinaryDictionary personalizationDict =
-                getPersonalizationDictToUpdate(mContext, locale);
-        if (personalizationDict == null) {
-            if (callback != null) {
-                callback.onFinished();
-            }
-            return;
-        }
-        final ArrayList<WordInputEventForPersonalization> inputEvents =
-                WordInputEventForPersonalization.createInputEventFrom(
-                        personalizationDataChunk.mTokens,
-                        personalizationDataChunk.mTimestampInSeconds, spacingAndPunctuations,
-                        locale, new DistracterFilterCheckingIsInDictionary(
-                                mDistracterFilter, personalizationDict));
-        if (inputEvents == null || inputEvents.isEmpty()) {
-            if (callback != null) {
-                callback.onFinished();
-            }
-            return;
-        }
-        personalizationDict.updateEntriesForInputEvents(inputEvents, callback);
-    }
-
-    public void updateEntriesOfPersonalizationDictionaries(final Locale defaultLocale,
-            final PersonalizationDataChunk personalizationDataChunk,
-            final SpacingAndPunctuations spacingAndPunctuations,
-            final UpdateEntriesForInputEventsCallback callback) {
-        final String language = personalizationDataChunk.mDetectedLanguage;
-        final HashSet<Locale> locales;
-        if (mIsMonolingualUser && PersonalizationDataChunk.LANGUAGE_UNKNOWN.equals(language)
-                && mLangToLocalesMap.size() == 1) {
-            locales = mLangToLocalesMap.get(defaultLocale.getLanguage());
-        } else {
-            locales = mLangToLocalesMap.get(language);
-        }
-        if (locales == null || locales.isEmpty()) {
-            if (callback != null) {
-                callback.onFinished();
-            }
-            return;
-        }
-        final AtomicInteger remainingTaskCount = new AtomicInteger(locales.size());
-        final UpdateEntriesForInputEventsCallback callbackForLocales =
-                new UpdateEntriesForInputEventsCallback() {
-                    @Override
-                    public void onFinished() {
-                        if (remainingTaskCount.decrementAndGet() == 0) {
-                            // Update tasks for all locales have been finished.
-                            if (callback != null) {
-                                callback.onFinished();
-                            }
-                        }
-                    }
-                };
-        for (final Locale locale : locales) {
-            updateEntriesOfPersonalizationDictionariesForLocale(locale, personalizationDataChunk,
-                    spacingAndPunctuations, callbackForLocales);
-        }
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java b/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java
deleted file mode 100644
index f663fe9..0000000
--- a/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-package com.android.inputmethod.latin.personalization;
-
-import android.content.Context;
-
-import com.android.inputmethod.annotations.ExternallyReferenced;
-import com.android.inputmethod.latin.Dictionary;
-import com.android.inputmethod.latin.ExpandableBinaryDictionary;
-
-import java.io.File;
-import java.util.Locale;
-
-import javax.annotation.Nullable;
-
-public class ContextualDictionary extends ExpandableBinaryDictionary {
-    /* package */ static final String NAME = ContextualDictionary.class.getSimpleName();
-
-    private ContextualDictionary(final Context context, final Locale locale,
-            final File dictFile) {
-        super(context, getDictName(NAME, locale, dictFile), locale, Dictionary.TYPE_CONTEXTUAL,
-                dictFile);
-        // Always reset the contents.
-        clear();
-    }
-
-    // Note: This method is called by {@link DictionaryFacilitator} using Java reflection.
-    @SuppressWarnings("unused")
-    @ExternallyReferenced
-    public static ContextualDictionary getDictionary(final Context context, final Locale locale,
-            final File dictFile, final String dictNamePrefix, @Nullable final String account) {
-        return new ContextualDictionary(context, locale, dictFile);
-    }
-
-    @Override
-    public boolean isValidWord(final String word) {
-        // Strings out of this dictionary should not be considered existing words.
-        return false;
-    }
-
-    @Override
-    protected void loadInitialContentsLocked() {
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/personalization/DictionaryDecayBroadcastReciever.java b/java/src/com/android/inputmethod/latin/personalization/DictionaryDecayBroadcastReciever.java
index e974f33..0c5e5d0 100644
--- a/java/src/com/android/inputmethod/latin/personalization/DictionaryDecayBroadcastReciever.java
+++ b/java/src/com/android/inputmethod/latin/personalization/DictionaryDecayBroadcastReciever.java
@@ -84,7 +84,6 @@
         final String action = intent.getAction();
         if (action.equals(DICTIONARY_DECAY_INTENT_ACTION)) {
             PersonalizationHelper.runGCOnAllOpenedUserHistoryDictionaries();
-            PersonalizationHelper.runGCOnAllOpenedPersonalizationDictionaries();
         }
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDataChunk.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDataChunk.java
deleted file mode 100644
index 734ed55..0000000
--- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDataChunk.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-package com.android.inputmethod.latin.personalization;
-
-import java.util.Collections;
-import java.util.List;
-
-public class PersonalizationDataChunk {
-    public static final String LANGUAGE_UNKNOWN = "";
-
-    public final boolean mInputByUser;
-    public final List<String> mTokens;
-    public final int mTimestampInSeconds;
-    public final String mPackageName;
-    public final String mDetectedLanguage;
-
-    public PersonalizationDataChunk(boolean inputByUser, final List<String> tokens,
-            final int timestampInSeconds, final String packageName, final String detectedLanguage) {
-        mInputByUser = inputByUser;
-        mTokens = Collections.unmodifiableList(tokens);
-        mTimestampInSeconds = timestampInSeconds;
-        mPackageName = packageName;
-        mDetectedLanguage = detectedLanguage;
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
deleted file mode 100644
index 76451cc..0000000
--- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionary.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.inputmethod.latin.personalization;
-
-import android.content.Context;
-
-import com.android.inputmethod.annotations.ExternallyReferenced;
-import com.android.inputmethod.latin.Dictionary;
-
-import java.io.File;
-import java.util.Locale;
-
-import javax.annotation.Nullable;
-
-public class PersonalizationDictionary extends DecayingExpandableBinaryDictionaryBase {
-    /* package */ static final String NAME = PersonalizationDictionary.class.getSimpleName();
-
-    // TODO: Make this constructor private
-    /* package */ PersonalizationDictionary(final Context context, final Locale locale) {
-        super(context, getDictName(NAME, locale, null /* dictFile */), locale,
-                Dictionary.TYPE_PERSONALIZATION, null /* dictFile */);
-    }
-
-    // Note: This method is called by {@link DictionaryFacilitator} using Java reflection.
-    @SuppressWarnings("unused")
-    @ExternallyReferenced
-    public static PersonalizationDictionary getDictionary(final Context context,
-            final Locale locale, final File dictFile, final String dictNamePrefix,
-            @Nullable final String account) {
-        return PersonalizationHelper.getPersonalizationDictionary(context, locale);
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java
index 4231450..1c1cb4f 100644
--- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java
+++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java
@@ -32,8 +32,7 @@
 import javax.annotation.Nullable;
 
 /**
- * Helps handle and manage personalized dictionaries such as {@link UserHistoryDictionary} and
- * {@link PersonalizationDictionary}.
+ * Helps handle and manage personalized dictionaries such as {@link UserHistoryDictionary}.
  */
 public class PersonalizationHelper {
     private static final String TAG = PersonalizationHelper.class.getSimpleName();
@@ -41,8 +40,6 @@
 
     private static final ConcurrentHashMap<String, SoftReference<UserHistoryDictionary>>
             sLangUserHistoryDictCache = new ConcurrentHashMap<>();
-    private static final ConcurrentHashMap<String, SoftReference<PersonalizationDictionary>>
-            sLangPersonalizationDictCache = new ConcurrentHashMap<>();
 
     @Nonnull
     public static UserHistoryDictionary getUserHistoryDictionary(
@@ -77,7 +74,6 @@
                 DictionaryDecayBroadcastReciever.DICTIONARY_DECAY_INTERVAL_IN_MILLIS)
                         < currentTimestamp - sCurrentTimestampForTesting) {
             runGCOnAllOpenedUserHistoryDictionaries();
-            runGCOnAllOpenedPersonalizationDictionaries();
         }
     }
 
@@ -85,10 +81,6 @@
         runGCOnAllDictionariesIfRequired(sLangUserHistoryDictCache);
     }
 
-    public static void runGCOnAllOpenedPersonalizationDictionaries() {
-        runGCOnAllDictionariesIfRequired(sLangPersonalizationDictCache);
-    }
-
     private static <T extends DecayingExpandableBinaryDictionaryBase>
             void runGCOnAllDictionariesIfRequired(
                     final ConcurrentHashMap<String, SoftReference<T>> dictionaryMap) {
@@ -103,32 +95,6 @@
         }
     }
 
-    public static PersonalizationDictionary getPersonalizationDictionary(
-            final Context context, final Locale locale) {
-        final String localeStr = locale.toString();
-        synchronized (sLangPersonalizationDictCache) {
-            if (sLangPersonalizationDictCache.containsKey(localeStr)) {
-                final SoftReference<PersonalizationDictionary> ref =
-                        sLangPersonalizationDictCache.get(localeStr);
-                final PersonalizationDictionary dict = ref == null ? null : ref.get();
-                if (dict != null) {
-                    if (DEBUG) {
-                        Log.w(TAG, "Use cached PersonalizationDictionary for " + locale);
-                    }
-                    return dict;
-                }
-            }
-            final PersonalizationDictionary dict = new PersonalizationDictionary(context, locale);
-            sLangPersonalizationDictCache.put(localeStr, new SoftReference<>(dict));
-            return dict;
-        }
-    }
-
-    public static void removeAllPersonalizationDictionaries(final Context context) {
-        removeAllDictionaries(context, sLangPersonalizationDictCache,
-                PersonalizationDictionary.NAME);
-    }
-
     public static void removeAllUserHistoryDictionaries(final Context context) {
         removeAllDictionaries(context, sLangUserHistoryDictCache,
                 UserHistoryDictionary.NAME);
diff --git a/tests/src/com/android/inputmethod/latin/personalization/ContextualDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/ContextualDictionaryTests.java
deleted file mode 100644
index b9ce78d..0000000
--- a/tests/src/com/android/inputmethod/latin/personalization/ContextualDictionaryTests.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-package com.android.inputmethod.latin.personalization;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import com.android.inputmethod.latin.Dictionary;
-import com.android.inputmethod.latin.DictionaryFacilitator;
-import com.android.inputmethod.latin.DictionaryFacilitatorProvider;
-import com.android.inputmethod.latin.ExpandableBinaryDictionary;
-
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-
-/**
- * Unit tests for contextual dictionary
- */
-@LargeTest
-public class ContextualDictionaryTests extends AndroidTestCase {
-    private static final Locale LOCALE_EN_US = new Locale("en", "US");
-
-    private DictionaryFacilitator getDictionaryFacilitator() {
-        final ArrayList<String> dictTypes = new ArrayList<>();
-        dictTypes.add(Dictionary.TYPE_CONTEXTUAL);
-        final DictionaryFacilitator dictionaryFacilitator =
-            DictionaryFacilitatorProvider.newDictionaryFacilitator();
-        dictionaryFacilitator.resetDictionariesForTesting(getContext(),
-                new Locale[] { LOCALE_EN_US }, dictTypes, new HashMap<String, File>(),
-                Collections.<String, Map<String, String>>emptyMap(), null /* account */);
-        return dictionaryFacilitator;
-    }
-
-    public void testAddPhrase() {
-        final DictionaryFacilitator dictionaryFacilitator = getDictionaryFacilitator();
-        final String[] phrase = new String[] {"a", "b", "c", "d"};
-        final int probability = 100;
-        final int bigramProbabilityForWords = 150;
-        final int bigramProbabilityForPhrases = 200;
-        dictionaryFacilitator.addPhraseToContextualDictionary(
-                phrase, probability, bigramProbabilityForWords, bigramProbabilityForPhrases);
-        final ExpandableBinaryDictionary contextualDictionary =
-                dictionaryFacilitator.getSubDictForTesting(Dictionary.TYPE_CONTEXTUAL);
-        contextualDictionary.waitAllTasksForTests();
-        // Word
-        assertTrue(contextualDictionary.isInDictionary("a"));
-        assertTrue(contextualDictionary.isInDictionary("b"));
-        assertTrue(contextualDictionary.isInDictionary("c"));
-        assertTrue(contextualDictionary.isInDictionary("d"));
-        // Phrase
-        assertTrue(contextualDictionary.isInDictionary("a b c d"));
-        assertTrue(contextualDictionary.isInDictionary("b c d"));
-        assertTrue(contextualDictionary.isInDictionary("c d"));
-        assertFalse(contextualDictionary.isInDictionary("a b c"));
-        assertFalse(contextualDictionary.isInDictionary("abcd"));
-        // TODO: Add tests for probability.
-        // TODO: Add tests for n-grams.
-    }
-}
diff --git a/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java
deleted file mode 100644
index 548167f..0000000
--- a/tests/src/com/android/inputmethod/latin/personalization/PersonalizationDictionaryTests.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-package com.android.inputmethod.latin.personalization;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import com.android.inputmethod.latin.BinaryDictionary;
-import com.android.inputmethod.latin.Dictionary;
-import com.android.inputmethod.latin.DictionaryFacilitator;
-import com.android.inputmethod.latin.DictionaryFacilitatorProvider;
-import com.android.inputmethod.latin.ExpandableBinaryDictionary;
-import com.android.inputmethod.latin.RichInputMethodManager;
-import com.android.inputmethod.latin.ExpandableBinaryDictionary.UpdateEntriesForInputEventsCallback;
-import com.android.inputmethod.latin.common.CodePointUtils;
-import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
-
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.util.Log;
-import android.view.inputmethod.InputMethodSubtype;
-
-/**
- * Unit tests for personalization dictionary
- */
-@LargeTest
-public class PersonalizationDictionaryTests extends AndroidTestCase {
-    private static final String TAG = PersonalizationDictionaryTests.class.getSimpleName();
-
-    private static final Locale LOCALE_EN_US = new Locale("en", "US");
-    private static final String DUMMY_PACKAGE_NAME = "test.package.name";
-    private static final long TIMEOUT_TO_WAIT_DICTIONARY_OPERATIONS_IN_SECONDS = 120;
-
-    private DictionaryFacilitator getDictionaryFacilitator() {
-        final ArrayList<String> dictTypes = new ArrayList<>();
-        dictTypes.add(Dictionary.TYPE_MAIN);
-        dictTypes.add(Dictionary.TYPE_PERSONALIZATION);
-        final DictionaryFacilitator dictionaryFacilitator =
-                DictionaryFacilitatorProvider.newDictionaryFacilitator(getContext());
-        dictionaryFacilitator.resetDictionariesForTesting(getContext(),
-                new Locale[] { LOCALE_EN_US }, dictTypes, new HashMap<String, File>(),
-                Collections.<String, Map<String, String>>emptyMap(), null /* account */);
-        // Set subtypes.
-        RichInputMethodManager.init(getContext());
-        final RichInputMethodManager richImm = RichInputMethodManager.getInstance();
-        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<>();
-        subtypes.add(richImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                LOCALE_EN_US.toString(), "qwerty"));
-        dictionaryFacilitator.updateEnabledSubtypes(subtypes);
-        return dictionaryFacilitator;
-    }
-
-    public void testAddManyTokens() {
-        final DictionaryFacilitator dictionaryFacilitator = getDictionaryFacilitator();
-        dictionaryFacilitator.clearPersonalizationDictionary();
-        final int dataChunkCount = 100;
-        final int wordCountInOneChunk = 200;
-        final int uniqueWordCount = 100;
-        final Random random = new Random(System.currentTimeMillis());
-        final int[] codePointSet = CodePointUtils.LATIN_ALPHABETS_LOWER;
-        final ArrayList<String> words = new ArrayList<>();
-        for (int i = 0; i < uniqueWordCount; i++) {
-            words.add(CodePointUtils.generateWord(random, codePointSet));
-        }
-
-        final SpacingAndPunctuations spacingAndPunctuations =
-                new SpacingAndPunctuations(getContext().getResources());
-
-        final int timeStampInSeconds = (int)TimeUnit.MILLISECONDS.toSeconds(
-                System.currentTimeMillis());
-
-        for (int i = 0; i < dataChunkCount; i++) {
-            final ArrayList<String> tokens = new ArrayList<>();
-            for (int j = 0; j < wordCountInOneChunk; j++) {
-                tokens.add(words.get(random.nextInt(words.size())));
-            }
-            final PersonalizationDataChunk personalizationDataChunk = new PersonalizationDataChunk(
-                    true /* inputByUser */, tokens, timeStampInSeconds, DUMMY_PACKAGE_NAME,
-                    LOCALE_EN_US.getLanguage());
-            final CountDownLatch countDownLatch = new CountDownLatch(1);
-            final UpdateEntriesForInputEventsCallback callback =
-                    new UpdateEntriesForInputEventsCallback() {
-                        @Override
-                        public void onFinished() {
-                            countDownLatch.countDown();
-                        }
-                    };
-            dictionaryFacilitator.addEntriesToPersonalizationDictionary(personalizationDataChunk,
-                    spacingAndPunctuations, callback);
-            try {
-                countDownLatch.await(TIMEOUT_TO_WAIT_DICTIONARY_OPERATIONS_IN_SECONDS,
-                        TimeUnit.SECONDS);
-            } catch (InterruptedException e) {
-                Log.e(TAG, "Interrupted while waiting for finishing dictionary operations.", e);
-            }
-        }
-        dictionaryFacilitator.flushPersonalizationDictionary();
-        try {
-            dictionaryFacilitator.waitForLoadingDictionariesForTesting(
-                    TIMEOUT_TO_WAIT_DICTIONARY_OPERATIONS_IN_SECONDS, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            Log.e(TAG, "Interrupted while waiting for finishing dictionary operations.", e);
-        }
-        final String dictName = ExpandableBinaryDictionary.getDictName(
-                PersonalizationDictionary.NAME, LOCALE_EN_US, null /* dictFile */);
-        final File dictFile = ExpandableBinaryDictionary.getDictFile(
-                getContext(), dictName, null /* dictFile */);
-
-        final BinaryDictionary binaryDictionary = new BinaryDictionary(dictFile.getAbsolutePath(),
-                0 /* offset */, 0 /* size */,
-                true /* useFullEditDistance */, LOCALE_EN_US, Dictionary.TYPE_PERSONALIZATION,
-                true /* isUpdatable */);
-        assertTrue(binaryDictionary.isValidDictionary());
-    }
-}
