diff --git a/src/com/android/browser/EdgeSwipeController.java b/src/com/android/browser/EdgeSwipeController.java
index 5d6edd5..b9c2568 100644
--- a/src/com/android/browser/EdgeSwipeController.java
+++ b/src/com/android/browser/EdgeSwipeController.java
@@ -159,7 +159,7 @@
         if (!mbCurrBMSynced) {
             Bitmap currBM = mModel.readSnapshot(mCurrIndex);
             if (currBM != null) {
-                mView.setStationaryViewBitmap(currBM);
+                mView.setStationaryViewBitmap(currBM, mModel.getColor(mCurrIndex));
                 mbCurrBMSynced = true;
             }
         }
@@ -168,7 +168,7 @@
     private void showCurrBMInSlidingView() {
         if (!mbCurrBMSynced) {
             Bitmap currBM = mModel.readSnapshot(mCurrIndex);
-            mView.setSlidingViewBitmap(currBM);
+            mView.setSlidingViewBitmap(currBM, mModel.getColor(mCurrIndex));
             if (currBM != null) {
                 mbCurrBMSynced = true;
             }
@@ -224,12 +224,14 @@
                         switch (mFromEdge) {
                             case ViewDragHelper.EDGE_LEFT:
                                 mView.setSlidingViewBitmap(
-                                        getGrayscale(getSnapshotOrFavicon(pageIndex)));
+                                        getGrayscale(getSnapshotOrFavicon(pageIndex)),
+                                        mModel.getColor(pageIndex));
                                 mGrayBM = true;
                                 break;
                             case ViewDragHelper.EDGE_RIGHT:
                                 mView.setStationaryViewBitmap(
-                                        getGrayscale(getSnapshotOrFavicon(pageIndex)));
+                                        getGrayscale(getSnapshotOrFavicon(pageIndex)),
+                                        mModel.getColor(pageIndex));
                                 mGrayBM = true;
                                 break;
                         }
@@ -238,7 +240,8 @@
                             return;
                         }
                         mView.setStationaryViewBitmap(
-                                getGrayscale(getSnapshotOrFavicon(pageIndex)));
+                                getGrayscale(getSnapshotOrFavicon(pageIndex)),
+                                mModel.getColor(pageIndex));
                         mGrayBM = true;
                     }
                 }
@@ -325,7 +328,8 @@
             mView.hideSlidingViews();
 
             if (mbNavigated) {
-                mView.setStationaryViewBitmap(getSnapshotOrFavicon(mCurrIndex));
+                mView.setStationaryViewBitmap(getSnapshotOrFavicon(mCurrIndex),
+                        mModel.getColor(mCurrIndex));
             } else {
                 swipeSessionCleanup();
             }
@@ -402,7 +406,8 @@
 
                     if (mPrevIndex >= 0) {
                         if (!mView.stationaryViewHasImage()) {
-                            mView.setStationaryViewBitmap(getSnapshotOrFavicon(mPrevIndex));
+                            mView.setStationaryViewBitmap(getSnapshotOrFavicon(mPrevIndex),
+                                    mModel.getColor(mPrevIndex));
                         }
                     }
                     break;
@@ -412,7 +417,8 @@
                         mView.moveShadowView(mView.getMeasuredWidth() + left);
 
                         if (!mView.slidingViewHasImage() && mNextIndex < mMaxIndex) {
-                            mView.setSlidingViewBitmap(getSnapshotOrFavicon(mNextIndex));
+                            mView.setSlidingViewBitmap(getSnapshotOrFavicon(mNextIndex),
+                                    mModel.getColor(mNextIndex));
                         }
 
                         showCurrBMInStationaryView();
@@ -451,13 +457,15 @@
                     mView.showSlidingViews();
                     mView.goDormant();
                     mPrevIndex = mCurrIndex - 1;
-                    mView.setStationaryViewBitmap(getSnapshotOrFavicon(mPrevIndex));
+                    mView.setStationaryViewBitmap(getSnapshotOrFavicon(mPrevIndex),
+                            mModel.getColor(mPrevIndex));
                     showCurrBMInSlidingView();
                     break;
                 case ViewDragHelper.EDGE_RIGHT:
                     mView.showSlidingViews();
                     mNextIndex = mCurrIndex + 1;
-                    mView.setSlidingViewBitmap(getSnapshotOrFavicon(mNextIndex));
+                    mView.setSlidingViewBitmap(getSnapshotOrFavicon(mNextIndex),
+                            mModel.getColor(mNextIndex));
                     showCurrBMInStationaryView();
                     if (mbCurrBMSynced)
                         mView.goDormant();
diff --git a/src/com/android/browser/EdgeSwipeModel.java b/src/com/android/browser/EdgeSwipeModel.java
index 51a5dc9..2d8517b 100644
--- a/src/com/android/browser/EdgeSwipeModel.java
+++ b/src/com/android/browser/EdgeSwipeModel.java
@@ -30,11 +30,15 @@
 package com.android.browser;
 
 import android.graphics.Bitmap;
+import android.graphics.Color;
 import android.util.SparseArray;
 import android.webkit.ValueCallback;
 
