diff --git a/java/src/com/android/inputmethod/compat/InputMethodServiceCompatUtils.java b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatUtils.java
index 14ee654f3b700202b7f3cd6ffd95ec6e57cd94a0..81df171277405a94f32da66caf9e7d83f1353b30 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodServiceCompatUtils.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodServiceCompatUtils.java
@@ -17,11 +17,12 @@
 package com.android.inputmethod.compat;
 
 import android.inputmethodservice.InputMethodService;
+import com.android.inputmethod.latin.define.ProductionFlag;
 
 import java.lang.reflect.Method;
 
 public final class InputMethodServiceCompatUtils {
-    // Note that InputMethodService.enableHardwareAcceleration() has been introduced
+    // Note that {@link InputMethodService#enableHardwareAcceleration} has been introduced
     // in API level 17 (Build.VERSION_CODES.JELLY_BEAN_MR1).
     private static final Method METHOD_enableHardwareAcceleration =
             CompatUtils.getMethod(InputMethodService.class, "enableHardwareAcceleration");
@@ -34,4 +35,30 @@ public final class InputMethodServiceCompatUtils {
         return (Boolean)CompatUtils.invoke(ims, false /* defaultValue */,
                 METHOD_enableHardwareAcceleration);
     }
+
+    public static void setCursorAnchorMonitorMode(final InputMethodService ims, final int mode) {
+        if (ProductionFlag.USES_CURSOR_ANCHOR_MONITOR) {
+            ExperimentalAPIUtils.setCursorAnchorMonitorMode(ims, mode);
+        }
+    }
+
+    /*
+     * For unreleased APIs. ProGuard will strip this class entirely, unless used explicitly.
+     */
+    private static final class ExperimentalAPIUtils {
+        // Note that {@link InputMethodManager#setCursorAnchorMonitorMode} is not yet available as
+        // an official API as of API level 19 (Build.VERSION_CODES.KITKAT).
+        private static final Method METHOD_setCursorAnchorMonitorMode = CompatUtils.getMethod(
+                InputMethodService.class, "setCursorAnchorMonitorMode", int.class);
+
+        private ExperimentalAPIUtils() {
+            // This utility class is not publicly instantiable.
+        }
+
+        public static void setCursorAnchorMonitorMode(final InputMethodService ims,
+                final int mode) {
+            CompatUtils.invoke(ims, null /* defaultValue */,
+                    METHOD_setCursorAnchorMonitorMode, mode);
+        }
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 0594c68ccc8fe2666a17ec75e2402ff1b3f12d7a..059f362880db3b862de1b2d466ea36b9cdcdc7d7 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -367,6 +367,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
                 if (latinIme != null) {
                     executePendingImsCallback(latinIme, editorInfo, restarting);
                     latinIme.onStartInputInternal(editorInfo, restarting);
+                    if (ProductionFlag.USES_CURSOR_ANCHOR_MONITOR) {
+                        // Currently we need to call this every time when the IME is attached to
+                        // new application.
+                        // TODO: Consider if we can do this automatically in the framework.
+                        InputMethodServiceCompatUtils.setCursorAnchorMonitorMode(latinIme, 1);
+                    }
                 }
             }
         }
@@ -931,6 +937,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
         mSubtypeState.currentSubtypeUsed();
     }
 
+    @Override
+    public void onUpdateCursor(Rect rect) {
+        if (DEBUG) {
+            Log.i(TAG, "onUpdateCursor:" + rect.toShortString());
+        }
+        super.onUpdateCursor(rect);
+    }
+
     /**
      * This is called when the user has clicked on the extracted text view,
      * when running in fullscreen mode.  The default implementation hides