diff --git a/res/drawable-xxhdpi/ic_deco_favicon_normal.png b/res/drawable-xxhdpi/ic_deco_favicon_normal.png
index 5e38c97..ac3b2a4 100644
--- a/res/drawable-xxhdpi/ic_deco_favicon_normal.png
+++ b/res/drawable-xxhdpi/ic_deco_favicon_normal.png
Binary files differ
diff --git a/res/layout/swe_website_settings.xml b/res/layout/swe_website_settings.xml
index 50d593c..b71d4cc 100644
--- a/res/layout/swe_website_settings.xml
+++ b/res/layout/swe_website_settings.xml
@@ -23,34 +23,47 @@
     android:layout_width="match_parent"
     android:background="@android:color/transparent">
 
-    <ListView android:id="@android:id/list"
+    <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="0px"
-        android:layout_weight="1"
-        android:clipToPadding="false"
-        android:drawSelectorOnTop="false"
-        android:cacheColorHint="@android:color/transparent"
-        android:divider="@null"
-        android:dividerHeight="0dp"
-        android:scrollbarAlwaysDrawVerticalTrack="true" />
+        android:layout_height="fill_parent"
+        android:layout_weight="1">
+        <ListView android:id="@android:id/list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:clipToPadding="false"
+            android:drawSelectorOnTop="false"
+            android:cacheColorHint="@android:color/transparent"
+            android:divider="@null"
+            android:dividerHeight="0dp"
+            android:scrollbarAlwaysDrawVerticalTrack="true" />
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/combo_shadow_height"
+            android:layout_gravity="bottom"
+            android:background="@drawable/shadow_top" />
+    </FrameLayout>
 
     <LinearLayout
-        android:orientation="horizontal"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content">
+        android:layout_height="wrap_content"
+        android:background="@color/primary"
+        style="?android:attr/buttonBarStyle" >
 
         <Button android:id="@+id/add_new_site"
-                android:layout_width="150dip"
-                android:layout_height="wrap_content"
-                android:layout_margin="5dip"
-                android:text="@string/website_settings_add_origin"
-                android:visibility="gone" />
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:layout_weight="1"
+            android:text="@string/website_settings_add_origin"
+            style="?android:attr/buttonBarButtonStyle"
+            />
 
         <Button android:id="@+id/clear_all_button"
-            android:layout_width="150dip"
             android:layout_height="wrap_content"
-            android:layout_margin="5dip"
+            android:layout_width="wrap_content"
+            android:layout_weight="1"
             android:text="@string/website_settings_clear_all"
-            android:visibility="gone" />
+            style="?android:attr/buttonBarButtonStyle"
+             />
     </LinearLayout>
 </LinearLayout>
diff --git a/res/layout/website_settings_row.xml b/res/layout/website_settings_row.xml
index 68c38d9..32d53c8 100644
--- a/res/layout/website_settings_row.xml
+++ b/res/layout/website_settings_row.xml
@@ -21,15 +21,13 @@
   android:gravity="center_vertical"
   android:padding="0dip">
 
-  <ImageView android:id="@+id/icon"
-    android:layout_width="20dip"
-    android:layout_height="20dip"
-    android:layout_marginStart="18dip"
-    android:layout_marginEnd="18dip"
-    android:layout_centerVertical="true"
-    android:background="@drawable/bookmark_list_favicon_bg"
-    android:padding="2dip" />
-
+    <com.android.browser.SiteTileView
+        android:id="@+id/icon"
+        android:layout_centerVertical="true"
+        android:layout_width="36dp"
+        android:layout_height="36dp"
+        android:layout_marginStart="6dip"
+        android:layout_marginEnd="6dip"/>
   <LinearLayout
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 481f10c..374bc15 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -228,7 +228,6 @@
     @Override
     public void onTabDataChanged(Tab tab) {
         setUrlTitle(tab);
-        setFavicon(tab);
         updateTabSecurityState(tab);
         updateNavigationState(tab);
         mTitleBar.onTabDataChanged(tab);
@@ -305,6 +304,7 @@
         mTitleBar.bringToFront();
         tab.getTopWindow().requestFocus();
         onTabDataChanged(tab);
+        setFavicon(tab);
         onProgressChanged(tab);
         mNavigationBar.setIncognitoMode(tab.isPrivateBrowsingEnabled());
         mBlockFocusAnimations = false;
@@ -722,10 +722,8 @@
     }
 
     // Set the favicon in the title bar.
