diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index e420f80563f3efa77f64b4013eca3c1a0551b24c..19aeb289568fc067a295bbe7ece15eef5409558e 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -403,10 +403,10 @@ static bool latinime_BinaryDictionary_addNgramEntry(JNIEnv *env, jclass clazz, j
     jsize wordLength = env->GetArrayLength(word);
     int wordCodePoints[wordLength];
     env->GetIntArrayRegion(word, 0, wordLength, wordCodePoints);
-    // Use 1 for count to indicate the bigram has inputted.
-    const BigramProperty bigramProperty(CodePointArrayView(wordCodePoints, wordLength).toVector(),
+    // Use 1 for count to indicate the ngram has inputted.
+    const NgramProperty ngramProperty(CodePointArrayView(wordCodePoints, wordLength).toVector(),
             probability, timestamp, 0 /* level */, 1 /* count */);
-    return dictionary->addNgramEntry(&prevWordsInfo, &bigramProperty);
+    return dictionary->addNgramEntry(&prevWordsInfo, &ngramProperty);
 }
 
 static bool latinime_BinaryDictionary_removeNgramEntry(JNIEnv *env, jclass clazz, jlong dict,
@@ -501,12 +501,12 @@ static int latinime_BinaryDictionary_addMultipleDictionaryEntries(JNIEnv *env, j
         if (word0) {
             jint bigramProbability = env->GetIntField(languageModelParam, bigramProbabilityFieldId);
             // Use 1 for count to indicate the bigram has inputted.
-            const BigramProperty bigramProperty(
+            const NgramProperty ngramProperty(
                     CodePointArrayView(word1CodePoints, word1Length).toVector(),
                     bigramProbability, timestamp, 0 /* level */, 1 /* count */);
             const PrevWordsInfo prevWordsInfo(word0CodePoints, word0Length,
                     false /* isBeginningOfSentence */);
-            dictionary->addNgramEntry(&prevWordsInfo, &bigramProperty);
+            dictionary->addNgramEntry(&prevWordsInfo, &ngramProperty);
         }
         if (dictionary->needsToRunGC(true /* mindsBlockByGC */)) {
             return i + 1;
@@ -603,6 +603,7 @@ static bool latinime_BinaryDictionary_migrateNative(JNIEnv *env, jclass clazz, j
     } while (token != 0);
 
     // Add bigrams.
+    // TODO: Support ngrams.
     do {
         token = dictionary->getNextWordAndNextToken(token, wordCodePoints, &wordCodePointCount);
         const WordProperty wordProperty = dictionary->getWordProperty(
@@ -617,10 +618,10 @@ static bool latinime_BinaryDictionary_migrateNative(JNIEnv *env, jclass clazz, j
         }
         const PrevWordsInfo prevWordsInfo(wordCodePoints, wordCodePointCount,
                 wordProperty.getUnigramProperty()->representsBeginningOfSentence());
-        for (const BigramProperty &bigramProperty : *wordProperty.getBigramProperties()) {
+        for (const NgramProperty &ngramProperty : *wordProperty.getNgramProperties()) {
             if (!dictionaryStructureWithBufferPolicy->addNgramEntry(&prevWordsInfo,
-                    &bigramProperty)) {
-                LogUtils::logToJava(env, "Cannot add bigram to the new dict.");
+                    &ngramProperty)) {
+                LogUtils::logToJava(env, "Cannot add ngram to the new dict.");
                 return false;
             }
         }
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp
index a3bb408c3c8066d8a876622e424cbc02d3e43fbb..c3f422916aebdd6a4cf521f13ebdcc564c8e8f6d 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp
@@ -144,9 +144,9 @@ bool Dictionary::removeUnigramEntry(const CodePointArrayView codePoints) {
 }
 
 bool Dictionary::addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
-        const BigramProperty *const bigramProperty) {
+        const NgramProperty *const ngramProperty) {
     TimeKeeper::setCurrentTime();
-    return mDictionaryStructureWithBufferPolicy->addNgramEntry(prevWordsInfo, bigramProperty);
+    return mDictionaryStructureWithBufferPolicy->addNgramEntry(prevWordsInfo, ngramProperty);
 }
 
 bool Dictionary::removeNgramEntry(const PrevWordsInfo *const prevWordsInfo,
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.h b/native/jni/src/suggest/core/dictionary/dictionary.h
index 324e3504a3bb8f539ca2bb2275a10ecbe869d2ef..09f8eacebb821b524a1ef9014f41676659a1a6ad 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.h
+++ b/native/jni/src/suggest/core/dictionary/dictionary.h
@@ -85,7 +85,7 @@ class Dictionary {
     bool removeUnigramEntry(const CodePointArrayView codePoints);
 
     bool addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
-            const BigramProperty *const bigramProperty);
+            const NgramProperty *const ngramProperty);
 
     bool removeNgramEntry(const PrevWordsInfo *const prevWordsInfo,
             const CodePointArrayView codePoints);
diff --git a/native/jni/src/suggest/core/dictionary/property/bigram_property.h b/native/jni/src/suggest/core/dictionary/property/ngram_property.h
similarity index 83%
rename from native/jni/src/suggest/core/dictionary/property/bigram_property.h
rename to native/jni/src/suggest/core/dictionary/property/ngram_property.h
index 9e0baa032671ed45e5a3d7e87c8e08a4bc291fc8..5d822fa3bbc76261c59e9a2a2ffd5cbc447b4cc6 100644
--- a/native/jni/src/suggest/core/dictionary/property/bigram_property.h
+++ b/native/jni/src/suggest/core/dictionary/property/ngram_property.h
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#ifndef LATINIME_BIGRAM_PROPERTY_H
-#define LATINIME_BIGRAM_PROPERTY_H
+#ifndef LATINIME_NGRAM_PROPERTY_H
+#define LATINIME_NGRAM_PROPERTY_H
 
 #include <vector>
 
@@ -23,10 +23,9 @@
 
 namespace latinime {
 
-// TODO: Change to NgramProperty.
-class BigramProperty {
+class NgramProperty {
  public:
-    BigramProperty(const std::vector<int> &&targetCodePoints, const int probability,
+    NgramProperty(const std::vector<int> &&targetCodePoints, const int probability,
             const int timestamp, const int level, const int count)
             : mTargetCodePoints(std::move(targetCodePoints)), mProbability(probability),
               mTimestamp(timestamp), mLevel(level), mCount(count) {}
@@ -53,7 +52,7 @@ class BigramProperty {
 
  private:
     // Default copy constructor and assign operator are used for using in std::vector.
-    DISALLOW_DEFAULT_CONSTRUCTOR(BigramProperty);
+    DISALLOW_DEFAULT_CONSTRUCTOR(NgramProperty);
 
     // TODO: Make members const.
     std::vector<int> mTargetCodePoints;
@@ -63,4 +62,4 @@ class BigramProperty {
     int mCount;
 };
 } // namespace latinime
-#endif // LATINIME_WORD_PROPERTY_H
+#endif // LATINIME_NGRAM_PROPERTY_H
diff --git a/native/jni/src/suggest/core/dictionary/property/word_property.cpp b/native/jni/src/suggest/core/dictionary/property/word_property.cpp
index 66daf3e3fd6c38f9f38076ffdeabb2e5829949e2..e3406fac598ce6f7ffd28857534d163944b85a64 100644
--- a/native/jni/src/suggest/core/dictionary/property/word_property.cpp
+++ b/native/jni/src/suggest/core/dictionary/property/word_property.cpp
@@ -28,7 +28,7 @@ void WordProperty::outputProperties(JNIEnv *const env, jintArray outCodePoints,
             MAX_WORD_LENGTH /* maxLength */, mCodePoints.data(), mCodePoints.size(),
             false /* needsNullTermination */);
     jboolean flags[] = {mUnigramProperty.isNotAWord(), mUnigramProperty.isBlacklisted(),
-            !mBigrams.empty(), mUnigramProperty.hasShortcuts(),
+            !mNgrams.empty(), mUnigramProperty.hasShortcuts(),
             mUnigramProperty.representsBeginningOfSentence()};
     env->SetBooleanArrayRegion(outFlags, 0 /* start */, NELEMS(flags), flags);
     int probabilityInfo[] = {mUnigramProperty.getProbability(), mUnigramProperty.getTimestamp(),
@@ -42,8 +42,9 @@ void WordProperty::outputProperties(JNIEnv *const env, jintArray outCodePoints,
     jmethodID addMethodId = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");
 
     // Output bigrams.
-    for (const auto &bigramProperty : mBigrams) {
-        const std::vector<int> *const word1CodePoints = bigramProperty.getTargetCodePoints();
+    // TODO: Support n-gram
+    for (const auto &ngramProperty : mNgrams) {
+        const std::vector<int> *const word1CodePoints = ngramProperty.getTargetCodePoints();
         jintArray bigramWord1CodePointArray = env->NewIntArray(word1CodePoints->size());
         JniDataUtils::outputCodePoints(env, bigramWord1CodePointArray, 0 /* start */,
                 word1CodePoints->size(), word1CodePoints->data(), word1CodePoints->size(),
@@ -51,9 +52,9 @@ void WordProperty::outputProperties(JNIEnv *const env, jintArray outCodePoints,
         env->CallBooleanMethod(outBigramTargets, addMethodId, bigramWord1CodePointArray);
         env->DeleteLocalRef(bigramWord1CodePointArray);
 
-        int bigramProbabilityInfo[] = {bigramProperty.getProbability(),
-                bigramProperty.getTimestamp(), bigramProperty.getLevel(),
-                bigramProperty.getCount()};
+        int bigramProbabilityInfo[] = {ngramProperty.getProbability(),
+                ngramProperty.getTimestamp(), ngramProperty.getLevel(),
+                ngramProperty.getCount()};
         jintArray bigramProbabilityInfoArray = env->NewIntArray(NELEMS(bigramProbabilityInfo));
         env->SetIntArrayRegion(bigramProbabilityInfoArray, 0 /* start */,
                 NELEMS(bigramProbabilityInfo), bigramProbabilityInfo);
diff --git a/native/jni/src/suggest/core/dictionary/property/word_property.h b/native/jni/src/suggest/core/dictionary/property/word_property.h
index 4e6febb3f948fd3be3faeb5417b5014786c4bc2d..0c23e822529c2c0ab714b2219d80a45be51bbe46 100644
--- a/native/jni/src/suggest/core/dictionary/property/word_property.h
+++ b/native/jni/src/suggest/core/dictionary/property/word_property.h
@@ -21,7 +21,7 @@
 
 #include "defines.h"
 #include "jni.h"
-#include "suggest/core/dictionary/property/bigram_property.h"
+#include "suggest/core/dictionary/property/ngram_property.h"
 #include "suggest/core/dictionary/property/unigram_property.h"
 
 namespace latinime {
@@ -31,12 +31,12 @@ class WordProperty {
  public:
     // Default constructor is used to create an instance that indicates an invalid word.
     WordProperty()
-            : mCodePoints(), mUnigramProperty(), mBigrams() {}
+            : mCodePoints(), mUnigramProperty(), mNgrams() {}
 
     WordProperty(const std::vector<int> &&codePoints, const UnigramProperty *const unigramProperty,
-            const std::vector<BigramProperty> *const bigrams)
+            const std::vector<NgramProperty> *const bigrams)
             : mCodePoints(std::move(codePoints)), mUnigramProperty(*unigramProperty),
-              mBigrams(*bigrams) {}
+              mNgrams(*bigrams) {}
 
     void outputProperties(JNIEnv *const env, jintArray outCodePoints, jbooleanArray outFlags,
             jintArray outProbabilityInfo, jobject outBigramTargets, jobject outBigramProbabilities,
@@ -46,8 +46,8 @@ class WordProperty {
         return &mUnigramProperty;
     }
 
-    const std::vector<BigramProperty> *getBigramProperties() const {
-        return &mBigrams;
+    const std::vector<NgramProperty> *getNgramProperties() const {
+        return &mNgrams;
     }
 
  private:
@@ -56,7 +56,7 @@ class WordProperty {
 
     const std::vector<int> mCodePoints;
     const UnigramProperty mUnigramProperty;
-    const std::vector<BigramProperty> mBigrams;
+    const std::vector<NgramProperty> mNgrams;
 };
 } // namespace latinime
 #endif // LATINIME_WORD_PROPERTY_H
diff --git a/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
index 1546b26102bcee30ceba6a086d4aa082045573c4..f4b97989fd92176b355269a4da00e0aabb03ecf1 100644
--- a/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
+++ b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
@@ -81,7 +81,7 @@ class DictionaryStructureWithBufferPolicy {
 
     // Returns whether the update was success or not.
     virtual bool addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
-            const BigramProperty *const bigramProperty) = 0;
+            const NgramProperty *const ngramProperty) = 0;
 
     // Returns whether the update was success or not.
     virtual bool removeNgramEntry(const PrevWordsInfo *const prevWordsInfo,
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.cpp
index 3e8e059f2cdefe29b12a47e0bd28fa29cdde3a78..c6397706d5cf1bdfebfa7ecb5137d856485fdf65 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.cpp
@@ -24,7 +24,7 @@
 
 #include "suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.h"
 
-#include "suggest/core/dictionary/property/bigram_property.h"
+#include "suggest/core/dictionary/property/ngram_property.h"
 #include "suggest/policyimpl/dictionary/header/header_policy.h"
 #include "suggest/policyimpl/dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.h"
 #include "suggest/policyimpl/dictionary/structure/backward/v402/content/bigram_dict_content.h"
@@ -60,7 +60,7 @@ void Ver4BigramListPolicy::getNextBigram(int *const outBigramPos, int *const out
 }
 
 bool Ver4BigramListPolicy::addNewEntry(const int terminalId, const int newTargetTerminalId,
-        const BigramProperty *const bigramProperty, bool *const outAddedNewEntry) {
+        const NgramProperty *const ngramProperty, bool *const outAddedNewEntry) {
     // 1. The word has no bigrams yet.
     // 2. The word has bigrams, and there is the target in the list.
     // 3. The word has bigrams, and there is an invalid entry that can be reclaimed.
@@ -79,7 +79,7 @@ bool Ver4BigramListPolicy::addNewEntry(const int terminalId, const int newTarget
         const BigramEntry newBigramEntry(false /* hasNext */, NOT_A_PROBABILITY,
                 newTargetTerminalId);
         const BigramEntry bigramEntryToWrite = createUpdatedBigramEntryFrom(&newBigramEntry,
-                bigramProperty);
+                ngramProperty);
         // Write an entry.
         const int writingPos =  mBigramDictContent->getBigramListHeadPos(terminalId);
         if (!mBigramDictContent->writeBigramEntry(&bigramEntryToWrite, writingPos)) {
@@ -112,7 +112,7 @@ bool Ver4BigramListPolicy::addNewEntry(const int terminalId, const int newTarget
         const BigramEntry newBigramEntry(false /* hasNext */, NOT_A_PROBABILITY,
                 newTargetTerminalId);
         const BigramEntry bigramEntryToWrite = createUpdatedBigramEntryFrom(
-                &newBigramEntry, bigramProperty);
+                &newBigramEntry, ngramProperty);
         if (!mBigramDictContent->writeBigramEntryAtTail(&bigramEntryToWrite)) {
             return false;
         }
@@ -138,7 +138,7 @@ bool Ver4BigramListPolicy::addNewEntry(const int terminalId, const int newTarget
     const BigramEntry updatedBigramEntry =
             originalBigramEntry.updateTargetTerminalIdAndGetEntry(newTargetTerminalId);
     const BigramEntry bigramEntryToWrite = createUpdatedBigramEntryFrom(
-            &updatedBigramEntry, bigramProperty);
+            &updatedBigramEntry, ngramProperty);
     return mBigramDictContent->writeBigramEntry(&bigramEntryToWrite, entryPosToUpdate);
 }
 
@@ -264,18 +264,18 @@ int Ver4BigramListPolicy::getEntryPosToUpdate(const int targetTerminalIdToFind,
 
 const BigramEntry Ver4BigramListPolicy::createUpdatedBigramEntryFrom(
         const BigramEntry *const originalBigramEntry,
-        const BigramProperty *const bigramProperty) const {
+        const NgramProperty *const ngramProperty) const {
     // TODO: Consolidate historical info and probability.
     if (mHeaderPolicy->hasHistoricalInfoOfWords()) {
-        const HistoricalInfo historicalInfoForUpdate(bigramProperty->getTimestamp(),
-                bigramProperty->getLevel(), bigramProperty->getCount());
+        const HistoricalInfo historicalInfoForUpdate(ngramProperty->getTimestamp(),
+                ngramProperty->getLevel(), ngramProperty->getCount());
         const HistoricalInfo updatedHistoricalInfo =
                 ForgettingCurveUtils::createUpdatedHistoricalInfo(
-                        originalBigramEntry->getHistoricalInfo(), bigramProperty->getProbability(),
+                        originalBigramEntry->getHistoricalInfo(), ngramProperty->getProbability(),
                         &historicalInfoForUpdate, mHeaderPolicy);
         return originalBigramEntry->updateHistoricalInfoAndGetEntry(&updatedHistoricalInfo);
     } else {
-        return originalBigramEntry->updateProbabilityAndGetEntry(bigramProperty->getProbability());
+        return originalBigramEntry->updateProbabilityAndGetEntry(ngramProperty->getProbability());
     }
 }
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.h
index 50a4c9743e9741b1d3f588b88568a91369a6c868..aac6f547044d6e7fb6db97308cbc2e3e835954c0 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.h
@@ -36,7 +36,7 @@ namespace v402 {
 class BigramDictContent;
 } // namespace v402
 } // namespace backward
-class BigramProperty;
+class NgramProperty;
 namespace backward {
 namespace v402 {
 } // namespace v402
@@ -64,7 +64,7 @@ class Ver4BigramListPolicy : public DictionaryBigramsStructurePolicy {
     }
 
     bool addNewEntry(const int terminalId, const int newTargetTerminalId,
-            const BigramProperty *const bigramProperty, bool *const outAddedNewEntry);
+            const NgramProperty *const ngramProperty, bool *const outAddedNewEntry);
 
     bool removeEntry(const int terminalId, const int targetTerminalId);
 
@@ -80,7 +80,7 @@ class Ver4BigramListPolicy : public DictionaryBigramsStructurePolicy {
             int *const outTailEntryPos) const;
 
     const BigramEntry createUpdatedBigramEntryFrom(const BigramEntry *const originalBigramEntry,
-            const BigramProperty *const bigramProperty) const;
+            const NgramProperty *const ngramProperty) const;
 
     bool updateHasNextFlag(const bool hasNext, const int bigramEntryPos);
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp
index 97a8bcc98e17ad4912ef4f2c0f41aac61eaa4e43..6827c3ee378046d688c2a14201dad4f3e74430c9 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp
@@ -232,8 +232,8 @@ bool Ver4PatriciaTrieNodeWriter::writeNewTerminalPtNodeAndAdvancePosition(
 }
 
 bool Ver4PatriciaTrieNodeWriter::addNgramEntry(const WordIdArrayView prevWordIds, const int wordId,
-        const BigramProperty *const bigramProperty, bool *const outAddedNewEntry) {
-    if (!mBigramPolicy->addNewEntry(prevWordIds[0], wordId, bigramProperty, outAddedNewEntry)) {
+        const NgramProperty *const ngramProperty, bool *const outAddedNewEntry) {
+    if (!mBigramPolicy->addNewEntry(prevWordIds[0], wordId, ngramProperty, outAddedNewEntry)) {
         AKLOGE("Cannot add new bigram entry. prevWordId: %d, wordId: %d",
                 prevWordIds[0], wordId);
         return false;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.h b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.h
index 9d8a55bff060074ac62411ca3c36ffa638aba6af..d0bab50f8476f64cb431ce60d4a108138ebfa02e 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.h
@@ -94,7 +94,7 @@ class Ver4PatriciaTrieNodeWriter : public PtNodeWriter {
             const UnigramProperty *const unigramProperty, int *const ptNodeWritingPos);
 
     virtual bool addNgramEntry(const WordIdArrayView prevWordIds, const int wordId,
-            const BigramProperty *const bigramProperty, bool *const outAddedNewEntry);
+            const NgramProperty *const ngramProperty, bool *const outAddedNewEntry);
 
     virtual bool removeNgramEntry(const WordIdArrayView prevWordIds, const int wordId);
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
index f752f89f1bd5e7a711cec4bb02838fff8f3c43bc..9631cf1aea0271ec6350a2fee28d9276aaf31099 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
@@ -30,7 +30,7 @@
 #include "suggest/core/dicnode/dic_node_vector.h"
 #include "suggest/core/dictionary/multi_bigram_map.h"
 #include "suggest/core/dictionary/ngram_listener.h"
-#include "suggest/core/dictionary/property/bigram_property.h"
+#include "suggest/core/dictionary/property/ngram_property.h"
 #include "suggest/core/dictionary/property/unigram_property.h"
 #include "suggest/core/dictionary/property/word_property.h"
 #include "suggest/core/session/prev_words_info.h"
@@ -312,7 +312,7 @@ bool Ver4PatriciaTriePolicy::removeUnigramEntry(const CodePointArrayView wordCod
 }
 
 bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
-        const BigramProperty *const bigramProperty) {
+        const NgramProperty *const ngramProperty) {
     if (!mBuffers->isUpdatable()) {
         AKLOGI("Warning: addNgramEntry() is called for non-updatable dictionary.");
         return false;
@@ -326,9 +326,9 @@ bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsI
         AKLOGE("prev words info is not valid for adding n-gram entry to the dictionary.");
         return false;
     }
-    if (bigramProperty->getTargetCodePoints()->size() > MAX_WORD_LENGTH) {
+    if (ngramProperty->getTargetCodePoints()->size() > MAX_WORD_LENGTH) {
         AKLOGE("The word is too long to insert the ngram to the dictionary. "
-                "length: %zd", bigramProperty->getTargetCodePoints()->size());
+                "length: %zd", ngramProperty->getTargetCodePoints()->size());
         return false;
     }
     WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> prevWordIdArray;
@@ -356,7 +356,7 @@ bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsI
         }
     }
     const int wordPos = getTerminalPtNodePosFromWordId(getWordId(
-            CodePointArrayView(*bigramProperty->getTargetCodePoints()),
+            CodePointArrayView(*ngramProperty->getTargetCodePoints()),
                     false /* forceLowerCaseSearch */));
     if (wordPos == NOT_A_DICT_POS) {
         return false;
@@ -364,7 +364,7 @@ bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsI
     bool addedNewBigram = false;
     const int prevWordPtNodePos = getTerminalPtNodePosFromWordId(prevWordIds[0]);
     if (mUpdatingHelper.addNgramEntry(PtNodePosArrayView::singleElementView(&prevWordPtNodePos),
-            wordPos, bigramProperty, &addedNewBigram)) {
+            wordPos, ngramProperty, &addedNewBigram)) {
         if (addedNewBigram) {
             mBigramCount++;
         }
@@ -499,7 +499,7 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
                     ptNodeParams.getTerminalId());
     const HistoricalInfo *const historicalInfo = probabilityEntry.getHistoricalInfo();
     // Fetch bigram information.
-    std::vector<BigramProperty> bigrams;
+    std::vector<NgramProperty> ngrams;
     const int bigramListPos = getBigramsPositionOfPtNode(ptNodePos);
     if (bigramListPos != NOT_A_DICT_POS) {
         int bigramWord1CodePoints[MAX_WORD_LENGTH];
@@ -526,7 +526,7 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
                     ForgettingCurveUtils::decodeProbability(
                             bigramEntry.getHistoricalInfo(), mHeaderPolicy) :
                     bigramEntry.getProbability();
-            bigrams.emplace_back(
+            ngrams.emplace_back(
                     CodePointArrayView(bigramWord1CodePoints, codePointCount).toVector(),
                     probability, historicalInfo->getTimeStamp(), historicalInfo->getLevel(),
                     historicalInfo->getCount());
@@ -554,7 +554,7 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
             ptNodeParams.isNotAWord(), ptNodeParams.isBlacklisted(), ptNodeParams.getProbability(),
             historicalInfo->getTimeStamp(), historicalInfo->getLevel(),
             historicalInfo->getCount(), &shortcuts);
-    return WordProperty(wordCodePoints.toVector(), &unigramProperty, &bigrams);
+    return WordProperty(wordCodePoints.toVector(), &unigramProperty, &ngrams);
 }
 
 int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints,
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
index 8420c94d0808e07c61de4d78a304115d9c8578a4..324a53e6213bfd16ed9b96a11295cc1e73ef8170 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
@@ -59,6 +59,7 @@ namespace backward {
 namespace v402 {
 
 // Word id = Position of a PtNode that represents the word.
+// Max supported n-gram is bigram.
 class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
  public:
     Ver4PatriciaTriePolicy(Ver4DictBuffers::Ver4DictBuffersPtr buffers)
@@ -112,7 +113,7 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
     bool removeUnigramEntry(const CodePointArrayView wordCodePoints);
 
     bool addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
-            const BigramProperty *const bigramProperty);
+            const NgramProperty *const ngramProperty);
 
     bool removeNgramEntry(const PrevWordsInfo *const prevWordsInfo,
             const CodePointArrayView wordCodePoints);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.h b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.h
index 2aa4027489a79324ab91f761e03f72bfe1b5d47d..b8a4a92e87fe774b2f5d14db404c5096c083126d 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.h
@@ -76,6 +76,7 @@ class DynamicPtGcEventListeners {
         int mValidUnigramCount;
     };
 
+    // TODO: Remove when we stop supporting v402 format.
     // Updates all bigram entries that are held by valid PtNodes. This removes useless bigram
     // entries.
     class TraversePolicyToUpdateBigramProbability
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.cpp
index 3b58d7d6d48a718cd7f98cbd7a0e423a7ecf8363..92fd6f21494494fc3d3cfe9bf1b7f2587446d0c1 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.cpp
@@ -82,7 +82,7 @@ bool DynamicPtUpdatingHelper::addUnigramWord(DynamicPtReadingHelper *const readi
 }
 
 bool DynamicPtUpdatingHelper::addNgramEntry(const PtNodePosArrayView prevWordsPtNodePos,
-        const int wordPos, const BigramProperty *const bigramProperty,
+        const int wordPos, const NgramProperty *const ngramProperty,
         bool *const outAddedNewEntry) {
     if (prevWordsPtNodePos.empty()) {
         return false;
@@ -96,7 +96,7 @@ bool DynamicPtUpdatingHelper::addNgramEntry(const PtNodePosArrayView prevWordsPt
     const WordIdArrayView prevWordIds(prevWordTerminalIds, prevWordsPtNodePos.size());
     const int wordId =
             mPtNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(wordPos).getTerminalId();
-    return mPtNodeWriter->addNgramEntry(prevWordIds, wordId, bigramProperty, outAddedNewEntry);
+    return mPtNodeWriter->addNgramEntry(prevWordIds, wordId, ngramProperty, outAddedNewEntry);
 }
 
 bool DynamicPtUpdatingHelper::removeNgramEntry(const PtNodePosArrayView prevWordsPtNodePos,
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.h b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.h
index 710047e8c3595b80766edbbeb7a2435127f44c81..2bbe2f4dca7bbe0d39ec951fb9254d7d5d390d67 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.h
@@ -23,7 +23,7 @@
 
 namespace latinime {
 
-class BigramProperty;
+class NgramProperty;
 class BufferWithExtendableBuffer;
 class DynamicPtReadingHelper;
 class PtNodeReader;
@@ -46,7 +46,7 @@ class DynamicPtUpdatingHelper {
     // TODO: Remove after stopping supporting v402.
     // Add an n-gram entry.
     bool addNgramEntry(const PtNodePosArrayView prevWordsPtNodePos, const int wordPos,
-            const BigramProperty *const bigramProperty, bool *const outAddedNewEntry);
+            const NgramProperty *const ngramProperty, bool *const outAddedNewEntry);
 
     // TODO: Remove after stopping supporting v402.
     // Remove an n-gram entry.
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_writer.h b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_writer.h
index 955d779ac6f856bfb2757e22da9fb30de7ca6b56..954db9b0a34c3a44996062fbb88813e11ca1574e 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_writer.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_writer.h
@@ -25,7 +25,7 @@
 
 namespace latinime {
 
-class BigramProperty;
+class NgramProperty;
 class UnigramProperty;
 
 // Interface class used to write PtNode information.
@@ -72,7 +72,7 @@ class PtNodeWriter {
             const UnigramProperty *const unigramProperty, int *const ptNodeWritingPos) = 0;
 
     virtual bool addNgramEntry(const WordIdArrayView prevWordIds, const int wordId,
-            const BigramProperty *const bigramProperty, bool *const outAddedNewEntry) = 0;
+            const NgramProperty *const ngramProperty, bool *const outAddedNewEntry) = 0;
 
     virtual bool removeNgramEntry(const WordIdArrayView prevWordIds, const int wordId) = 0;
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
index 13cf9a5a844f30d3d6eaff58f52f31baad470293..49095d0e93c0502268efaede1f0965886b2cb4f4 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
@@ -436,7 +436,7 @@ const WordProperty PatriciaTriePolicy::getWordProperty(
     const PtNodeParams ptNodeParams =
             mPtNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
     // Fetch bigram information.
-    std::vector<BigramProperty> bigrams;
+    std::vector<NgramProperty> ngrams;
     const int bigramListPos = getBigramsPositionOfPtNode(ptNodePos);
     int bigramWord1CodePoints[MAX_WORD_LENGTH];
     BinaryDictionaryBigramsIterator bigramsIt(&mBigramListPolicy, bigramListPos);
@@ -450,7 +450,7 @@ const WordProperty PatriciaTriePolicy::getWordProperty(
                     getWordIdFromTerminalPtNodePos(bigramsIt.getBigramPos()), MAX_WORD_LENGTH,
                     bigramWord1CodePoints, &word1Probability);
             const int probability = getProbability(word1Probability, bigramsIt.getProbability());
-            bigrams.emplace_back(
+            ngrams.emplace_back(
                     CodePointArrayView(bigramWord1CodePoints, word1CodePointCount).toVector(),
                     probability, NOT_A_TIMESTAMP /* timestamp */, 0 /* level */, 0 /* count */);
         }
@@ -478,7 +478,7 @@ const WordProperty PatriciaTriePolicy::getWordProperty(
     const UnigramProperty unigramProperty(ptNodeParams.representsBeginningOfSentence(),
             ptNodeParams.isNotAWord(), ptNodeParams.isBlacklisted(), ptNodeParams.getProbability(),
             NOT_A_TIMESTAMP /* timestamp */, 0 /* level */, 0 /* count */, &shortcuts);
-    return WordProperty(wordCodePoints.toVector(), &unigramProperty, &bigrams);
+    return WordProperty(wordCodePoints.toVector(), &unigramProperty, &ngrams);
 }
 
 int PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints,
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
index 0d679c5dcf713266d9bef28e98621d6a2a25a929..a912d03be322b34e906cf481ec53be8d48b4e9a1 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
@@ -38,6 +38,7 @@ class DicNode;
 class DicNodeVector;
 
 // Word id = Position of a PtNode that represents the word.
+// Max supported n-gram is bigram.
 class PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
  public:
     PatriciaTriePolicy(MmappedBuffer::MmappedBufferPtr mmappedBuffer)
@@ -93,7 +94,7 @@ class PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
     }
 
     bool addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
-            const BigramProperty *const bigramProperty) {
+            const NgramProperty *const ngramProperty) {
         // This method should not be called for non-updatable dictionary.
         AKLOGI("Warning: addNgramEntry() is called for non-updatable dictionary.");
         return false;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_entry.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_entry.h
index e1e10ca177bd30f70bf13a5e1e4c7397af81399c..fd52e574cbfac7090e62e791861df3f60ab37a6e 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_entry.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_entry.h
@@ -21,7 +21,7 @@
 #include <cstdint>
 
 #include "defines.h"
-#include "suggest/core/dictionary/property/bigram_property.h"
+#include "suggest/core/dictionary/property/ngram_property.h"
 #include "suggest/core/dictionary/property/unigram_property.h"
 #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h"
 #include "suggest/policyimpl/dictionary/utils/historical_info.h"
@@ -56,12 +56,12 @@ class ProbabilityEntry {
               mHistoricalInfo(unigramProperty->getTimestamp(), unigramProperty->getLevel(),
                       unigramProperty->getCount()) {}
 
-    // Create from bigram property.
+    // Create from ngram property.
     // TODO: Set flags.
-    ProbabilityEntry(const BigramProperty *const bigramProperty)
-            : mFlags(0), mProbability(bigramProperty->getProbability()),
-              mHistoricalInfo(bigramProperty->getTimestamp(), bigramProperty->getLevel(),
-                      bigramProperty->getCount()) {}
+    ProbabilityEntry(const NgramProperty *const ngramProperty)
+            : mFlags(0), mProbability(ngramProperty->getProbability()),
+              mHistoricalInfo(ngramProperty->getTimestamp(), ngramProperty->getLevel(),
+                      ngramProperty->getCount()) {}
 
     bool isValid() const {
         return (mFlags & Ver4DictConstants::FLAG_NOT_A_VALID_ENTRY) == 0;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
index a1a33d27aafe9b76e9c9aadd36453702d0cd02f8..f13512d5a4f42bae47b8d37b93483611de7abe6c 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
@@ -61,6 +61,7 @@ bool Ver4PatriciaTrieNodeWriter::markPtNodeAsDeleted(
     }
 }
 
+// TODO: Quit using bigramLinkedNodePos.
 bool Ver4PatriciaTrieNodeWriter::markPtNodeAsMoved(
         const PtNodeParams *const toBeUpdatedPtNodeParams,
         const int movedPos, const int bigramLinkedNodePos) {
@@ -208,15 +209,16 @@ bool Ver4PatriciaTrieNodeWriter::writeNewTerminalPtNodeAndAdvancePosition(
             terminalId, &probabilityEntryToWrite);
 }
 
+// TODO: Support counting ngram entries.
 bool Ver4PatriciaTrieNodeWriter::addNgramEntry(const WordIdArrayView prevWordIds, const int wordId,
-        const BigramProperty *const bigramProperty, bool *const outAddedNewBigram) {
+        const NgramProperty *const ngramProperty, bool *const outAddedNewBigram) {
     LanguageModelDictContent *const languageModelDictContent =
             mBuffers->getMutableLanguageModelDictContent();
     const ProbabilityEntry probabilityEntry =
             languageModelDictContent->getNgramProbabilityEntry(prevWordIds, wordId);
-    const ProbabilityEntry probabilityEntryOfBigramProperty(bigramProperty);
+    const ProbabilityEntry probabilityEntryOfNgramProperty(ngramProperty);
     const ProbabilityEntry updatedProbabilityEntry = createUpdatedEntryFrom(
-            &probabilityEntry, &probabilityEntryOfBigramProperty);
+            &probabilityEntry, &probabilityEntryOfNgramProperty);
     if (!languageModelDictContent->setNgramProbabilityEntry(
             prevWordIds, wordId, &updatedProbabilityEntry)) {
         AKLOGE("Cannot add new ngram entry. prevWordId[0]: %d, prevWordId.size(): %zd, wordId: %d",
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h
index 17915273b2571b8ca2e6950b14c201fb6f79f3cb..ea4f09904c3ccc446cc1bf753b7af87338905ffd 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h
@@ -74,7 +74,7 @@ class Ver4PatriciaTrieNodeWriter : public PtNodeWriter {
             const UnigramProperty *const unigramProperty, int *const ptNodeWritingPos);
 
     virtual bool addNgramEntry(const WordIdArrayView prevWordIds, const int wordId,
-            const BigramProperty *const bigramProperty, bool *const outAddedNewEntry);
+            const NgramProperty *const ngramProperty, bool *const outAddedNewEntry);
 
     virtual bool removeNgramEntry(const WordIdArrayView prevWordIds, const int wordId);
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
index 0f06964101d24caa2d49e15bda22f2f8834aec72..d46acf59456d70253e6c096fbb2b57341b75a3da 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
@@ -23,7 +23,7 @@
 #include "suggest/core/dicnode/dic_node_vector.h"
 #include "suggest/core/dictionary/multi_bigram_map.h"
 #include "suggest/core/dictionary/ngram_listener.h"
-#include "suggest/core/dictionary/property/bigram_property.h"
+#include "suggest/core/dictionary/property/ngram_property.h"
 #include "suggest/core/dictionary/property/unigram_property.h"
 #include "suggest/core/dictionary/property/word_property.h"
 #include "suggest/core/session/prev_words_info.h"
@@ -266,7 +266,7 @@ bool Ver4PatriciaTriePolicy::removeUnigramEntry(const CodePointArrayView wordCod
 }
 
 bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
-        const BigramProperty *const bigramProperty) {
+        const NgramProperty *const ngramProperty) {
     if (!mBuffers->isUpdatable()) {
         AKLOGI("Warning: addNgramEntry() is called for non-updatable dictionary.");
         return false;
@@ -280,9 +280,9 @@ bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsI
         AKLOGE("prev words info is not valid for adding n-gram entry to the dictionary.");
         return false;
     }
-    if (bigramProperty->getTargetCodePoints()->size() > MAX_WORD_LENGTH) {
+    if (ngramProperty->getTargetCodePoints()->size() > MAX_WORD_LENGTH) {
         AKLOGE("The word is too long to insert the ngram to the dictionary. "
-                "length: %zd", bigramProperty->getTargetCodePoints()->size());
+                "length: %zd", ngramProperty->getTargetCodePoints()->size());
         return false;
     }
     WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> prevWordIdArray;
@@ -311,13 +311,13 @@ bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsI
         // Refresh word ids.
         prevWordsInfo->getPrevWordIds(this, &prevWordIdArray, false /* tryLowerCaseSearch */);
     }
-    const int wordId = getWordId(CodePointArrayView(*bigramProperty->getTargetCodePoints()),
+    const int wordId = getWordId(CodePointArrayView(*ngramProperty->getTargetCodePoints()),
             false /* forceLowerCaseSearch */);
     if (wordId == NOT_A_WORD_ID) {
         return false;
     }
     bool addedNewEntry = false;
-    if (mNodeWriter.addNgramEntry(prevWordIds, wordId, bigramProperty, &addedNewEntry)) {
+    if (mNodeWriter.addNgramEntry(prevWordIds, wordId, ngramProperty, &addedNewEntry)) {
         if (addedNewEntry) {
             mBigramCount++;
         }
@@ -451,7 +451,7 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
     const HistoricalInfo *const historicalInfo = probabilityEntry.getHistoricalInfo();
     // Fetch bigram information.
     // TODO: Support n-gram.
-    std::vector<BigramProperty> bigrams;
+    std::vector<NgramProperty> ngrams;
     const WordIdArrayView prevWordIds = WordIdArrayView::singleElementView(&wordId);
     int bigramWord1CodePoints[MAX_WORD_LENGTH];
     for (const auto entry : mBuffers->getLanguageModelDictContent()->getProbabilityEntries(
@@ -463,7 +463,7 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
         const int probability = probabilityEntry.hasHistoricalInfo() ?
                 ForgettingCurveUtils::decodeProbability(historicalInfo, mHeaderPolicy) :
                 probabilityEntry.getProbability();
-        bigrams.emplace_back(CodePointArrayView(bigramWord1CodePoints, codePointCount).toVector(),
+        ngrams.emplace_back(CodePointArrayView(bigramWord1CodePoints, codePointCount).toVector(),
                 probability, historicalInfo->getTimeStamp(), historicalInfo->getLevel(),
                 historicalInfo->getCount());
     }
@@ -489,7 +489,7 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(
             probabilityEntry.isNotAWord(), probabilityEntry.isBlacklisted(),
             probabilityEntry.getProbability(), historicalInfo->getTimeStamp(),
             historicalInfo->getLevel(), historicalInfo->getCount(), &shortcuts);
-    return WordProperty(wordCodePoints.toVector(), &unigramProperty, &bigrams);
+    return WordProperty(wordCodePoints.toVector(), &unigramProperty, &ngrams);
 }
 
 int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints,
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
index c9bde2cf5a4fdb38216b9c5e3cd7a8be47b594fb..598122bf28af52342e133ca66067d05390e36860 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
@@ -37,6 +37,7 @@ namespace latinime {
 class DicNode;
 class DicNodeVector;
 
+// TODO: Support counting ngram entries.
 // Word id = Artificial id that is stored in the PtNode looked up by the word.
 class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
  public:
@@ -92,7 +93,7 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
     bool removeUnigramEntry(const CodePointArrayView wordCodePoints);
 
     bool addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
-            const BigramProperty *const bigramProperty);
+            const NgramProperty *const ngramProperty);
 
     bool removeNgramEntry(const PrevWordsInfo *const prevWordsInfo,
             const CodePointArrayView wordCodePoints);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
index 442abadeef195b05b2941768f9d4aaf66860b60e..e1ff973de87e27396046199f0d5defbfe5765377 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
@@ -114,14 +114,6 @@ bool Ver4PatriciaTrieWritingHelper::runGC(const int rootPtNodeArrayPos,
         return false;
     }
 
-    readingHelper.initWithPtNodeArrayPos(rootPtNodeArrayPos);
-    DynamicPtGcEventListeners::TraversePolicyToUpdateBigramProbability
-            traversePolicyToUpdateBigramProbability(&ptNodeWriter);
-    if (!readingHelper.traverseAllPtNodesInPostorderDepthFirstManner(
-            &traversePolicyToUpdateBigramProbability)) {
-        return false;
-    }
-
     // Mapping from positions in mBuffer to positions in bufferToWrite.
     PtNodeWriter::DictPositionRelocationMap dictPositionRelocationMap;
     readingHelper.initWithPtNodeArrayPos(rootPtNodeArrayPos);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.h
index b6278c4cb20cd041d8e821a3010971a68a4d31c9..3569d0576230f827ee25974aea24f5cd8a3b0447 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.h
@@ -33,6 +33,7 @@ class Ver4PatriciaTrieWritingHelper {
     Ver4PatriciaTrieWritingHelper(Ver4DictBuffers *const buffers)
             : mBuffers(buffers) {}
 
+    // TODO: Support counting ngram entries.
     bool writeToDictFile(const char *const dictDirPath, const int unigramCount,
             const int bigramCount) const;
 
@@ -70,11 +71,6 @@ class Ver4PatriciaTrieWritingHelper {
             Ver4DictBuffers *const buffersToWrite, int *const outUnigramCount,
             int *const outBigramCount);
 
-    bool truncateUnigrams(const Ver4PatriciaTrieNodeReader *const ptNodeReader,
-            Ver4PatriciaTrieNodeWriter *const ptNodeWriter, const int maxUnigramCount);
-
-    bool truncateBigrams(const int maxBigramCount);
-
     Ver4DictBuffers *const mBuffers;
 };
 } // namespace latinime