diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 02e8eeb..4975d65 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -119,6 +119,7 @@
             <enum name="boldItalic" value="3" />
         </attr>
 
+        <!-- Attributes for PreviewPlacerView -->
         <attr name="gestureFloatingPreviewTextSize" format="dimension" />
         <attr name="gestureFloatingPreviewTextColor" format="color" />
         <attr name="gestureFloatingPreviewTextOffset" format="dimension" />
@@ -128,6 +129,8 @@
         <attr name="gestureFloatingPreviewTextShadowBorder" format="dimension" />
         <attr name="gestureFloatingPreviewTextConnectorColor" format="color" />
         <attr name="gestureFloatingPreviewTextConnectorWidth" format="dimension" />
+        <!-- Delay after gesture input and gesture floating preview text dismissing in millisecond -->
+        <attr name="gestureFloatingPreviewTextLingerTimeout" format="integer" />
         <attr name="gesturePreviewTrailColor" format="color" />
         <attr name="gesturePreviewTrailWidth" format="dimension" />
     </declare-styleable>
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index e5575e7..54a6687 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -49,6 +49,7 @@
          Configuration for KeyboardView
     -->
     <integer name="config_key_preview_linger_timeout">70</integer>
+    <integer name="config_gesture_floating_preview_text_linger_timeout">200</integer>
     <!--
          Configuration for MainKeyboardView
     -->
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index 955a276..ae67c43 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -77,6 +77,7 @@
         <item name="gestureFloatingPreviewTextShadowBorder">@dimen/gesture_floating_preview_text_shadow_border</item>
         <item name="gestureFloatingPreviewTextConnectorColor">@android:color/white</item>
         <item name="gestureFloatingPreviewTextConnectorWidth">@dimen/gesture_floating_preview_text_connector_width</item>
