diff --git a/native/src/proximity_info.cpp b/native/src/proximity_info.cpp
index 6857caf00a745a08b040ce4239d05b8a17722c02..6e26da276b14b5164e371b077333601bc3bb9171 100644
--- a/native/src/proximity_info.cpp
+++ b/native/src/proximity_info.cpp
@@ -100,9 +100,17 @@ inline int ProximityInfo::getStartIndexFromCoordinates(const int x, const int y)
 }
 
 bool ProximityInfo::hasSpaceProximity(const int x, const int y) const {
+    if (x < 0 || y < 0) {
+        if (DEBUG_DICT) {
+            LOGI("HasSpaceProximity: Illegal coordinates (%d, %d)", x, y);
+            assert(true);
+        }
+        return false;
+    }
+
     const int startIndex = getStartIndexFromCoordinates(x, y);
     if (DEBUG_PROXIMITY_INFO) {
-        LOGI("hasSpaceProximity: index %d", startIndex);
+        LOGI("hasSpaceProximity: index %d, %d, %d", startIndex, x, y);
     }
     for (int i = 0; i < MAX_PROXIMITY_CHARS_SIZE; ++i) {
         if (DEBUG_PROXIMITY_INFO) {
diff --git a/native/src/unigram_dictionary.cpp b/native/src/unigram_dictionary.cpp
index 0db33e7d8519a02fe443671a57e68cc29d72b6a4..15fe9715b1ce25c303b737e3e6d06ab3c058d5de 100644
--- a/native/src/unigram_dictionary.cpp
+++ b/native/src/unigram_dictionary.cpp
@@ -182,21 +182,16 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo,
         const int *xcoordinates, const int *ycoordinates, const int *codes,
         const int inputLength, const int flags, Correction *correction,
         WordsPriorityQueuePool *queuePool) {
-    WordsPriorityQueue *masterQueue = queuePool->getMasterQueue();
 
     PROF_OPEN;
     PROF_START(0);
-    initSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, inputLength, masterQueue);
-    if (DEBUG_DICT) assert(codesSize == inputLength);
-
-    const int maxDepth = min(inputLength * MAX_DEPTH_MULTIPLIER, MAX_WORD_LENGTH);
-    correction->initCorrection(proximityInfo, inputLength, maxDepth);
+    // Note: This line is intentionally left blank
     PROF_END(0);
 
-    const bool useFullEditDistance = USE_FULL_EDIT_DISTANCE & flags;
-    // TODO: remove
     PROF_START(1);
-    getSuggestionCandidates(useFullEditDistance, inputLength, correction, masterQueue);
+    const bool useFullEditDistance = USE_FULL_EDIT_DISTANCE & flags;
+    getOneWordSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, useFullEditDistance,
+            inputLength, correction, queuePool);
     PROF_END(1);
 
     PROF_START(2);
@@ -219,8 +214,8 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo,
             if (DEBUG_DICT) {
                 LOGI("--- Suggest missing space characters %d", i);
             }
-            getMissingSpaceWords(
-                    inputLength, i, proximityInfo, correction, useFullEditDistance, queuePool);
+            getMissingSpaceWords(proximityInfo, xcoordinates, ycoordinates, codes,
+                    useFullEditDistance, inputLength, i, correction, queuePool);
         }
     }
     PROF_END(5);
@@ -239,8 +234,8 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo,
                         i, x, y, proximityInfo->hasSpaceProximity(x, y));
             }
             if (proximityInfo->hasSpaceProximity(x, y)) {
-                getMistypedSpaceWords(inputLength, i, proximityInfo, correction,
-                        useFullEditDistance, queuePool);
+                getMistypedSpaceWords(proximityInfo, xcoordinates, ycoordinates, codes,
+                        useFullEditDistance, inputLength, i, correction, queuePool);
             }
         }
     }
