diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
index 7b100d72969e25655ab6db0b890197fe79bf74fd..6e3295e5978cc0309e9e8d9c05532dc5a9424cb1 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
@@ -21,13 +21,15 @@ import android.util.FloatMath;
 
 import com.android.inputmethod.latin.Constants;
 import com.android.inputmethod.latin.InputPointers;
+import com.android.inputmethod.latin.ResizableIntArray;
 
 public class GestureStroke {
     public static final int DEFAULT_CAPACITY = 128;
 
     private final int mPointerId;
-    // TODO: Replace this {@link InputPointers} with a set of {@link ScalableIntArray}s.
-    private final InputPointers mInputPointers = new InputPointers(DEFAULT_CAPACITY);
+    private final ResizableIntArray mEventTimes = new ResizableIntArray(DEFAULT_CAPACITY);
+    private final ResizableIntArray mXCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
+    private final ResizableIntArray mYCoordinates = new ResizableIntArray(DEFAULT_CAPACITY);
     private float mLength;
     private float mAngle;
     private int mIncrementalRecognitionSize;
@@ -85,7 +87,9 @@ public class GestureStroke {
         mIncrementalRecognitionSize = 0;
         mLastIncrementalBatchSize = 0;
         mLastPointTime = 0;
-        mInputPointers.reset();
+        mEventTimes.setLength(0);
+        mXCoordinates.setLength(0);
+        mYCoordinates.setLength(0);
         mDrawingRect.setEmpty();
     }
 
@@ -96,26 +100,24 @@ public class GestureStroke {
     }
 
     public void addPoint(final int x, final int y, final int time, final boolean isHistorical) {
-        final int size = mInputPointers.getPointerSize();
+        final int size = mEventTimes.getLength();
         if (size == 0) {
-            mInputPointers.addPointer(x, y, mPointerId, time);
+            mEventTimes.add(time);
+            mXCoordinates.add(x);
+            mYCoordinates.add(y);
             if (!isHistorical) {
                 updateLastPoint(x, y, time);
             }
             return;
         }
-        final int[] xCoords = mInputPointers.getXCoordinates();
-        final int[] yCoords = mInputPointers.getYCoordinates();
-        final int lastX = xCoords[size - 1];
-        final int lastY = yCoords[size - 1];
+
+        final int lastX = mXCoordinates.get(size - 1);
+        final int lastY = mYCoordinates.get(size - 1);
         final float dist = getDistance(lastX, lastY, x, y);
         if (dist > mMinGestureSampleLength) {
-            mInputPointers.addPointer(x, y, mPointerId, time);
-            if (mDrawingRect.isEmpty()) {
-                mDrawingRect.set(x - 1, y - 1, x + 1, y + 1);
-            } else {
-                mDrawingRect.union(x, y);
-            }
+            mEventTimes.add(time);
+            mXCoordinates.add(x);
+            mYCoordinates.add(y);
             mLength += dist;
             final float angle = getAngle(lastX, lastY, x, y);
             if (size > 1) {
@@ -142,15 +144,17 @@ public class GestureStroke {
     }
 
     public void appendAllBatchPoints(final InputPointers out) {
-        final int size = mInputPointers.getPointerSize();
-        out.append(mInputPointers, mLastIncrementalBatchSize, size - mLastIncrementalBatchSize);
-        mLastIncrementalBatchSize = size;
+        appendBatchPoints(out, mEventTimes.getLength());
     }
 
     public void appendIncrementalBatchPoints(final InputPointers out) {
-        out.append(mInputPointers, mLastIncrementalBatchSize,
-                mIncrementalRecognitionSize - mLastIncrementalBatchSize);
-        mLastIncrementalBatchSize = mIncrementalRecognitionSize;
+        appendBatchPoints(out, mIncrementalRecognitionSize);
+    }
+
+    private void appendBatchPoints(final InputPointers out, final int size) {
+        out.append(mPointerId, mEventTimes, mXCoordinates, mYCoordinates,
+                mLastIncrementalBatchSize, size - mLastIncrementalBatchSize);
+        mLastIncrementalBatchSize = size;
     }
 
     private static float getDistance(final int p1x, final int p1y,
@@ -179,9 +183,9 @@ public class GestureStroke {
     public void drawGestureTrail(Canvas canvas, Paint paint, int lastX, int lastY) {
         // TODO: These paint parameter interpolation should be tunable, possibly introduce an object
         // that implements an interface such as Paint getPaint(int step, int strokePoints)
-        final int size = mInputPointers.getPointerSize();
-        int[] xCoords = mInputPointers.getXCoordinates();
-        int[] yCoords = mInputPointers.getYCoordinates();
+        final int size = mXCoordinates.getLength();
+        int[] xCoords = mXCoordinates.getPrimitiveArray();
+        int[] yCoords = mYCoordinates.getPrimitiveArray();
         int alpha = Constants.Color.ALPHA_OPAQUE;
         for (int i = size - 1; i > 0 && alpha > 0; i--) {
             paint.setAlpha(alpha);
diff --git a/java/src/com/android/inputmethod/latin/InputPointers.java b/java/src/com/android/inputmethod/latin/InputPointers.java
index 2bccdee4819d59f35f2aace0a63d65cdec7ab8ad..cbc916a7e268019dd06e64164092584296933aa4 100644
--- a/java/src/com/android/inputmethod/latin/InputPointers.java
+++ b/java/src/com/android/inputmethod/latin/InputPointers.java
@@ -76,6 +76,27 @@ public class InputPointers {
         mTimes.append(src.mTimes, startPos, length);
     }
 
+    /**
+     * Append the times, x-coordinates and y-coordinates in the specified {@link ResizableIntArray}
+     * to the end of this.
+     * @param pointerId the pointer id of the source.
+     * @param times the source {@link ResizableIntArray} to read the event times from.
+     * @param xCoordinates the source {@link ResizableIntArray} to read the x-coordinates from.
+     * @param yCoordinates the source {@link ResizableIntArray} to read the y-coordinates from.
+     * @param startPos the starting index of the data in {@code times} and etc.
+     * @param length the number of data to be appended.
+     */
+    public void append(int pointerId, ResizableIntArray times, ResizableIntArray xCoordinates,
+            ResizableIntArray yCoordinates, int startPos, int length) {
+        if (length == 0) {
+            return;
+        }
+        mXCoordinates.append(xCoordinates, startPos, length);
+        mYCoordinates.append(yCoordinates, startPos, length);
+        mPointerIds.fill(pointerId, startPos, length);
+        mTimes.append(times, startPos, length);
+    }
+
     public void reset() {
         final int defaultCapacity = mDefaultCapacity;
         mXCoordinates.reset(defaultCapacity);