+import org.codeaurora.swe.WebHistoryItem;
+
 public class EdgeSwipeModel {
     private SparseArray<Bitmap> mBitmaps;
+    private SparseArray<Integer> mColors;
     private Tab mTab;
     private TitleBar mBar;
 
@@ -46,6 +50,7 @@
         mTab = tab;
         mBar = bar;
         mBitmaps = new SparseArray<>();
+        mColors = new SparseArray<>();
     }
 
     public void updateSnapshot(final int index) {
@@ -80,6 +85,17 @@
     }
 
     public void fetchSnapshot(final int index) {
+        if (mColors.get(index) == null && mTab.getWebView() != null) {
+            WebHistoryItem item = mTab.getWebView().copyBackForwardList().getItemAtIndex(index);
+            if (item != null) {
+                String url = item.getUrl();
+                int color = NavigationBarBase.getSiteIconColor(url);
+                if (color != 0) {
+                    mColors.put(index, color);
+                }
+            }
+        }
+
         if (mBitmaps.get(index) != null) {
             return;
         }
@@ -108,11 +124,29 @@
         return mBitmaps.get(index);
     }
 
+    public int getColor(int index) {
+        if (index < 0) {
+            return Color.DKGRAY;
+        }
+
+        if (index > (mTab.getWebView().copyBackForwardList().getSize() - 1)) {
+            return Color.DKGRAY;
+        }
+
+        Integer color = mColors.get(index);
+        if (color != null) {
+            return color.intValue();
+        }
+
+        return Color.DKGRAY;
+    }
+
     public void deleteSnapshot(int index) {
         mBitmaps.delete(index);
     }
 
     public void cleanup() {
         mBitmaps.clear();
+        mColors.clear();
     }
 }
diff --git a/src/com/android/browser/EdgeSwipeView.java b/src/com/android/browser/EdgeSwipeView.java
index a777c26..bce8aef 100644
--- a/src/com/android/browser/EdgeSwipeView.java
+++ b/src/com/android/browser/EdgeSwipeView.java
@@ -135,10 +135,10 @@
         return (mViewGroup.getHeight() < mViewGroup.getWidth());
     }
 
-    private void setBitmap(ImageView view, Bitmap bitmap) {
+    private void setBitmap(ImageView view, Bitmap bitmap, int color) {
         clampViewIfNeeded(view);
         if (bitmap == null) {
-            bitmap = getColorBitmap(Color.DKGRAY);
+            bitmap = getColorBitmap(color);
         }
 
         int offset = 0;
@@ -146,6 +146,12 @@
             offset = mTitleBar.getNavigationBar().getMeasuredHeight();
         }
 
+        if ((view.getMeasuredHeight() > view.getMeasuredWidth()) !=
+                (bitmap.getHeight() > bitmap.getWidth())) {
+            view.setImageBitmap(bitmap);
+            return;
+        }
+
         int bitmap_height = bitmap.getHeight();
 
         if (view.getMeasuredHeight() != 0) {
@@ -161,18 +167,18 @@
         }
     }
 
-    public void setStationaryViewBitmap(Bitmap bitmap) {
+    public void setStationaryViewBitmap(Bitmap bitmap, int color) {
         mbStationaryViewBMSet = null != bitmap;
-        setBitmap(mStationaryView, bitmap);
+        setBitmap(mStationaryView, bitmap, color);
     }
 
     public void setStationaryViewAlpha(float alpha) {
         mStationaryView.setAlpha(alpha);
     }
 
-    public void setSlidingViewBitmap(Bitmap bitmap) {
+    public void setSlidingViewBitmap(Bitmap bitmap, int color) {
         mbSlidingViewBMSet = null != bitmap;
-        setBitmap(mSlidingView, bitmap);
+        setBitmap(mSlidingView, bitmap, color);
     }
 
     public boolean slidingViewHasImage() {
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index f1444c8..ebeeadf 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -608,13 +608,16 @@
             mTabHistoryUpdateObservable.set(index);
             final int maxIdx = view.copyBackForwardList().getSize();
             final WebView wv = view;
+            final int currIdx = index;
+            final int currentTabIdx = (int) mWebViewController.getTabControl().
+                    getCurrentTab().getId();
             view.getSnapshotIds(new ValueCallback <List<Integer>>() {
                 @Override
                 public void onReceiveValue(List<Integer> ids) {
-                    int currentTabIdx = mWebViewController.getTabControl().getCurrentPosition();
                     for (Integer id : ids) {
-                        if (getTabIdxFromCaptureIdx(id) == currentTabIdx &&
-                                getNavIdxFromCaptureIdx(id) >= maxIdx) {
+                        int tabIdx = getTabIdxFromCaptureIdx(id);
+                        int navIdx = getNavIdxFromCaptureIdx(id);
+                        if (tabIdx == currentTabIdx && (navIdx >= maxIdx || navIdx == currIdx)) {
                             wv.deleteSnapshot(id);
                         }
                     }
@@ -1363,13 +1366,13 @@
             final WebView webView = mMainView;
             setWebView(null);
             if (!mWebViewDestroyedByMemoryMonitor && !BaseUi.isUiLowPowerMode()) {
+                final int destroyedTabIdx = (int) mId;
                 // Tabs can be reused with new instance of WebView so delete the snapshots
                 webView.getSnapshotIds(new ValueCallback<List<Integer>>() {
                     @Override
                     public void onReceiveValue(List<Integer> ids) {
-                        int currentTabIdx = mWebViewController.getTabControl().getCurrentPosition();
                         for (Integer id : ids) {
-                            if (getTabIdxFromCaptureIdx(id) == currentTabIdx) {
+                            if (getTabIdxFromCaptureIdx(id) == destroyedTabIdx) {
                                 webView.deleteSnapshot(id);
                             }
                         }
