diff --git a/src/com/android/browser/BookmarksLoader.java b/src/com/android/browser/BookmarksLoader.java
index e2f8941..7722392 100644
--- a/src/com/android/browser/BookmarksLoader.java
+++ b/src/com/android/browser/BookmarksLoader.java
@@ -21,7 +21,6 @@
 import android.net.Uri;
 import android.provider.BrowserContract.Bookmarks;
 import android.provider.BrowserContract.ChromeSyncColumns;
-import android.text.TextUtils;
 
 public class BookmarksLoader extends CursorLoader {
     public static final String ARG_ACCOUNT_TYPE = "acct_type";
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index fa7a5e2..f20583a 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -25,11 +25,11 @@
 import android.content.ClipboardManager;
 import android.content.ContentUris;
 import android.content.Context;
-import android.content.CursorLoader;
 import android.content.Intent;
 import android.content.Loader;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.database.Cursor;
@@ -40,9 +40,7 @@
 import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.provider.BrowserContract;
-import android.provider.BrowserContract.Accounts;
 import android.provider.BrowserContract.ChromeSyncColumns;
-import android.text.TextUtils;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.LayoutInflater;
@@ -52,10 +50,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.webkit.WebIconDatabase.IconListener;
-import android.widget.Adapter;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemSelectedListener;
 import android.widget.GridView;
 import android.widget.ListView;
 import android.widget.PopupMenu.OnMenuItemClickListener;
@@ -74,12 +70,11 @@
  */
 public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
         LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener,
-        OnItemSelectedListener, BreadCrumbView.Controller, OnMenuItemClickListener {
+        BreadCrumbView.Controller, OnMenuItemClickListener, OnSharedPreferenceChangeListener {
 
     static final String LOGTAG = "browser";
 
     static final int LOADER_BOOKMARKS = 1;
-    static final int LOADER_ACCOUNTS_THEN_BOOKMARKS = 2;
 
     static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
 
@@ -88,7 +83,6 @@
     public static final String PREF_ACCOUNT_TYPE = "acct_type";
     public static final String PREF_ACCOUNT_NAME = "acct_name";
 
-    static final String DEFAULT_ACCOUNT = "local";
     static final int VIEW_THUMBNAILS = 1;
     static final int VIEW_LIST = 2;
     static final String PREF_SELECTED_VIEW = "bookmarks_view";
@@ -124,13 +118,12 @@
     public Loader<Cursor> onCreateLoader(int id, Bundle args) {
         switch (id) {
             case LOADER_BOOKMARKS: {
-                String accountType = null;
-                String accountName = null;
-                if (args != null) {
-                    accountType = args.getString(BookmarksLoader.ARG_ACCOUNT_TYPE);
-                    accountName = args.getString(BookmarksLoader.ARG_ACCOUNT_NAME);
-                }
-                BookmarksLoader bl = new BookmarksLoader(getActivity(), accountType, accountName);
+                SharedPreferences prefs = PreferenceManager
+                        .getDefaultSharedPreferences(getActivity());
+                String accountType = prefs.getString(PREF_ACCOUNT_TYPE, null);
+                String accountName = prefs.getString(PREF_ACCOUNT_NAME, null);
+                BookmarksLoader bl = new BookmarksLoader(getActivity(),
+                        accountType, accountName);
                 if (mCrumbs != null) {
                     Uri uri = (Uri) mCrumbs.getTopData();
                     if (uri != null) {
@@ -139,11 +132,6 @@
                 }
                 return bl;
             }
-            case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
-                return new CursorLoader(getActivity(), Accounts.CONTENT_URI,
-                        new String[] { Accounts.ACCOUNT_TYPE, Accounts.ACCOUNT_NAME }, null, null,
-                        null);
-            }
         }
         throw new UnsupportedOperationException("Unknown loader id " + id);
     }
@@ -166,77 +154,12 @@
                 mAdapter.changeCursor(cursor);
                 break;
             }
-
-            case LOADER_ACCOUNTS_THEN_BOOKMARKS: {
-                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
-                        getActivity());
-                String storedAccountType = prefs.getString(PREF_ACCOUNT_TYPE, null);
-                String storedAccountName = prefs.getString(PREF_ACCOUNT_NAME, null);
-                String accountType =
-                        TextUtils.isEmpty(storedAccountType) ? DEFAULT_ACCOUNT : storedAccountType;
-                String accountName =
-                        TextUtils.isEmpty(storedAccountName) ? DEFAULT_ACCOUNT : storedAccountName;
-
-                Bundle args = null;
-                if (cursor == null || !cursor.moveToFirst()) {
-                    // No accounts, set the prefs to the default
-                    accountType = DEFAULT_ACCOUNT;
-                    accountName = DEFAULT_ACCOUNT;
-                } else {
-                    int accountPosition = -1;
-
-                    if (!DEFAULT_ACCOUNT.equals(accountType) &&
-                            !DEFAULT_ACCOUNT.equals(accountName)) {
-                        // Check to see if the account in prefs still exists
-                        cursor.moveToFirst();
-                        do {
-                            if (accountType.equals(cursor.getString(0))
-                                    && accountName.equals(cursor.getString(1))) {
-                                accountPosition = cursor.getPosition();
-                                break;
-                            }
-                        } while (cursor.moveToNext());
-                    }
-
-                    if (accountPosition == -1) {
-                        if (!(DEFAULT_ACCOUNT.equals(accountType)
-                                && DEFAULT_ACCOUNT.equals(accountName))) {
-                            // No account is set in prefs and there is at least one,
-                            // so pick the first one as the default
-                            cursor.moveToFirst();
-                            accountType = cursor.getString(0);
-                            accountName = cursor.getString(1);
-                        }
-                    }
-
-                    args = new Bundle();
-                    args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
-                    args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
-                }
-
-                // The stored account name wasn't found, update the stored account with a valid one
-                if (!accountType.equals(storedAccountType)
-                        || !accountName.equals(storedAccountName)) {
-                    prefs.edit()
-                            .putString(PREF_ACCOUNT_TYPE, accountType)
-                            .putString(PREF_ACCOUNT_NAME, accountName)
-                            .apply();
-                }
-                getLoaderManager().initLoader(LOADER_BOOKMARKS, args, this);
-
-                break;
-            }
         }
     }
 
