diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 096b946d24b168c815a95af1ab0b398c04226e5d..284daddeefe4a6657cc432907dae19120b144bfe 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -189,6 +189,7 @@ public final class BinaryDictionary extends Dictionary {
     private static native void closeNative(long dict);
     private static native int getFormatVersionNative(long dict);
     private static native int getProbabilityNative(long dict, int[] word);
+    private static native int getMaxProbabilityOfExactMatchesNative(long dict, int[] word);
     private static native int getBigramProbabilityNative(long dict, int[] word0,
             boolean isBeginningOfSentence, int[] word1);
     private static native void getWordPropertyNative(long dict, int[] word,
@@ -350,11 +351,17 @@ public final class BinaryDictionary extends Dictionary {
 
     @Override
     public int getFrequency(final String word) {
-        if (word == null) return NOT_A_PROBABILITY;
+        if (TextUtils.isEmpty(word)) return NOT_A_PROBABILITY;
         int[] codePoints = StringUtils.toCodePointArray(word);
         return getProbabilityNative(mNativeDict, codePoints);
     }
 
+    public int getMaxFrequencyOfExactMatches(final String word) {
+        if (TextUtils.isEmpty(word)) return NOT_A_PROBABILITY;
+        int[] codePoints = StringUtils.toCodePointArray(word);
+        return getMaxProbabilityOfExactMatchesNative(mNativeDict, codePoints);
+    }
+
     @UsedForTesting
     public boolean isValidNgram(final PrevWordsInfo prevWordsInfo, final String word) {
         return getNgramProbability(prevWordsInfo, word) != NOT_A_PROBABILITY;
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index d6a6196d266522572fb628283864726d4eda0d6d..bbeb8dd34050f3d33532b9a241bb9d587ad8e1ac 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -273,6 +273,17 @@ static jint latinime_BinaryDictionary_getProbability(JNIEnv *env, jclass clazz,
     return dictionary->getProbability(codePoints, wordLength);
 }
 
+static jint latinime_BinaryDictionary_getMaxProbabilityOfExactMatches(
+        JNIEnv *env, jclass clazz, jlong dict, jintArray word) {
+    Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
+    if (!dictionary) return NOT_A_PROBABILITY;
+    const jsize wordLength = env->GetArrayLength(word);
+    int codePoints[wordLength];
+    env->GetIntArrayRegion(word, 0, wordLength, codePoints);
+    // TODO: Implement.
+    return NOT_A_PROBABILITY;
+}
+
 static jint latinime_BinaryDictionary_getBigramProbability(JNIEnv *env, jclass clazz,
         jlong dict, jintArray word0, jboolean isBeginningOfSentence, jintArray word1) {
     Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
@@ -633,6 +644,11 @@ static const JNINativeMethod sMethods[] = {
         const_cast<char *>("(J[I)I"),
         reinterpret_cast<void *>(latinime_BinaryDictionary_getProbability)
     },
+    {
+        const_cast<char *>("getMaxProbabilityOfExactMatchesNative"),
+        const_cast<char *>("(J[I)I"),
+        reinterpret_cast<void *>(latinime_BinaryDictionary_getMaxProbabilityOfExactMatches)
+    },
     {
         const_cast<char *>("getBigramProbabilityNative"),
         const_cast<char *>("(J[IZ[I)I"),