diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index b39cb43..b9ccd72 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -349,7 +349,6 @@
             // Request focus on the top window.
             mTabBar.onSetActiveTab(tab);
         }
-        bookmarkedStatusHasChanged(tab);
         resetTitleIconAndProgress(tab);
         updateLockIconToLatest(tab);
         tab.getTopWindow().requestFocus();
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index a2caf90..e433e29 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -33,6 +33,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.res.Configuration;
+import android.database.ContentObserver;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteException;
@@ -191,6 +192,9 @@
     private boolean mLoadStopped;
 
     private Handler mHandler;
+    // Checks to see when the bookmarks database has changed, and updates the
+    // Tabs' notion of whether they represent bookmarked sites.
+    private ContentObserver mBookmarksObserver;
 
     private static class ClearThumbnails extends AsyncTask<File, Void, Void> {
         @Override
@@ -221,6 +225,18 @@
         mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser");
 
         startHandler();
+        mBookmarksObserver = new ContentObserver(mHandler) {
+            @Override
+            public void onChange(boolean selfChange) {
+                int size = mTabControl.getTabCount();
+                for (int i = 0; i < size; i++) {
+                    mTabControl.getTab(i).updateBookmarkedStatus();
+                }
+            }
+
+        };
+        browser.getContentResolver().registerContentObserver(
+                BrowserContract.Bookmarks.CONTENT_URI, true, mBookmarksObserver);
 
         mNetworkHandler = new NetworkStateHandler(mActivity, this);
         // Start watching the default geolocation permissions
@@ -668,6 +684,7 @@
             dismissSubWindow(t);
             removeTab(t);
         }
+        mActivity.getContentResolver().unregisterContentObserver(mBookmarksObserver);
         // Destroy all the tabs
         mTabControl.destroy();
         WebIconDatabase.getInstance().close();
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 3e79edb..5b536f8 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -503,39 +503,7 @@
             // finally update the UI in the activity if it is in the foreground
             mWebViewController.onPageStarted(Tab.this, view, url, favicon);
 
-            final String urlInQuestion = url;
-            if (mBookmarkAsyncTask != null) {
-                mBookmarkAsyncTask.cancel(true);
-            }
-            mBookmarkAsyncTask = new AsyncTask<Void, Void, Boolean>() {
-                @Override
-                protected Boolean doInBackground(Void... unused) {
-                    // Check to see if the site is bookmarked
-                    Cursor cursor = null;
-                    try {
-                        cursor = mActivity.getContentResolver().query(
-                                BrowserContract.Bookmarks.CONTENT_URI,
-                                new String[] { BrowserContract.Bookmarks.URL },
-                                BrowserContract.Bookmarks.URL + " == ?",
-                                new String[] { urlInQuestion },
-                                null);
-                        return cursor.moveToFirst();
-                    } catch (SQLiteException e) {
-                        Log.e(LOGTAG, "Error checking for bookmark: " + e);
-                        return false;
-                    } finally {
-                        if (cursor != null) cursor.close();
-                    }
-                }
-                @Override
-                protected void onPostExecute(Boolean isBookmarked) {
-                    if (this == mBookmarkAsyncTask) {
-                        mIsBookmarkedSite = isBookmarked;
-                        mWebViewController.bookmarkedStatusHasChanged(Tab.this);
-                    }
-                }
-            };
-            mBookmarkAsyncTask.execute();
+            updateBookmarkedStatusForUrl(url);
         }
 
         @Override
@@ -1450,6 +1418,7 @@
         if (mQueuedErrors != null && mQueuedErrors.size() >  0) {
             showError(mQueuedErrors.getFirst());
         }
+        mWebViewController.bookmarkedStatusHasChanged(this);
     }
 
     void putInBackground() {
@@ -1827,4 +1796,55 @@
         return true;
     }
 
+    public void updateBookmarkedStatus() {
+        if (mMainView == null) {
+            return;
+        }
+        String url = mMainView.getUrl();
+        if (url == null) {
+            return;
+        }
+        updateBookmarkedStatusForUrl(url);
+    }
+
+    /**
+     * Update mIsBookmarkedSite, using urlInQuestion to compare.
+     * @param urlInQuestion URL of the current page, to be checked in the
+     *          bookmarks database.
+     */
+    private void updateBookmarkedStatusForUrl(final String urlInQuestion) {
+        if (mBookmarkAsyncTask != null) {
+            mBookmarkAsyncTask.cancel(true);
+        }
+        mBookmarkAsyncTask = new AsyncTask<Void, Void, Boolean>() {
+            @Override
+            protected Boolean doInBackground(Void... unused) {
+                // Check to see if the site is bookmarked
+                Cursor cursor = null;
+                try {
+                    cursor = mActivity.getContentResolver().query(
+                            BrowserContract.Bookmarks.CONTENT_URI,
+                            new String[] { BrowserContract.Bookmarks.URL },
+                            BrowserContract.Bookmarks.URL + " == ?",
+                            new String[] { urlInQuestion },
+                            null);
+                    return cursor.moveToFirst();
+                } catch (SQLiteException e) {
+                    Log.e(LOGTAG, "Error checking for bookmark: " + e);
+                    return false;
+                } finally {
+                    if (cursor != null) cursor.close();
+                }
+            }
+            @Override
+            protected void onPostExecute(Boolean isBookmarked) {
+                if (this == mBookmarkAsyncTask) {
+                    mIsBookmarkedSite = isBookmarked;
+                    mWebViewController.bookmarkedStatusHasChanged(Tab.this);
+                }
+            }
+        };
+        mBookmarkAsyncTask.execute();
+    }
+
 }
