diff --git a/apps/BugReportSender/AndroidManifest.xml b/apps/BugReportSender/AndroidManifest.xml
index 39c1d7e..aee89f1 100644
--- a/apps/BugReportSender/AndroidManifest.xml
+++ b/apps/BugReportSender/AndroidManifest.xml
@@ -33,6 +33,14 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="BugReportPreviewActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:mimeType="vnd.android/bugreport" />
+            </intent-filter>
+        </activity>
+
     </application>
 
 </manifest>
diff --git a/apps/BugReportSender/res/layout/bugreport_preview.xml b/apps/BugReportSender/res/layout/bugreport_preview.xml
new file mode 100644
index 0000000..2f85c20
--- /dev/null
+++ b/apps/BugReportSender/res/layout/bugreport_preview.xml
@@ -0,0 +1,12 @@
+<ScrollView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+    <TextView
+            android:id="@+id/preview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:scrollbars="horizontal|vertical"
+            android:scrollbarAlwaysDrawVerticalTrack="true"/>
+</ScrollView>
\ No newline at end of file
diff --git a/apps/BugReportSender/src/com/android/bugreportsender/BugReportListActivity.java b/apps/BugReportSender/src/com/android/bugreportsender/BugReportListActivity.java
index 56bc4d8..966de88 100644
--- a/apps/BugReportSender/src/com/android/bugreportsender/BugReportListActivity.java
+++ b/apps/BugReportSender/src/com/android/bugreportsender/BugReportListActivity.java
@@ -24,7 +24,10 @@
 import android.os.FileObserver;
 import android.os.Handler;
 import android.util.Log;
+import android.view.ContextMenu;
+import android.view.MenuItem;
 import android.view.View;
+import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
 
