diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 09faf41..5fbfe7b 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -21,6 +21,7 @@
 import android.app.DialogFragment;
 import android.app.Fragment;
 import android.content.ContentResolver;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
@@ -111,6 +112,28 @@
         mDialogFragment = null;
     }
 
+    /**
+     * Sets the OnCancelListener of the dialog shown. This method can only be
+     * called after showDialog(int) and before removeDialog(int). The method
+     * does nothing otherwise.
+     */
+    protected void setOnCancelListener(DialogInterface.OnCancelListener listener) {
+        if (mDialogFragment != null) {
+            mDialogFragment.mOnCancelListener = listener;
+        }
+    }
+
+    /**
+     * Sets the OnDismissListener of the dialog shown. This method can only be
+     * called after showDialog(int) and before removeDialog(int). The method
+     * does nothing otherwise.
+     */
+    protected void setOnDismissListener(DialogInterface.OnDismissListener listener) {
+        if (mDialogFragment != null) {
+            mDialogFragment.mOnDismissListener = listener;
+        }
+    }
+
     public static class SettingsDialogFragment extends DialogFragment {
         private static final String KEY_DIALOG_ID = "key_dialog_id";
         private static final String KEY_PARENT_FRAGMENT_ID = "key_parent_fragment_id";
@@ -119,6 +142,9 @@
 
         private Fragment mParentFragment;
 
+        private DialogInterface.OnCancelListener mOnCancelListener;
+        private DialogInterface.OnDismissListener mOnDismissListener;
+
         public SettingsDialogFragment() {
             /* do nothing */
         }
@@ -163,6 +189,21 @@
             return ((DialogCreatable) mParentFragment).onCreateDialog(mDialogId);
         }
 
+        @Override
+        public void onCancel(DialogInterface dialog) {
+            super.onCancel(dialog);
+            if (mOnCancelListener != null) {
+                mOnCancelListener.onCancel(dialog);
+            }
+        }
+
+        @Override
+        public void onDismiss(DialogInterface dialog) {
+            super.onDismiss(dialog);
+            if (mOnDismissListener != null) {
+                mOnDismissListener.onDismiss(dialog);
+            }
+        }
         public int getDialogId() {
             return mDialogId;
         }
diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java
index c3df2d5..3e0f0a2 100644
--- a/src/com/android/settings/deviceinfo/Memory.java
+++ b/src/com/android/settings/deviceinfo/Memory.java
@@ -311,19 +311,29 @@
                         }})
                     .setNegativeButton(R.string.cancel, null)
                     .setMessage(R.string.dlg_confirm_unmount_text)
-                    .setOnCancelListener(this)
                     .create();
         case DLG_ERROR_UNMOUNT:
                 return new AlertDialog.Builder(getActivity())
             .setTitle(R.string.dlg_error_unmount_title)
             .setNeutralButton(R.string.dlg_ok, null)
             .setMessage(R.string.dlg_error_unmount_text)
-            .setOnCancelListener(this)
             .create();
         }
         return null;
     }
 
+    @Override
+    protected void showDialog(int id) {
+        super.showDialog(id);
+
+        switch (id) {
+        case DLG_CONFIRM_UNMOUNT:
+        case DLG_ERROR_UNMOUNT:
+            setOnCancelListener(this);
+            break;
+        }
+    }
+
     private void doUnmount(boolean force) {
         // Present a toast here
         Toast.makeText(getActivity(), R.string.unmount_inform_text, Toast.LENGTH_SHORT).show();
diff --git a/src/com/android/settings/vpn/VpnSettings.java b/src/com/android/settings/vpn/VpnSettings.java
index 03687f2..1e02d50 100644
--- a/src/com/android/settings/vpn/VpnSettings.java
+++ b/src/com/android/settings/vpn/VpnSettings.java
@@ -239,6 +239,17 @@
     }
 
     @Override
+    protected void showDialog(int dialogId) {
+        super.showDialog(dialogId);
+
+        setOnCancelListener(new DialogInterface.OnCancelListener() {
+            public void onCancel(DialogInterface dialog) {
+                onIdle();
+            }
+        });
+    }
+
+    @Override
     public Dialog onCreateDialog (int id) {
         switch (id) {
             case DIALOG_CONNECT:
@@ -267,27 +278,17 @@
         }
     }
 
-    private class ConnectDialog extends AlertDialog {
-        public ConnectDialog(Context context) {
-            super(context);
-            setTitle(String.format(getString(R.string.vpn_connect_to),
-                    mConnectingActor.getProfile().getName()));
-            setButton(DialogInterface.BUTTON_POSITIVE,
-                    getString(R.string.vpn_connect_button),
-                    VpnSettings.this);
-            setButton(DialogInterface.BUTTON_NEGATIVE,
-                    getString(android.R.string.cancel),
-                    VpnSettings.this);
-            setView(mConnectingActor.createConnectView());
-        }
-        public void onBackPressed() {
-            changeState(mActiveProfile, VpnState.IDLE);
-            super.onBackPressed();
-        }
-    }
-
     private Dialog createConnectDialog() {
-        return new ConnectDialog(getActivity());
+        final Activity activity = getActivity();
+        return new AlertDialog.Builder(activity)
+                .setView(mConnectingActor.createConnectView())
+                .setTitle(String.format(activity.getString(R.string.vpn_connect_to),
+                        mConnectingActor.getProfile().getName()))
+                .setPositiveButton(activity.getString(R.string.vpn_connect_button),
+                        this)
+                .setNegativeButton(activity.getString(android.R.string.cancel),
+                        this)
+                .create();
     }
 
     private Dialog createReconnectDialog(int id) {
@@ -375,11 +376,6 @@
                             public void onClick(DialogInterface dialog, int w) {
                                 onIdle();
                             }
-                        })
-                .setOnCancelListener(new DialogInterface.OnCancelListener() {
-                            public void onCancel(DialogInterface dialog) {
-                                onIdle();
-                            }
                         });
     }
 
