diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b35549b..569549f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -24,4 +24,6 @@
         </activity>
     </application>
 
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
 </manifest>
diff --git a/assets/plox.dat b/assets/plox.dat
new file mode 100644
index 0000000..bf1e6c5
--- /dev/null
+++ b/assets/plox.dat
Binary files differ
diff --git a/res/layout/activity_ara_plox.xml b/res/layout/activity_ara_plox.xml
index 66778d3..0d0e8aa 100644
--- a/res/layout/activity_ara_plox.xml
+++ b/res/layout/activity_ara_plox.xml
@@ -10,6 +10,7 @@
                   android:layout_height="0dip"
                   android:layout_weight="2"/>
 
+<!--
     <TextView
         android:id="@+id/textView"
         android:layout_width="fill_parent"
@@ -20,5 +21,6 @@
         android:fontFamily="sans-serif"
         android:textSize="64sp"
         android:text="@string/hello_world" />
+-->
 
 </LinearLayout>
diff --git a/src/com/google/araploxio/AFE4400Thread.java b/src/com/google/araploxio/AFE4400Thread.java
index 4e94ea4..84e949b 100644
--- a/src/com/google/araploxio/AFE4400Thread.java
+++ b/src/com/google/araploxio/AFE4400Thread.java
@@ -25,6 +25,7 @@
 import java.io.IOException;
 import java.io.FileNotFoundException;
 import java.io.DataOutputStream;
