diff --git a/native/src/correction.cpp b/native/src/correction.cpp
index 654d4715fbc2490391591518c5ee8c16ace9bade..a05be55c75ef17dfec2b76854bf14ab69406f7b7 100644
--- a/native/src/correction.cpp
+++ b/native/src/correction.cpp
@@ -54,11 +54,16 @@ void Correction::initCorrection(const ProximityInfo *pi, const int inputLength,
 void Correction::initCorrectionState(
         const int rootPos, const int childCount, const bool traverseAll) {
     latinime::initCorrectionState(mCorrectionStates, rootPos, childCount, traverseAll);
+    // TODO: remove
+    mCorrectionStates[0].mSkipPos = mSkipPos;
 }
 
 void Correction::setCorrectionParams(const int skipPos, const int excessivePos,
         const int transposedPos, const int spaceProximityPos, const int missingSpacePos) {
+    // TODO: remove
     mSkipPos = skipPos;
+    // TODO: remove
+    mCorrectionStates[0].mSkipPos = skipPos;
     mExcessivePos = excessivePos;
     mTransposedPos = transposedPos;
     mSpaceProximityPos = spaceProximityPos;
@@ -111,6 +116,7 @@ bool Correction::initProcessState(const int outputIndex) {
     mNeedsToTraverseAllNodes = mCorrectionStates[outputIndex].mNeedsToTraverseAllNodes;
     mDiffs = mCorrectionStates[outputIndex].mDiffs;
     mSkippedCount = mCorrectionStates[outputIndex].mSkippedCount;
+    mSkipPos = mCorrectionStates[outputIndex].mSkipPos;
     mSkipping = false;
     mMatching = false;
     return true;
@@ -158,6 +164,7 @@ void Correction::incrementOutputIndex() {
     mCorrectionStates[mOutputIndex].mDiffs = mDiffs;
     mCorrectionStates[mOutputIndex].mSkippedCount = mSkippedCount;
     mCorrectionStates[mOutputIndex].mSkipping = mSkipping;
+    mCorrectionStates[mOutputIndex].mSkipPos = mSkipPos;
     mCorrectionStates[mOutputIndex].mMatching = mMatching;
 }
 
@@ -195,6 +202,12 @@ Correction::CorrectionType Correction::processCharAndCalcState(
 
     bool skip = false;
     if (mSkipPos >= 0) {
+        if (mSkippedCount == 0 && mSkipPos < mOutputIndex) {
+            if (DEBUG_DICT) {
+                assert(mSkipPos == mOutputIndex - 1);
+            }
+            ++mSkipPos;
+        }
         skip = mSkipPos == mOutputIndex;
         mSkipping = true;
     }
@@ -229,11 +242,6 @@ Correction::CorrectionType Correction::processCharAndCalcState(
             }
         }
 
-        // TODO: remove after allowing combination errors
-        if (skip) {
-            return UNRELATED;
-        }
-
         mWord[mOutputIndex] = c;
         // If inputIndex is greater than mInputLength, that means there is no
         // proximity chars. So, we don't need to check proximity.
diff --git a/native/src/correction.h b/native/src/correction.h
index 62fe3869692d2f5bd436c5a90597667d5f7709d2..0aa5660a6f934c9da63e3b442d90c47e931221f0 100644
--- a/native/src/correction.h
+++ b/native/src/correction.h
@@ -120,7 +120,6 @@ private:
     int mMaxEditDistance;
     int mMaxDepth;
     int mInputLength;
-    int mSkipPos;
     int mExcessivePos;
     int mTransposedPos;
     int mSpaceProximityPos;
@@ -137,6 +136,7 @@ private:
     int mDiffs;
     int mMatchedCharCount;
     int mSkippedCount;
+    int mSkipPos;
     bool mNeedsToTraverseAllNodes;
     bool mMatching;
     bool mSkipping;
diff --git a/native/src/correction_state.h b/native/src/correction_state.h
index 73122269675d52a1d7ecb548a5c58345b47492aa..3ff8134e6997db6bfdee27f4a7cac6cb956cf9de 100644
--- a/native/src/correction_state.h
+++ b/native/src/correction_state.h
@@ -31,6 +31,7 @@ struct CorrectionState {
     uint8_t mDiffs;
     uint8_t mMatchedCount;
     uint8_t mSkippedCount;
+    int8_t mSkipPos; // should be signed
     bool mMatching;
     bool mSkipping;
     bool mNeedsToTraverseAllNodes;
@@ -49,6 +50,7 @@ inline static void initCorrectionState(CorrectionState *state, const int rootPos
     state->mMatching = false;
     state->mSkipping = false;
     state->mNeedsToTraverseAllNodes = traverseAll;
+    state->mSkipPos = -1;
 }
 
 } // namespace latinime
diff --git a/native/src/unigram_dictionary.cpp b/native/src/unigram_dictionary.cpp
index bbfaea4543c5ba98bf2d5c7a49d8438c8c6dc39d..6517bc0b8067ea245ed7cc8f53ae32f6b25f1d8e 100644
--- a/native/src/unigram_dictionary.cpp
+++ b/native/src/unigram_dictionary.cpp
@@ -193,14 +193,8 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo,
 
     PROF_START(2);
     // Suggestion with missing character
-    if (SUGGEST_WORDS_WITH_MISSING_CHARACTER) {
-        for (int i = 0; i < codesSize; ++i) {
-            if (DEBUG_DICT) {
-                LOGI("--- Suggest missing characters %d", i);
-            }
-            getSuggestionCandidates(i, -1, -1);
-        }
-    }
+    LOGI("--- Suggest missing characters");
+    getSuggestionCandidates(0, -1, -1);
     PROF_END(2);
 
     PROF_START(3);