diff --git a/tests/tests/database/src/android/database/cts/CursorWindowTest.java b/tests/tests/database/src/android/database/cts/CursorWindowTest.java
index 1febfd0..9156d02 100644
--- a/tests/tests/database/src/android/database/cts/CursorWindowTest.java
+++ b/tests/tests/database/src/android/database/cts/CursorWindowTest.java
@@ -16,7 +16,6 @@
 
 package android.database.cts;
 
-import com.android.common.ArrayListCursor;
 import com.google.android.collect.Lists;
 
 import dalvik.annotation.TestLevel;
@@ -28,6 +27,7 @@
 import android.database.AbstractCursor;
 import android.database.CharArrayBuffer;
 import android.database.CursorWindow;
+import android.database.MatrixCursor;
 import android.database.sqlite.SQLiteException;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
@@ -81,10 +81,13 @@
     })
     public void testWriteCursorToWindow() throws Exception {
         // create cursor
-        String[] colNames = new String[]{"name", "number", "profit"};
+        String[] colNames = new String[]{"_id", "name", "number", "profit"};
         int colsize = colNames.length;
         ArrayList<ArrayList> list = createTestList(10, colsize);
-        AbstractCursor cursor = new ArrayListCursor(colNames, list);
+        MatrixCursor cursor = new MatrixCursor(colNames, list.size());
+        for (ArrayList row : list) {
+            cursor.addRow(row);
+        }
 
         // fill window
         CursorWindow window = new CursorWindow(false);
@@ -674,8 +677,7 @@
             list.add(col);
             for (int j = 0; j < cols; j++) {
                 // generate random number
-                Integer r = generator.nextInt();
-                col.add(r);
+                col.add(j == 0 ? i : generator.nextInt());
             }
         }
         return list;
diff --git a/tests/tests/widget/src/android/widget/cts/AlphabetIndexerTest.java b/tests/tests/widget/src/android/widget/cts/AlphabetIndexerTest.java
index 59b940c..291f886 100644
--- a/tests/tests/widget/src/android/widget/cts/AlphabetIndexerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AlphabetIndexerTest.java
@@ -16,19 +16,16 @@
 
 package android.widget.cts;
 
-import com.android.common.ArrayListCursor;
-
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
 
 import android.database.Cursor;
+import android.database.MatrixCursor;
 import android.test.AndroidTestCase;
 import android.widget.AlphabetIndexer;
 