@@ -260,6 +255,18 @@ void UnigramDictionary::initSuggestions(ProximityInfo *proximityInfo, const int
 static const char QUOTE = '\'';
 static const char SPACE = ' ';
 
+void UnigramDictionary::getOneWordSuggestions(ProximityInfo *proximityInfo,
+        const int *xcoordinates, const int *ycoordinates, const int *codes,
+        const bool useFullEditDistance, const int inputLength, Correction *correction,
+        WordsPriorityQueuePool *queuePool) {
+    WordsPriorityQueue *masterQueue = queuePool->getMasterQueue();
+    initSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, inputLength, masterQueue);
+    if (DEBUG_DICT) assert(codesSize == inputLength);
+    const int maxDepth = min(inputLength * MAX_DEPTH_MULTIPLIER, MAX_WORD_LENGTH);
+    correction->initCorrection(proximityInfo, inputLength, maxDepth);
+    getSuggestionCandidates(useFullEditDistance, inputLength, correction, masterQueue);
+}
+
 void UnigramDictionary::getSuggestionCandidates(const bool useFullEditDistance,
         const int inputLength, Correction *correction, WordsPriorityQueue *queue) {
     // TODO: Remove setCorrectionParams
@@ -295,22 +302,28 @@ void UnigramDictionary::getSuggestionCandidates(const bool useFullEditDistance,
     }
 }
 