-    protected void setFavicon(Tab tab) {
-        if (tab.inForeground()) {
-            mNavigationBar.setFavicon(tab.getWebView().getFavicon());
-        }
+    public void setFavicon(Tab tab) {
+        mNavigationBar.showCurrentFavicon(tab);
     }
 
     // active tabs page
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index 80e1da7..282ad6c 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -35,6 +35,7 @@
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.database.DataSetObserver;
+import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -87,6 +88,7 @@
     private ViewGroup mPrefsContainer;
     private FragmentBreadCrumbs mFragmentBreadCrumbs;
     private ExpandableListView mHistoryList;
+    private static Bitmap sDefaultFavicon;
 
     private View mRoot;
 
@@ -211,6 +213,10 @@
                 mCallback = (CombinedBookmarksCallbacks) cb;
             }
         }
+        if (sDefaultFavicon == null) {
+            sDefaultFavicon = BitmapFactory.decodeResource(
+                    this.getResources(), R.drawable.ic_deco_favicon_normal);
+        }
     }
 
     @Override
@@ -676,7 +682,7 @@
                 item.setFavicon(BitmapFactory.decodeByteArray(data, 0,
                         data.length));
             } else {
-                item.setFavicon(null);
+                item.setFavicon(sDefaultFavicon);
             }
             item.setIsBookmark(cursor.getInt(HistoryQuery.INDEX_IS_BOOKMARK) == 1);
             return item;
diff --git a/src/com/android/browser/BrowserSnapshotPage.java b/src/com/android/browser/BrowserSnapshotPage.java
index c01691f..a5a3519 100644
--- a/src/com/android/browser/BrowserSnapshotPage.java
+++ b/src/com/android/browser/BrowserSnapshotPage.java
@@ -77,6 +77,7 @@
     private static final int SNAPSHOT_FAVICON = 4;
     private static final int SNAPSHOT_URL = 5;
     private static final int SNAPSHOT_DATE_CREATED = 6;
+    private static Bitmap sDefaultFavicon;
 
     GridView mGrid;
     View mEmpty;
@@ -98,6 +99,9 @@
             }
         }
         mAnimateId = getArguments().getLong(EXTRA_ANIMATE_ID);
+        if (sDefaultFavicon == null)
+            sDefaultFavicon = BitmapFactory.decodeResource(getResources(),
+                    R.drawable.ic_deco_favicon_normal);
     }
 
     @Override
@@ -190,7 +194,13 @@
     private void populateBookmarkItem(Cursor cursor, BookmarkItem item) {
         item.setName(cursor.getString(SNAPSHOT_TITLE));
         item.setUrl(cursor.getString(SNAPSHOT_URL));
-        item.setFavicon(getBitmap(cursor, SNAPSHOT_FAVICON));
+        Bitmap favicon = getBitmap(cursor, SNAPSHOT_FAVICON);
+        if (favicon != null) {
+            item.setFavicon(favicon);
+        } else {
+            item.setFavicon(sDefaultFavicon);
+        }
+
     }
 
     static Bitmap getBitmap(Cursor cursor, int columnIndex) {
diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java
index 9aa044c..afcca1a 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -17,6 +17,8 @@
 package com.android.browser;
 
 import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.content.res.Resources;
 import android.util.AttributeSet;
@@ -200,6 +202,16 @@
     }
 
     @Override
