diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index 80f0cea5ee572606939c15a9f4ca940c4ebc830d..4cb920f37efa3291a4099a23c87f2dd657d9c49b 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -168,7 +168,7 @@ public class DictionaryFacilitator {
     }
 
     public DictionaryFacilitator() {
-        mDistracterFilter = new DistracterFilter.EmptyDistracterFilter();
+        mDistracterFilter = DistracterFilter.EMPTY_DISTRACTER_FILTER;
     }
 
     public DictionaryFacilitator(final DistracterFilter distracterFilter) {
@@ -448,7 +448,7 @@ public class DictionaryFacilitator {
         // We don't add words with 0-frequency (assuming they would be profanity etc.).
         final boolean isValid = maxFreq > 0;
         UserHistoryDictionary.addToDictionary(userHistoryDictionary, prevWordsInfo, secondWord,
-                isValid, timeStampInSeconds);
+                isValid, timeStampInSeconds, mDistracterFilter);
     }
 
     public void cancelAddingUserHistory(final PrevWordsInfo prevWordsInfo,
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index b92f0425235718e19a2dede4d39780c460230b58..95ff8c6e3caa276b7c9d48cecb63f27750848a0d 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -27,6 +27,7 @@ import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
 import com.android.inputmethod.latin.makedict.WordProperty;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 import com.android.inputmethod.latin.utils.CombinedFormatUtils;
+import com.android.inputmethod.latin.utils.DistracterFilter;
 import com.android.inputmethod.latin.utils.ExecutorUtils;
 import com.android.inputmethod.latin.utils.FileUtils;
 import com.android.inputmethod.latin.utils.LanguageModelParam;
@@ -271,9 +272,10 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
     /**
      * Adds unigram information of a word to the dictionary. May overwrite an existing entry.
      */
-    public void addUnigramEntry(final String word, final int frequency,
+    public void addUnigramEntryWithCheckingDistracter(final String word, final int frequency,
             final String shortcutTarget, final int shortcutFreq, final boolean isNotAWord,
-            final boolean isBlacklisted, final int timestamp) {
+            final boolean isBlacklisted, final int timestamp,
+            final DistracterFilter distracterFilter) {
         reloadDictionaryIfRequired();
         asyncExecuteTaskWithWriteLock(new Runnable() {
             @Override
@@ -281,6 +283,11 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
                 if (mBinaryDictionary == null) {
                     return;
                 }
+                if (distracterFilter.isDistracterToWordsInDictionaries(
+                        PrevWordsInfo.EMPTY_PREV_WORDS_INFO, word, mLocale)) {
+                    // The word is a distracter.
+                    return;
+                }
                 runGCIfRequiredLocked(true /* mindsBlockByGC */);
                 addUnigramLocked(word, frequency, shortcutTarget, shortcutFreq,
                         isNotAWord, isBlacklisted, timestamp);
diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
index f89caf92176cf94439ac54a98aebc7a9bb62be80..67ad54fb7e1dfed103e06f991e69d7aae4047232 100644
--- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java
@@ -23,6 +23,7 @@ import com.android.inputmethod.latin.Constants;
 import com.android.inputmethod.latin.Dictionary;
 import com.android.inputmethod.latin.ExpandableBinaryDictionary;
 import com.android.inputmethod.latin.PrevWordsInfo;
+import com.android.inputmethod.latin.utils.DistracterFilter;
 
 import java.io.File;
 import java.util.Locale;
@@ -60,10 +61,11 @@ public class UserHistoryDictionary extends DecayingExpandableBinaryDictionaryBas
      * @param word the word the user inputted
      * @param isValid whether the word is valid or not
      * @param timestamp the timestamp when the word has been inputted
+     * @param distracterFilter the filter to check whether the word is a distracter
      */
     public static void addToDictionary(final ExpandableBinaryDictionary userHistoryDictionary,
             final PrevWordsInfo prevWordsInfo, final String word, final boolean isValid,
-            final int timestamp) {
+            final int timestamp, final DistracterFilter distracterFilter) {
         final String prevWord = prevWordsInfo.mPrevWord;
         if (word.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH ||
                 (prevWord != null && prevWord.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH)) {
@@ -71,8 +73,9 @@ public class UserHistoryDictionary extends DecayingExpandableBinaryDictionaryBas
         }
         final int frequency = isValid ?
                 FREQUENCY_FOR_WORDS_IN_DICTS : FREQUENCY_FOR_WORDS_NOT_IN_DICTS;
-        userHistoryDictionary.addUnigramEntry(word, frequency, null /* shortcutTarget */,
-                0 /* shortcutFreq */, false /* isNotAWord */, false /* isBlacklisted */, timestamp);
+        userHistoryDictionary.addUnigramEntryWithCheckingDistracter(word, frequency,
+                null /* shortcutTarget */, 0 /* shortcutFreq */, false /* isNotAWord */,
+                false /* isBlacklisted */, timestamp, distracterFilter);
         // Do not insert a word as a bigram of itself
         if (word.equals(prevWord)) {
             return;
diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java
index 6e0fab32a111ce85c3e9cebec8df5d38ed09d2db..787e4a59d6b659dbfcb4bfcb99a8967640a18c9a 100644
--- a/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java
+++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java
@@ -40,7 +40,7 @@ public interface DistracterFilter {
 
     public void close();
 
-    public static final class EmptyDistracterFilter implements DistracterFilter {
+    public static final DistracterFilter EMPTY_DISTRACTER_FILTER = new DistracterFilter() {
         @Override
         public boolean isDistracterToWordsInDictionaries(PrevWordsInfo prevWordsInfo,
                 String testedWord, Locale locale) {
@@ -54,5 +54,5 @@ public interface DistracterFilter {
         @Override
         public void updateEnabledSubtypes(List<InputMethodSubtype> enabledSubtypes) {
         }
-    }
+    };
 }
diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilterUsingSuggestion.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilterUsingSuggestion.java
index 3fc84180e78793630f343ef3199d69a2c6e0e038..1c93a91056c8c67f9a9daebaae79fee2767d7f67 100644
--- a/java/src/com/android/inputmethod/latin/utils/DistracterFilterUsingSuggestion.java
+++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilterUsingSuggestion.java
@@ -32,6 +32,7 @@ import android.view.inputmethod.InputMethodSubtype;
 import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.keyboard.KeyboardId;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
+import com.android.inputmethod.latin.Constants;
 import com.android.inputmethod.latin.DictionaryFacilitator;
 import com.android.inputmethod.latin.PrevWordsInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
@@ -205,14 +206,25 @@ public class DistracterFilterUsingSuggestion implements DistracterFilter {
         final String consideredWord = trailingSingleQuotesCount > 0 ?
                 testedWord.substring(0, testedWord.length() - trailingSingleQuotesCount) :
                 testedWord;
-
-        final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults(
-                composer, PrevWordsInfo.EMPTY_PREV_WORDS_INFO, mKeyboard.getProximityInfo(),
-                true /* blockOffensiveWords */, null /* additionalFeaturesOptions */,
-                0 /* sessionId */, null /* rawSuggestions */);
-        if (suggestionResults.isEmpty()) {
-            return false;
-        }
-        return isDistracter(suggestionResults, consideredWord);
+        final AsyncResultHolder<Boolean> holder = new AsyncResultHolder<>();
+        ExecutorUtils.getExecutor("check distracters").execute(new Runnable() {
+            @Override
+            public void run() {
+                final SuggestionResults suggestionResults =
+                        mDictionaryFacilitator.getSuggestionResults(
+                                composer, PrevWordsInfo.EMPTY_PREV_WORDS_INFO,
+                                mKeyboard.getProximityInfo(), true /* blockOffensiveWords */,
+                                null /* additionalFeaturesOptions */, 0 /* sessionId */,
+                                null /* rawSuggestions */);
+                if (suggestionResults.isEmpty()) {
+                    holder.set(false);
+                    return;
+                }
+                holder.set(isDistracter(suggestionResults, consideredWord));
+            }
+        });
+        // It's OK to block the distracter filtering, but the dictionary lookup should be done
+        // sequentially using ExecutorUtils.
+        return holder.get(false /* defaultValue */, Constants.GET_SUGGESTED_WORDS_TIMEOUT);
     }
 }
diff --git a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
index 8bcf14aa32d5dc65e2e9afef3b8bb06e373c4f9f..c67d1fa5e7c5d591b1772e251947aa27b217a6f9 100644
--- a/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/personalization/UserHistoryDictionaryTests.java
@@ -23,6 +23,7 @@ import android.util.Log;
 import com.android.inputmethod.latin.ExpandableBinaryDictionary;
 import com.android.inputmethod.latin.PrevWordsInfo;
 import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
+import com.android.inputmethod.latin.utils.DistracterFilter;
 import com.android.inputmethod.latin.utils.FileUtils;
 
 import java.io.File;
@@ -112,7 +113,8 @@ public class UserHistoryDictionaryTests extends AndroidTestCase {
         PrevWordsInfo prevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO;
         for (String word : words) {
             UserHistoryDictionary.addToDictionary(dict, prevWordsInfo, word, true,
-                    (int)TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
+                    (int)TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()),
+                    DistracterFilter.EMPTY_DISTRACTER_FILTER);
             prevWordsInfo = new PrevWordsInfo(word);
         }
     }
@@ -262,7 +264,8 @@ public class UserHistoryDictionaryTests extends AndroidTestCase {
         dict.waitAllTasksForTests();
         PrevWordsInfo prevWordsInfo = new PrevWordsInfo(null);
         for (final String word : words) {
-            UserHistoryDictionary.addToDictionary(dict, prevWordsInfo, word, true, mCurrentTime);
+            UserHistoryDictionary.addToDictionary(dict, prevWordsInfo, word, true, mCurrentTime,
+                    DistracterFilter.EMPTY_DISTRACTER_FILTER);
             prevWordsInfo = new PrevWordsInfo(word);
             dict.waitAllTasksForTests();
             assertTrue(dict.isInUnderlyingBinaryDictionaryForTests(word));