+    @Override
     public void onLoaderReset(Loader<Cursor> loader) {
         onLoadFinished(loader, null);
-        switch (loader.getId()) {
-            case LOADER_BOOKMARKS: {
-                onLoadFinished(loader, null);
-                break;
-            }
-        }
     }
 
     long getFolderId() {
@@ -443,28 +366,15 @@
         if (mCallbacks != null) {
             mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
         }
-
         // Start the loaders
         LoaderManager lm = getLoaderManager();
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+        SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(getActivity());
+        prefs.registerOnSharedPreferenceChangeListener(this);
         mCurrentView =
             prefs.getInt(PREF_SELECTED_VIEW, BrowserBookmarksPage.VIEW_THUMBNAILS);
         mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView);
-        String accountType = prefs.getString(PREF_ACCOUNT_TYPE, DEFAULT_ACCOUNT);
-        String accountName = prefs.getString(PREF_ACCOUNT_NAME, DEFAULT_ACCOUNT);
-        if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
-            // There is an account set, load up that one
-            Bundle args = null;
-            if (!DEFAULT_ACCOUNT.equals(accountType) && !DEFAULT_ACCOUNT.equals(accountName)) {
-                args = new Bundle();
-                args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
-                args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
-            }
-            lm.restartLoader(LOADER_BOOKMARKS, args, this);
-        } else {
-            // No account set, load the account list first
-            lm.restartLoader(LOADER_ACCOUNTS_THEN_BOOKMARKS, null, this);
-        }
+        lm.restartLoader(LOADER_BOOKMARKS, null, this);
 
         // Add our own listener in case there are favicons that have yet to be loaded.
         CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
@@ -475,6 +385,9 @@
     @Override
     public void onDestroyView() {
         super.onDestroyView();
+        SharedPreferences prefs = PreferenceManager
+                .getDefaultSharedPreferences(getActivity());
+        prefs.unregisterOnSharedPreferenceChangeListener(this);
         if (mHeaderContainer != null) {
             mHeaderContainer.removeView(mHeader);
         }
@@ -518,36 +431,6 @@
         }
     }
 
-    @Override
-    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        Adapter adapter = parent.getAdapter();
-        String accountType = "com.google";
-        String accountName = adapter.getItem(position).toString();
-
-        Bundle args = null;
-        if (ACCOUNT_NAME_UNSYNCED.equals(accountName)) {
-            accountType = DEFAULT_ACCOUNT;
-            accountName = DEFAULT_ACCOUNT;
-        } else {
-            args = new Bundle();
-            args.putString(BookmarksLoader.ARG_ACCOUNT_TYPE, accountType);
-            args.putString(BookmarksLoader.ARG_ACCOUNT_NAME, accountName);
-        }
-
-        // Remember the selection for later
-        PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
-                .putString(PREF_ACCOUNT_TYPE, accountType)
-                .putString(PREF_ACCOUNT_NAME, accountName)
-                .apply();
-
-        getLoaderManager().restartLoader(LOADER_BOOKMARKS, args, this);
-    }
-
-    @Override
-    public void onNothingSelected(AdapterView<?> parent) {
-        // Do nothing
-    }
-
     /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
         String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
         String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
@@ -842,4 +725,21 @@
             mCrumbs.setMaxVisible(mCrumbMaxVisible);
         }
     }
+
+    @Override
+    public void onSharedPreferenceChanged(
+            SharedPreferences sharedPreferences, String key) {
+        if (PREF_ACCOUNT_NAME.equals(key) || PREF_ACCOUNT_TYPE.equals(key)) {
+            mCrumbs.setController(null);
+            mCrumbs.clear();
+            LoaderManager lm = getLoaderManager();
+            lm.restartLoader(LOADER_BOOKMARKS, null, this);
+            mCrumbs.setController(this);
+            String name = getString(R.string.bookmarks);
+            mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
+            if (mCallbacks != null) {
+                mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
+            }
+        }
+    }
 }
