diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 3393c4f..0d3bc48 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -22,39 +22,28 @@
 import com.android.browser.search.SearchEngines;
 
 import android.app.ActivityManager;
-import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.content.pm.ActivityInfo;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
-import android.database.ContentObserver;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.AsyncTask;
-import android.os.Handler;
 import android.os.Message;
-import android.preference.PreferenceActivity;
 import android.preference.PreferenceManager;
-import android.preference.PreferenceScreen;
 import android.provider.Browser;
-import android.provider.Settings;
 import android.util.Log;
 import android.webkit.CookieManager;
 import android.webkit.GeolocationPermissions;
-import android.webkit.ValueCallback;
-import android.webkit.WebView;
-import android.webkit.WebViewDatabase;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
 import android.webkit.WebSettings.AutoFillProfile;
 import android.webkit.WebStorage;
-import android.widget.Toast;
+import android.webkit.WebView;
+import android.webkit.WebViewDatabase;
 
 import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
 import java.util.Observable;
 
 /*
@@ -635,6 +624,14 @@
         autoLoginAccount = name;
     }
 
+    public void setAutoLoginEnabled(Context context, boolean enable) {
+        Editor ed = PreferenceManager.
+                getDefaultSharedPreferences(context).edit();
+        ed.putBoolean(PREF_AUTOLOGIN, enable);
+        ed.apply();
+        autoLoginEnabled = enable;
+    }
+
     public void setAutoFillProfile(Context ctx, AutoFillProfile profile, Message msg) {
         if (profile != null) {
             setActiveAutoFillProfileId(ctx, profile.getUniqueId());
diff --git a/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java b/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java
index 20d4f42..c0cf3cf 100644
--- a/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java
+++ b/src/com/android/browser/preferences/PrivacySecurityPreferencesFragment.java
@@ -22,12 +22,9 @@
 
 import android.accounts.Account;
 import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
 import android.content.Intent;
 import android.os.Bundle;
-import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 
@@ -47,19 +44,40 @@
 
         Preference e = findPreference(BrowserSettings.PREF_CLEAR_HISTORY);
         e.setOnPreferenceChangeListener(this);
-        e = findPreference(BrowserSettings.PREF_AUTOLOGIN);
-        e.setOnPreferenceChangeListener(this);
-        updateAutoLoginSummary((CheckBoxPreference) e);
+        setupAutoLoginPreference();
     }
 
-    private void updateAutoLoginSummary(CheckBoxPreference pref) {
-        String account = mSettings.getAutoLoginAccount(getActivity());
-        if (account == null) {
-            pref.setChecked(false);
-            pref.setEnabled(false);
-            pref.setSummary(R.string.pref_autologin_no_account);
+    void setupAutoLoginPreference() {
+        ListPreference autologinPref = (ListPreference) findPreference(
+                BrowserSettings.PREF_AUTOLOGIN_ACCOUNT);
+        autologinPref.setOnPreferenceChangeListener(this);
+        updateAutoLoginSummary(autologinPref);
+        Account[] accounts = GoogleAccountLogin.getAccounts(getActivity());
+        // +1 for disable
+        CharSequence[] names = new CharSequence[accounts.length + 1];
+        CharSequence[] values = new CharSequence[names.length];
+        int i = 0;
+        int defaultAccount = 0;
+        for (Account a : accounts) {
+            values[i] = names[i] = a.name;
+            i++;
+        }
+        names[i] = getResources().getString(R.string.pref_autologin_disable);
+        values[i] = "";
+        autologinPref.setEntries(names);
+        autologinPref.setEntryValues(values);
+    }
+
+    private void updateAutoLoginSummary(Preference pref) {
+        if (!mSettings.isAutoLoginEnabled()) {
+            pref.setSummary(R.string.pref_autologin_disable);
         } else {
-            pref.setSummary(getString(R.string.pref_autologin_summary, account));
+            String account = mSettings.getAutoLoginAccount(getActivity());
+            if (account == null) {
+                pref.setSummary(R.string.pref_autologin_no_account);
+            } else {
+                pref.setSummary(getString(R.string.pref_autologin_summary, account));
+            }
         }
     }
 
@@ -72,68 +90,20 @@
             getActivity().setResult(Activity.RESULT_OK, (new Intent()).putExtra(Intent.EXTRA_TEXT,
                     pref.getKey()));
             return true;
-        } else if (pref.getKey().equals(BrowserSettings.PREF_AUTOLOGIN)) {
-            boolean val = ((Boolean) objValue).booleanValue();
-            if (val) {
-                selectAccount((CheckBoxPreference) pref);
-                return false;
+        } else if (pref.getKey().equals(BrowserSettings.PREF_AUTOLOGIN_ACCOUNT)) {
+            String account = (String) objValue;
+            if (account.length() == 0) {
+                // Disable
+                mSettings.setAutoLoginEnabled(getActivity(), false);
+            } else {
+                mSettings.setAutoLoginEnabled(getActivity(), true);
             }
+            mSettings.setAutoLoginAccount(getActivity(), account);
+            updateAutoLoginSummary(pref);
             return true;
         }
 
         return false;
     }
 
-    class AccountCallback implements OnClickListener {
-        private final Account[] mAccounts;
-        private final CheckBoxPreference mPref;
-
-        public AccountCallback(Account[] accounts, CheckBoxPreference pref) {
-            mAccounts = accounts;
-            mPref = pref;
-        }
-
-        public void onClick(DialogInterface d, int which) {
-            saveAutoLoginAccount(mPref, mAccounts[which].name);
-            d.dismiss();
-        }
-    }
-
-    private void saveAutoLoginAccount(CheckBoxPreference pref, String name) {
-        mSettings.setAutoLoginAccount(getActivity(), name);
-        pref.setChecked(true);
-        updateAutoLoginSummary(pref);
-    }
-
-    private void selectAccount(CheckBoxPreference pref) {
-        Account[] accounts = GoogleAccountLogin.getAccounts(getActivity());
-        if (accounts.length == 0) {
-            mSettings.setAutoLoginAccount(getActivity(), null);
-            updateAutoLoginSummary(pref);
-            return;
-        } else if (accounts.length == 1) {
-            // No need for a dialog with one account.
-            saveAutoLoginAccount(pref, accounts[0].name);
-            return;
-        }
-
-        String account = mSettings.getAutoLoginAccount(getActivity());
-        CharSequence[] names = new CharSequence[accounts.length];
-        int i = 0;
-        int defaultAccount = 0;
-        for (Account a : accounts) {
-            if (a.name.equals(account)) {
-                defaultAccount = i;
-            }
-            names[i++] = a.name;
-        }
-
-        AccountCallback callback =
-                new AccountCallback(accounts, pref);
-        new AlertDialog.Builder(getActivity())
-                .setTitle(R.string.pref_autologin_title)
-                .setSingleChoiceItems(names, defaultAccount, callback)
-                .setCancelable(true)
-                .show();
-    }
 }
