diff --git a/java/res/values/phantom_sudden_move_event_device_list.xml b/java/res/values/phantom_sudden_move_event_device_list.xml
new file mode 100644
index 0000000000000000000000000000000000000000..63d12e96e5104f8251fb659d1bcb04fb4d8380cc
--- /dev/null
+++ b/java/res/values/phantom_sudden_move_event_device_list.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources>
+    <string-array name="phantom_sudden_move_event_device_list" translatable="false">
+        <!-- "Build.HARDWARE,true" that needs "phantom sudden move event" hack.
+             See {@link com.android.inputmethod.keyboard.PointerTracker}. -->
+        <item>stingray,true</item> <!-- Xoom -->
+    </string-array>
+</resources>
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index b1599937b6cdc9679d3b697ab50d200ec46572e4..e917a81285fa58be105c71e5ebbc710289f7d7d9 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -338,8 +338,10 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
 
         mHasDistinctMultitouch = context.getPackageManager()
                 .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);
-
-        PointerTracker.init(mHasDistinctMultitouch);
+        final boolean needsPhantomSuddenMoveEventHack = Boolean.parseBoolean(
+                Utils.getDeviceOverrideValue(context.getResources(),
+                        R.array.phantom_sudden_move_event_device_list, "false"));
+        PointerTracker.init(mHasDistinctMultitouch, needsPhantomSuddenMoveEventHack);
 
         final TypedArray a = context.obtainStyledAttributes(
                 attrs, R.styleable.LatinKeyboardView, defStyle, R.style.LatinKeyboardView);
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 57f633ccc1c041ef743a0697b13322194d6983a1..20d8df72f2c1a1d33592ddf5930a00271f9a76b0 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -108,6 +108,7 @@ public class PointerTracker {
     // Parameters for pointer handling.
     private static LatinKeyboardView.PointerTrackerParams sParams;
     private static int sTouchNoiseThresholdDistanceSquared;
+    private static boolean sNeedsPhantomSuddenMoveEventHack;
 
     private static final ArrayList<PointerTracker> sTrackers = new ArrayList<PointerTracker>();
     private static PointerTrackerQueue sPointerTrackerQueue;
@@ -162,12 +163,14 @@ public class PointerTracker {
     private static final KeyboardActionListener EMPTY_LISTENER =
             new KeyboardActionListener.Adapter();
 
-    public static void init(boolean hasDistinctMultitouch) {
+    public static void init(boolean hasDistinctMultitouch,
+            boolean needsPhantomSuddenMoveEventHack) {
         if (hasDistinctMultitouch) {
             sPointerTrackerQueue = new PointerTrackerQueue();
         } else {
             sPointerTrackerQueue = null;
         }
+        sNeedsPhantomSuddenMoveEventHack = needsPhantomSuddenMoveEventHack;
 
         setParameters(LatinKeyboardView.PointerTrackerParams.DEFAULT);
     }
@@ -589,10 +592,13 @@ public class PointerTracker {
                     final int dx = x - lastX;
                     final int dy = y - lastY;
                     final int lastMoveSquared = dx * dx + dy * dy;
-                    if (lastMoveSquared >= mKeyQuarterWidthSquared) {
-                        if (DEBUG_MODE)
-                            Log.w(TAG, String.format("onMoveEvent: sudden move is translated to "
+                    if (sNeedsPhantomSuddenMoveEventHack
+                            && lastMoveSquared >= mKeyQuarterWidthSquared) {
+                        if (DEBUG_MODE) {
+                            Log.w(TAG, String.format("onMoveEvent:"
+                                    + " phantom sudden move event is translated to "
                                     + "up[%d,%d]/down[%d,%d] events", lastX, lastY, x, y));
+                        }
                         if (ProductionFlag.IS_EXPERIMENTAL) {
                             ResearchLogger.pointerTracker_onMoveEvent(x, y, lastX, lastY);
                         }