diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3aaed74..7a5174e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2711,6 +2711,8 @@
     <string name="vpn_type_title">Add VPN</string>
     <!-- "Add VPN" preference title -->
     <string name="vpn_add_new_vpn">Add VPN</string>
+    <!-- VPN details screen title -->
+    <string name="vpn_details_title">VPN details</string>
     <!-- VPN profile editor title when adding a new profile -->
     <string name="vpn_edit_title_add">Add <xliff:g id="name">%s</xliff:g> VPN</string>
     <!-- VPN profile editor title when editing an existing profile -->
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 41ff87f..3c771f5 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -64,49 +64,11 @@
     private Button mNextButton;
 
     @Override
-    public void onResume() {
-        super.onResume();
-
-        final Fragment f = getTargetFragment();
-        final int requestCode = getTargetRequestCode();
-
-        // TargetFragment becomes invalid when this object is resumed. Notify it to
-        // FragmentManager. Without this code, FragmentManager wrongly take the TargetFragment
-        // as live, and throws IllegalStateException.
-        setTargetFragment(null, -1);
-
-        if (f != null && (f instanceof SettingsPreferenceFragment)) {
-            final SettingsPreferenceFragment spf = (SettingsPreferenceFragment)f;
-            final int resultCode = spf.getResultCode();
-            final Intent resultData = spf.getResultData();
-            onActivityResult(requestCode, resultCode, resultData);
-        }
-    }
-
-    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
         setupButtonBar();
     }
 
-    public final void setResult(int resultCode) {
-        mResultCode = resultCode;
-        mResultData = null;
-    }
-
-    public final void setResult(int resultCode, Intent data) {
-        mResultCode = resultCode;
-        mResultData = data;
-    }
-
-    public final int getResultCode() {
-        return mResultCode;
-    }
-
-    public final Intent getResultData() {
-        return mResultData;
-    }
-
     /*
      * The name is intentionally made different from Activity#finish(), so that
      * users won't misunderstand its meaning.
@@ -196,9 +158,8 @@
             Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
         if (getActivity() instanceof PreferenceActivity) {
             PreferenceActivity preferenceActivity = (PreferenceActivity)getActivity();
-            Fragment f = Fragment.instantiate(getActivity(), fragmentClass, extras);
-            caller.setTargetFragment(f, requestCode);
-            preferenceActivity.switchToHeader(fragmentClass, extras);
+            preferenceActivity.startPreferencePanel(fragmentClass, extras, 0, null, caller,
+                    requestCode);
             return true;
         } else {
             Log.w(TAG, "Parent isn't PreferenceActivity, thus there's no way to launch the "
diff --git a/src/com/android/settings/vpn/VpnEditor.java b/src/com/android/settings/vpn/VpnEditor.java
index 3ab0b90..1b3bdb5 100644
--- a/src/com/android/settings/vpn/VpnEditor.java
+++ b/src/com/android/settings/vpn/VpnEditor.java
@@ -32,8 +32,8 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.preference.PreferenceActivity;
 import android.text.TextUtils;
-import android.util.Log;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -109,7 +109,11 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case MENU_SAVE:
-                if (validateAndSetResult()) finishFragment();
+                Intent resultIntent = validateAndGetResult();
+                if (resultIntent != null) {
+                    ((PreferenceActivity) getActivity()).finishPreferencePanel(
+                            this, Activity.RESULT_OK, resultIntent);
+                }
                 return true;
 
             case MENU_CANCEL:
@@ -152,22 +156,24 @@
      * Checks the validity of the inputs and set the profile as result if valid.
      * @return true if the result is successfully set
      */
-    private boolean validateAndSetResult() {
+    private Intent validateAndGetResult() {
         String errorMsg = mProfileEditor.validate();
 
         if (errorMsg != null) {
             Util.showErrorMessage(getActivity(), errorMsg);
-            return false;
+            return null;
         }
 
-        if (profileChanged()) setResult(getProfile());
-        return true;
+        if (profileChanged()) {
+            return getResult(getProfile());
+        }
+        return null;
     }
 
-    private void setResult(VpnProfile p) {
+    private Intent getResult(VpnProfile p) {
         Intent intent = new Intent(getActivity(), VpnSettings.class);
         intent.putExtra(VpnSettings.KEY_VPN_PROFILE, (Parcelable) p);
-        setResult(Activity.RESULT_OK, intent);
+        return intent;
     }
 
     private VpnProfileEditor getEditor(VpnProfile p) {
diff --git a/src/com/android/settings/vpn/VpnSettings.java b/src/com/android/settings/vpn/VpnSettings.java
index e9a4c3d..0b77930 100644
--- a/src/com/android/settings/vpn/VpnSettings.java
+++ b/src/com/android/settings/vpn/VpnSettings.java
@@ -22,7 +22,6 @@
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.Fragment;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -39,19 +38,21 @@
 import android.net.vpn.VpnType;
 import android.os.Bundle;
 import android.os.ConditionVariable;
+import android.os.Handler;
 import android.os.IBinder;
 import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceActivity;
 import android.preference.PreferenceCategory;
 import android.preference.PreferenceScreen;
+import android.preference.Preference.OnPreferenceClickListener;
 import android.security.Credentials;
 import android.security.KeyStore;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ContextMenu.ContextMenuInfo;
 import android.widget.AdapterView.AdapterContextMenuInfo;
 
 import java.io.File;
@@ -72,6 +73,9 @@
  */
 public class VpnSettings extends SettingsPreferenceFragment
         implements DialogInterface.OnClickListener {
+
+    private static final boolean DEBUG = false;
+
     // Key to the field exchanged for profile editing.
     static final String KEY_VPN_PROFILE = "vpn_profile";
 
@@ -87,7 +91,7 @@
     private static final String PROFILE_OBJ_FILE = ".pobj";
 
     private static final int REQUEST_ADD_OR_EDIT_PROFILE = 1;
-    private static final int REQUEST_SELECT_VPN_TYPE = 2;
+    static final int REQUEST_SELECT_VPN_TYPE = 2;
 
     private static final int CONTEXT_MENU_CONNECT_ID = ContextMenu.FIRST + 0;
     private static final int CONTEXT_MENU_DISCONNECT_ID = ContextMenu.FIRST + 1;
@@ -134,6 +138,8 @@
 
     private StatusChecker mStatusChecker = new StatusChecker();
 
+    private Handler mHandler = new Handler();
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -171,7 +177,8 @@
     @Override
     public void onResume() {
         super.onResume();
-
+        if (DEBUG)
+            Log.d(TAG, "onResume");
         if ((mUnlockAction != null) && isKeyStoreUnlocked()) {
             Runnable action = mUnlockAction;
             mUnlockAction = null;
@@ -282,7 +289,7 @@
                 .setPositiveButton(R.string.vpn_yes_button,
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int w) {
-                                startVpnEditor(mActiveProfile);
+                                startVpnEditor(mActiveProfile, false);
                             }
                         })
                 .create();
@@ -295,7 +302,7 @@
                             public void onClick(DialogInterface dialog, int w) {
                                 VpnProfile p = mActiveProfile;
                                 onIdle();
-                                startVpnEditor(p);
+                                startVpnEditor(p, false);
                             }
                         });
     }
@@ -362,7 +369,7 @@
             return true;
 
         case CONTEXT_MENU_EDIT_ID:
-            startVpnEditor(p);
+                startVpnEditor(p, false);
             return true;
 
         case CONTEXT_MENU_DELETE_ID:
@@ -376,14 +383,21 @@
     @Override
     public void onActivityResult(final int requestCode, final int resultCode,
             final Intent data) {
+
+        if (DEBUG) Log.d(TAG, "onActivityResult , result = " + resultCode + ", data = " + data);
         if ((resultCode == Activity.RESULT_CANCELED) || (data == null)) {
             Log.d(TAG, "no result returned by editor");
             return;
         }
 
         if (requestCode == REQUEST_SELECT_VPN_TYPE) {
-            String typeName = data.getStringExtra(KEY_VPN_TYPE);
-            startVpnEditor(createVpnProfile(typeName));
+            final String typeName = data.getStringExtra(KEY_VPN_TYPE);
+            mHandler.post(new Runnable() {
+
+                public void run() {
+                    startVpnEditor(createVpnProfile(typeName), true);
+                }
+            });
         } else if (requestCode == REQUEST_ADD_OR_EDIT_PROFILE) {
             VpnProfile p = data.getParcelableExtra(KEY_VPN_PROFILE);
             if (p == null) {
@@ -400,7 +414,7 @@
                         p.getName()),
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int w) {
-                                startVpnEditor(profile);
+                                startVpnEditor(profile, false);
                             }
                         });
                 return;
@@ -431,7 +445,7 @@
                 Util.showErrorMessage(activity, e + ": " + e.getMessage(),
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int w) {
-                                startVpnEditor(profile);
+                                startVpnEditor(profile, false);
                             }
                         });
             }
@@ -615,8 +629,9 @@
     }
 
     private void startVpnTypeSelection() {
-        startFragment(this, VpnTypeSelection.class.getCanonicalName(),
-                REQUEST_SELECT_VPN_TYPE, null);
+        ((PreferenceActivity)getActivity()).startPreferencePanel(
+                VpnTypeSelection.class.getCanonicalName(), null, R.string.vpn_type_title, null,
+                this, REQUEST_SELECT_VPN_TYPE);
     }
 
     private boolean isKeyStoreUnlocked() {
@@ -666,11 +681,14 @@
         return false;
     }
 
-    private void startVpnEditor(final VpnProfile profile) {
+    private void startVpnEditor(final VpnProfile profile, boolean add) {
         Bundle args = new Bundle();
         args.putParcelable(KEY_VPN_PROFILE, profile);
-        startFragment(this, VpnEditor.class.getCanonicalName(),
-                REQUEST_ADD_OR_EDIT_PROFILE, args);
+        // TODO: Show different titles for add and edit.
+        ((PreferenceActivity)getActivity()).startPreferencePanel(
+                VpnEditor.class.getCanonicalName(), args,
+                add ? R.string.vpn_details_title : R.string.vpn_details_title, null,
+                this, REQUEST_ADD_OR_EDIT_PROFILE);
     }
 
     private synchronized void connect(final VpnProfile p) {
diff --git a/src/com/android/settings/vpn/VpnTypeSelection.java b/src/com/android/settings/vpn/VpnTypeSelection.java
index 5990ac0..45e33b9 100644
--- a/src/com/android/settings/vpn/VpnTypeSelection.java
+++ b/src/com/android/settings/vpn/VpnTypeSelection.java
@@ -25,6 +25,7 @@
 import android.net.vpn.VpnType;
 import android.os.Bundle;
 import android.preference.Preference;
+import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
 
 import java.util.HashMap;
@@ -46,8 +47,9 @@
 
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen ps, Preference pref) {
-        setResult(mTypeMap.get(pref.getTitle().toString()));
-        finishFragment();
+        ((PreferenceActivity)getActivity())
+                .finishPreferencePanel(this, Activity.RESULT_OK,
+                        getResultIntent(mTypeMap.get(pref.getTitle().toString())));
         return true;
     }
 
@@ -67,9 +69,9 @@
         }
     }
 
-    private void setResult(VpnType type) {
+    private Intent getResultIntent(VpnType type) {
         Intent intent = new Intent(getActivity(), VpnSettings.class);
         intent.putExtra(VpnSettings.KEY_VPN_TYPE, type.toString());
-        setResult(Activity.RESULT_OK, intent);
+        return intent;
     }
 }
