diff --git a/src/com/android/browser/ActiveTabsPage.java b/src/com/android/browser/ActiveTabsPage.java
index e589d42..90c417a 100644
--- a/src/com/android/browser/ActiveTabsPage.java
+++ b/src/com/android/browser/ActiveTabsPage.java
@@ -17,6 +17,7 @@
 package com.android.browser;
 
 import android.content.Context;
+import android.graphics.Bitmap;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -102,36 +103,44 @@
         public long getItemId(int position) {
             return position;
         }
-        public View getView(int position, View convertView, ViewGroup parent) {
-            if (convertView == null) {
-                convertView = mFactory.inflate(R.layout.tab_view, null);
+        public int getViewTypeCount() {
+            return 2;
+        }
+        public int getItemViewType(int position) {
+            if (mControl.getTabCount() < TabControl.MAX_TABS) {
+                position--;
             }
-            TextView title = (TextView) convertView.findViewById(R.id.title);
-            TextView url = (TextView) convertView.findViewById(R.id.url);
-            FakeWebView webView
-                    = (FakeWebView) convertView.findViewById(R.id.screen_shot);
-            View close = convertView.findViewById(R.id.close);
-            View divider = convertView.findViewById(R.id.divider);
-
+            // Do not recycle the "add new tab" item.
+            return position == -1 ? IGNORE_ITEM_VIEW_TYPE : 1;
+        }
+        public View getView(int position, View convertView, ViewGroup parent) {
             final int tabCount = mControl.getTabCount();
             if (tabCount < TabControl.MAX_TABS) {
                 position--;
             }
-            if (position == -1) {
-                title.setText(R.string.new_tab);
-                url.setVisibility(View.GONE);
-                webView.setImageResource(R.drawable.ic_add_tab);
-                close.setVisibility(View.GONE);
-                divider.setVisibility(View.GONE);
-            } else {
+
+            if (convertView == null) {
+                convertView = mFactory.inflate(position == -1 ?
+                        R.layout.tab_view_add_tab : R.layout.tab_view, null);
+            }
+
+            if (position != -1) {
+                TextView title =
+                        (TextView) convertView.findViewById(R.id.title);
+                TextView url = (TextView) convertView.findViewById(R.id.url);
+                ImageView favicon =
+                        (ImageView) convertView.findViewById(R.id.favicon);
+                View close = convertView.findViewById(R.id.close);
                 TabControl.Tab tab = mControl.getTab(position);
                 mControl.populatePickerData(tab);
                 title.setText(tab.getTitle());
                 url.setText(tab.getUrl());
-                url.setVisibility(View.VISIBLE);
-                webView.setTab(tab);
-                divider.setVisibility(View.VISIBLE);
-                close.setVisibility(View.VISIBLE);
+                Bitmap icon = tab.getFavicon();
+                if (icon != null) {
+                    favicon.setImageBitmap(icon);
+                } else {
+                    favicon.setImageResource(R.drawable.app_web_browser_sm);
+                }
                 final int closePosition = position;
                 close.setOnClickListener(new View.OnClickListener() {
                         public void onClick(View v) {
diff --git a/src/com/android/browser/FakeWebView.java b/src/com/android/browser/FakeWebView.java
deleted file mode 100644
index da5ef5f..0000000
--- a/src/com/android/browser/FakeWebView.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- 
-package com.android.browser;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Picture;
-import android.util.AttributeSet;
-import android.view.View;
-import android.webkit.WebView;
-import android.widget.ImageView;
-
-import android.util.Log;
-
-/**
- *  This class is used by ImageAdapter to draw a representation of each tab. It 
- *  overrides ImageView so it can be used for the new tab image as well.
- */
-public class FakeWebView extends ImageView {
-    private TabControl.PickerData mPickerData;
-    private boolean        mUsesResource;
-
-    public FakeWebView(Context context) {
-        this(context, null);
-    }
-    
-    public FakeWebView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-    
-    public FakeWebView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        if (mUsesResource) {
-            super.onDraw(canvas);
-        } else {
-            // Always draw white behind the picture just in case the picture
-            // draws nothing.
-            // FIXME: We used to draw white only when the WebView was null but
-            // sometimes the picture was empty. So now we always draw white. It
-            // would be nice to know if the picture is empty so we can avoid
-            // drawing white.
-            canvas.drawColor(Color.WHITE);
-            if (mPickerData != null) {
-                final Picture p = mPickerData.mPicture;
-                if (p != null) {
-                    canvas.save();
-                    float scale = getWidth() * mPickerData.mScale
-                            / mPickerData.mWidth;
-                    // Check for NaN and infinity.
-                    if (Float.isNaN(scale) || Float.isInfinite(scale)) {
-                        scale = 1.0f;
-                    }
-                    canvas.scale(scale, scale);
-                    canvas.translate(-mPickerData.mScrollX,
-                            -mPickerData.mScrollY);
-                    canvas.drawPicture(p);
-                    canvas.restore();
-                }
-            }
-        }
-    }
-    
-    @Override
-    public void setImageResource(int resId) {
-        mUsesResource = true;
-        mPickerData = null;
-        super.setImageResource(resId);
-    }
-
-    /**
-     *  Set a WebView for this FakeWebView to represent.
-     *  @param  t The tab whose picture and other data will be used in onDraw.
-     */
-    public void setTab(TabControl.Tab t) {
-        mUsesResource = false;
-        if (mPickerData != null) {
-            // Clear the old tab's view first
-            mPickerData.mFakeWebView = null;
-        }
-        mPickerData = null;
-        if (t != null && t.getPickerData() != null) {
-            mPickerData = t.getPickerData();
-            mPickerData.mFakeWebView = this;
-        }
-    }
-}
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 6e4bae2..3de60a3 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -17,6 +17,7 @@
 package com.android.browser;
 
 import android.content.Context;
+import android.graphics.Bitmap;
 import android.graphics.Picture;
 import android.net.http.SslError;
 import android.os.Bundle;
@@ -159,20 +160,16 @@
     public static class PickerData {
         String  mUrl;
         String  mTitle;
+        Bitmap  mFavicon;
         float   mScale;
         int     mScrollX;
         int     mScrollY;
-        int     mWidth;
-        Picture mPicture;
-        // This can be null. When a new picture comes in, this view should be
-        // invalidated to show the new picture.
-        FakeWebView mFakeWebView;
     }
 
     /**
      * Private class for maintaining Tabs with a main WebView and a subwindow.
      */
-    public class Tab implements WebView.PictureListener {
+    public class Tab {
         // The Geolocation permissions prompt
         private GeolocationPermissionsPrompt mGeolocationPermissionsPrompt;
         private View mContainer;
@@ -372,11 +369,11 @@
             return null;
         }
 
-        /**
-         * Returns the picker data.
-         */
-        public PickerData getPickerData() {
-            return mPickerData;
+        public Bitmap getFavicon() {
+            if (mPickerData != null) {
+                return mPickerData.mFavicon;
+            }
+            return null;
         }
 
         private void setParentTab(Tab parent) {
@@ -439,18 +436,6 @@
             return mCloseOnExit;
         }
 
-        public void onNewPicture(WebView view, Picture p) {
-            if (mPickerData == null) {
-                return;
-            }
-
-            mPickerData.mPicture = p;
-            // Tell the FakeWebView to redraw.
-            if (mPickerData.mFakeWebView != null) {
-                mPickerData.mFakeWebView.invalidate();
-            }
-        }
-
         void setLockIconType(int type) {
             mSavedLockIconType = type;
         }
@@ -730,7 +715,6 @@
     private static final String CURRTAB = "currentTab";
     private static final String CURRURL = "currentUrl";
     private static final String CURRTITLE = "currentTitle";
-    private static final String CURRWIDTH = "currentWidth";
     private static final String CURRPICTURE = "currentPicture";
     private static final String CLOSEONEXIT = "closeonexit";
     private static final String PARENTTAB = "parentTab";
@@ -1194,15 +1178,6 @@
         final WebHistoryItem item =
                 list != null ? list.getCurrentItem() : null;
         populatePickerData(t, item);
-
-        // This method is only called during the tab picker creation. At this
-        // point we need to listen for new pictures since the WebView is still
-        // active.
-        final WebView w = t.getTopWindow();
-        w.setPictureListener(t);
-        // Capture the picture here instead of populatePickerData since it can
-        // be called when saving the state of a tab.
-        t.mPickerData.mPicture = w.capturePicture();
     }
 
     // Create the PickerData and populate it using the saved state of the tab.
@@ -1215,25 +1190,12 @@
         final Bundle state = t.mSavedState;
         data.mUrl = state.getString(CURRURL);
         data.mTitle = state.getString(CURRTITLE);
-        data.mWidth = state.getInt(CURRWIDTH, 0);
         // XXX: These keys are from WebView.savePicture so if they change, this
         // will break.
         data.mScale = state.getFloat("scale", 1.0f);
         data.mScrollX = state.getInt("scrollX", 0);
         data.mScrollY = state.getInt("scrollY", 0);
 
-        if (state.containsKey(CURRPICTURE)) {
-            final File f = new File(t.mSavedState.getString(CURRPICTURE));
-            try {
-                final FileInputStream in = new FileInputStream(f);
-                data.mPicture = Picture.createFromStream(in);
-                in.close();
-            } catch (Exception ex) {
-                // Ignore any problems with inflating the picture. We just
-                // won't draw anything.
-            }
-        }
-
         // Set the tab's picker data.
         t.mPickerData = data;
     }
@@ -1245,6 +1207,7 @@
         if (item != null) {
             data.mUrl = item.getUrl();
             data.mTitle = item.getTitle();
+            data.mFavicon = item.getFavicon();
             if (data.mTitle == null) {
                 data.mTitle = data.mUrl;
             }
@@ -1252,15 +1215,10 @@
         // We want to display the top window in the tab picker but use the url
         // and title of the main window.
         final WebView w = t.getTopWindow();
-        data.mWidth = w.getWidth();
         data.mScale = w.getScale();
         data.mScrollX = w.getScrollX();
         data.mScrollY = w.getScrollY();
 
-        // Remember the old picture if possible.
-        if (t.mPickerData != null) {
-            data.mPicture = t.mPickerData.mPicture;
-        }
         t.mPickerData = data;
     }
     
@@ -1274,13 +1232,6 @@
             if (t != null && t.mSavedState == null) {
                 t.mPickerData = null;
             }
-            if (t.mMainView != null) {
-                // Clear the picture listeners.
-                t.mMainView.setPictureListener(null);
-                if (t.mSubView != null) {
-                    t.mSubView.setPictureListener(null);
-                }
-            }
         }
     }
 
@@ -1319,7 +1270,6 @@
             if (data.mTitle != null) {
                 b.putString(CURRTITLE, data.mTitle);
             }
-            b.putInt(CURRWIDTH, data.mWidth);
             b.putBoolean(CLOSEONEXIT, t.mCloseOnExit);
             if (t.mAppId != null) {
                 b.putString(APPID, t.mAppId);
