diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 74fc185..3c878d0 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -229,6 +229,9 @@
     // 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 @@
     @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 @@
                 if (ic != null) {
                     ic.finishComposingText();
                 }
+                mComposingStateManager.onFinishComposingText();
                 mVoiceProxy.setVoiceInputHighlighted(false);
             } else if (!mHasUncommittedTypedChars) {
                 TextEntryState.reset();
@@ -1336,7 +1341,12 @@
             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 @@
                 mComposingStringBuilder.setLength(0);
                 mWordComposer.reset();
                 clearSuggestions();
+                mComposingStateManager.onFinishComposingText();
             }
         }
         final KeyboardSwitcher switcher = mKeyboardSwitcher;
@@ -1458,8 +1469,14 @@
                 // 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 @@
 
     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 @@
 
         // 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 @@
 
     @Override
     public void pickSuggestionManually(int index, CharSequence suggestion) {
+        mComposingStateManager.onFinishComposingText();
         SuggestedWords suggestions = mSuggestionsView.getSuggestions();
         mVoiceProxy.flushAndLogAllTextModificationCounters(index, suggestion,
                 mSettingsValues.mWordSeparators);
@@ -2279,6 +2305,43 @@
         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);