-void UnigramDictionary::getMissingSpaceWords(
-        const int inputLength, const int missingSpacePos, ProximityInfo *proximityInfo,
-        Correction *correction, const bool useFullEditDistance, WordsPriorityQueuePool *queuePool) {
+void UnigramDictionary::getMissingSpaceWords(ProximityInfo *proximityInfo, const int *xcoordinates,
+        const int *ycoordinates, const int *codes, const bool useFullEditDistance,
+        const int inputLength, const int missingSpacePos, Correction *correction,
+        WordsPriorityQueuePool* queuePool) {
     correction->setCorrectionParams(-1 /* skipPos */, -1 /* excessivePos */,
             -1 /* transposedPos */, -1 /* spaceProximityPos */, missingSpacePos,
             useFullEditDistance, false /* doAutoCompletion */, MAX_ERRORS_FOR_TWO_WORDS);
-    getSplitTwoWordsSuggestion(inputLength, proximityInfo, correction, queuePool);
+    getSplitTwoWordsSuggestions(proximityInfo, xcoordinates, ycoordinates, codes,
+            useFullEditDistance, inputLength, missingSpacePos, -1/* spaceProximityPos */,
+            correction, queuePool);
 }
 
-void UnigramDictionary::getMistypedSpaceWords(
-        const int inputLength, const int spaceProximityPos, ProximityInfo *proximityInfo,
-        Correction *correction, const bool useFullEditDistance, WordsPriorityQueuePool *queuePool) {
+void UnigramDictionary::getMistypedSpaceWords(ProximityInfo *proximityInfo, const int *xcoordinates,
+        const int *ycoordinates, const int *codes, const bool useFullEditDistance,
+        const int inputLength, const int spaceProximityPos, Correction *correction,
+        WordsPriorityQueuePool* queuePool) {
     correction->setCorrectionParams(-1 /* skipPos */, -1 /* excessivePos */,
             -1 /* transposedPos */, spaceProximityPos, -1 /* missingSpacePos */,
             useFullEditDistance, false /* doAutoCompletion */, MAX_ERRORS_FOR_TWO_WORDS);
-    getSplitTwoWordsSuggestion(inputLength, proximityInfo, correction, queuePool);
+    getSplitTwoWordsSuggestions(proximityInfo, xcoordinates, ycoordinates, codes,
+            useFullEditDistance, inputLength, -1 /* missingSpacePos */, spaceProximityPos,
+            correction, queuePool);
 }
 
 inline void UnigramDictionary::onTerminal(
@@ -323,13 +336,12 @@ inline void UnigramDictionary::onTerminal(
     }
 }
 
-void UnigramDictionary::getSplitTwoWordsSuggestion(
-        const int inputLength, ProximityInfo *proximityInfo, Correction *correction,
-        WordsPriorityQueuePool *queuePool) {
+void UnigramDictionary::getSplitTwoWordsSuggestions(ProximityInfo *proximityInfo,
+        const int *xcoordinates, const int *ycoordinates, const int *codes,
+        const bool useFullEditDistance, const int inputLength, const int missingSpacePos,
+        const int  spaceProximityPos, Correction *correction, WordsPriorityQueuePool* queuePool) {
     WordsPriorityQueue *masterQueue = queuePool->getMasterQueue();
 
-    const int spaceProximityPos = correction->getSpaceProximityPos();
-    const int missingSpacePos = correction->getMissingSpacePos();
     if (DEBUG_DICT) {
         int inputCount = 0;
         if (spaceProximityPos >= 0) ++inputCount;
diff --git a/native/src/unigram_dictionary.h b/native/src/unigram_dictionary.h
index ce15cdd8fa40e841b31bddab0df61639b89df84a..27ebef157473bfa20ee49e9c2eea84bf09d4573f 100644
--- a/native/src/unigram_dictionary.h
+++ b/native/src/unigram_dictionary.h
@@ -91,17 +91,24 @@ private:
     void initSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
             const int *ycoordinates, const int *codes, const int codesSize,
             WordsPriorityQueue *queue);
+    void getOneWordSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
+            const int *ycoordinates, const int *codes, const bool useFullEditDistance,
+            const int inputLength, Correction *correction, WordsPriorityQueuePool* queuePool);
     void getSuggestionCandidates(
             const bool useFullEditDistance, const int inputLength, Correction *correction,
             WordsPriorityQueue* queue);
-    void getSplitTwoWordsSuggestion(const int inputLength, ProximityInfo *proximityInfo,
-            Correction *correction, WordsPriorityQueuePool *queuePool);
-    void getMissingSpaceWords(const int inputLength, const int missingSpacePos,
-            ProximityInfo *proximityInfo, Correction *correction,
-            const bool useFullEditDistance, WordsPriorityQueuePool *queuePool);
-    void getMistypedSpaceWords(const int inputLength, const int spaceProximityPos,
-            ProximityInfo *proximityInfo, Correction *correction,
-            const bool useFullEditDistance, WordsPriorityQueuePool *queuePool);
+    void getSplitTwoWordsSuggestions(ProximityInfo *proximityInfo,
+            const int *xcoordinates, const int *ycoordinates, const int *codes,
+            const bool useFullEditDistance, const int inputLength, const int spaceProximityPos,
+            const int missingSpacePos, Correction *correction, WordsPriorityQueuePool* queuePool);
+    void getMissingSpaceWords(ProximityInfo *proximityInfo, const int *xcoordinates,
+            const int *ycoordinates, const int *codes, const bool useFullEditDistance,
+            const int inputLength, const int missingSpacePos, Correction *correction,
+            WordsPriorityQueuePool* queuePool);
+    void getMistypedSpaceWords(ProximityInfo *proximityInfo, const int *xcoordinates,
+            const int *ycoordinates, const int *codes, const bool useFullEditDistance,
+            const int inputLength, const int spaceProximityPos, Correction *correction,
+            WordsPriorityQueuePool* queuePool);
     void onTerminal(const int freq, Correction *correction, WordsPriorityQueue *queue);
     bool needsToSkipCurrentNode(const unsigned short c,
             const int inputIndex, const int skipPos, const int depth);
diff --git a/native/src/words_priority_queue.h b/native/src/words_priority_queue.h
index a4175d3e0ac7ec3f2032289975baf68670b8d7e3..2d6270977441aa1d704c2903567ee3da9d04c1f4 100644
--- a/native/src/words_priority_queue.h
+++ b/native/src/words_priority_queue.h
@@ -111,6 +111,10 @@ public:
         return size;
     }
 
+    int size() {
+        return mSuggestions.size();
+    }
+
     void clear() {
         while (!mSuggestions.empty()) {
             SuggestedWord* sw = mSuggestions.top();