diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index d7f389a..9e32f49 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -35,12 +35,11 @@
 import android.widget.RelativeLayout;
 
 import com.android.browser.NavTabScroller.OnRemoveListener;
-import com.android.browser.TabControl.OnThumbnailUpdatedListener;
 
 import java.util.HashMap;
 
 public class NavScreen extends RelativeLayout
-        implements OnClickListener, OnMenuItemClickListener, OnThumbnailUpdatedListener {
+        implements OnClickListener, OnMenuItemClickListener {
 
 
     private final UiController mUiController;
@@ -257,13 +256,4 @@
         }
 
     }
-
-    @Override
-    public void onThumbnailUpdated(Tab t) {
-        View v = mTabViews.get(t);
-        if (v != null) {
-            v.invalidate();
-        }
-    }
-
 }
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index a1cb7b3..d606b79 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -23,10 +23,7 @@
 import android.app.Activity;
 import android.content.Context;
 import android.graphics.Bitmap;
-import android.graphics.Canvas;
 import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Rect;
 import android.os.Message;
 import android.util.Log;
 import android.view.ActionMode;
@@ -37,12 +34,12 @@
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.DecelerateInterpolator;
-import android.webkit.ValueCallback;
-import org.codeaurora.swe.WebView;
 import android.widget.ImageView;
 
 import com.android.browser.UrlInputView.StateListener;
 
+import org.codeaurora.swe.WebView;
+
 /**
  * Ui for regular phone screen sizes
  */
@@ -250,44 +247,43 @@
     }
 
     void showNavScreen() {
-        WebView webView = getWebView();
-        if (webView != null) {
-            blockEvents();
-            mNavScreenRequested = true;
+        blockEvents();
+        mNavScreenRequested = true;
+        mTabControl.setOnThumbnailUpdatedListener(
+                new TabControl.OnThumbnailUpdatedListener() {
+                    @Override
+                    public void onThumbnailUpdated(Tab t) {
+                        mTabControl.setOnThumbnailUpdatedListener(null);
 
-            //To conserve memory, get a scaled down version of the screen and
-            //scale back up to full size
-            //0.25 uses 16 times less memory than the full size
-            final float downscaleRatio = 0.25f;
-            final float upscaleRatio = 1/downscaleRatio;
-            webView.getContentBitmapAsync(
-                    downscaleRatio,
-                    new Rect(),
-                    new ValueCallback<Bitmap>() {
-                        @Override
-                        public void onReceiveValue(Bitmap bm) {
-                            // Discard the callback if the req is interrupted
-                            if (!mNavScreenRequested) {
-                                unblockEvents();
-                                return;
-                            }
-
-                            Bitmap sbm = bm;
-                            if (bm != null) {
-                                //Upscale the low-res bitmap to the needed size
-                                sbm = Bitmap.createBitmap((int) upscaleRatio * bm.getWidth(),
-                                        (int) upscaleRatio * bm.getHeight(), Bitmap.Config.RGB_565);
-                                Canvas canvas = new Canvas(sbm);
-                                Matrix m = new Matrix();
-                                m.setScale(upscaleRatio, upscaleRatio, 0.0f, 0.0f);
-                                canvas.drawBitmap(bm, m, new Paint(Paint.FILTER_BITMAP_FLAG));
-                            }
-
-                            onShowNavScreenContinue(sbm);
+                        // Discard the callback if the req is interrupted
+                        if (!mNavScreenRequested) {
+                            unblockEvents();
+                            return;
                         }
+
+                        Bitmap bm = t.getScreenshot();
+                        Bitmap sbm;
+                        WebView webView = getWebView();
+                        if (webView != null) {
+                            int view_width = webView.getWidth();
+                            int capture_width = mActivity.getResources().getDimensionPixelSize(
+                                    R.dimen.tab_thumbnail_width);
+
+                            float scale =  (float) view_width / capture_width;
+
+                            //Upscale the low-res bitmap to the needed size
+                            Matrix m = new Matrix();
+                            m.postScale(scale, scale);
+                            sbm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
+                                    bm.getHeight(), m, false);
+                        } else {
+                            sbm = bm;
+                        }
+
+                        onShowNavScreenContinue(sbm);
                     }
-            );
-        }
+                });
+        mActiveTab.capture();
     }
 
     void onShowNavScreenContinue(Bitmap viewportBitmap) {
@@ -302,7 +298,6 @@
             mNavScreen.setAlpha(1f);
             mNavScreen.refreshAdapter();
         }
-        mActiveTab.capture();
         if (mAnimScreen == null) {
             mAnimScreen = new AnimScreen(mActivity);
         } else {
@@ -369,7 +364,6 @@
         if (showingNavScreen()) {
             // notify accessibility manager about the screen change
             mNavScreen.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-            mTabControl.setOnThumbnailUpdatedListener(mNavScreen);
         }
     }
 
@@ -517,7 +511,6 @@
     }
 
     private void finishAnimateOut() {
-        mTabControl.setOnThumbnailUpdatedListener(null);
         mNavScreen.setVisibility(View.GONE);
         mCustomViewContainer.setAlpha(1f);
         mCustomViewContainer.setVisibility(View.GONE);
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index fa6e372..107ab07 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -166,6 +166,7 @@
     private boolean mInPageLoad;
     private boolean mPageFinished;
     private boolean mDisableOverrideUrlLoading;
+    private boolean mFirstVisualPixelPainted = false;
     // The last reported progress of the current page
     private int mPageLoadProgress;
     // The time the load started, used to find load page time
@@ -374,6 +375,7 @@
         public void onPageStarted(WebView view, String url, Bitmap favicon) {
             mInPageLoad = true;
             mPageFinished = false;
+            mFirstVisualPixelPainted = false;
             mReceivedError = false;
             mUpdateThumbnail = true;
             mPageLoadProgress = INITIAL_PROGRESS;
@@ -412,6 +414,11 @@
             mWebViewController.onPageFinished(Tab.this);
         }
 
+        @Override
+        public void onFirstVisualPixel(WebView view) {
+            mFirstVisualPixelPainted = true;
+        }
+
         // return true if want to hijack the url to let another app to handle it
         @Override
         public boolean shouldOverrideUrlLoading(WebView view, String url) {
@@ -2068,6 +2075,26 @@
             return;
         }
 
+        if (!mFirstVisualPixelPainted) {
+            mCapture = Bitmap.createBitmap(
+                    mCaptureWidth,
+                    mCaptureHeight,
+                    Bitmap.Config.RGB_565);
+            mCapture.eraseColor(Color.WHITE);
+
+            mHandler.removeMessages(MSG_CAPTURE);
+
+            TabControl tc = mWebViewController.getTabControl();
+            if (tc != null) {
+                OnThumbnailUpdatedListener updateListener
+                        = tc.getOnThumbnailUpdatedListener();
+                if (updateListener != null) {
+                    updateListener.onThumbnailUpdated(this);
+                }
+            }
+            return;
+        }
+
         mMainView
             .getContentBitmapAsync(
                  (float) mCaptureWidth / mMainView.getWidth(),
