diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index d637ab5f1bf80a3bcb96951f247b8146646b2eca..f27d793824c305a974ed068450332614728c2c44 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -74,7 +74,6 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
     private MainKeyboardView mKeyboardView;
     private LatinIME mLatinIME;
     private Resources mResources;
-    private SettingsValues mCurrentSettingsValues;
 
     private KeyboardState mState;
 
@@ -136,7 +135,6 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
     }
 
     public void loadKeyboard(EditorInfo editorInfo, SettingsValues settingsValues) {
-        mCurrentSettingsValues = settingsValues;
         final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(
                 mThemeContext, editorInfo);
         builder.setScreenGeometry(mThemeContext.getResources().getConfiguration().orientation,
@@ -171,20 +169,20 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
     }
 
     private void setKeyboard(final Keyboard keyboard) {
-        final Keyboard oldKeyboard = mKeyboardView.getKeyboard();
-        mKeyboardView.setGestureInputEnabled(mCurrentSettingsValues.mGestureInputEnabled);
-        mKeyboardView.setKeyboard(keyboard);
+        final MainKeyboardView keyboardView = mKeyboardView;
+        final Keyboard oldKeyboard = keyboardView.getKeyboard();
+        keyboardView.setKeyboard(keyboard);
         mCurrentInputView.setKeyboardGeometry(keyboard.mTopPadding);
-        mKeyboardView.setKeyPreviewPopupEnabled(
+        keyboardView.setKeyPreviewPopupEnabled(
                 SettingsValues.isKeyPreviewPopupEnabled(mPrefs, mResources),
                 SettingsValues.getKeyPreviewPopupDismissDelay(mPrefs, mResources));
-        mKeyboardView.updateAutoCorrectionState(mIsAutoCorrectionActive);
-        mKeyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
+        keyboardView.updateAutoCorrectionState(mIsAutoCorrectionActive);
+        keyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
         final boolean subtypeChanged = (oldKeyboard == null)
                 || !keyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
         final boolean needsToDisplayLanguage = mSubtypeSwitcher.needsToDisplayLanguage(
                 keyboard.mId.mLocale);
-        mKeyboardView.startDisplayLanguageOnSpacebar(subtypeChanged, needsToDisplayLanguage,
+        keyboardView.startDisplayLanguageOnSpacebar(subtypeChanged, needsToDisplayLanguage,
                 ImfUtils.hasMultipleEnabledIMEsOrSubtypes(mLatinIME, true));
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index f751fa53c5bb163bffbc9b8d34f32a13523f8187..a6c439294d48f9f5b5f4cbddb594604c22888a7a 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -111,8 +111,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
     private int mDelayAfterPreview;
     private ViewGroup mPreviewPlacer;
 
-    /** True if the gesture input is enabled. */
-    protected boolean mGestureInputEnabled;
+    /** True if {@link KeyboardView} should handle gesture events. */
+    protected boolean mShouldHandleGesture;
 
     // Drawing
     /** True if the entire keyboard needs to be dimmed. */
@@ -443,8 +443,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
         return mShowKeyPreviewPopup;
     }
 
-    public void setGestureInputEnabled(boolean gestureInputEnabled) {
-        mGestureInputEnabled = gestureInputEnabled;
+    public void setGestureHandlingMode(boolean shouldHandleGesture) {
+        mShouldHandleGesture = shouldHandleGesture;
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 8c234e4e69c6f4c7d8195573d1731d6daec47ef8..110f3c3e3b3d82251ebd041d4172cbf4099caea0 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -461,7 +461,7 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key
         super.setKeyboard(keyboard);
         mKeyDetector.setKeyboard(
                 keyboard, -getPaddingLeft(), -getPaddingTop() + mVerticalCorrection);
-        PointerTracker.setKeyDetector(mKeyDetector, mGestureInputEnabled);
+        PointerTracker.setKeyDetector(mKeyDetector, mShouldHandleGesture);
         mTouchScreenRegulator.setKeyboard(keyboard);
         mMoreKeysPanelCache.clear();
 
@@ -479,6 +479,12 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key
         AccessibleKeyboardViewProxy.getInstance().setKeyboard(keyboard);
     }
 
+    @Override
+    public void setGestureHandlingMode(final boolean shouldHandleGesture) {
+        super.setGestureHandlingMode(shouldHandleGesture);
+        PointerTracker.setKeyDetector(mKeyDetector, shouldHandleGesture);
+    }
+
     /**
      * Returns whether the device has distinct multi-touch panel.
      * @return true if the device has distinct multi-touch panel.
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 4a5ecf986df84335064e8b9e6c9a9858af9bc57c..56c3d46b9affbd960bec6c05f53ed40f699f266c 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -42,8 +42,8 @@ public class PointerTracker {
     private static final boolean DEBUG_LISTENER = false;
     private static boolean DEBUG_MODE = LatinImeLogger.sDBG;
 
-    // TODO: There should be an option to turn on/off the gesture input.
-    private static boolean sIsGestureEnabled = true;
+    /** True if {@link PointerTracker}s should handle gesture events. */
+    private static boolean sShouldHandleGesture = false;
 
     private static final int MIN_GESTURE_RECOGNITION_TIME = 100; // msec
 
@@ -199,7 +199,7 @@ public class PointerTracker {
         sNeedsPhantomSuddenMoveEventHack = needsPhantomSuddenMoveEventHack;
 
         setParameters(MainKeyboardView.PointerTrackerParams.DEFAULT);
-        updateGestureInputEnabledState(null, false /* gestureInputEnabled */);
+        updateGestureHandlingMode(null, false /* shouldHandleGesture */);
     }
 
     public static void setParameters(MainKeyboardView.PointerTrackerParams params) {
@@ -208,14 +208,13 @@ public class PointerTracker {
                 params.mTouchNoiseThresholdDistance * params.mTouchNoiseThresholdDistance);
     }
 
-    private static void updateGestureInputEnabledState(Keyboard keyboard,
-            boolean gestureInputEnabled) {
-        if (!gestureInputEnabled
+    private static void updateGestureHandlingMode(Keyboard keyboard, boolean shouldHandleGesture) {
+        if (!shouldHandleGesture
                 || AccessibilityUtils.getInstance().isTouchExplorationEnabled()
                 || (keyboard != null && keyboard.mId.passwordInput())) {
-            sIsGestureEnabled = false;
+            sShouldHandleGesture = false;
         } else {
-            sIsGestureEnabled = true;
+            sShouldHandleGesture = true;
         }
     }
 
@@ -243,7 +242,7 @@ public class PointerTracker {
         }
     }
 
-    public static void setKeyDetector(KeyDetector keyDetector, boolean gestureInputEnabledByUser) {
+    public static void setKeyDetector(KeyDetector keyDetector, boolean shouldHandleGesture) {
         final int trackersSize = sTrackers.size();
         for (int i = 0; i < trackersSize; ++i) {
             final PointerTracker tracker = sTrackers.get(i);
@@ -252,7 +251,7 @@ public class PointerTracker {
             tracker.mKeyboardLayoutHasBeenChanged = true;
         }
         final Keyboard keyboard = keyDetector.getKeyboard();
-        updateGestureInputEnabledState(keyboard, gestureInputEnabledByUser);
+        updateGestureHandlingMode(keyboard, shouldHandleGesture);
     }
 
     public static void dismissAllKeyPreviews() {
@@ -669,8 +668,8 @@ public class PointerTracker {
         if (queue != null && queue.size() == 1) {
             mIsPossibleGesture = false;
             // A gesture should start only from the letter key.
-            if (sIsGestureEnabled && mIsAlphabetKeyboard && !mIsShowingMoreKeysPanel && key != null
-                    && Keyboard.isLetterCode(key.mCode)) {
+            if (sShouldHandleGesture && mIsAlphabetKeyboard && !mIsShowingMoreKeysPanel
+                    && key != null && Keyboard.isLetterCode(key.mCode)) {
                 mIsPossibleGesture = true;
                 // TODO: pointer times should be relative to first down even in entire batch input
                 // instead of resetting to 0 for each new down event.
@@ -714,7 +713,7 @@ public class PointerTracker {
     private void onGestureMoveEvent(PointerTracker tracker, int x, int y, long eventTime,
             boolean isHistorical, Key key) {
         final int gestureTime = (int)(eventTime - tracker.getDownTime());
-        if (sIsGestureEnabled && mIsPossibleGesture) {
+        if (sShouldHandleGesture && mIsPossibleGesture) {
             final GestureStroke stroke = mGestureStroke;
             stroke.addPoint(x, y, gestureTime, isHistorical);
             if (!mInGesture && stroke.isStartOfAGesture(gestureTime, sWasInGesture)) {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 05dcee50bd94d9130186fd95e58313783bc55315..7d79886faa548627bac62c7cdd275d8825b999d3 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -430,7 +430,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
     @Override
     public void onUpdateMainDictionaryAvailability(boolean isMainDictionaryAvailable) {
         mIsMainDictionaryAvailable = isMainDictionaryAvailable;
-        // TODO: Update gesture input enable state.
+        updateKeyboardViewGestureHandlingModeByMainDictionaryAvailability();
     }
 
     private void initSuggest() {
@@ -681,6 +681,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
         }
 
         switcher.loadKeyboard(editorInfo, mCurrentSettings);
+        updateKeyboardViewGestureHandlingModeByMainDictionaryAvailability();
 
         if (mSuggestionStripView != null)
             mSuggestionStripView.clear();
@@ -2052,18 +2053,28 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
     public void onRefreshKeyboard() {
         // When the device locale is changed in SetupWizard etc., this method may get called via
         // onConfigurationChanged before SoftInputWindow is shown.
+        initSuggest();
+        loadSettings();
         if (mKeyboardSwitcher.getKeyboardView() != null) {
             // Reload keyboard because the current language has been changed.
             mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(), mCurrentSettings);
+            updateKeyboardViewGestureHandlingModeByMainDictionaryAvailability();
         }
-        initSuggest();
-        loadSettings();
         // Since we just changed languages, we should re-evaluate suggestions with whatever word
         // we are currently composing. If we are not composing anything, we may want to display
         // predictions or punctuation signs (which is done by the updateSuggestionStrip anyway).
         mHandler.postUpdateSuggestionStrip();
     }
 
+    private void updateKeyboardViewGestureHandlingModeByMainDictionaryAvailability() {
+        final MainKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
+        if (keyboardView != null) {
+            final boolean shouldHandleGesture = mCurrentSettings.mGestureInputEnabled
+                    && mIsMainDictionaryAvailable;
+            keyboardView.setGestureHandlingMode(shouldHandleGesture);
+        }
+    }
+
     // TODO: Remove this method from {@link LatinIME} and move {@link FeedbackManager} to
     // {@link KeyboardSwitcher}. Called from KeyboardSwitcher
     public void hapticAndAudioFeedback(final int primaryCode) {