diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 7e8c77e1365d4dbcbbb031083e398b378fdcb409..acc5df2e5de58be22381695227c98b692b837610 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -125,6 +125,8 @@
         <attr name="longPressShiftKeyTimeout" format="integer" />
         <!-- Ignore special key timeout while typing in millisecond. -->
         <attr name="ignoreAltCodeKeyTimeout" format="integer" />
+        <!-- Disable gesture input while fast typing timer in millisecond. -->
+        <attr name="disableGestureWhileFastTypingTimeout" format="integer" />
         <!-- More keys keyboard will shown at touched point. -->
         <attr name="showMoreKeysKeyboardAtTouchedPoint" format="boolean" />
     </declare-styleable>
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 8e2d43e4e04c96205eb357bce3ceae0775d5933d..1f6adffbbe40d62691f8110c65cf88b9c844eff2 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -66,6 +66,7 @@
     <!-- Long pressing shift will invoke caps-lock if > 0, never invoke caps-lock if == 0 -->
     <integer name="config_long_press_shift_key_timeout">1200</integer>
     <integer name="config_ignore_alt_code_key_timeout">350</integer>
+    <integer name="config_disable_gesture_while_fast_typing_timeout">350</integer>
     <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if
          false -->
     <bool name="config_show_more_keys_keyboard_at_touched_point">false</bool>
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index ed92440ef0929dd7c441d3591e8a89e65f4bc9fa..d520392215265d877f9a27631774d7f432d40dc7 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -89,6 +89,7 @@
         <item name="longPressKeyTimeout">@integer/config_long_press_key_timeout</item>
         <item name="longPressShiftKeyTimeout">@integer/config_long_press_shift_key_timeout</item>
         <item name="ignoreAltCodeKeyTimeout">@integer/config_ignore_alt_code_key_timeout</item>
+        <item name="disableGestureWhileFastTypingTimeout">@integer/config_disable_gesture_while_fast_typing_timeout</item>
         <item name="showMoreKeysKeyboardAtTouchedPoint">@bool/config_show_more_keys_keyboard_at_touched_point</item>
         <item name="languageOnSpacebarFinalAlpha">@integer/config_language_on_spacebar_final_alpha</item>
         <item name="languageOnSpacebarFadeoutAnimator">@anim/language_on_spacebar_fadeout</item>
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 4ed0f58e14423e64db1ceca264b99f7ef44dc526..f5c1b7a0c299cc281749f84e94b4a296a6e9d04f 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -142,12 +142,14 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key
         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_DISABLE_GESTURE_EXPIRED = 4;
 
         private final int mKeyRepeatStartTimeout;
         private final int mKeyRepeatInterval;
         private final int mLongPressKeyTimeout;
         private final int mLongPressShiftKeyTimeout;
         private final int mIgnoreAltCodeKeyTimeout;
+        private final int mDisableGestureWhileFastTypingTimeout;
 
         public KeyTimerHandler(final MainKeyboardView outerInstance,
                 final TypedArray mainKeyboardViewAttr) {
@@ -163,6 +165,8 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key
                     R.styleable.MainKeyboardView_longPressShiftKeyTimeout, 0);
             mIgnoreAltCodeKeyTimeout = mainKeyboardViewAttr.getInt(
                     R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0);
+            mDisableGestureWhileFastTypingTimeout = mainKeyboardViewAttr.getInt(
+                    R.styleable.MainKeyboardView_disableGestureWhileFastTypingTimeout, 0);
         }
 
         @Override
@@ -187,6 +191,9 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key
                     KeyboardSwitcher.getInstance().onLongPressTimeout(msg.arg1);
                 }
                 break;
+            case MSG_DISABLE_GESTURE_EXPIRED:
+                PointerTracker.clearGestureOffWhileFastTyping();
+                break;
             }
         }
 
@@ -311,6 +318,14 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key
             return hasMessages(MSG_TYPING_STATE_EXPIRED);
         }
 
