diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java
index b2b9b4f..59aeb55 100644
--- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java
+++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java
@@ -71,12 +71,18 @@
 
     private long mLastRecordedEventTime = -1;
 
+    // process scripts in line-by-line mode (true) or batch processing mode (false)
+    private boolean mReadScriptLineByLine = false;
+
     private static final boolean THIS_DEBUG = false;
 
     // a parameter that compensates the difference of real elapsed time and
     // time in theory
     private static final long SLEEP_COMPENSATE_DIFF = 16;
 
+    // if this header is present, scripts are read and processed in line-by-line mode
+    private static final String HEADER_LINE_BY_LINE = "linebyline";
+
     // maximum number of events that we read at one time
     private static final int MAX_ONE_TIME_READS = 100;
 
@@ -147,6 +153,15 @@
 
     BufferedReader mBufferedReader;
 
+    // X and Y coordincates of last touch event. Array Index is the pointerId
+    private float mLastX[] = new float[2];
+
+    private float mLastY[] = new float[2];
+
+    private long mScriptStartTime = -1;
+
+    private long mMonkeyStartTime = -1;
+
     /**
      * Creates a MonkeySourceScript instance.
      *
@@ -207,6 +222,8 @@
                     System.err.println(e);
                     return false;
                 }
+            } else if (line.indexOf(HEADER_LINE_BY_LINE) >= 0) {
+                mReadScriptLineByLine = true;
             } else if (line.indexOf(STARTING_DATA_LINE) >= 0) {
                 return true;
             }
@@ -234,6 +251,21 @@
         return MAX_ONE_TIME_READS;
     }
 
+     /**
+      * Reads one line and processes it.
+      *
+      * @return the number of lines read
+      * @throws IOException If there was an error reading the file.
+      */
+    private int readOneLine() throws IOException {
+        String line = mBufferedReader.readLine();
+        if (line == null) {
+            return 0;
+        }
+        line.trim();
+        processLine(line);
+        return 1;
+    }
 
 
 
@@ -306,6 +338,84 @@
             return;
         }
 
+        // Handle trackball or multi-touch  pointer events. pointer ID is the 13th parameter
+        if ((s.indexOf(EVENT_KEYWORD_POINTER) >= 0 || s.indexOf(EVENT_KEYWORD_TRACKBALL) >= 0)
+                && args.length == 13) {
+            try {
+                long downTime = Long.parseLong(args[0]);
+                long eventTime = Long.parseLong(args[1]);
+                int action = Integer.parseInt(args[2]);
+                float x = Float.parseFloat(args[3]);
+                float y = Float.parseFloat(args[4]);
+                float pressure = Float.parseFloat(args[5]);
+                float size = Float.parseFloat(args[6]);
+                int metaState = Integer.parseInt(args[7]);
+                float xPrecision = Float.parseFloat(args[8]);
+                float yPrecision = Float.parseFloat(args[9]);
+                int device = Integer.parseInt(args[10]);
+                int edgeFlags = Integer.parseInt(args[11]);
+                int pointerId = Integer.parseInt(args[12]);
+
+                MonkeyMotionEvent e;
+                if (s.indexOf("Pointer") > 0) {
+                    if (action == MotionEvent.ACTION_POINTER_DOWN) {
+                        e = new MonkeyTouchEvent(MotionEvent.ACTION_POINTER_DOWN
+                                | (pointerId << MotionEvent.ACTION_POINTER_INDEX_SHIFT))
+                                        .setIntermediateNote(true);
+                    } else {
+                        e = new MonkeyTouchEvent(action);
+                    }
+                    if (mScriptStartTime < 0) {
+                        mMonkeyStartTime = SystemClock.uptimeMillis();
+                        mScriptStartTime = eventTime;
+                    }
+                } else {
+                    e = new MonkeyTrackballEvent(action);
+                }
+
+                if (pointerId == 1) {
+                    e.setDownTime(downTime)
+                            .setEventTime(eventTime)
+                            .setMetaState(metaState)
+                            .setPrecision(xPrecision, yPrecision)
+                            .setDeviceId(device)
+                            .setEdgeFlags(edgeFlags)
+                            .addPointer(0, mLastX[0], mLastY[0], pressure, size)
+                            .addPointer(1, x, y, pressure, size);
+                    mLastX[1] = x;
+                    mLastY[1] = y;
+                } else if (pointerId == 0) {
+                    e.setDownTime(downTime)
+                            .setEventTime(eventTime)
+                            .setMetaState(metaState)
+                            .setPrecision(xPrecision, yPrecision)
+                            .setDeviceId(device)
+                            .setEdgeFlags(edgeFlags)
+                            .addPointer(0, x, y, pressure, size);
+                     if(action == MotionEvent.ACTION_POINTER_UP) {
+                         e.addPointer(1, mLastX[1], mLastY[1]);
+                     }
+                     mLastX[0] = x;
+                     mLastY[0] = y;
+                }
+
+                // Dynamically adjust waiting time to ensure that simulated evnets follow
+                // the time tap specified in the script
+                if (mReadScriptLineByLine) {
+                    long curUpTime = SystemClock.uptimeMillis();
+                    long realElapsedTime = curUpTime - mMonkeyStartTime;
+                    long scriptElapsedTime = eventTime - mScriptStartTime;
+                    if (realElapsedTime < scriptElapsedTime) {
+                        long waitDuration = scriptElapsedTime - realElapsedTime;
+                        mQ.addLast(new MonkeyWaitEvent(waitDuration));
+                    }
+                }
+                mQ.addLast(e);
+            } catch (NumberFormatException e) {
+            }
+            return;
+        }
+
         // Handle screen rotation events
         if ((s.indexOf(EVENT_KEYWORD_ROTATION) >= 0) && args.length == 2) {
             try {
@@ -719,7 +829,11 @@
             readHeader();
         }
 
-        linesRead = readLines();
+        if (mReadScriptLineByLine) {
+            linesRead = readOneLine();
+        } else {
+            linesRead = readLines();
+        }
 
         if (linesRead == 0) {
             closeFile();
diff --git a/testrunner/test_defs.xml b/testrunner/test_defs.xml
index 35aea0f..f3928f1 100644
--- a/testrunner/test_defs.xml
+++ b/testrunner/test_defs.xml
@@ -514,12 +514,6 @@
     build_path="external/skia/tests"
     description="Skia tests." />
 
-<!--  Android STL tests -->
-<test-native name="astl"
-    build_path="external/astl/tests"
-    description="Android STL."
-    extra_build_args="ASTL_TESTS=1" />
-
 <!-- Google Test -->
 <test-native name="gtest"
     build_path="external/gtest"
