diff --git a/java/src/com/android/inputmethod/latin/LastComposedWord.java b/java/src/com/android/inputmethod/latin/LastComposedWord.java
index 69963d222826878c4c69f787d3b2f8d56d489ea6..a3b03062681165068ff99904da01fadf5d5698a1 100644
--- a/java/src/com/android/inputmethod/latin/LastComposedWord.java
+++ b/java/src/com/android/inputmethod/latin/LastComposedWord.java
@@ -38,25 +38,38 @@ public final class LastComposedWord {
     // or it may be exactly what the user typed if it's in the dictionary or the IME does not have
     // enough confidence in any suggestion to auto-correct (auto-correct to typed word).
     public static final int COMMIT_TYPE_DECIDED_WORD = 2;
+    // COMMIT_TYPE_CANCEL_AUTO_CORRECT is used upon committing back the old word upon cancelling
+    // an auto-correction.
+    public static final int COMMIT_TYPE_CANCEL_AUTO_CORRECT = 3;
 
     public static final String NOT_A_SEPARATOR = "";
 
+    public final ArrayList<Event> mEvents;
     public final String mTypedWord;
     public final CharSequence mCommittedWord;
     public final String mSeparatorString;
     public final String mPrevWord;
     public final int mCapitalizedMode;
+    public final InputPointers mInputPointers =
+            new InputPointers(Constants.DICTIONARY_MAX_WORD_LENGTH);
 
     private boolean mActive;
 
     public static final LastComposedWord NOT_A_COMPOSED_WORD =
-            new LastComposedWord("", "", NOT_A_SEPARATOR, null, WordComposer.CAPS_MODE_OFF);
+            new LastComposedWord(new ArrayList<Event>(), null, "", "",
+                    NOT_A_SEPARATOR, null, WordComposer.CAPS_MODE_OFF);
 
     // Warning: this is using the passed objects as is and fully expects them to be
     // immutable. Do not fiddle with their contents after you passed them to this constructor.
-    public LastComposedWord(final String typedWord, final CharSequence committedWord,
-            final String separatorString, final String prevWord, final int capitalizedMode) {
+    public LastComposedWord(final ArrayList<Event> events,
+            final InputPointers inputPointers, final String typedWord,
+            final CharSequence committedWord, final String separatorString,
+            final String prevWord, final int capitalizedMode) {
+        if (inputPointers != null) {
+            mInputPointers.copy(inputPointers);
+        }
         mTypedWord = typedWord;
+        mEvents = new ArrayList<Event>(events);
         mCommittedWord = committedWord;
         mSeparatorString = separatorString;
         mActive = true;
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index 52d13770b70751c2b1475f44f7c984ad306d6d06..4638c8a8bd32dc7a002b1bf901fbc61a80f0f928 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -426,8 +426,9 @@ public final class WordComposer {
         // Note: currently, we come here whenever we commit a word. If it's a MANUAL_PICK
         // or a DECIDED_WORD we may cancel the commit later; otherwise, we should deactivate
         // the last composed word to ensure this does not happen.
-        final LastComposedWord lastComposedWord = new LastComposedWord(
-                mTypedWord.toString(), committedWord, separatorString, prevWord, mCapitalizedMode);
+        final LastComposedWord lastComposedWord = new LastComposedWord(mEvents,
+                mInputPointers, mTypedWord.toString(), committedWord, separatorString,
+                prevWord, mCapitalizedMode);
         mInputPointers.reset();
         if (type != LastComposedWord.COMMIT_TYPE_DECIDED_WORD
                 && type != LastComposedWord.COMMIT_TYPE_MANUAL_PICK) {
@@ -458,6 +459,24 @@ public final class WordComposer {
     public void discardPreviousWordForSuggestion() {
         mPreviousWordForSuggestion = null;
     }
+
+    public void resumeSuggestionOnLastComposedWord(final LastComposedWord lastComposedWord,
+            final String previousWord) {
+        mEvents.clear();
+        Collections.copy(mEvents, lastComposedWord.mEvents);
+        mInputPointers.set(lastComposedWord.mInputPointers);
+        mTypedWord.setLength(0);
+        mCombinerChain.reset();
+        mTypedWord.append(lastComposedWord.mTypedWord);
+        refreshSize();
+        mCapitalizedMode = lastComposedWord.mCapitalizedMode;
+        mAutoCorrection = null; // This will be filled by the next call to updateSuggestion.
+        mCursorPositionWithinWord = mCodePointSize;
+        mRejectedBatchModeSuggestion = null;
+        mIsResumed = true;
+        mPreviousWordForSuggestion = previousWord;
+    }
+
     public boolean isBatchMode() {
         return mIsBatchMode;
     }