+    public Bitmap getFavicon() {
+        Tab currentTab = mTitleBar.getUiController().getCurrentTab();
+        if (currentTab != null){
+            return currentTab.getFavicon();
+        }
+        else return BitmapFactory.decodeResource(
+                this.getResources(), R.drawable.ic_deco_favicon_normal);
+    }
+
+    @Override
     public boolean dispatchKeyEventPreIme(KeyEvent event) {
         Tab currentTab = mTitleBar.getUiController().getCurrentTab();
         if (currentTab != null && currentTab.isKeyboardShowing()){
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 3678608..2b66988 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -47,7 +47,6 @@
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.Uri;
-import android.net.http.SslError;
 import android.net.wifi.WifiManager;
 import android.net.wifi.ScanResult;
 import android.os.AsyncTask;
@@ -978,7 +977,7 @@
 
         String url = tab.getUrl();
         // update the bookmark database for favicon
-        maybeUpdateFavicon(tab, null, url, favicon);
+        syncBookmarkFavicon(tab, null, url, favicon);
 
         Performance.tracePageStart(url);
 
@@ -1000,7 +999,7 @@
          }
 
         tab.onPageFinished();
-        maybeUpdateFavicon(tab, tab.getOriginalUrl(), tab.getUrl(), tab.getFavicon());
+        syncBookmarkFavicon(tab, tab.getOriginalUrl(), tab.getUrl(), tab.getFavicon());
 
         Performance.tracePageFinished();
     }
@@ -1068,8 +1067,8 @@
 
     @Override
     public void onFavicon(Tab tab, WebView view, Bitmap icon) {
-        mUi.onTabDataChanged(tab);
-        maybeUpdateFavicon(tab, view.getOriginalUrl(), view.getUrl(), icon);
+        syncBookmarkFavicon(tab, view.getOriginalUrl(), view.getUrl(), icon);
+        ((BaseUi)mUi).setFavicon(tab);
     }
 
     @Override
@@ -1263,8 +1262,8 @@
      * Update the favorites icon if the private browsing isn't enabled and the
      * icon is valid.
      */