+        @Override
+        public void startGestureOffWhileFastTypingTimer() {
+            removeMessages(MSG_DISABLE_GESTURE_EXPIRED);
+            PointerTracker.setGestureOffWhileFastTyping();
+            sendMessageDelayed(obtainMessage(MSG_DISABLE_GESTURE_EXPIRED),
+                    mDisableGestureWhileFastTypingTimeout);
+        }
+
         @Override
         public void startDoubleTapTimer() {
             sendMessageDelayed(obtainMessage(MSG_DOUBLE_TAP),
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index d4902ec289590fafa5f2a646fdf32d1c96c013d7..89b6e7bc5c881c0481d1c02692eca2d3ad7951f3 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -46,6 +46,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
     private static boolean sMainDictionaryAvailable = false;
     private static boolean sGestureHandlingEnabledByInputField = false;
     private static boolean sGestureHandlingEnabledByUser = false;
+    private static boolean sGestureOffWhileFastTyping = false;
 
     public interface KeyEventHandler {
         /**
@@ -84,6 +85,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
     public interface TimerProxy {
         public void startTypingStateTimer(Key typedKey);
         public boolean isTypingState();
+        public void startGestureOffWhileFastTypingTimer();
         public void startKeyRepeatTimer(PointerTracker tracker);
         public void startLongPressTimer(PointerTracker tracker);
         public void startLongPressTimer(int code);
@@ -99,6 +101,8 @@ public class PointerTracker implements PointerTrackerQueue.Element {
             @Override
             public boolean isTypingState() { return false; }
             @Override
+            public void startGestureOffWhileFastTypingTimer() {}
+            @Override
             public void startKeyRepeatTimer(PointerTracker tracker) {}
             @Override
             public void startLongPressTimer(PointerTracker tracker) {}
@@ -225,6 +229,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
 
     private static void updateGestureHandlingMode() {
         sShouldHandleGesture = sMainDictionaryAvailable
+                && !sGestureOffWhileFastTyping
                 && sGestureHandlingEnabledByInputField
                 && sGestureHandlingEnabledByUser
                 && !AccessibilityUtils.getInstance().isTouchExplorationEnabled();
@@ -241,6 +246,16 @@ public class PointerTracker implements PointerTrackerQueue.Element {
         updateGestureHandlingMode();
     }
 
+    public static void setGestureOffWhileFastTyping() {
+        sGestureOffWhileFastTyping = true;
+        updateGestureHandlingMode();
+    }
+
+    public static void clearGestureOffWhileFastTyping() {
+        sGestureOffWhileFastTyping = false;
+        updateGestureHandlingMode();
+    }
+
     public static PointerTracker getPointerTracker(final int id, final KeyEventHandler handler) {
         final ArrayList<PointerTracker> trackers = sTrackers;
 
@@ -346,8 +361,10 @@ public class PointerTracker implements PointerTrackerQueue.Element {
         if (key.isEnabled() || altersCode) {
             if (code == Keyboard.CODE_OUTPUT_TEXT) {
                 mListener.onTextInput(key.getOutputText());
+                mTimerProxy.startGestureOffWhileFastTypingTimer();
             } else if (code != Keyboard.CODE_UNSPECIFIED) {
                 mListener.onCodeInput(code, x, y);
+                mTimerProxy.startGestureOffWhileFastTypingTimer();
             }
         }
     }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
index 73413f698a93bd287732a23987af054a8e067888..193c3a4bad119598438e0b0d0daf965dae072c04 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
@@ -45,7 +45,7 @@ public class GestureStroke {
     private int mDetectFastMoveY;
 
     // TODO: Move some of these to resource.
-    private static final float START_GESTURE_LENGTH_THRESHOLD_RATIO_TO_KEY_WIDTH = 0.75f;
+    private static final float START_GESTURE_LENGTH_THRESHOLD_RATIO_TO_KEY_WIDTH = 0.60f;
     private static final int START_GESTURE_DURATION_THRESHOLD = 70; // msec
     private static final int MIN_GESTURE_RECOGNITION_TIME = 100; // msec
     private static final float MIN_GESTURE_SAMPLING_RATIO_TO_KEY_WIDTH = 1.0f / 6.0f;