diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index a7fa19c..e2c09cf 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -383,11 +383,17 @@
 
     /* package */ void populateBookmarkItem(BookmarkItem b, int position) {
         mCursor.moveToPosition(position - mExtraOffset);
-        b.setUrl(mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
+        String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
+        b.setUrl(url);
         b.setName(mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
         byte[] data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
-        Bitmap bitmap = (null == data) ? null :
-                BitmapFactory.decodeByteArray(data, 0, data.length);
+        Bitmap bitmap = null;
+        if (data == null) {
+            bitmap = CombinedBookmarkHistoryActivity.getIconListenerSet()
+                    .getFavicon(url);
+        } else {
+            bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
+        }
         b.setFavicon(bitmap);
     }
 
@@ -544,7 +550,8 @@
         if (data != null) {
             b.setFavicon(BitmapFactory.decodeByteArray(data, 0, data.length));
         } else {
-            b.setFavicon(null);
+            b.setFavicon(CombinedBookmarkHistoryActivity.getIconListenerSet()
+                    .getFavicon(url));
         }
     }
 
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index c130a79..d364c9c 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -25,6 +25,7 @@
 import android.database.Cursor;
 import android.database.DataSetObserver;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.ServiceManager;
@@ -131,7 +132,7 @@
         }
         mDisableNewWindow = getIntent().getBooleanExtra("disable_new_window",
                 false);
-        CombinedBookmarkHistoryActivity.getIconListenerSet(getContentResolver())
+        CombinedBookmarkHistoryActivity.getIconListenerSet()
                 .addListener(mIconReceiver);
         
         // initialize the result to canceled, so that if the user just presses
@@ -142,7 +143,7 @@
     @Override
     protected void onDestroy() {
         super.onDestroy();
-        CombinedBookmarkHistoryActivity.getIconListenerSet(getContentResolver())
+        CombinedBookmarkHistoryActivity.getIconListenerSet()
                 .removeListener(mIconReceiver);
     }
 
@@ -424,8 +425,14 @@
             item.setName(mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
             String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
             item.setUrl(url);
-            item.setFavicon(CombinedBookmarkHistoryActivity.getIconListenerSet(
-                    getContentResolver()).getFavicon(url));
+            byte[] data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
+            if (data != null) {
+                item.setFavicon(BitmapFactory.decodeByteArray(data, 0,
+                        data.length));
+            } else {
+                item.setFavicon(CombinedBookmarkHistoryActivity
+                        .getIconListenerSet().getFavicon(url));
+            }
             item.setIsBookmark(1 ==
                     mCursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX));
             return item;
diff --git a/src/com/android/browser/CombinedBookmarkHistoryActivity.java b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
index 816731a..25bc0e2 100644
--- a/src/com/android/browser/CombinedBookmarkHistoryActivity.java
+++ b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
@@ -67,10 +67,9 @@
         }
     }
     private static IconListenerSet sIconListenerSet;
-    static IconListenerSet getIconListenerSet(ContentResolver cr) {
+    static IconListenerSet getIconListenerSet() {
         if (null == sIconListenerSet) {
             sIconListenerSet = new IconListenerSet();
-            Browser.requestAllIcons(cr, null, sIconListenerSet);
         }
         return sIconListenerSet;
     }
@@ -84,7 +83,10 @@
 
         Bundle extras = getIntent().getExtras();
 
-        getIconListenerSet(getContentResolver());
+        getIconListenerSet();
+        // Do this every time we create a new activity so that we get the
+        // newest icons.
+        Browser.requestAllIcons(getContentResolver(), null, sIconListenerSet);
 
         Intent bookmarksIntent = new Intent(this, BrowserBookmarksPage.class);
         bookmarksIntent.putExtras(extras);
diff --git a/src/com/android/browser/MostVisitedActivity.java b/src/com/android/browser/MostVisitedActivity.java
index 65cb89f..d03c7a3 100644
--- a/src/com/android/browser/MostVisitedActivity.java
+++ b/src/com/android/browser/MostVisitedActivity.java
@@ -23,6 +23,7 @@
 import android.database.Cursor;
 import android.database.DataSetObserver;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.os.Bundle;
 import android.os.Handler;
 import android.provider.Browser;
@@ -50,7 +51,7 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mAdapter = new MyAdapter();
-        CombinedBookmarkHistoryActivity.getIconListenerSet(getContentResolver())
+        CombinedBookmarkHistoryActivity.getIconListenerSet()
                 .addListener(mIconReceiver);
         setListAdapter(mAdapter);
         ListView list = getListView();
@@ -63,7 +64,7 @@
     @Override
     protected void onDestroy() {
         super.onDestroy();
-        CombinedBookmarkHistoryActivity.getIconListenerSet(getContentResolver())
+        CombinedBookmarkHistoryActivity.getIconListenerSet()
                .removeListener(mIconReceiver);
     }
 
@@ -97,13 +98,15 @@
         private static final int mUrlIndex = 0;
         private static final int mTitleIndex = 1;
         private static final int mBookmarkIndex = 2;
+        private static final int mFaviconIndex = 3;
 
         MyAdapter() {
             mObservers = new Vector<DataSetObserver>();
             String[] projection = new String[] {
                     Browser.BookmarkColumns.URL,
                     Browser.BookmarkColumns.TITLE,
-                    Browser.BookmarkColumns.BOOKMARK };
+                    Browser.BookmarkColumns.BOOKMARK,
+                    Browser.BookmarkColumns.FAVICON };
             String whereClause = Browser.BookmarkColumns.VISITS + " != 0";
             String orderBy = Browser.BookmarkColumns.VISITS + " DESC";
             mCursor = managedQuery(Browser.BOOKMARKS_URI, projection,
@@ -145,8 +148,14 @@
             item.setName(mCursor.getString(mTitleIndex));
             String url = mCursor.getString(mUrlIndex);
             item.setUrl(url);
-            item.setFavicon(CombinedBookmarkHistoryActivity.getIconListenerSet(
-                    getContentResolver()).getFavicon(url));
+            byte[] data = mCursor.getBlob(mFaviconIndex);
+            if (data != null) {
+                item.setFavicon(BitmapFactory.decodeByteArray(data, 0,
+                        data.length));
+            } else {
+                item.setFavicon(CombinedBookmarkHistoryActivity
+                        .getIconListenerSet().getFavicon(url));
+            }
             item.setIsBookmark(1 == mCursor.getInt(mBookmarkIndex));
             return item;
         }