@@ -32,6 +35,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 
 /**
  * Shows a list of bug reports currently in /sdcard/bugreports
@@ -39,6 +43,18 @@
 public class BugReportListActivity extends ListActivity {
     private static final String TAG = "BugReportListActivity";
     private static final File REPORT_DIR = new File("/sdcard/bugreports");
+    private static final int SYSTEM_LOG_ID = 1;
+    private static final int MEMORY_ID = 2;
+    private static final int CPU_ID = 3;
+    private static final int PROCRANK_ID = 4;
+    private static final HashMap<Integer, String> ID_MAP = new HashMap<Integer, String>();
+
+    static {
+        ID_MAP.put(SYSTEM_LOG_ID, "SYSTEM LOG");
+        ID_MAP.put(MEMORY_ID, "MEMORY INFO");
+        ID_MAP.put(CPU_ID, "CPU INFO");
+        ID_MAP.put(PROCRANK_ID, "PROCRANK");
+    }
 
     private ArrayAdapter<String> mAdapter = null;
     private ArrayList<File> mFiles = null;
@@ -60,6 +76,17 @@
         };
 
         setListAdapter(mAdapter);
+        registerForContextMenu(getListView());
+    }
+
+    @Override
+    public void onCreateContextMenu(ContextMenu menu, View v,
+                                    ContextMenu.ContextMenuInfo menuInfo) {
+        super.onCreateContextMenu(menu, v, menuInfo);
+        menu.add(0, SYSTEM_LOG_ID, 0, "System Log");
+        menu.add(0, CPU_ID, 0, "CPU Info");
+        menu.add(0, MEMORY_ID, 0, "Memory Info");
+        menu.add(0, PROCRANK_ID, 0, "Procrank");
     }
 
     @Override
@@ -95,6 +122,31 @@
         }
     }
 
+
+    @Override
+    public boolean onContextItemSelected(MenuItem item) {
+      AdapterView.AdapterContextMenuInfo info =
+              (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
+      if (info.position >= mFiles.size()) {
+        return true;
+      }
+      int id = item.getItemId();
+      switch (id) {
+          case SYSTEM_LOG_ID: // drop down
+          case MEMORY_ID:     // drop down
+          case CPU_ID:        // drop down
+          case PROCRANK_ID:
+          File file = mFiles.get(info.position);
+          Intent intent = new Intent(Intent.ACTION_VIEW);
+          intent.setDataAndType(Uri.fromFile(file), "vnd.android/bugreport");
+          intent.putExtra("section", ID_MAP.get(id));
+          startActivity(intent);
+          return true;
+      default:
+        return super.onContextItemSelected(item);
+      }
+    }
+
     private void scanDirectory() {
         mAdapter.clear();
         mFiles.clear();
diff --git a/apps/BugReportSender/src/com/android/bugreportsender/BugReportParser.java b/apps/BugReportSender/src/com/android/bugreportsender/BugReportParser.java
new file mode 100644
index 0000000..4675cd9
--- /dev/null
+++ b/apps/BugReportSender/src/com/android/bugreportsender/BugReportParser.java
@@ -0,0 +1,49 @@
+package com.android.bugreportsender;
+
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * Utility class for parsing a bugreport into its sections.
+ */
+public final class BugReportParser {
+    private static final int BUFFER_SIZE = 8*1024;
+    private static final String SECTION_HEADER = "------";
+    private static final int MAX_LINES = 1000; // just in case we miss the end of the section.
+
+    // utility class
+    private BugReportParser() {}
+
+    public static String extractSystemLogs(InputStream in, String section) throws IOException {
+        final String sectionWithHeader = SECTION_HEADER + " " + section;
+        StringBuilder sb = new StringBuilder();
+        // open a reader around the provided inputstream.
+        BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), BUFFER_SIZE);
+        boolean inSection = false;
+        int numLines = 0;
+        // read file contents.  loop until we get to the appropriate section header.
+        // once we reach that header, accumulate all lines until we get to the next section.
+        String line = null;
+        while ((line = reader.readLine()) != null) {
+            if (inSection) {
+                // finish when we get to:
+                // -----
+                if (line.startsWith(SECTION_HEADER) || (numLines > MAX_LINES)) {
+                    break;
+                }
+                sb.append(line);
+                sb.append("\n");
+                ++numLines;
+            } else if (line.startsWith(sectionWithHeader)) {
+                sb.append(line);
+                sb.append("\n");
+                inSection = true;
+            }
+        }
+        return sb.toString();
+    }
+}
diff --git a/apps/BugReportSender/src/com/android/bugreportsender/BugReportPreviewActivity.java b/apps/BugReportSender/src/com/android/bugreportsender/BugReportPreviewActivity.java
new file mode 100644
index 0000000..74239c6
--- /dev/null
+++ b/apps/BugReportSender/src/com/android/bugreportsender/BugReportPreviewActivity.java
@@ -0,0 +1,79 @@
+package com.android.bugreportsender;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Config;
+import android.util.Log;
+import android.widget.TextView;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Provides a scrolling text view previewing a named section of a
+ * bugreport.
+ */
+public class BugReportPreviewActivity extends Activity {
+
+    private static final String TAG = "BugReportPreview";
+
+    private TextView mText;
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        setContentView(com.android.bugreportsender.R.layout.bugreport_preview);
+        mText = (TextView) findViewById(R.id.preview);
+
+        if (icicle != null && icicle.getString("text") != null) {
+            mText.setText(icicle.getString("text"));
+        } else {
+            Intent intent = getIntent();
+            if (intent == null) {
+                Log.w(TAG, "No intent provided.");
+                return;
+            }
+            Uri uri = intent.getData();
+            String section = intent.getStringExtra("section");
+            if (section == null || section.length() == 0) {
+                section = "SYSTEM LOG";
+            }
+            Log.d(TAG, "Loading " + uri);
+            InputStream in = null;
+            try {
+		// TODO: do this in a background thread, using handlers and all that nonsense.
+                in = getContentResolver().openInputStream(uri);
+                String text = BugReportParser.extractSystemLogs(in, section);
+                mText.setText(text);
+            } catch (FileNotFoundException fnfe) {
+                Log.w(TAG, "Unable to open file: " + uri, fnfe);
+		mText.setText("Unable to open file: " + uri + ": " + fnfe);
+                return;
+            } catch (IOException ioe) {
+                Log.w(TAG, "Unable to process log.", ioe);
+		mText.setText("Unable to process log: " + ioe);
+		return;
+            } finally {
+                try {
+                    if (in != null) {
+			in.close();
+		    }
+                } catch (IOException ioe) {
+                    // ignore
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle icicle) {
+        CharSequence text = mText.getText();
+        if (text != null) {
+            icicle.putString("text", mText.getText().toString());
+        }
+    }
+}
