diff --git a/native/src/correction.cpp b/native/src/correction.cpp
index d1e866d9dc30be8cfec83d8334bd25f689f1c8ed..a08a21bd20fd9a43d39b597bc67c5d8973eb8760 100644
--- a/native/src/correction.cpp
+++ b/native/src/correction.cpp
@@ -299,23 +299,41 @@ Correction::CorrectionType Correction::processCharAndCalcState(
 
     // TODO: Change the limit if we'll allow two or more proximity chars with corrections
     const bool checkProximityChars = noCorrectionsHappenedSoFar ||  mProximityCount == 0;
-    const ProximityInfo::ProximityType matchedProximityCharId = secondTransposing
+    ProximityInfo::ProximityType matchedProximityCharId = secondTransposing
             ? ProximityInfo::EQUIVALENT_CHAR
             : mProximityInfo->getMatchedProximityId(mInputIndex, c, checkProximityChars);
 
     if (ProximityInfo::UNRELATED_CHAR == matchedProximityCharId) {
-        // TODO: Optimize
-        // As the current char turned out to be an unrelated char,
-        // we will try other correction-types. Please note that mCorrectionStates[mOutputIndex]
-        // here refers to the previous state.
-        if (canTryCorrection && mCorrectionStates[mOutputIndex].mProximityMatching
+        if (canTryCorrection && mOutputIndex > 0
+                && mCorrectionStates[mOutputIndex].mProximityMatching
                 && mCorrectionStates[mOutputIndex].mExceeding
                 && isEquivalentChar(mProximityInfo->getMatchedProximityId(
-                        mInputIndex, mWord[mOutputIndex], false))) {
+                        mInputIndex, mWord[mOutputIndex - 1], false))) {
+            if (DEBUG_CORRECTION) {
+                LOGI("CONVERSION p->e %c", mWord[mOutputIndex - 1]);
+            }
             // Conversion p->e
+            // Example:
+            // wearth ->    earth
+            // px     -> (E)mmmmm
             ++mExcessiveCount;
             --mProximityCount;
-        } else if (mInputIndex < mInputLength - 1 && mOutputIndex > 0 && mTransposedCount > 0
+            mExcessivePos = mOutputIndex - 1;
+            ++mInputIndex;
+            // Here, we are doing something equivalent to matchedProximityCharId,
+            // but we already know that "excessive char correction" just happened
+            // so that we just need to check "mProximityCount == 0".
+            matchedProximityCharId =
+                    mProximityInfo->getMatchedProximityId(mInputIndex, c, mProximityCount == 0);
+        }
+    }
+
+    if (ProximityInfo::UNRELATED_CHAR == matchedProximityCharId) {
+        // TODO: Optimize
+        // As the current char turned out to be an unrelated char,
+        // we will try other correction-types. Please note that mCorrectionStates[mOutputIndex]
+        // here refers to the previous state.
+        if (mInputIndex < mInputLength - 1 && mOutputIndex > 0 && mTransposedCount > 0
                 && !mCorrectionStates[mOutputIndex].mTransposing
                 && mCorrectionStates[mOutputIndex - 1].mTransposing
                 && isEquivalentChar(mProximityInfo->getMatchedProximityId(
@@ -425,6 +443,11 @@ Correction::CorrectionType Correction::processCharAndCalcState(
             || isSameAsUserTypedLength) && isTerminal) {
         mTerminalInputIndex = mInputIndex - 1;
         mTerminalOutputIndex = mOutputIndex - 1;
+        if (DEBUG_CORRECTION) {
+            DUMP_WORD(mWord, mOutputIndex);
+            LOGI("ONTERMINAL(1): %d, %d, %d, %d, %c", mProximityCount, mSkippedCount,
+                    mTransposedCount, mExcessiveCount, c);
+        }
         return ON_TERMINAL;
     } else {
         return NOT_ON_TERMINAL;