+        <item name="gestureFloatingPreviewTextLingerTimeout">@integer/config_gesture_floating_preview_text_linger_timeout</item>
         <item name="gesturePreviewTrailColor">@android:color/holo_blue_light</item>
         <item name="gesturePreviewTrailWidth">@dimen/gesture_preview_trail_width</item>
         <!-- Common attributes of MainKeyboardView -->
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index dc84763..10f651a 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -267,7 +267,7 @@
     // Implements {@link KeyboardState.SwitchActions}.
     @Override
     public void startDoubleTapTimer() {
-        final MainKeyboardView keyboardView = getKeyboardView();
+        final MainKeyboardView keyboardView = getMainKeyboardView();
         if (keyboardView != null) {
             final TimerProxy timer = keyboardView.getTimerProxy();
             timer.startDoubleTapTimer();
@@ -277,7 +277,7 @@
     // Implements {@link KeyboardState.SwitchActions}.
     @Override
     public void cancelDoubleTapTimer() {
-        final MainKeyboardView keyboardView = getKeyboardView();
+        final MainKeyboardView keyboardView = getMainKeyboardView();
         if (keyboardView != null) {
             final TimerProxy timer = keyboardView.getTimerProxy();
             timer.cancelDoubleTapTimer();
@@ -287,7 +287,7 @@
     // Implements {@link KeyboardState.SwitchActions}.
     @Override
     public boolean isInDoubleTapTimeout() {
-        final MainKeyboardView keyboardView = getKeyboardView();
+        final MainKeyboardView keyboardView = getMainKeyboardView();
         return (keyboardView != null)
                 ? keyboardView.getTimerProxy().isInDoubleTapTimeout() : false;
     }
@@ -295,7 +295,7 @@
     // Implements {@link KeyboardState.SwitchActions}.
     @Override
     public void startLongPressTimer(int code) {
-        final MainKeyboardView keyboardView = getKeyboardView();
+        final MainKeyboardView keyboardView = getMainKeyboardView();
         if (keyboardView != null) {
             final TimerProxy timer = keyboardView.getTimerProxy();
             timer.startLongPressTimer(code);
@@ -305,7 +305,7 @@
     // Implements {@link KeyboardState.SwitchActions}.
     @Override
     public void cancelLongPressTimer() {
-        final MainKeyboardView keyboardView = getKeyboardView();
+        final MainKeyboardView keyboardView = getMainKeyboardView();
         if (keyboardView != null) {
             final TimerProxy timer = keyboardView.getTimerProxy();
             timer.cancelLongPressTimer();
@@ -345,7 +345,7 @@
         mState.onCodeInput(code, isSinglePointer(), mLatinIME.getCurrentAutoCapsState());
     }
 
-    public MainKeyboardView getKeyboardView() {
+    public MainKeyboardView getMainKeyboardView() {
         return mKeyboardView;
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index 69e4d98..0e6de70 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -140,7 +140,7 @@
     private final DrawingHandler mDrawingHandler = new DrawingHandler(this);
 
     public static class DrawingHandler extends StaticInnerHandlerWrapper<KeyboardView> {
-        private static final int MSG_DISMISS_KEY_PREVIEW = 1;
+        private static final int MSG_DISMISS_KEY_PREVIEW = 0;
 
         public DrawingHandler(KeyboardView outerInstance) {
             super(outerInstance);
@@ -902,6 +902,9 @@
 
     public void cancelAllMessages() {
         mDrawingHandler.cancelAllMessages();
+        if (mPreviewPlacerView != null) {
+            mPreviewPlacerView.cancelAllMessages();
+        }
     }
 
     // Called by {@link PointerTracker} constructor to create a TextView.
@@ -943,6 +946,11 @@
         mPreviewPlacerView.setGestureFloatingPreviewText(gestureFloatingPreviewText);
     }
 
+    public void dismissGestureFloatingPreviewText() {
+        locatePreviewPlacerView();
+        mPreviewPlacerView.dismissGestureFloatingPreviewText();
+    }
+
     @Override
     public void showGestureTrail(PointerTracker tracker) {
         locatePreviewPlacerView();
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 7945908..fe9cb94 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -122,10 +122,10 @@
 
     private static class KeyTimerHandler extends StaticInnerHandlerWrapper<MainKeyboardView>
             implements TimerProxy {
+        private static final int MSG_TYPING_STATE_EXPIRED = 0;
         private static final int MSG_REPEAT_KEY = 1;
         private static final int MSG_LONGPRESS_KEY = 2;
         private static final int MSG_DOUBLE_TAP = 3;
-        private static final int MSG_TYPING_STATE_EXPIRED = 4;
 
         private final KeyTimerParams mParams;
 
@@ -139,6 +139,9 @@
             final MainKeyboardView keyboardView = getOuterInstance();
             final PointerTracker tracker = (PointerTracker) msg.obj;
             switch (msg.what) {
+            case MSG_TYPING_STATE_EXPIRED:
+                startWhileTypingFadeinAnimation(keyboardView);
+                break;
             case MSG_REPEAT_KEY:
                 final Key currentKey = tracker.getKey();
                 if (currentKey != null && currentKey.mCode == msg.arg1) {
@@ -153,9 +156,6 @@
                     KeyboardSwitcher.getInstance().onLongPressTimeout(msg.arg1);
                 }
                 break;
-            case MSG_TYPING_STATE_EXPIRED:
-                startWhileTypingFadeinAnimation(keyboardView);
-                break;
             }
         }
 
diff --git a/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java b/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java
index c38febf..d0fecf0 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java
@@ -21,12 +21,14 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Align;
+import android.os.Message;
 import android.text.TextUtils;
 import android.util.SparseArray;
 import android.widget.RelativeLayout;
 
 import com.android.inputmethod.keyboard.PointerTracker;
 import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
 
 public class PreviewPlacerView extends RelativeLayout {
     private final Paint mGesturePaint;
@@ -39,6 +41,7 @@
     private final int mGestureFloatingPreviewTextShadingBorder;
     private final int mGestureFloatingPreviewTextConnectorColor;
     private final int mGestureFloatingPreviewTextConnectorWidth;
+    /* package */ final int mGestureFloatingPreviewTextLingerTimeout;
 
     private int mXOrigin;
     private int mYOrigin;
@@ -49,6 +52,43 @@
     private boolean mDrawsGesturePreviewTrail;
     private boolean mDrawsGestureFloatingPreviewText;
 
+    private final DrawingHandler mDrawingHandler = new DrawingHandler(this);
+
+    private static class DrawingHandler extends StaticInnerHandlerWrapper<PreviewPlacerView> {
+        private static final int MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT = 0;
+
+        public DrawingHandler(PreviewPlacerView outerInstance) {
+            super(outerInstance);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            final PreviewPlacerView placerView = getOuterInstance();
+            if (placerView == null) return;
+            switch (msg.what) {
+            case MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT:
+                placerView.setGestureFloatingPreviewText(null);
+                break;
+            }
+        }
+
+        private void cancelDismissGestureFloatingPreviewText() {
+            removeMessages(MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT);
+        }
+
+        public void dismissGestureFloatingPreviewText() {
+            cancelDismissGestureFloatingPreviewText();
+            final PreviewPlacerView placerView = getOuterInstance();
+            sendMessageDelayed(
+                    obtainMessage(MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT),
+                    placerView.mGestureFloatingPreviewTextLingerTimeout);
+        }
+
+        public void cancelAllMessages() {
+            cancelDismissGestureFloatingPreviewText();
+        }
+    }
+
     public PreviewPlacerView(Context context, TypedArray keyboardViewAttr) {
         super(context);
         setWillNotDraw(false);
@@ -71,6 +111,8 @@
                 R.styleable.KeyboardView_gestureFloatingPreviewTextConnectorColor, 0);
         mGestureFloatingPreviewTextConnectorWidth = keyboardViewAttr.getDimensionPixelSize(
                 R.styleable.KeyboardView_gestureFloatingPreviewTextConnectorWidth, 0);
+        mGestureFloatingPreviewTextLingerTimeout = keyboardViewAttr.getInt(
+                R.styleable.KeyboardView_gestureFloatingPreviewTextLingerTimeout, 0);
         final int gesturePreviewTrailColor = keyboardViewAttr.getColor(
                 R.styleable.KeyboardView_gesturePreviewTrailColor, 0);
         final int gesturePreviewTrailWidth = keyboardViewAttr.getDimensionPixelSize(
@@ -136,6 +178,14 @@
         invalidate();
     }
 
+    public void dismissGestureFloatingPreviewText() {
+        mDrawingHandler.dismissGestureFloatingPreviewText();
+    }
+
+    public void cancelAllMessages() {
+        mDrawingHandler.cancelAllMessages();
+    }
+
     private void drawGestureFloatingPreviewText(Canvas canvas, PointerTracker tracker,
             String gestureFloatingPreviewText) {
         if (TextUtils.isEmpty(gestureFloatingPreviewText)) {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 1e700f5..4550860 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -181,9 +181,9 @@
     public final UIHandler mHandler = new UIHandler(this);
 
     public static class UIHandler extends StaticInnerHandlerWrapper<LatinIME> {
-        private static final int MSG_UPDATE_SHIFT_STATE = 1;
-        private static final int MSG_PENDING_IMS_CALLBACK = 6;
-        private static final int MSG_UPDATE_SUGGESTION_STRIP = 7;
+        private static final int MSG_UPDATE_SHIFT_STATE = 0;
+        private static final int MSG_PENDING_IMS_CALLBACK = 1;
+        private static final int MSG_UPDATE_SUGGESTION_STRIP = 2;
 
         private int mDelayUpdateSuggestions;
         private int mDelayUpdateShiftState;
@@ -613,7 +613,7 @@
     private void onStartInputViewInternal(EditorInfo editorInfo, boolean restarting) {
         super.onStartInputView(editorInfo, restarting);
         final KeyboardSwitcher switcher = mKeyboardSwitcher;
-        MainKeyboardView inputView = switcher.getKeyboardView();
+        final MainKeyboardView mainKeyboardView = switcher.getMainKeyboardView();
 
         if (editorInfo == null) {
             Log.e(TAG, "Null EditorInfo in onStartInputView()");
@@ -656,7 +656,7 @@
 
         LatinImeLogger.onStartInputView(editorInfo);
         // In landscape mode, this method gets called without the input view being created.
-        if (inputView == null) {
+        if (mainKeyboardView == null) {
             return;
         }
 
@@ -693,7 +693,7 @@
         }
 
         if (!restarting) {
-            inputView.closing();
+            mainKeyboardView.closing();
             loadSettings();
 
             if (mSuggest != null && mCurrentSettings.mCorrectionEnabled) {
@@ -719,7 +719,7 @@
         mHandler.cancelUpdateSuggestionStrip();
         mHandler.cancelDoubleSpacesTimer();
 
-        inputView.setKeyPreviewPopupEnabled(mCurrentSettings.mKeyPreviewPopupOn,
+        mainKeyboardView.setKeyPreviewPopupEnabled(mCurrentSettings.mKeyPreviewPopupOn,
                 mCurrentSettings.mKeyPreviewPopupDismissDelay);
 
         if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
@@ -738,8 +738,10 @@
                     getCurrentInputConnection());
         }
         super.onWindowHidden();
-        KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
-        if (inputView != null) inputView.closing();
+        final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+        if (mainKeyboardView != null) {
+            mainKeyboardView.closing();
+        }
     }
 
     private void onFinishInputInternal() {
@@ -750,15 +752,19 @@
             ResearchLogger.getInstance().latinIME_onFinishInputInternal();
         }
 
-        KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
-        if (inputView != null) inputView.closing();
+        final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+        if (mainKeyboardView != null) {
+            mainKeyboardView.closing();
+        }
     }
 
     private void onFinishInputViewInternal(boolean finishingInput) {
         super.onFinishInputView(finishingInput);
         mKeyboardSwitcher.onFinishInputView();
-        KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
-        if (inputView != null) inputView.cancelAllMessages();
+        final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+        if (mainKeyboardView != null) {
+            mainKeyboardView.cancelAllMessages();
+        }
         // Remove pending messages related to update suggestions
         mHandler.cancelUpdateSuggestionStrip();
     }
@@ -925,8 +931,9 @@
     private void setSuggestionStripShownInternal(boolean shown, boolean needsInputViewShown) {
         // TODO: Modify this if we support suggestions with hard keyboard
         if (onEvaluateInputViewShown() && mSuggestionsContainer != null) {
-            final MainKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
-            final boolean inputViewShown = (keyboardView != null) ? keyboardView.isShown() : false;
+            final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+            final boolean inputViewShown = (mainKeyboardView != null)
+                    ? mainKeyboardView.isShown() : false;
             final boolean shouldShowSuggestions = shown
                     && (needsInputViewShown ? inputViewShown : true);
             if (isFullscreenMode()) {
@@ -949,11 +956,11 @@
             return currentHeight;
         }
 
-        final KeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
-        if (keyboardView == null) {
+        final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+        if (mainKeyboardView == null) {
             return 0;
         }
-        final int keyboardHeight = keyboardView.getHeight();
+        final int keyboardHeight = mainKeyboardView.getHeight();
         final int suggestionsHeight = mSuggestionsContainer.getHeight();
         final int displayHeight = mResources.getDisplayMetrics().heightPixels;
         final Rect rect = new Rect();
@@ -971,9 +978,10 @@
     @Override
     public void onComputeInsets(InputMethodService.Insets outInsets) {
         super.onComputeInsets(outInsets);
-        final KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
-        if (inputView == null || mSuggestionsContainer == null)
+        final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+        if (mainKeyboardView == null || mSuggestionsContainer == null) {
             return;
+        }
         final int adjustedBackingHeight = getAdjustedBackingViewHeight();
         final boolean backingGone = (mKeyPreviewBackingView.getVisibility() == View.GONE);
         final int backingHeight = backingGone ? 0 : adjustedBackingHeight;
@@ -986,13 +994,12 @@
         final int extraHeight = extractHeight + backingHeight + suggestionsHeight;
         int touchY = extraHeight;
         // Need to set touchable region only if input view is being shown
-        final MainKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
-        if (keyboardView != null && keyboardView.isShown()) {
+        if (mainKeyboardView.isShown()) {
             if (mSuggestionsContainer.getVisibility() == View.VISIBLE) {
                 touchY -= suggestionsHeight;
             }
-            final int touchWidth = inputView.getWidth();
-            final int touchHeight = inputView.getHeight() + extraHeight
+            final int touchWidth = mainKeyboardView.getWidth();
+            final int touchHeight = mainKeyboardView.getHeight() + extraHeight
                     // Extend touchable region below the keyboard.
                     + EXTENDED_TOUCHABLE_REGION_HEIGHT;
             outInsets.touchableInsets = InputMethodService.Insets.TOUCHABLE_INSETS_REGION;
@@ -1372,7 +1379,7 @@
         showSuggestionStrip(suggestedWords, null);
         final String gestureFloatingPreviewText = (suggestedWords.size() > 0)
                 ? suggestedWords.getWord(0) : null;
-        mKeyboardSwitcher.getKeyboardView()
+        mKeyboardSwitcher.getMainKeyboardView()
                 .showGestureFloatingPreviewText(gestureFloatingPreviewText);
     }
 
@@ -1381,7 +1388,11 @@
         mWordComposer.setBatchInputPointers(batchPointers);
         final SuggestedWords suggestedWords = getSuggestedWords();
         showSuggestionStrip(suggestedWords, null);
-        mKeyboardSwitcher.getKeyboardView().showGestureFloatingPreviewText(null);
+        final String gestureFloatingPreviewText = (suggestedWords.size() > 0)
+                ? suggestedWords.getWord(0) : null;
+        final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+        mainKeyboardView.showGestureFloatingPreviewText(gestureFloatingPreviewText);
+        mainKeyboardView.dismissGestureFloatingPreviewText();
         if (suggestedWords == null || suggestedWords.size() == 0) {
             return;
         }
@@ -1586,7 +1597,7 @@
                 keyY = y;
             } else {
                 final KeyDetector keyDetector =
-                        mKeyboardSwitcher.getKeyboardView().getKeyDetector();
+                        mKeyboardSwitcher.getMainKeyboardView().getKeyDetector();
                 keyX = keyDetector.getTouchX(x);
                 keyY = keyDetector.getTouchY(y);
             }
@@ -1688,9 +1699,9 @@
     private void handleClose() {
         commitTyped(LastComposedWord.NOT_A_SEPARATOR);
         requestHideSelf(0);
-        MainKeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
-        if (inputView != null) {
-            inputView.closing();
+        final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+        if (mainKeyboardView != null) {
+            mainKeyboardView.closing();
         }
     }
 
@@ -2089,7 +2100,7 @@
         // onConfigurationChanged before SoftInputWindow is shown.
         initSuggest();
         loadSettings();
-        if (mKeyboardSwitcher.getKeyboardView() != null) {
+        if (mKeyboardSwitcher.getMainKeyboardView() != null) {
             // Reload keyboard because the current language has been changed.
             mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(), mCurrentSettings);
             updateKeyboardViewGestureHandlingModeByMainDictionaryAvailability();
@@ -2101,11 +2112,11 @@
     }
 
     private void updateKeyboardViewGestureHandlingModeByMainDictionaryAvailability() {
-        final MainKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
-        if (keyboardView != null) {
+        final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+        if (mainKeyboardView != null) {
             final boolean shouldHandleGesture = mCurrentSettings.mGestureInputEnabled
                     && mIsMainDictionaryAvailable;
-            keyboardView.setGestureHandlingMode(shouldHandleGesture,
+            mainKeyboardView.setGestureHandlingMode(shouldHandleGesture,
                     mCurrentSettings.mGesturePreviewTrailEnabled,
                     mCurrentSettings.mGestureFloatingPreviewTextEnabled);
         }
@@ -2114,7 +2125,8 @@
     // TODO: Remove this method from {@link LatinIME} and move {@link FeedbackManager} to
     // {@link KeyboardSwitcher}. Called from KeyboardSwitcher
     public void hapticAndAudioFeedback(final int primaryCode) {
-        mFeedbackManager.hapticAndAudioFeedback(primaryCode, mKeyboardSwitcher.getKeyboardView());
+        mFeedbackManager.hapticAndAudioFeedback(
+                primaryCode, mKeyboardSwitcher.getMainKeyboardView());
     }
 
     // Callback called by PointerTracker through the KeyboardActionListener. This is called when a
@@ -2225,8 +2237,10 @@
     }
 
     public void showOptionDialog(AlertDialog dialog) {
-        final IBinder windowToken = mKeyboardSwitcher.getKeyboardView().getWindowToken();
-        if (windowToken == null) return;
+        final IBinder windowToken = mKeyboardSwitcher.getMainKeyboardView().getWindowToken();
+        if (windowToken == null) {
+            return;
+        }
 
         dialog.setCancelable(true);
         dialog.setCanceledOnTouchOutside(true);
diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java
index 68bd98a..cf6f31a 100644
--- a/java/src/com/android/inputmethod/research/ResearchLogger.java
+++ b/java/src/com/android/inputmethod/research/ResearchLogger.java
@@ -209,7 +209,7 @@
         if (mSplashDialog != null && mSplashDialog.isShowing()) {
             return;
         }
-        final IBinder windowToken = mKeyboardSwitcher.getKeyboardView().getWindowToken();
+        final IBinder windowToken = mKeyboardSwitcher.getMainKeyboardView().getWindowToken();
         if (windowToken == null) {
             return;
         }
@@ -540,11 +540,11 @@
         if (mKeyboardSwitcher == null) {
             return;
         }
-        final KeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
-        if (keyboardView == null) {
+        final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
+        if (mainKeyboardView == null) {
             return;
         }
-        keyboardView.invalidateAllKeys();
+        mainKeyboardView.invalidateAllKeys();
     }
 
 
