diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java
index aab16653e2a62d8f02ac73c3c9ffe646f030dba0..bc7276b9af72e418b3b923151ecd441b5404bcaa 100644
--- a/java/src/com/android/inputmethod/latin/Dictionary.java
+++ b/java/src/com/android/inputmethod/latin/Dictionary.java
@@ -95,6 +95,10 @@ public abstract class Dictionary {
         return NOT_A_PROBABILITY;
     }
 
+    public int getMaxFrequencyOfExactMatches(final String word) {
+        return NOT_A_PROBABILITY;
+    }
+
     /**
      * Compares the contents of the character array with the typed word and returns true if they
      * are the same.
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index 7fa3d04799e694bf8595d9af4706e9995be0dadd..e8b0be0691d6282f8cb3e4591af3fae1f5ba2c77 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -63,7 +63,7 @@ public class DictionaryFacilitator {
     private final Object mLock = new Object();
     private final DistracterFilter mDistracterFilter;
 
-    private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTION =
+    private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS =
             new String[] {
                 Dictionary.TYPE_MAIN,
                 Dictionary.TYPE_USER_HISTORY,
@@ -89,8 +89,8 @@ public class DictionaryFacilitator {
             new Class[] { Context.class, Locale.class, File.class };
 
     private static final String[] SUB_DICT_TYPES =
-            Arrays.copyOfRange(DICT_TYPES_ORDERED_TO_GET_SUGGESTION, 1 /* start */,
-                    DICT_TYPES_ORDERED_TO_GET_SUGGESTION.length);
+            Arrays.copyOfRange(DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS, 1 /* start */,
+                    DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS.length);
 
     /**
      * Class contains dictionaries for a locale.
@@ -333,7 +333,7 @@ public class DictionaryFacilitator {
             dictionaries = mDictionaries;
             mDictionaries = new Dictionaries();
         }
-        for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) {
+        for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) {
             dictionaries.closeDict(dictType);
         }
         mDistracterFilter.close();
@@ -469,7 +469,7 @@ public class DictionaryFacilitator {
         final SuggestionResults suggestionResults =
                 new SuggestionResults(dictionaries.mLocale, SuggestedWords.MAX_SUGGESTIONS);
         final float[] languageWeight = new float[] { Dictionary.NOT_A_LANGUAGE_WEIGHT };
-        for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) {
+        for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) {
             final Dictionary dictionary = dictionaries.getDict(dictType);
             if (null == dictionary) continue;
             final ArrayList<SuggestedWordInfo> dictionarySuggestions =
@@ -502,7 +502,7 @@ public class DictionaryFacilitator {
             return false;
         }
         final String lowerCasedWord = word.toLowerCase(dictionaries.mLocale);
-        for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) {
+        for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) {
             final Dictionary dictionary = dictionaries.getDict(dictType);
             // Ideally the passed map would come out of a {@link java.util.concurrent.Future} and
             // would be immutable once it's finished initializing, but concretely a null test is
@@ -516,16 +516,22 @@ public class DictionaryFacilitator {
         return false;
     }
 
-    public int getFrequency(final String word) {
+    private int getFrequencyInternal(final String word,
+            final boolean isGettingMaxFrequencyOfExactMatches) {
         if (TextUtils.isEmpty(word)) {
             return Dictionary.NOT_A_PROBABILITY;
         }
-        int maxFreq = -1;
+        int maxFreq = Dictionary.NOT_A_PROBABILITY;
         final Dictionaries dictionaries = mDictionaries;
-        for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) {
+        for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS) {
             final Dictionary dictionary = dictionaries.getDict(dictType);
             if (dictionary == null) continue;
-            final int tempFreq = dictionary.getFrequency(word);
+            final int tempFreq;
+            if (isGettingMaxFrequencyOfExactMatches) {
+                tempFreq = dictionary.getMaxFrequencyOfExactMatches(word);
+            } else {
+                tempFreq = dictionary.getFrequency(word);
+            }
             if (tempFreq >= maxFreq) {
                 maxFreq = tempFreq;
             }
@@ -533,6 +539,14 @@ public class DictionaryFacilitator {
         return maxFreq;
     }
 
+    public int getFrequency(final String word) {
+        return getFrequencyInternal(word, false /* isGettingMaxFrequencyOfExactMatches */);
+    }
+
+    public int getMaxFrequencyOfExactMatches(final String word) {
+        return getFrequencyInternal(word, true /* isGettingMaxFrequencyOfExactMatches */);
+    }
+
     public void clearUserHistoryDictionary() {
         final ExpandableBinaryDictionary userHistoryDict =
                 mDictionaries.getSubDict(Dictionary.TYPE_USER_HISTORY);
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index b10bae01af0b5691e62ae507319d67f21768ad20..8664c09e4065528e44afc8ee25d07af93b832cb5 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -441,6 +441,30 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
         return mBinaryDictionary.isValidWord(word);
     }
 
+    @Override
+    public int getMaxFrequencyOfExactMatches(final String word) {
+        reloadDictionaryIfRequired();
+        boolean lockAcquired = false;
+        try {
+            lockAcquired = mLock.readLock().tryLock(
+                    TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS, TimeUnit.MILLISECONDS);
+            if (lockAcquired) {
+                if (mBinaryDictionary == null) {
+                    return NOT_A_PROBABILITY;
+                }
+                return mBinaryDictionary.getMaxFrequencyOfExactMatches(word);
+            }
+        } catch (final InterruptedException e) {
+            Log.e(TAG, "Interrupted tryLock() in getMaxFrequencyOfExactMatches().", e);
+        } finally {
+            if (lockAcquired) {
+                mLock.readLock().unlock();
+            }
+        }
+        return NOT_A_PROBABILITY;
+    }
+
+
     protected boolean isValidNgramLocked(final PrevWordsInfo prevWordsInfo, final String word) {
         if (mBinaryDictionary == null) return false;
         return mBinaryDictionary.isValidNgram(prevWordsInfo, word);
diff --git a/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java
index 8f744bef8961698563d7db1f977077f5c65989ac..7989346f4149a95a908c35bcc03d28d12cee1d6a 100644
--- a/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java
@@ -101,6 +101,18 @@ public final class ReadOnlyBinaryDictionary extends Dictionary {
         return NOT_A_PROBABILITY;
     }
 
+    @Override
+    public int getMaxFrequencyOfExactMatches(final String word) {
+        if (mLock.readLock().tryLock()) {
+            try {
+                return mBinaryDictionary.getMaxFrequencyOfExactMatches(word);
+            } finally {
+                mLock.readLock().unlock();
+            }
+        }
+        return NOT_A_PROBABILITY;
+    }
+
     @Override
     public void close() {
         mLock.writeLock().lock();