diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 47a3e94691ca6205b3508ece9d7dbf8602e4dae4..47137e7fb9c331d2eabb9046fc297d83e5bf2ec9 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -799,19 +799,22 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
             suggest = mInputLogic.mSuggest;
         }
 
-        // Sometimes, while rotating, for some reason the framework tells the app we are not
-        // connected to it and that means we can't refresh the cache. In this case, schedule a
-        // refresh later.
         // TODO[IL]: Can the following be moved to InputLogic#startInput?
         final boolean canReachInputConnection;
         if (!mInputLogic.mConnection.resetCachesUponCursorMoveAndReturnSuccess(
                 editorInfo.initialSelStart, editorInfo.initialSelEnd,
                 false /* shouldFinishComposition */)) {
+            // Sometimes, while rotating, for some reason the framework tells the app we are not
+            // connected to it and that means we can't refresh the cache. In this case, schedule a
+            // refresh later.
             // We try resetting the caches up to 5 times before giving up.
             mHandler.postResetCaches(isDifferentTextField, 5 /* remainingTries */);
             // mLastSelection{Start,End} are reset later in this method, don't need to do it here
             canReachInputConnection = false;
         } else {
+            // When rotating, initialSelStart and initialSelEnd sometimes are lying. Make a best
+            // effort to work around this bug.
+            mInputLogic.mConnection.tryFixLyingCursorPosition();
             if (isDifferentTextField) {
                 mHandler.postResumeSuggestions();
             }
diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index cc2db4c930f0b9dedbe0006a367299fae772a676..0e85b3c77dca0a077ba02d42a3a8ef4c41c88f3c 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -172,20 +172,6 @@ public final class RichInputConnection {
             Log.d(TAG, "Will try to retrieve text later.");
             return false;
         }
-        final int lengthOfTextBeforeCursor = mCommittedTextBeforeComposingText.length();
-        if (lengthOfTextBeforeCursor > newSelStart
-                || (newSelStart != lengthOfTextBeforeCursor
-                        && lengthOfTextBeforeCursor < Constants.EDITOR_CONTENTS_CACHE_SIZE
-                        && newSelStart < Constants.EDITOR_CONTENTS_CACHE_SIZE)) {
-            // newSelStart and newSelEnd may be lying -- when rotating the device (probably a
-            // framework bug). If the values don't agree and we have less chars than we asked
-            // for, then we know how many chars we have. If we got more than newSelStart says, then
-            // we also know it was lying. In both cases the length is more reliable. Note that we
-            // only have to check newSelStart (not newSelEnd) since if newSelEnd is wrong, then
-            // newSelStart will be wrong as well.
-            mExpectedSelStart = lengthOfTextBeforeCursor;
-            mExpectedSelEnd = lengthOfTextBeforeCursor;
-        }
         if (null != mIC && shouldFinishComposition) {
             mIC.finishComposingText();
             if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {