diff --git a/res/values/strings.xml b/res/values/strings.xml
index 137b171..993eb30 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -936,8 +936,8 @@
 
     <!-- Bluetooth settings: The title of the preference (list item) that initiates a scan for devices -->
     <string name="bluetooth_preference_scan_title">Scan for devices</string>
-    <!-- Bluetooth settings: The title of the action button that finds nearby devices [CHAR LIMIT=20] -->
-    <string name="bluetooth_preference_find_nearby_title">Scan</string>
+    <!-- Bluetooth settings: The title of the action button that initiates a scan for nearby devices [CHAR LIMIT=20] -->
+    <string name="bluetooth_scan_nearby_devices">Scan</string>
     <!-- Bluetooth settings: The sub heading for device settings. [CHAR LIMIT=30] -->
     <string name="bluetooth_preference_device_settings">Device settings</string>
     <!-- Bluetooth settings: The sub heading for paired devices. [CHAR LIMIT=30] -->
diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml
index 3a88d0b..9f78820 100644
--- a/res/xml/security_settings_misc.xml
+++ b/res/xml/security_settings_misc.xml
@@ -59,7 +59,7 @@
         <Preference android:title="@string/trusted_credentials"
                 android:summary="@string/trusted_credentials_summary"
                 android:persistent="false"
-                android:fragment="com.android.settings.TrustedCredentials"/>
+                android:fragment="com.android.settings.TrustedCredentialsSettings"/>
 
         <Preference android:title="@string/credentials_install"
                 android:summary="@string/credentials_install_summary"
diff --git a/res/xml/settings_headers.xml b/res/xml/settings_headers.xml
index 532bf7d..7e80db4 100644
--- a/res/xml/settings_headers.xml
+++ b/res/xml/settings_headers.xml
@@ -42,17 +42,6 @@
         android:title="@string/data_usage_summary_title"
         android:icon="@drawable/ic_settings_data_usage" />
 
-    <!-- Call settings - this is in the phone process -->
-    <header
-        android:id="@+id/call_settings"
-        android:icon="@drawable/ic_settings_call"
-        android:title="@string/call_settings_title">
-        <intent
-            android:action="android.intent.action.MAIN"
-            android:targetPackage="com.android.phone"
-            android:targetClass="com.android.phone.CallFeaturesSetting" />
-    </header>
-
     <!-- Operator hook -->
     <header
         android:fragment="com.android.settings.WirelessSettings"
diff --git a/src/com/android/settings/ProgressCategory.java b/src/com/android/settings/ProgressCategory.java
index c5b68b6..bedcc98 100644
--- a/src/com/android/settings/ProgressCategory.java
+++ b/src/com/android/settings/ProgressCategory.java
@@ -23,7 +23,6 @@
 public class ProgressCategory extends ProgressCategoryBase {
 
     private boolean mProgress = false;
-    private View oldView = null;
 
     public ProgressCategory(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -39,13 +38,6 @@
         final int visibility = mProgress ? View.VISIBLE : View.INVISIBLE;
         textView.setVisibility(visibility);
         progressBar.setVisibility(visibility);
-
-        if (oldView != null) {
-            oldView.findViewById(R.id.scanning_progress).setVisibility(View.GONE);
-            oldView.findViewById(R.id.scanning_text).setVisibility(View.GONE);
-            oldView.setVisibility(View.GONE);
-        }
-        oldView = view;
     }
 
     @Override
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index c63d061..69e6fad 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -305,9 +305,6 @@
                     target.remove(header);
             } else if (id == R.id.operator_settings || id == R.id.manufacturer_settings) {
                 Utils.updateHeaderToSpecificActivityFromMetaDataOrRemove(this, target, header);
-            } else if (id == R.id.call_settings) {
-                if (!Utils.isVoiceCapable(this))
-                    target.remove(header);
             } else if (id == R.id.wifi_settings) {
                 // Remove WiFi Settings if WiFi service is not available.
                 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
diff --git a/src/com/android/settings/TrustedCredentials.java b/src/com/android/settings/TrustedCredentialsSettings.java
similarity index 98%
rename from src/com/android/settings/TrustedCredentials.java
rename to src/com/android/settings/TrustedCredentialsSettings.java
index 987d2dc..340e93d 100644
--- a/src/com/android/settings/TrustedCredentials.java
+++ b/src/com/android/settings/TrustedCredentialsSettings.java
@@ -46,9 +46,9 @@
 import java.util.Set;
 import org.apache.harmony.xnet.provider.jsse.TrustedCertificateStore;
 
-public class TrustedCredentials extends Fragment {
+public class TrustedCredentialsSettings extends Fragment {
 
-    private static final String TAG = "TrustedCredentials";
+    private static final String TAG = "TrustedCredentialsSettings";
 
     private enum Tab {
         SYSTEM("system",
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceFilter.java b/src/com/android/settings/bluetooth/BluetoothDeviceFilter.java
index 00e342c..e4f11a2 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceFilter.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceFilter.java
@@ -42,6 +42,9 @@
     /** Bonded devices only filter (referenced directly). */
     static final Filter BONDED_DEVICE_FILTER = new BondedDeviceFilter();
 
+    /** Unbonded devices only filter (referenced directly). */
+    static final Filter UNBONDED_DEVICE_FILTER = new UnbondedDeviceFilter();
+
     /** Table of singleton filter objects. */
     private static final Filter[] FILTERS = {
             ALL_FILTER,             // FILTER_TYPE_ALL
@@ -85,6 +88,13 @@
         }
     }
 
+    /** Filter that matches only unbonded devices. */
+    private static final class UnbondedDeviceFilter implements Filter {
+        public boolean matches(BluetoothDevice device) {
+            return device.getBondState() != BluetoothDevice.BOND_BONDED;
+        }
+    }
+
     /** Parent class of filters based on UUID and/or Bluetooth class. */
     private abstract static class ClassUuidFilter implements Filter {
         abstract boolean matches(ParcelUuid[] uuids, BluetoothClass btClass);
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index 391c941..06c708b 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -49,8 +49,6 @@
 
     private final CachedBluetoothDevice mCachedDevice;
 
-    private ImageView mDeviceSettings;
-
     private OnClickListener mOnSettingsClickListener;
 
     private AlertDialog mDisconnectDialog;
@@ -121,13 +119,13 @@
         btClass.setImageResource(getBtClassDrawable());
         btClass.setAlpha(isEnabled() ? 255 : sDimAlpha);
         btClass.setVisibility(View.VISIBLE);
-        mDeviceSettings = (ImageView) view.findViewById(R.id.deviceDetails);
+        ImageView deviceDetails = (ImageView) view.findViewById(R.id.deviceDetails);
         if (mOnSettingsClickListener != null) {
-            mDeviceSettings.setOnClickListener(this);
-            mDeviceSettings.setTag(mCachedDevice);
-            mDeviceSettings.setAlpha(isEnabled() ? 255 : sDimAlpha);
+            deviceDetails.setOnClickListener(this);
+            deviceDetails.setTag(mCachedDevice);
+            deviceDetails.setAlpha(isEnabled() ? 255 : sDimAlpha);
         } else { // Hide the settings icon and divider
-            mDeviceSettings.setVisibility(View.GONE);
+            deviceDetails.setVisibility(View.GONE);
             View divider = view.findViewById(R.id.divider);
             if (divider != null) {
                 divider.setVisibility(View.GONE);
@@ -152,13 +150,13 @@
     }
 
     public void onClick(View v) {
-        if (v == mDeviceSettings) {
-            if (mOnSettingsClickListener != null) {
-                mOnSettingsClickListener.onClick(v);
-            }
+        // Should never be null by construction
+        if (mOnSettingsClickListener != null) {
+            mOnSettingsClickListener.onClick(v);
         }
     }
 
+    @Override
     public boolean equals(Object o) {
         if ((o == null) || !(o instanceof BluetoothDevicePreference)) {
             return false;
@@ -167,6 +165,7 @@
                 ((BluetoothDevicePreference) o).mCachedDevice);
     }
 
+    @Override
     public int hashCode() {
         return mCachedDevice.hashCode();
     }
@@ -174,8 +173,8 @@
     @Override
     public int compareTo(Preference another) {
         if (!(another instanceof BluetoothDevicePreference)) {
-            // Put other preference types above us
-            return 1;
+            // Rely on default sort
+            return super.compareTo(another);
         }
 
         return mCachedDevice
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index f20ad78..76bf623 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -22,6 +22,7 @@
 import android.bluetooth.BluetoothDevice;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
 import android.util.Log;
 import android.view.Gravity;
@@ -31,6 +32,7 @@
 import android.view.View;
 import android.widget.Switch;
 
+import com.android.settings.ProgressCategory;
 import com.android.settings.R;
 
 /**
@@ -45,10 +47,8 @@
 
     private BluetoothEnabler mBluetoothEnabler;
 
-    /** Initialize the filter to show bonded devices only. */
-    //public BluetoothSettings() {
-    //    super(BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
-    //}
+    private PreferenceGroup mFoundDevicesCategory;
+    private boolean mFoundDevicesCategoryIsPresent;
 
     @Override
     void addPreferencesForActivity() {
@@ -101,9 +101,9 @@
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         boolean bluetoothIsEnabled = mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON;
-        menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.bluetooth_preference_find_nearby_title)
+        menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.bluetooth_scan_nearby_devices)
                 //.setIcon(R.drawable.ic_menu_scan_network)
-                .setEnabled(bluetoothIsEnabled)
+                .setEnabled(bluetoothIsEnabled && !mLocalAdapter.isDiscovering())
                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
         menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.bluetooth_menu_advanced)
                 //.setIcon(android.R.drawable.ic_menu_manage)
@@ -113,13 +113,9 @@
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
-                // TODO
-//                if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON) {
-//                    onAddNetworkPressed();
-//                }
             case MENU_ID_SCAN:
                 if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON) {
-                    mLocalAdapter.startScanning(true);
+                    startScanning();
                 }
                 return true;
             case MENU_ID_ADVANCED:
@@ -137,24 +133,12 @@
         return super.onOptionsItemSelected(item);
     }
 
-    private final View.OnClickListener mListener = new View.OnClickListener() {
-        public void onClick(View v) {
-            // User clicked on advanced options icon for a device in the list
-            if (v.getTag() instanceof CachedBluetoothDevice) {
-                CachedBluetoothDevice device = (CachedBluetoothDevice) v.getTag();
-
-                Preference pref = new Preference(getActivity());
-                pref.setTitle(device.getName());
-                pref.setFragment(DeviceProfilesSettings.class.getName());
-                pref.getExtras().putParcelable(DeviceProfilesSettings.EXTRA_DEVICE,
-                        device.getDevice());
-                ((PreferenceActivity) getActivity()).onPreferenceStartFragment(
-                        BluetoothSettings.this, pref);
-            } else {
-                Log.w(TAG, "onClick() called for other View: " + v);
-            }
+    private void startScanning() {
+        if (!mFoundDevicesCategoryIsPresent) {
+            getPreferenceScreen().addPreference(mFoundDevicesCategory);
         }
-    };
+        mLocalAdapter.startScanning(true);
+    }
 
     @Override
     void onDevicePreferenceClick(BluetoothDevicePreference btPreference) {
@@ -162,12 +146,6 @@
         super.onDevicePreferenceClick(btPreference);
     }
 
-    @Override
-    public void onBluetoothStateChanged(int bluetoothState) {
-        super.onBluetoothStateChanged(bluetoothState);
-        updateContent(bluetoothState);
-    }
-
     private void updateContent(int bluetoothState) {
         final PreferenceScreen preferenceScreen = getPreferenceScreen();
         getActivity().invalidateOptionsMenu();
@@ -176,9 +154,34 @@
         switch (bluetoothState) {
             case BluetoothAdapter.STATE_ON:
                 preferenceScreen.removeAll();
-                // Repopulate (which isn't too bad since it's cached in the settings bluetooth manager)
-                addDevices();
-                mLocalAdapter.startScanning(false);
+
+                // Add bonded devices from cache first
+                setFilter(BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
+                setDeviceListGroup(preferenceScreen);
+                preferenceScreen.setOrderingAsAdded(true);
+
+                addCachedDevices();
+                int numberOfPairedDevices = preferenceScreen.getPreferenceCount();
+
+                // Found devices category
+                mFoundDevicesCategory = new ProgressCategory(getActivity(), null);
+                mFoundDevicesCategory.setTitle(R.string.bluetooth_preference_found_devices);
+                preferenceScreen.addPreference(mFoundDevicesCategory);
+                mFoundDevicesCategoryIsPresent = true;
+
+                // Unbonded found devices from cache
+                setFilter(BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER);
+                setDeviceListGroup(mFoundDevicesCategory);
+                addCachedDevices();
+
+                int numberOfUnpairedDevices = mFoundDevicesCategory.getPreferenceCount();
+                if (numberOfUnpairedDevices == 0) {
+                    preferenceScreen.removePreference(mFoundDevicesCategory);
+                    mFoundDevicesCategoryIsPresent = false;
+                }
+
+                if (numberOfPairedDevices == 0) startScanning();
+
                 return;
 
             case BluetoothAdapter.STATE_TURNING_OFF:
@@ -197,31 +200,63 @@
                 break;
         }
 
+        setDeviceListGroup(preferenceScreen);
         removeAllDevices();
+
         // TODO: from xml, add top padding. Same as in wifi
         Preference emptyListPreference = new Preference(getActivity());
         emptyListPreference.setTitle(messageId);
         preferenceScreen.addPreference(emptyListPreference);
     }
 
-    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
-        if (bondState == BluetoothDevice.BOND_BONDED) {
-            // add to "Paired devices" list after remote-initiated pairing
-            if (mDevicePreferenceMap.get(cachedDevice) == null) {
-                createDevicePreference(cachedDevice);
-            }
-        } else if (bondState == BluetoothDevice.BOND_NONE) {
-            // remove unpaired device from paired devices list
-            onDeviceDeleted(cachedDevice);
-        }
+    @Override
+    public void onBluetoothStateChanged(int bluetoothState) {
+        super.onBluetoothStateChanged(bluetoothState);
+        updateContent(bluetoothState);
     }
 
+    @Override
+    public void onScanningStateChanged(boolean started) {
+        super.onScanningStateChanged(started);
+        // Update 'Scan' option enabled state
+        getActivity().invalidateOptionsMenu();
+    }
+
+    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
+        setDeviceListGroup(getPreferenceScreen());
+        removeAllDevices();
+        updateContent(mLocalAdapter.getBluetoothState());
+    }
+
+    private final View.OnClickListener mDeviceProfilesListener = new View.OnClickListener() {
+        public void onClick(View v) {
+            // User clicked on advanced options icon for a device in the list
+            if (v.getTag() instanceof CachedBluetoothDevice) {
+                CachedBluetoothDevice device = (CachedBluetoothDevice) v.getTag();
+
+                Preference pref = new Preference(getActivity());
+                pref.setTitle(device.getName());
+                pref.setFragment(DeviceProfilesSettings.class.getName());
+                pref.getExtras().putParcelable(DeviceProfilesSettings.EXTRA_DEVICE,
+                        device.getDevice());
+                ((PreferenceActivity) getActivity()).onPreferenceStartFragment(
+                        BluetoothSettings.this, pref);
+            } else {
+                Log.w(TAG, "onClick() called for other View: " + v); // TODO remove
+            }
+        }
+    };
+
     /**
      * Add a listener, which enables the advanced settings icon.
      * @param preference the newly added preference
      */
     @Override
     void initDevicePreference(BluetoothDevicePreference preference) {
-        preference.setOnSettingsClickListener(mListener);
+        CachedBluetoothDevice cachedDevice = preference.getCachedDevice();
+        if (cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
+            // Only paired device have an associated advanced settings screen
+            preference.setOnSettingsClickListener(mDeviceProfilesListener);
+        }
     }
 }
diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
index 409edb9..9783fd7 100644
--- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
+++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
@@ -62,7 +62,7 @@
         mFilter = BluetoothDeviceFilter.ALL_FILTER;
     }
 
-    DeviceListPreferenceFragment(BluetoothDeviceFilter.Filter filter) {
+    final void setFilter(BluetoothDeviceFilter.Filter filter) {
         mFilter = filter;
     }
 
@@ -84,14 +84,10 @@
         addPreferencesForActivity();
 
         mDeviceListGroup = (PreferenceCategory) findPreference(KEY_BT_DEVICE_LIST);
-        if (mDeviceListGroup == null) {
-            // If null, device preferences are added directly to the root of the preference screen
-            mDeviceListGroup = getPreferenceScreen();
-            mDeviceListGroup.setOrderingAsAdded(false);
-        }
-        if (mDeviceListGroup == null) {
-            Log.e(TAG, "Could not find device list preference object!");
-        }
+    }
+
+    void setDeviceListGroup(PreferenceGroup preferenceGroup) {
+        mDeviceListGroup = preferenceGroup;
     }
 
     /** Add preferences from the subclass. */
@@ -121,7 +117,7 @@
         mDeviceListGroup.removeAll();
     }
 
-    void addDevices() {
+    void addCachedDevices() {
         Collection<CachedBluetoothDevice> cachedDevices =
                 mLocalManager.getCachedDeviceManager().getCachedDevicesCopy();
         for (CachedBluetoothDevice cachedDevice : cachedDevices) {
@@ -159,7 +155,7 @@
             return;
         }
 
-        // No update while list shows state message
+        // Prevent updates while the list shows one of the state messages
         if (mLocalAdapter.getBluetoothState() != BluetoothAdapter.STATE_ON) return;
 
         if (mFilter.matches(cachedDevice.getDevice())) {
@@ -199,7 +195,6 @@
         if (mDeviceListGroup instanceof ProgressCategory) {
             ((ProgressCategory) mDeviceListGroup).setProgress(start);
         }
-        // else TODO Add a spinner at the end of the list to show in progress state
     }
 
     public void onBluetoothStateChanged(int bluetoothState) {
diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java
index 3aeb7e2..8b32941 100644
--- a/src/com/android/settings/bluetooth/DevicePickerFragment.java
+++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java
@@ -55,7 +55,7 @@
     @Override
     public void onResume() {
         super.onResume();
-        addDevices();
+        addCachedDevices();
         mLocalAdapter.startScanning(true);
     }
 
diff --git a/src/com/android/settings/vpn2/VpnDialog.java b/src/com/android/settings/vpn2/VpnDialog.java
index b3e417b..92ad362 100644
--- a/src/com/android/settings/vpn2/VpnDialog.java
+++ b/src/com/android/settings/vpn2/VpnDialog.java
@@ -36,15 +36,15 @@
 import android.widget.TextView;
 
 class VpnDialog extends AlertDialog implements TextWatcher, OnItemSelectedListener {
-    private static final String DUMMY = "\r\r\r\r";
+    private static final String DUMMY = "\r";
 
     private static String getDummy(String secret) {
         return secret.isEmpty() ? "" : DUMMY;
     }
 
-    private static String getSecret(TextView dummy) {
-        String secret = dummy.getText().toString();
-        return DUMMY.equals(secret) ? "" : secret;
+    private static String getSecret(String oldSecret, TextView view) {
+        String newSecret = view.getText().toString();
+        return DUMMY.equals(newSecret) ? oldSecret : newSecret;
     }
 
     private final KeyStore mKeyStore = KeyStore.getInstance();
@@ -116,7 +116,7 @@
         mIpsecSecret.setText(getDummy(mProfile.ipsecSecret));
         loadCertificates(mIpsecUserCert, Credentials.USER_CERTIFICATE,
                 0, mProfile.ipsecUserCert);
-        loadCertificates(mIpsecUserCert, Credentials.CA_CERTIFICATE,
+        loadCertificates(mIpsecCaCert, Credentials.CA_CERTIFICATE,
                 R.string.vpn_no_ca_cert, mProfile.ipsecCaCert);
         mSaveLogin.setChecked(mProfile.saveLogin);
 
@@ -186,7 +186,7 @@
         if (parent == mType) {
             changeType(position);
         }
-        getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(validate(false));
+        getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(validate(mEditing));
     }
 
     @Override
@@ -252,24 +252,24 @@
     private void loadCertificates(Spinner spinner, String prefix, int firstId, String selected) {
         Context context = getContext();
         String first = (firstId == 0) ? "" : context.getString(firstId);
-        String[] certs = mKeyStore.saw(prefix);
+        String[] certificates = mKeyStore.saw(prefix);
 
-        if (certs == null || certs.length == 0) {
-            certs = new String[] {first};
+        if (certificates == null || certificates.length == 0) {
+            certificates = new String[] {first};
         } else {
-            String[] array = new String[certs.length + 1];
+            String[] array = new String[certificates.length + 1];
             array[0] = first;
-            System.arraycopy(certs, 0, array, 1, certs.length);
-            certs = array;
+            System.arraycopy(certificates, 0, array, 1, certificates.length);
+            certificates = array;
         }
 
         ArrayAdapter<String> adapter = new ArrayAdapter<String>(
-                context, android.R.layout.simple_spinner_item, certs);
+                context, android.R.layout.simple_spinner_item, certificates);
         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         spinner.setAdapter(adapter);
 
-        for (int i = 1; i < certs.length; ++i) {
-            if (certs[i].equals(selected)) {
+        for (int i = 1; i < certificates.length; ++i) {
+            if (certificates[i].equals(selected)) {
                 spinner.setSelection(i);
                 break;
             }
@@ -287,7 +287,7 @@
         profile.type = mType.getSelectedItemPosition();
         profile.server = mServer.getText().toString().trim();
         profile.username = mUsername.getText().toString();
-        profile.password = getSecret(mPassword);
+        profile.password = getSecret(mProfile.password, mPassword);
         profile.domains = mDomains.getText().toString().trim();
         profile.routes = mRoutes.getText().toString().trim();
 
@@ -298,14 +298,14 @@
                 break;
 
             case VpnProfile.TYPE_L2TP_IPSEC_PSK:
-                profile.l2tpSecret = getSecret(mL2tpSecret);
+                profile.l2tpSecret = getSecret(mProfile.l2tpSecret, mL2tpSecret);
                 // fall through
             case VpnProfile.TYPE_IPSEC_XAUTH_PSK:
-                profile.ipsecSecret = getSecret(mIpsecSecret);
+                profile.ipsecSecret = getSecret(mProfile.ipsecSecret, mIpsecSecret);
                 break;
 
             case VpnProfile.TYPE_L2TP_IPSEC_RSA:
-                profile.l2tpSecret = getSecret(mL2tpSecret);
+                profile.l2tpSecret = getSecret(mProfile.l2tpSecret, mL2tpSecret);
                 // fall through
             case VpnProfile.TYPE_IPSEC_XAUTH_RSA:
                 if (mIpsecCaCert.getSelectedItemPosition() != 0) {
diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java
index 6662dd9..56fb983 100644
--- a/src/com/android/settings/vpn2/VpnSettings.java
+++ b/src/com/android/settings/vpn2/VpnSettings.java
@@ -20,9 +20,11 @@
 
 import android.content.Context;
 import android.content.DialogInterface;
+import android.net.IConnectivityManager;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.os.ServiceManager;
 import android.preference.Preference;
 import android.preference.PreferenceGroup;
 import android.security.Credentials;
@@ -57,8 +59,11 @@
 
     private HashMap<String, VpnPreference> mPreferences;
     private VpnDialog mDialog;
+
+    private Handler mUpdater;
+
+    // The key of the profile for the current ContextMenu.
     private String mSelectedKey;
-    private Handler mHandler;
 
     @Override
     public void onCreate(Bundle savedState) {
@@ -145,10 +150,10 @@
         }
 
         // Start monitoring.
-        if (mHandler == null) {
-            mHandler = new Handler(this);
+        if (mUpdater == null) {
+            mUpdater = new Handler(this);
         }
-        mHandler.sendEmptyMessage(0);
+        mUpdater.sendEmptyMessage(0);
 
         // Register for context menu. Hmmm, getListView() is hidden?
         registerForContextMenu(getListView());
@@ -194,7 +199,7 @@
 
             // If we are not editing, connect!
             if (!mDialog.isEditing()) {
-                connect(profile.key);
+                connect(profile);
             }
         }
     }
@@ -274,19 +279,74 @@
 
     @Override
     public boolean handleMessage(Message message) {
-        mHandler.removeMessages(0);
+        mUpdater.removeMessages(0);
 
         if (isResumed()) {
 
 
 
 
-            mHandler.sendEmptyMessageDelayed(0, 1000);
+            mUpdater.sendEmptyMessageDelayed(0, 1000);
         }
         return true;
     }
 
-    private void connect(String key) {
+    private static IConnectivityManager getService() {
+        return IConnectivityManager.Stub.asInterface(
+                ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
+    }
+
+    private void connect(VpnProfile profile) {
+        String[] racoon = null;
+        switch (profile.type) {
+            case VpnProfile.TYPE_L2TP_IPSEC_PSK:
+                racoon = new String[] {
+                    profile.server, "1701", profile.ipsecSecret,
+                };
+                break;
+            case VpnProfile.TYPE_L2TP_IPSEC_RSA:
+                racoon = new String[] {
+                    profile.server, "1701",
+                    Credentials.USER_PRIVATE_KEY + profile.ipsecUserCert,
+                    Credentials.USER_CERTIFICATE + profile.ipsecUserCert,
+                    Credentials.CA_CERTIFICATE + profile.ipsecCaCert,
+                };
+                break;
+            case VpnProfile.TYPE_IPSEC_XAUTH_PSK:
+                break;
+            case VpnProfile.TYPE_IPSEC_XAUTH_RSA:
+                break;
+            case VpnProfile.TYPE_IPSEC_HYBRID_RSA:
+                break;
+        }
+
+        String[] mtpd = null;
+        switch (profile.type) {
+            case VpnProfile.TYPE_PPTP:
+                mtpd = new String[] {
+                    "pptp", profile.server, "1723",
+                    "name", profile.username, "password", profile.password,
+                    "linkname", "vpn", "refuse-eap", "nodefaultroute",
+                    "usepeerdns", "idle", "1800", "mtu", "1400", "mru", "1400",
+                    (profile.mppe ? "+mppe" : "nomppe"),
+                };
+                break;
+            case VpnProfile.TYPE_L2TP_IPSEC_PSK:
+            case VpnProfile.TYPE_L2TP_IPSEC_RSA:
+                mtpd = new String[] {
+                    "l2tp", profile.server, "1701", profile.l2tpSecret,
+                    "name", profile.username, "password", profile.password,
+                    "linkname", "vpn", "refuse-eap", "nodefaultroute",
+                    "usepeerdns", "idle", "1800", "mtu", "1400", "mru", "1400",
+                };
+                break;
+        }
+
+        try {
+//            getService().doLegacyVpn(racoon, mtpd);
+        } catch (Exception e) {
+            Log.e(TAG, "connect", e);
+        }
     }
 
     private void disconnect(String key) {
@@ -331,7 +391,7 @@
 
         @Override
         public int compareTo(Preference preference) {
-            int result = 1;
+            int result = -1;
             if (preference instanceof VpnPreference) {
                 VpnPreference another = (VpnPreference) preference;
 
