diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
index b629fc5..2b4661e 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
@@ -17,12 +17,14 @@
 package com.android.cts.verifier;
 
 import android.app.AlertDialog;
+import android.app.Dialog;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnCancelListener;
 import android.database.Cursor;
+import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -44,6 +46,12 @@
  */
 public class PassFailButtons {
 
+    private static final int INFO_DIALOG_ID = 1337;
+
+    private static final String INFO_DIALOG_VIEW_ID = "infoDialogViewId";
+    private static final String INFO_DIALOG_TITLE_ID = "infoDialogTitleId";
+    private static final String INFO_DIALOG_MESSAGE_ID = "infoDialogMessageId";
+
     // Interface mostly for making documentation and refactoring easier...
     private interface PassFailActivity {
 
@@ -67,36 +75,55 @@
         void setInfoResources(int titleId, int messageId, int viewId);
 
         Button getPassButton();
+
+        /* Added to the interface just to make sure it isn't forgotten in the implementations. */
+        Dialog onCreateDialog(int id, Bundle args);
     }
 
     public static class Activity extends android.app.Activity implements PassFailActivity {
 
+        @Override
         public void setPassFailButtonClickListeners() {
             setPassFailClickListeners(this);
         }
 
+        @Override
         public void setInfoResources(int titleId, int messageId, int viewId) {
             setInfo(this, titleId, messageId, viewId);
         }
 
+        @Override
         public Button getPassButton() {
             return getPassButtonView(this);
         }
+
+        @Override
+        public Dialog onCreateDialog(int id, Bundle args) {
+            return createDialog(this, id, args);
+        }
     }
 
     public static class ListActivity extends android.app.ListActivity implements PassFailActivity {
 
+        @Override
         public void setPassFailButtonClickListeners() {
             setPassFailClickListeners(this);
         }
 
+        @Override
         public void setInfoResources(int titleId, int messageId, int viewId) {
             setInfo(this, titleId, messageId, viewId);
         }
 
+        @Override
         public Button getPassButton() {
             return getPassButtonView(this);
         }
+
+        @Override
+        public Dialog onCreateDialog(int id, Bundle args) {
+            return createDialog(this, id, args);
+        }
     }
 
     private static void setPassFailClickListeners(final android.app.Activity activity) {
@@ -117,6 +144,7 @@
         View infoButton = activity.findViewById(R.id.info_button);
         infoButton.setVisibility(View.VISIBLE);
         infoButton.setOnClickListener(new OnClickListener() {
+            @Override
             public void onClick(View view) {
                 showInfoDialog(activity, titleId, messageId, viewId);
             }
@@ -145,6 +173,28 @@
 
     private static void showInfoDialog(final android.app.Activity activity, int titleId,
             int messageId, int viewId) {
+        Bundle args = new Bundle();
+        args.putInt(INFO_DIALOG_TITLE_ID, titleId);
+        args.putInt(INFO_DIALOG_MESSAGE_ID, messageId);
+        args.putInt(INFO_DIALOG_VIEW_ID, viewId);
+        activity.showDialog(INFO_DIALOG_ID, args);
+    }
+
+    private static Dialog createDialog(final android.app.Activity activity, int id, Bundle args) {
+        switch (id) {
+            case INFO_DIALOG_ID:
+                return createInfoDialog(activity, id, args);
+            default:
+                throw new IllegalArgumentException("Bad dialog id: " + id);
+        }
+    }
+
+    private static Dialog createInfoDialog(final android.app.Activity activity, int id,
+            Bundle args) {
+        int viewId = args.getInt(INFO_DIALOG_VIEW_ID);
+        int titleId = args.getInt(INFO_DIALOG_TITLE_ID);
+        int messageId = args.getInt(INFO_DIALOG_MESSAGE_ID);
+
         AlertDialog.Builder builder = new AlertDialog.Builder(activity).setIcon(
                 android.R.drawable.ic_dialog_info).setTitle(titleId);
         if (viewId > 0) {
@@ -155,15 +205,17 @@
             builder.setMessage(messageId);
         }
         builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+            @Override
             public void onClick(DialogInterface dialog, int which) {
                 markSeenInfoDialog(activity);
             }
         }).setOnCancelListener(new OnCancelListener() {
+            @Override
             public void onCancel(DialogInterface dialog) {
                 markSeenInfoDialog(activity);
             }
-        })
-    	.show();
+        });
+        return builder.create();
     }
 
     private static void markSeenInfoDialog(android.app.Activity activity) {