+import java.io.DataInputStream;
 import java.io.FileOutputStream;
 
 public class AFE4400Thread extends Thread {
@@ -35,11 +36,14 @@
 
     private static final String preferredI2cBus = "/dev/i2c-4";
 
+    private static final boolean useRecordedData = false;
+
     private Handler handler;
     private I2cManager i2c;
+    private Context context;
 
     private volatile boolean stopped;
-    private DataOutputStream buf = null;
+    private DataInputStream ploxInputStream;
 
     private static final I2cTransaction[] setupWrites = {
         WriteReg(0x00, 0x00, 0x00, 0x00), //AFE4400_CONTROL0
@@ -101,18 +105,48 @@
     };
 
     public AFE4400Thread(Context context, Handler handler) {
+        this.context = context;
         this.i2c = (I2cManager)context.getSystemService(Context.I2C_SERVICE);
         this.stopped = false;
         this.handler = handler;
+    }
+
+    private void startRecordedStream() {
+        Log.d(TAG, "Playing back recorded data");
+
         try {
-            this.buf = new DataOutputStream(new FileOutputStream("/sdcard/plox.dat"));
-        } catch (FileNotFoundException e) {
-            Log.e(TAG, e.toString());
+            ploxInputStream = new DataInputStream(context.getAssets().open("plox.dat"));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        int x = 0;
+        while (!stopped) {
+            Message msg;
+            try {
+                msg = handler.obtainMessage(0, x++, ploxInputStream.readInt());
+                ploxInputStream.readInt();
+                msg.sendToTarget();
+            } catch (IOException e1) {
+                e1.printStackTrace();
+                requestStop();
+                break;
+            }
+            try {
+                Thread.sleep(10);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+
+        try {
+            ploxInputStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
         }
     }
 
-    @Override
-    public void run() {
+    private void startSensorStream() {
         String[] buses = i2c.getI2cBuses();
         if (buses.length == 0) {
             setText("no I2C buses found :(");
@@ -126,15 +160,6 @@
         }
         Log.i(TAG, "[pulse ox app] Using I2C bus: " + bus);
 
-        int nsecs = 0;
-        while (nsecs > 0) {
-            setText("starting in " + nsecs + "...");
-            nsecs--;
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException e) {}
-        }
-
         I2cTransaction[] results;
         for (I2cTransaction txn: setupWrites) {
             try {
@@ -149,7 +174,6 @@
         while (!isStopped()) {
             results = null;
             boolean stop = true;
-            String updateString = "";
             byte[] data;
             int LED1VAL;
             int LED2VAL;
@@ -160,13 +184,6 @@
                 I2cTransaction.newRead(4),
             };
 
-            I2cTransaction[] txns1 = {
-                I2cTransaction.newWrite(0x01,                 // Select SPI device 1
-                                        0x2f,                 // LED2-ALED2VAL
-                                        0xff, 0xff, 0xff),    // 3 dummy bytes
-                I2cTransaction.newRead(4),
-            };
-
             try {
                 if (stop) {
                     for (I2cTransaction txn: txns0) {
@@ -189,42 +206,24 @@
                       (((int)data[2] & 0xFF) <<  8) |
                       (((int)data[3] & 0xFF));
 
-            try {
-                if (stop) {
-                    for (I2cTransaction txn: txns1) {
-                        results = i2c.performTransactions(bus, address, txn);
-                    }
-                } else {
-                    results = i2c.performTransactions(bus, address, txns1);
-                }
-            } catch (IOException e) {
-                setText("error while reading back: " + e);
-                return;
-            }
-
-            if (stop)
-                data = results[0].data;
-            else
-                data = results[1].data;
-
-            LED2VAL = (((int)data[1]) << 16) |
-                      (((int)data[2] & 0xFF) <<  8) |
-                      (((int)data[3] & 0xFF));
-            try {
-                this.buf.writeInt(LED1VAL);
-                this.buf.writeInt(LED2VAL);
-            } catch (IOException e) {
-                Log.e(TAG, "IOException: " + e);
-            }
-
             Message msg = handler.obtainMessage(0, sample++, LED1VAL);
             msg.sendToTarget();
-        }
 
-        try {
-            this.buf.close();
-        } catch (IOException e) {
-            Log.e(TAG, "IOException: " + e);
+            try {
+                Thread.sleep(5);
+            } catch (Exception e) {
+                e.printStackTrace();
+                requestStop();
+            }
+        }
+    }
+
+    @Override
+    public void run() {
+        if (useRecordedData) {
+            startRecordedStream();
+        } else {
+            startSensorStream();
         }
     }
 
diff --git a/src/com/google/araploxio/AraPloxActivity.java b/src/com/google/araploxio/AraPloxActivity.java
index 19ec770..a0f8def 100644
--- a/src/com/google/araploxio/AraPloxActivity.java
+++ b/src/com/google/araploxio/AraPloxActivity.java
@@ -16,6 +16,7 @@
 import android.os.Message;
 import android.util.Log;
 import android.view.Window;
+import android.view.WindowManager;
 import android.view.ViewGroup.LayoutParams;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -33,7 +34,7 @@
 		Log.d(TAG, "onCreate()");
 		requestWindowFeature(Window.FEATURE_NO_TITLE);
 		setContentView(R.layout.activity_ara_plox);
-		bpmTextView = (TextView)findViewById(R.id.textView);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
 
 		mHandler = new Handler() {
 			public void handleMessage(Message msg) {
@@ -42,10 +43,6 @@
 		};
 	}
 
-	private String[] fakeBPMs = new String[] {
-			"72", "72", "74", "75", "73", "73", "70", "70", "71", "73", "76", "78"
-	};
-	private int fakeBPMCount = 0;
 	private void handleAFE4400Message(Message msg) {
 		//	Log.d(TAG, "Message received: arg1: " + msg.arg1 + " arg2: " + msg.arg2);
 		double x = msg.arg1;
@@ -53,32 +50,29 @@
 
 		xySeries.add(x, y);
 		// Scroll continuously after ~150 points
-		if (x > 150) {
+		if (x > 200) {
 			xySeries.remove(0);
 		}
 
-		// Autoscale
-		double maxX = xySeries.getMaxX();
-		double minX = xySeries.getMinX();
-		double maxY = xySeries.getMaxY();
-		double minY = xySeries.getMinY();
-		renderer.setXAxisMax(maxX);
-		renderer.setXAxisMin(minX);
-		renderer.setYAxisMax(maxY);
-		renderer.setYAxisMin(minY);
+        // Autoscale
+        double maxX = xySeries.getMaxX();
+        double minX = xySeries.getMinX();
+        double maxY = xySeries.getMaxY();
+        double minY = xySeries.getMinY();
 
-		chart_view.repaint();
-		
-		// fake pulse rate...
-		if (x % 10 == 0) {
-			bpmTextView.setText(fakeBPMs[fakeBPMCount++] + " bpm");
-			if (fakeBPMCount == fakeBPMs.length) {
-				fakeBPMCount = 0;
-			}
-		}
-	}
+        maxY *= 1.02;
+        minY *= .98;
 
-	private XYMultipleSeriesRenderer renderer;
+        renderer.setXAxisMax(maxX);
+        renderer.setXAxisMin(minX);
+        renderer.setYAxisMax(maxY);
+        renderer.setYAxisMin(minY);
+
+        chart_view.repaint();
+
+    }
+
+    private XYMultipleSeriesRenderer renderer;
 	private XYMultipleSeriesDataset dataSet;
 	private XYSeries xySeries;
 
@@ -91,7 +85,7 @@
 		PointStyle[] styles = new PointStyle[] {PointStyle.CIRCLE};
 
 		renderer = new XYMultipleSeriesRenderer();
-		
+
 		int length = colors.length;
 		for (int i = 0; i < length; i++) {
 			XYSeriesRenderer r = new XYSeriesRenderer();
@@ -131,7 +125,6 @@
 		}
 	}
 
-
 	protected void onResume() {
 		super.onResume();
 		Log.d(TAG, "onResume()");
@@ -151,7 +144,7 @@
 		}
 
 	}
-	
+
 	protected void onStop() {
 		super.onStop();
 		Log.d(TAG, "onStop()");
