diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 74fc18523fb18291b5505066b90c3bf0f6568f4e..3c878d0a87a4318ce23db86f72b7f9a4c6362a59 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -229,6 +229,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
     // Keeps track of most recently inserted text (multi-character key) for reverting
     private CharSequence mEnteredText;
 
+    private final ComposingStateManager mComposingStateManager =
+            new ComposingStateManager();
+
     public final UIHandler mHandler = new UIHandler(this);
 
     public static class UIHandler extends StaticInnerHandlerWrapper<LatinIME> {
@@ -610,6 +613,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
     @Override
     public void onConfigurationChanged(Configuration conf) {
         mSubtypeSwitcher.onConfigurationChanged(conf);
+        mComposingStateManager.onFinishComposingText();
         // If orientation changed while predicting, commit the change
         if (mDisplayOrientation != conf.orientation) {
             mDisplayOrientation = conf.orientation;
@@ -881,6 +885,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
                 if (ic != null) {
                     ic.finishComposingText();
                 }
+                mComposingStateManager.onFinishComposingText();
                 mVoiceProxy.setVoiceInputHighlighted(false);
             } else if (!mHasUncommittedTypedChars) {
                 TextEntryState.reset();
@@ -1336,7 +1341,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
             if (length > 0) {
                 mComposingStringBuilder.delete(length - 1, length);
                 mWordComposer.deleteLast();
-                ic.setComposingText(mComposingStringBuilder, 1);
+                final CharSequence textWithUnderline =
+                        mComposingStateManager.isAutoCorrectionIndicatorOn()
+                                ? SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
+                                            this, mComposingStringBuilder)
+                                : mComposingStringBuilder;
+                ic.setComposingText(textWithUnderline, 1);
                 if (mComposingStringBuilder.length() == 0) {
                     mHasUncommittedTypedChars = false;
                 }
@@ -1427,6 +1437,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
                 mComposingStringBuilder.setLength(0);
                 mWordComposer.reset();
                 clearSuggestions();
+                mComposingStateManager.onFinishComposingText();
             }
         }
         final KeyboardSwitcher switcher = mKeyboardSwitcher;
@@ -1458,8 +1469,14 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
                 // If it's the first letter, make note of auto-caps state
                 if (mWordComposer.size() == 1) {
                     mWordComposer.setAutoCapitalized(getCurrentAutoCapsState());
+                    mComposingStateManager.onStartComposingText();
                 }
-                ic.setComposingText(mComposingStringBuilder, 1);
+                final CharSequence textWithUnderline =
+                        mComposingStateManager.isAutoCorrectionIndicatorOn()
+                                ? SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
+                                        this, mComposingStringBuilder)
+                                : mComposingStringBuilder;
+                ic.setComposingText(textWithUnderline, 1);
             }
             mHandler.postUpdateSuggestions();
         } else {
@@ -1478,6 +1495,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
 
     private void handleSeparator(int primaryCode, int x, int y) {
         mVoiceProxy.handleSeparator();
+        mComposingStateManager.onFinishComposingText();
 
         // Should dismiss the "Touch again to save" message when handling separator
         if (mSuggestionsView != null && mSuggestionsView.dismissAddToDictionaryHint()) {
@@ -1615,12 +1633,19 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
 
         // Put a blue underline to a word in TextView which will be auto-corrected.
         final InputConnection ic = getCurrentInputConnection();
-        if (ic != null && Utils.willAutoCorrect(words)) {
-            final CharSequence textWithUnderline =
-                    SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
-                            this, mComposingStringBuilder);
-            if (!TextUtils.isEmpty(textWithUnderline)) {
-                ic.setComposingText(textWithUnderline, 1);
+        if (ic != null) {
+            final boolean oldAutoCorrectionIndicator =
+                    mComposingStateManager.isAutoCorrectionIndicatorOn();
+            final boolean newAutoCorrectionIndicator = Utils.willAutoCorrect(words);
+            if (oldAutoCorrectionIndicator != newAutoCorrectionIndicator) {
+                final CharSequence textWithUnderline = newAutoCorrectionIndicator
+                        ? SuggestionSpanUtils.getTextWithAutoCorrectionIndicatorUnderline(
+                                this, mComposingStringBuilder)
+                        : mComposingStringBuilder;
+                if (!TextUtils.isEmpty(textWithUnderline)) {
+                    ic.setComposingText(textWithUnderline, 1);
+                }
+                mComposingStateManager.setAutoCorrectionIndicatorOn(newAutoCorrectionIndicator);
             }
         }
     }
@@ -1732,6 +1757,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
 
     @Override
     public void pickSuggestionManually(int index, CharSequence suggestion) {
+        mComposingStateManager.onFinishComposingText();
         SuggestedWords suggestions = mSuggestionsView.getSuggestions();
         mVoiceProxy.flushAndLogAllTextModificationCounters(index, suggestion,
                 mSettingsValues.mWordSeparators);
@@ -2279,6 +2305,43 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
         showOptionDialogInternal(builder.create());
     }
 
+    private static class ComposingStateManager {
+        private boolean mAutoCorrectionIndicatorOn;
+        private boolean mIsComposing;
+        public ComposingStateManager() {
+            mAutoCorrectionIndicatorOn = false;
+            mIsComposing = false;
+        }
+
+        private void onStartComposingText() {
+            if (!mIsComposing) {
+                if (LatinImeLogger.sDBG) {
+                    Log.i(TAG, "Start composing text.");
+                }
+                mAutoCorrectionIndicatorOn = false;
+                mIsComposing = true;
+            }
+        }
+
+        private void onFinishComposingText() {
+            if (mIsComposing) {
+                if (LatinImeLogger.sDBG) {
+                    Log.i(TAG, "Finish composing text.");
+                }
+                mAutoCorrectionIndicatorOn = false;
+                mIsComposing = false;
+            }
+        }
+
+        public boolean isAutoCorrectionIndicatorOn() {
+            return mAutoCorrectionIndicatorOn;
+        }
+
+        public void setAutoCorrectionIndicatorOn(boolean on) {
+            mAutoCorrectionIndicatorOn = on;
+        }
+    }
+
     @Override
     protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
         super.dump(fd, fout, args);