-    private void maybeUpdateFavicon(Tab tab, final String originalUrl,
-            final String url, Bitmap favicon) {
+    private void syncBookmarkFavicon(Tab tab, final String originalUrl,
+                                     final String url, Bitmap favicon) {
         if (favicon == null) {
             return;
         }
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index d1054b9..973094c 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -256,16 +256,20 @@
         return mDefaultStatusBarColor;
     }
 
-    public void setFavicon(Bitmap icon) {
-        int color = ColorUtils.getDominantColorForBitmap(icon);
-        Tab tab = mUiController.getCurrentTab();
+    // Sets the favicon for the given tab if it's in the foreground
+    // If the tab doesn't have a favicon, it sets the default favicon
+    public void showCurrentFavicon(Tab tab) {
+        int color;
+        if (tab == null) { return; }
 
-        if (tab != null) {
+        if (tab.inForeground()) {
             if (tab.hasFavicon()) {
+                color = ColorUtils.getDominantColorForBitmap(tab.getFavicon());
                 updateSiteIconColor(tab.getUrl(), color);
                 setStatusAndNavigationBarColor(mUiController.getActivity(),
                         adjustColor(color, 1, 1, 0.7f));
-            } else {
+
+            }   else {
                 color = getSiteIconColor(tab.getUrl());
                 if (color != 0) {
                     setStatusAndNavigationBarColor(mUiController.getActivity(),
@@ -275,14 +279,9 @@
                             mDefaultStatusBarColor);
                 }
             }
-        } else {
-            setStatusAndNavigationBarColor(mUiController.getActivity(), mDefaultStatusBarColor);
-        }
-
-        //Bitmap favicon = mUiController.getCurrentTopWebView().getFavicon();
-
-        if (mFaviconTile != null) {
-            mFaviconTile.replaceFavicon(mUiController.getCurrentTopWebView().getFavicon());
+            if (mFaviconTile != null) {
+                mFaviconTile.replaceFavicon(tab.getFavicon()); // Always set the tab's favicon
+            }
         }
     }
 
@@ -337,7 +336,7 @@
         Bitmap favicon = mUiController.getCurrentTopWebView().getFavicon();
         if (favicon != null) {
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            favicon.compress(Bitmap.CompressFormat.PNG, 50, baos);
+            favicon.compress(Bitmap.CompressFormat.PNG, 100, baos);
             bundle.putByteArray(SiteSpecificPreferencesFragment.EXTRA_FAVICON,
                     baos.toByteArray());
         }
@@ -722,7 +721,6 @@
         mFaviconTile.setBadgeBlockedObjectsCount(0);
         mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNKNOWN);
         mFaviconTile.setBadgeHasCertIssues(false);
-        mFaviconTile.replaceFavicon(mDefaultFavicon);
         setSecurityState(Tab.SecurityState.SECURITY_STATE_NOT_SECURE);
         mHandler.removeMessages(WEBREFINER_COUNTER_MSG);
         mHandler.sendEmptyMessageDelayed(WEBREFINER_COUNTER_MSG,
diff --git a/src/com/android/browser/SiteTileView.java b/src/com/android/browser/SiteTileView.java
index e2951ae..8d69dba 100644
--- a/src/com/android/browser/SiteTileView.java
+++ b/src/com/android/browser/SiteTileView.java
@@ -41,12 +41,12 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.util.ArrayMap;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.view.View;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -359,7 +359,7 @@
             sBackgroundDrawable.getPadding(sBackgroundDrawablePadding);
 
         // load all the badge drawables
-        sBadges = new ArrayMap<>();
+        sBadges = new HashMap<>();
         loadBadgeResources(r, TRUST_AVOID, R.drawable.img_deco_tile_avoid,
                 R.drawable.img_deco_tile_avoid_accent, R.color.TileBadgeTextAvoid);
         loadBadgeResources(r, TRUST_UNTRUSTED, R.drawable.img_deco_tile_untrusted,
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index d3621ef..8121ba4 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -220,8 +220,9 @@
         String mUrl;
         String mOriginalUrl;
         String mTitle;
-        SecurityState mSecurityState;
         // This is non-null only when mSecurityState is SECURITY_STATE_BAD_CERTIFICATE.
+        SecurityState mSecurityState;
+        // This is non-null only when onReceivedIcon is called or SnapshotTab restores it.
         Bitmap mFavicon;
         boolean mIsBookmarkedSite;
         boolean mIncognito;
@@ -237,14 +238,13 @@
             mSecurityState = SecurityState.SECURITY_STATE_NOT_SECURE;
         }
 
-        PageState(Context c, boolean incognito, String url, Bitmap favicon) {
+        PageState(Context c, boolean incognito, String url) {
             mIncognito = incognito;
             if (mIncognito)
                 mOriginalUrl = mUrl = "";
             else
                 mOriginalUrl = mUrl = url;
             mSecurityState = SecurityState.SECURITY_STATE_NOT_SECURE;
-            mFavicon = favicon;
         }
 
     }
@@ -335,7 +335,7 @@
             mUpdateThumbnail = true;
             mPageLoadProgress = INITIAL_PROGRESS;
             mCurrentState = new PageState(mContext,
-                    view.isPrivateBrowsingEnabled(), url, favicon);
+                    view.isPrivateBrowsingEnabled(), url);
             mLoadStartTime = SystemClock.uptimeMillis();
             // Need re-enable FullScreenMode on Page navigation if needed
             if (BrowserSettings.getInstance().useFullscreen()){
@@ -549,6 +549,18 @@
         @Override
         public void beforeNavigation(WebView view, String url) {
             mTouchIconUrl = null;
+            TitleBar titleBar = null;
+            Controller controller = (Controller)mWebViewController;
+            UI ui = controller.getUi();
+
+            if (ui instanceof BaseUi) {
+                titleBar = ((BaseUi)ui).getTitleBar();
+                if (titleBar != null) {
+                    NavigationBarBase navBar = titleBar.getNavigationBar();
+                    navBar.showCurrentFavicon(Tab.this); // Show the default Favicon while loading a new page
+                }
+            }
+
             if (BaseUi.isUiLowPowerMode()) {
                 return;
             }
@@ -561,19 +573,11 @@
                 return;
             }
 
-            if (view.getUrl().equals(url)) {
-                return;
-            }
-
             final int idx = view.copyBackForwardList().getCurrentIndex();
             boolean bitmapExists = view.hasSnapshot(idx);
 
             int progress = 100;
-            Controller controller = (Controller)mWebViewController;
-            UI ui = controller.getUi();
-            if (ui instanceof BaseUi) {
-                BaseUi baseUi = (BaseUi) ui;
-                TitleBar titleBar = baseUi.getTitleBar();
+            if (titleBar != null) {
                 progress = titleBar.getProgressView().getProgressPercent();
             }
 
@@ -657,10 +661,10 @@
                    url.contains(Controller.INCOGNITO_URI)) {
             mCurrentState.mUrl = mCurrentState.mOriginalUrl = "";
         }
+
         else {
             mCurrentState.mUrl = view.getUrl();
             mCurrentState.mOriginalUrl = view.getOriginalUrl();
-            mCurrentState.mFavicon = view.getFavicon();
         }
 
         if (mCurrentState.mUrl == null) {
@@ -1195,6 +1199,16 @@
             mId = TabControl.getNextId();
         }
         setWebView(w);
+
+        UI ui = ((Controller)mWebViewController).getUi();
+        if (ui instanceof BaseUi) {
+            TitleBar titleBar = ((BaseUi)ui).getTitleBar();
+            if (titleBar != null) {
+                NavigationBarBase navBar = titleBar.getNavigationBar();
+                navBar.showCurrentFavicon(this); // Show the default Favicon while loading a new page
+            }
+        }
+
         mHandler = new Handler() {
             @Override
             public void handleMessage(Message m) {
@@ -1783,7 +1797,7 @@
         String url = b.getString(CURRURL);
         String title = b.getString(CURRTITLE);
         boolean incognito = b.getBoolean(INCOGNITO);
-        mCurrentState = new PageState(mContext, incognito, url, null);
+        mCurrentState = new PageState(mContext, incognito, url);
         mCurrentState.mTitle = title;
         synchronized (Tab.this) {
             if (mCapture != null) {
@@ -1914,7 +1928,7 @@
         if (mMainView != null) {
             mPageLoadProgress = INITIAL_PROGRESS;
             mCurrentState = new PageState(
-                                mContext, mMainView.isPrivateBrowsingEnabled(), url, null);
+                                mContext, mMainView.isPrivateBrowsingEnabled(), url);
             mMainView.loadUrl(url, headers);
         }
     }
diff --git a/src/com/android/browser/preferences/WebsiteSettingsFragment.java b/src/com/android/browser/preferences/WebsiteSettingsFragment.java
index 2b5c9eb..bb4a8d3 100644
--- a/src/com/android/browser/preferences/WebsiteSettingsFragment.java
+++ b/src/com/android/browser/preferences/WebsiteSettingsFragment.java
@@ -43,8 +43,10 @@
 import android.widget.TextView;
 
 import com.android.browser.R;
+import com.android.browser.SiteTileView;
 import com.android.browser.WebStorageSizeManager;
 
+import java.io.ByteArrayOutputStream;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -63,24 +65,37 @@
 public class WebsiteSettingsFragment extends ListFragment implements OnClickListener {
     private SiteAdapter mAdapter = null;
 
-    private class Site {
+    private class Site implements OnClickListener {
         private String mOrigin;
         private String mTitle;
         private Bitmap mIcon;
+        private View mView;
+        private Bitmap mDefaultIcon = mAdapter.mDefaultIcon;
 
         public Site(String origin) {
             mOrigin = origin;
             mTitle = null;
             mIcon = null;
-            PermissionsServiceFactory.getFavicon(origin, getActivity(),
+            fetchFavicon();
+        }
+
+        private void fetchFavicon() {
+            // Fetch favicon and set it
+            PermissionsServiceFactory.getFavicon(mOrigin, getActivity(),
                     new ValueCallback<Bitmap>() {
                         @Override
                         public void onReceiveValue(Bitmap value) {
-                            mIcon = value;
+                            setIcon(value);
+
                         }
                     });
         }
 
+        public void updateView(View view){
+            mView = view;
+            fetchFavicon();
+        }
+
         public String getOrigin() {
             return mOrigin;
         }
@@ -89,8 +104,14 @@
             mTitle = title;
         }
 
-        public void setIcon(Bitmap icon) {
-            mIcon = icon;
+        public void setIcon(Bitmap image) {
+            mIcon = image;
+            if (mView != null) {
+                SiteTileView icon = (SiteTileView) mView.findViewById(R.id.icon);
+                icon.replaceFavicon((image == null) ? mDefaultIcon : image);
+                icon.setVisibility(View.VISIBLE);
+                icon.setOnClickListener(this);
+            }
         }
 
         public Bitmap getIcon() {
@@ -111,6 +132,11 @@
             Uri uri = Uri.parse(str);
             return "http".equals(uri.getScheme()) ?  str.substring(7) : str;
         }
+
+        @Override
+        public void onClick(View v) {
+            clickHandler(this);
+        }
     }
 
     class SiteAdapter extends ArrayAdapter<Site>
@@ -127,7 +153,6 @@
             mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             mDefaultIcon = BitmapFactory.decodeResource(getResources(),
                     R.drawable.ic_deco_favicon_normal);
-
             mReady = false;
             askForOrigins();
         }
@@ -207,7 +232,6 @@
             View view;
             final TextView title;
             final TextView subtitle;
-            final ImageView icon;
 
             if (convertView == null) {
                 view = mInflater.inflate(mResource, parent, false);
@@ -217,9 +241,9 @@
 
             title = (TextView) view.findViewById(R.id.title);
             subtitle = (TextView) view.findViewById(R.id.subtitle);
-            icon = (ImageView) view.findViewById(R.id.icon);
 
             Site site = getItem(position);
+            site.updateView(view);
             title.setText(site.getPrettyTitle());
             String subtitleText = site.getPrettyOrigin();
             if (subtitleText != null) {
@@ -232,13 +256,6 @@
                 title.setMaxLines(2);
                 title.setSingleLine(false);
             }
-
-            icon.setVisibility(View.VISIBLE);
-            Bitmap bmp = site.getIcon();
-            if (bmp == null) {
-                bmp = mDefaultIcon;
-            }
-            icon.setImageBitmap(bmp);
             // We set the site as the view's tag,
             // so that we can get it in onItemClick()
             view.setTag(site);
@@ -250,21 +267,29 @@
                                 View view,
                                 int position,
                                 long id) {
-            Site site = (Site) view.getTag();
-            Activity activity = getActivity();
-            if (activity != null) {
-                Bundle args = new Bundle();
-                args.putString(SiteSpecificPreferencesFragment.EXTRA_ORIGIN, site.getOrigin());
+            clickHandler((Site) view.getTag());
+        }
+    }
 
-                FragmentManager fragmentManager = activity.getFragmentManager();
-                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
-
-                Fragment newFragment = new SiteSpecificPreferencesFragment();
-                newFragment.setArguments(args);
-                fragmentTransaction.replace(getId(), newFragment);
-                fragmentTransaction.addToBackStack(null);
-                fragmentTransaction.commit();
+    private void clickHandler(Site site) {
+        Activity activity = getActivity();
+        if (activity != null) {
+            Bundle args = new Bundle();
+            args.putString(SiteSpecificPreferencesFragment.EXTRA_ORIGIN, site.getOrigin());
+            if(site.getIcon() != null) {
+                ByteArrayOutputStream favicon = new ByteArrayOutputStream();
+                site.getIcon().compress(Bitmap.CompressFormat.PNG, 100, favicon);
+                args.putByteArray(SiteSpecificPreferencesFragment.EXTRA_FAVICON,
+                        favicon.toByteArray());
             }
+            FragmentManager fragmentManager = activity.getFragmentManager();
+            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
+
+            Fragment newFragment = new SiteSpecificPreferencesFragment();
+            newFragment.setArguments(args);
+            fragmentTransaction.replace(getId(), newFragment);
+            fragmentTransaction.addToBackStack(null);
+            fragmentTransaction.commit();
         }
     }
 
