diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 02d9199..40bc16e 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -645,9 +645,9 @@
     }
 
     private void setStatusBarVisibility(boolean visible) {
-        int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
-        mActivity.getWindow().setFlags(flag,
-                WindowManager.LayoutParams.FLAG_FULLSCREEN);
+        WindowManager.LayoutParams params = mActivity.getWindow().getAttributes();
+        params.systemUiVisibility = visible ? View.STATUS_BAR_VISIBLE : View.STATUS_BAR_HIDDEN;
+        mActivity.getWindow().setAttributes(params);
     }
 
     // -------------------------------------------------------------------------
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);
+            }
+        }
+    }
 }
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index 6caacdc..ff06118 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -308,15 +308,15 @@
 
     @Override
     public void onDismiss() {
-        WebView top = mUiController.getCurrentTopWebView();
-        if (top != null) {
-            mUiController.getCurrentTopWebView().requestFocus();
+        Tab currentTab = mUi.getActiveTab();
+        if (currentTab != null && currentTab.getWebView() != null) {
+            currentTab.getWebView().requestFocus();
         }
         mUi.hideFakeTitleBar();
         setUrlMode(false);
         // if top != null current must be set
-        if ((top != null) && !mInVoiceMode) {
-            setDisplayTitle(mUiController.getCurrentWebView().getUrl());
+        if ((currentTab != null) && !mInVoiceMode) {
+            setDisplayTitle(currentTab.getUrl());
         }
     }
 
diff --git a/src/com/android/browser/widget/BookmarkThumbnailWidgetService.java b/src/com/android/browser/widget/BookmarkThumbnailWidgetService.java
index 51ba2ca..1c7856f 100644
--- a/src/com/android/browser/widget/BookmarkThumbnailWidgetService.java
+++ b/src/com/android/browser/widget/BookmarkThumbnailWidgetService.java
@@ -75,14 +75,16 @@
     private static final int BOOKMARK_INDEX_TOUCH_ICON = 5;
     private static final int BOOKMARK_INDEX_THUMBNAIL = 7;
 
-    private Map<Integer, BookmarkFactory> mFactories;
+    // The service will likely be destroyed at any time, so we need to keep references to the
+    // factories across services connections.
+    private static final Map<Integer, BookmarkFactory> mFactories =
+            new HashMap<Integer, BookmarkFactory>();
     private Handler mUiHandler;
     private BookmarksObserver mBookmarksObserver;
 
     @Override
     public void onCreate() {
         super.onCreate();
-        mFactories = new HashMap<Integer, BookmarkFactory>();
         mUiHandler = new Handler();
         mBookmarksObserver = new BookmarksObserver(mUiHandler);
         getContentResolver().registerContentObserver(
@@ -109,6 +111,12 @@
             BookmarkFactory fac = mFactories.get(widgetId);
             if (fac != null && folderId >= 0) {
                 fac.changeFolder(folderId);
+            } else {
+                // This a workaround to the issue when the Browser process crashes, after which
+                // mFactories is not populated (due to onBind() not being called).  Calling
+                // notifyDataSetChanged() will trigger a connection to be made.
+                AppWidgetManager.getInstance(getApplicationContext())
+                    .notifyAppWidgetViewDataChanged(widgetId, R.id.bookmarks_list);
             }
         }
         return START_STICKY;