-import java.util.ArrayList;
-
 @TestTargetClass(AlphabetIndexer.class)
 public class AlphabetIndexerTest extends AndroidTestCase {
     private static final String[] COUNTRIES_LIST = new String[]
@@ -36,7 +33,7 @@
     private static final String[] NAMES_LIST = new String[]
         {"Andy", "Bergkamp", "David", "Jacky", "Kevin", "Messi", "Michael", "Steven"};
     private static final String ALPHABET = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-    private static final int SORTED_COLUMN_INDEX = 0;
+    private static final int SORTED_COLUMN_INDEX = 1;
 
     private static final int INDEX_OF_ARGENTINA = 0;
     private static final int INDEX_OF_CHINA = 2;
@@ -151,16 +148,13 @@
 
     @SuppressWarnings("unchecked")
     private Cursor createCursor(String listName, String[] listData) {
-        String[] columns = { listName };
+        String[] columns = { "_id", listName };
 
-        ArrayList<ArrayList> list = new ArrayList<ArrayList>();
-        for (String cell : listData) {
-            ArrayList<String> row = new ArrayList<String>();
-            row.add(cell);
-            list.add(row);
+        MatrixCursor cursor = new MatrixCursor(columns, listData.length);
+        for (int i = 0; i < listData.length; i++) {
+            cursor.addRow(new Object[] { i, listData[i] });
         }
-
-        return new ArrayListCursor(columns, list);
+        return cursor;
     }
 
     /**
diff --git a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
index 38ec995..64935c5 100644
--- a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
@@ -17,7 +17,6 @@
 package android.widget.cts;
 
 import com.android.cts.stub.R;
-import com.android.common.ArrayListCursor;
 
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
@@ -26,14 +25,13 @@
 
 import android.content.Context;
 import android.database.Cursor;
+import android.database.MatrixCursor;
 import android.test.InstrumentationTestCase;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ResourceCursorAdapter;
 
-import java.util.ArrayList;
-
 /**
  * Test {@link ResourceCursorAdapter}.
  */
@@ -185,21 +183,22 @@
      */
     @SuppressWarnings("unchecked")
     private Cursor createTestCursor(int colCount, int rowCount) {
-        ArrayList<ArrayList> list = new ArrayList<ArrayList>();
-        String[] columns = new String[colCount];
+        String[] columns = new String[colCount + 1];
         for (int i = 0; i < colCount; i++) {
             columns[i] = "column" + i;
         }
+        columns[colCount] = "_id";
 
+        MatrixCursor cursor = new MatrixCursor(columns, rowCount);
+        Object[] row = new Object[colCount + 1];
         for (int i = 0; i < rowCount; i++) {
-            ArrayList<String> row = new ArrayList<String>();
             for (int j = 0; j < colCount; j++) {
-                row.add("" + i + "" + j);
+                row[j] = "" + i + "" + j;
             }
-            list.add(row);
+            row[colCount] = i;
+            cursor.addRow(row);
         }
-
-        return new ArrayListCursor(columns, list);
+        return cursor;
     }
 
     private static class MockResourceCursorAdapter extends ResourceCursorAdapter {
diff --git a/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
index 716104d..62f0709 100644
--- a/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
@@ -17,7 +17,6 @@
 package android.widget.cts;
 
 import com.android.cts.stub.R;
-import com.android.common.ArrayListCursor;
 
 import dalvik.annotation.TestTargets;
 import dalvik.annotation.TestLevel;
@@ -26,14 +25,13 @@
 
 import android.content.Context;
 import android.database.Cursor;
+import android.database.MatrixCursor;
 import android.test.InstrumentationTestCase;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ResourceCursorTreeAdapter;
 
-import java.util.ArrayList;
-
 /**
  * Test {@link ResourceCursorTreeAdapter}.
  */
@@ -186,21 +184,22 @@
      */
     @SuppressWarnings("unchecked")
     private Cursor createTestCursor(int colCount, int rowCount) {
-        ArrayList<ArrayList> list = new ArrayList<ArrayList>();
-        String[] columns = new String[colCount];
+        String[] columns = new String[colCount + 1];
         for (int i = 0; i < colCount; i++) {
             columns[i] = "column" + i;
         }
+        columns[colCount] = "_id";
 
+        MatrixCursor cursor = new MatrixCursor(columns, rowCount);
+        Object[] row = new Object[colCount + 1];
         for (int i = 0; i < rowCount; i++) {
-            ArrayList<String> row = new ArrayList<String>();
             for (int j = 0; j < colCount; j++) {
-                row.add("" + rowCount + "" + colCount);
+                row[j] = "" + rowCount + "" + colCount;
             }
-            list.add(row);
+            row[colCount] = i;
+            cursor.addRow(row);
         }
-
-        return new ArrayListCursor(columns, list);
+        return cursor;
     }
 
     private class MockResourceCursorTreeAdapter extends ResourceCursorTreeAdapter {
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
index 08e425a..e6e9d47 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
@@ -17,7 +17,6 @@
 package android.widget.cts;
 
 import com.android.cts.stub.R;
-import com.android.common.ArrayListCursor;
 
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
@@ -27,6 +26,7 @@
 
 import android.content.Context;
 import android.database.Cursor;
+import android.database.MatrixCursor;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.test.InstrumentationTestCase;
@@ -43,7 +43,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.ArrayList;
 
 /**
  * Test {@link SimpleCursorAdapter}.
@@ -470,21 +469,22 @@
      */
     @SuppressWarnings("unchecked")
     private Cursor createTestCursor(int colCount, int rowCount) {
-        ArrayList<ArrayList> list = new ArrayList<ArrayList>();
-        String[] columns = new String[colCount];
+        String[] columns = new String[colCount + 1];
         for (int i = 0; i < colCount; i++) {
             columns[i] = "column" + i;
         }
+        columns[colCount] = "_id";
 
+        MatrixCursor cursor = new MatrixCursor(columns, rowCount);
+        Object[] row = new Object[colCount + 1];
         for (int i = 0; i < rowCount; i++) {
-            ArrayList<String> row = new ArrayList<String>();
             for (int j = 0; j < colCount; j++) {
-                row.add("" + i + "" + j);
+                row[j] = "" + i + "" + j;
             }
-            list.add(row);
+            row[colCount] = i;
+            cursor.addRow(row);
         }
-
-        return new ArrayListCursor(columns, list);
+        return cursor;
     }
 
     private static class MockViewBinder implements ViewBinder {
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
index 8e6f0f3..bbb96c4 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
@@ -17,7 +17,6 @@
 package android.widget.cts;
 
 import com.android.cts.stub.R;
-import com.android.common.ArrayListCursor;
 
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
@@ -27,6 +26,7 @@
 
 import android.content.Context;
 import android.database.Cursor;
+import android.database.MatrixCursor;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.test.InstrumentationTestCase;
@@ -35,8 +35,6 @@
 import android.widget.SimpleCursorTreeAdapter;
 import android.widget.TextView;
 
-import java.util.ArrayList;
-
 /**
  * Test {@link SimpleCursorTreeAdapter}.
  */
@@ -232,21 +230,22 @@
      */
     @SuppressWarnings("unchecked")
     private Cursor createTestCursor(int colCount, int rowCount, String prefix) {
-        ArrayList<ArrayList> list = new ArrayList<ArrayList>();
-        String[] columns = new String[colCount];
+        String[] columns = new String[colCount + 1];
         for (int i = 0; i < colCount; i++) {
             columns[i] = "column" + i;
         }
+        columns[colCount] = "_id";
 
+        MatrixCursor cursor = new MatrixCursor(columns, rowCount);
+        Object[] row = new Object[colCount + 1];
         for (int i = 0; i < rowCount; i++) {
-            ArrayList<String> row = new ArrayList<String>();
             for (int j = 0; j < colCount; j++) {
-                row.add(prefix + i + "" + j);
+                row[j] = prefix + i + "" + j;
             }
-            list.add(row);
+            row[colCount] = i;
+            cursor.addRow(row);
         }
-
-        return new ArrayListCursor(columns, list);
+        return cursor;
     }
 
     private class MockSimpleCursorTreeAdapter extends SimpleCursorTreeAdapter {
