diff --git a/native/src/unigram_dictionary.cpp b/native/src/unigram_dictionary.cpp
index e3296f1..d01f9c0 100644
--- a/native/src/unigram_dictionary.cpp
+++ b/native/src/unigram_dictionary.cpp
@@ -153,6 +153,13 @@
 
     if (DEBUG_DICT) {
         LOGI("Returning %d words", suggestedWordsCount);
+        /// Print the returned words
+        for (int j = 0; j < suggestedWordsCount; ++j) {
+            short unsigned int* w = mOutputChars + j * MAX_WORD_LENGTH;
+            char s[MAX_WORD_LENGTH];
+            for (int i = 0; i <= MAX_WORD_LENGTH; i++) s[i] = w[i];
+            LOGI("%s %i", s, mFrequencies[j]);
+        }
         LOGI("Next letters: ");
         for (int k = 0; k < NEXT_LETTERS_SIZE; k++) {
             if (mNextLettersFrequency[k] > 0) {
@@ -322,16 +329,6 @@
     return false;
 }
 
-inline void UnigramDictionary::addWordAlternatesSpellings(const uint8_t* const root, int pos,
-        int depth, int finalFreq) {
-    // TODO: actually add alternates when the format supports it.
-}
-
-static inline bool hasAlternateSpellings(uint8_t flags) {
-    // TODO: when the format supports it, return the actual value.
-    return false;
-}
-
 static inline unsigned short toBaseLowerCase(unsigned short c) {
     if (c < sizeof(BASE_CHARS) / sizeof(BASE_CHARS[0])) {
         c = BASE_CHARS[c];
@@ -372,7 +369,7 @@
         assert(missingPos < mInputLength);
     }
     int rootPosition = ROOT_POS;
-    // Get the number of child of root, then increment the position
+    // Get the number of children of root, then increment the position
     int childCount = Dictionary::getCount(DICT_ROOT, &rootPosition);
     int depth = 0;
 
@@ -657,22 +654,19 @@
 }
 
 inline void UnigramDictionary::onTerminal(unsigned short int* word, const int depth,
-        const uint8_t* const root, const uint8_t flags, int pos,
+        const uint8_t* const root, const uint8_t flags, const int pos,
         const int inputIndex, const int matchWeight, const int skipPos,
         const int excessivePos, const int transposedPos, const int freq, const bool sameLength,
         int* nextLetters, const int nextLettersSize) {
 
     const bool isSameAsTyped = sameLength ? sameAsTyped(word, depth + 1) : false;
-    const bool hasAlternates = hasAlternateSpellings(flags);
-    if (isSameAsTyped && !hasAlternates) return;
+    if (isSameAsTyped) return;
 
     if (depth >= MIN_SUGGEST_DEPTH) {
         const int finalFreq = calculateFinalFreq(inputIndex, depth, matchWeight, skipPos,
                 excessivePos, transposedPos, freq, sameLength);
         if (!isSameAsTyped)
             addWord(word, depth + 1, finalFreq);
-        if (hasAlternates)
-            addWordAlternatesSpellings(DICT_ROOT, pos, flags, finalFreq);
     }
 
     if (sameLength && depth >= mInputLength && skipPos < 0) {
@@ -725,8 +719,8 @@
     }
 }
 
-inline int UnigramDictionary::getBestWordFreq(const int startInputIndex, const int inputLength,
-        unsigned short *word) {
+inline int UnigramDictionary::getMostFrequentWordLike(const int startInputIndex,
+        const int inputLength, unsigned short *word) {
     int pos = ROOT_POS;
     int count = Dictionary::getCount(DICT_ROOT, &pos);
     int maxFreq = 0;
diff --git a/native/src/unigram_dictionary.h b/native/src/unigram_dictionary.h
index 56690fe..7183b20 100644
--- a/native/src/unigram_dictionary.h
+++ b/native/src/unigram_dictionary.h
@@ -80,7 +80,7 @@
             const int excessivePos, const int transposedPos, const int freq,
             const bool sameLength) const;
     void onTerminal(unsigned short int* word, const int depth,
-            const uint8_t* const root, const uint8_t flags, int pos,
+            const uint8_t* const root, const uint8_t flags, const int pos,
             const int inputIndex, const int matchWeight, const int skipPos,
             const int excessivePos, const int transposedPos, const int freq, const bool sameLength,
             int *nextLetters, const int nextLettersSize);
@@ -95,7 +95,8 @@
             int *nextLetters, const int nextLettersSize, int *newCount, int *newChildPosition,
             bool *newTraverseAllNodes, int *newSnr, int*newInputIndex, int *newDiffs,
             int *nextSiblingPosition, int *nextOutputIndex);
-    int getBestWordFreq(const int startInputIndex, const int inputLength, unsigned short *word);
+    int getMostFrequentWordLike(const int startInputIndex, const int inputLength,
+            unsigned short *word);
     // Process a node by considering missing space
     bool processCurrentNodeForExactMatch(const int firstChildPos,
             const int startInputIndex, const int depth, unsigned short *word,
