diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index cd1388f..3682d69 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -49,8 +49,6 @@
 import android.widget.Toast;
 import android.content.res.TypedArray;
 
-import com.android.browser.Tab.SecurityState;
-
 import org.codeaurora.swe.BrowserCommandLine;
 import org.codeaurora.swe.WebView;
 
@@ -83,8 +81,6 @@
     protected Tab mActiveTab;
     private InputMethodManager mInputManager;
 
-    private Drawable mLockIconSecure;
-    private Drawable mLockIconMixed;
     private Drawable mGenericFavicon;
 
     protected FrameLayout mContentView;
@@ -160,20 +156,6 @@
         }
     }
 
-    private Drawable getLockIconSecure() {
-        if (mLockIconSecure == null) {
-            mLockIconSecure = mActivity.getResources().getDrawable(R.drawable.ic_deco_secure);
-        }
-        return mLockIconSecure;
-    }
-
-    private Drawable getLockIconMixed() {
-        if (mLockIconMixed == null) {
-            mLockIconMixed = mActivity.getResources().getDrawable(R.drawable.ic_deco_secure_partial);
-        }
-        return mLockIconMixed;
-    }
-
     protected Drawable getGenericFavicon() {
         if (mGenericFavicon == null) {
             mGenericFavicon = mActivity.getResources().getDrawable(R.drawable.ic_deco_favicon_normal);
@@ -247,7 +229,7 @@
     public void onTabDataChanged(Tab tab) {
         setUrlTitle(tab);
         setFavicon(tab);
-        updateLockIconToLatest(tab);
+        updateTabSecurityState(tab);
         updateNavigationState(tab);
         mTitleBar.onTabDataChanged(tab);
         mNavigationBar.onTabDataChanged(tab);
@@ -326,6 +308,9 @@
         mBlockFocusAnimations = false;
 
         scheduleRemoveTab(tabToRemove, tabToWaitFor);
+
+        updateTabSecurityState(tab);
+        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     Tab mTabToRemove = null;
@@ -719,28 +704,12 @@
     /**
      * Update the lock icon to correspond to our latest state.
      */
-    protected void updateLockIconToLatest(Tab t) {
+    private void updateTabSecurityState(Tab t) {
         if (t != null && t.inForeground()) {
-            updateLockIconImage(t.getSecurityState());
+            mNavigationBar.setSecurityState(t.getSecurityState());
         }
     }
 
-    /**
-     * Updates the lock-icon image in the title-bar.
-     */
-    private void updateLockIconImage(SecurityState securityState) {
-        Drawable d = null;
-        if (securityState == SecurityState.SECURITY_STATE_SECURE) {
-            d = getLockIconSecure();
-        } else if (securityState == SecurityState.SECURITY_STATE_MIXED
-                || securityState == SecurityState.SECURITY_STATE_BAD_CERTIFICATE) {
-            // TODO: It would be good to have different icons for insecure vs mixed content.
-            // See http://b/5403800
-            d = getLockIconMixed();
-        }
-        mNavigationBar.setLock(d, securityState);
-    }
-
     protected void setUrlTitle(Tab tab) {
         String url = tab.getUrl();
         String title = tab.getTitle();
@@ -755,8 +724,7 @@
     // Set the favicon in the title bar.
     protected void setFavicon(Tab tab) {
         if (tab.inForeground()) {
-            Bitmap icon = tab.getFavicon();
-            mNavigationBar.setFavicon(icon);
+            mNavigationBar.setFavicon(tab.getWebView().getFavicon());
         }
     }
 
@@ -1060,4 +1028,9 @@
             mTitleBar.setTranslationY(0);
         }
     }
+
+    @Override
+    public boolean shouldCaptureThumbnails() {
+        return true;
+    }
 }
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 344e7d9..0d98021 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -24,14 +24,17 @@
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.Color;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
 import android.text.Editable;
+import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -73,22 +76,34 @@
     protected TitleBar mTitleBar;
     protected UiController mUiController;
     protected UrlInputView mUrlInput;
+    protected ImageView mStopButton;
 
-    protected ImageView mFaviconBadge;
-
-    private ImageView mFavicon;
-    private ImageView mLockIcon;
-
+    private SiteTileView mFaviconTile;
+    private ImageView mMagnify;
+    private View mVoiceButton;
+    private ImageView mClearButton;
     private View mMore;
     private PopupMenu mPopupMenu;
     private boolean mOverflowMenuShowing;
     private boolean mNeedsMenu;
 
+    private static Bitmap mDefaultFavicon;
+
     private int mStatusBarColor;
     private static int mDefaultStatusBarColor = -1;
 
+    private static final int WEBREFINER_COUNTER_MSG = 4242;
+    private static final int WEBREFINER_COUNTER_MSG_DELAY = 3000;
+    private Handler mHandler;
+
     private Tab.SecurityState mSecurityState = Tab.SecurityState.SECURITY_STATE_NOT_SECURE;
 
+    private static final String noSitePrefs[] = {
+            "chrome://",
+            "about:",
+            "content:",
+    };
+
     public NavigationBarBase(Context context) {
         super(context);
     }
@@ -104,8 +119,6 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mLockIcon = (ImageView) findViewById(R.id.lock);
-        mFavicon = (ImageView) findViewById(R.id.favicon);
         mUrlInput = (UrlInputView) findViewById(R.id.url);
         mUrlInput.setUrlInputListener(this);
         mUrlInput.setOnFocusChangeListener(this);
@@ -114,7 +127,38 @@
         mMore = findViewById(R.id.more_browser_settings);
         mMore.setOnClickListener(this);
         mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
-        mFaviconBadge = (ImageView) findViewById(R.id.favicon_badge);
+        mMagnify = (ImageView) findViewById(R.id.magnify);
+        mMagnify.setOnClickListener(this);
+        mFaviconTile = (SiteTileView) findViewById(R.id.favicon_view);
+        mFaviconTile.setOnClickListener(this);
+        mVoiceButton = findViewById(R.id.voice);
+        mVoiceButton.setOnClickListener(this);
+        mClearButton = (ImageView) findViewById(R.id.clear);
+        mClearButton.setOnClickListener(this);
+        mStopButton = (ImageView) findViewById(R.id.stop);
+        mStopButton.setOnClickListener(this);
+
+        mDefaultFavicon = BitmapFactory.decodeResource(getResources(),
+                R.drawable.ic_deco_favicon_normal);
+
+        mHandler = new Handler() {
+            @Override
+            public void handleMessage(Message m) {
+                switch (m.what) {
+                    case WEBREFINER_COUNTER_MSG:
+                        WebView wv = mUiController.getCurrentTopWebView();
+                        if (wv != null && WebRefiner.isInitialized()) {
+                            int count = WebRefiner.getInstance().getBlockedURLCount(wv);
+                            if (count > 0) {
+                                mFaviconTile.setExtraBlockedObjectsCount(count);
+                            }
+                        }
+                        mHandler.sendEmptyMessageDelayed(WEBREFINER_COUNTER_MSG,
+                                WEBREFINER_COUNTER_MSG_DELAY);
+                        break;
+                }
+            }
+        };
     }
 
     public void setTitleBar(TitleBar titleBar) {
@@ -124,30 +168,21 @@
         mUrlInput.setController(mUiController);
     }
 
-    public void setLock(Drawable d, Tab.SecurityState securityState) {
+    public void setSecurityState(Tab.SecurityState securityState) {
         mSecurityState = securityState;
-        if (mFaviconBadge != null) {
-            switch (mSecurityState) {
-                case SECURITY_STATE_SECURE:
-                    mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_good);
-                    break;
-                case SECURITY_STATE_MIXED:
-                    mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_warning);
-                    break;
-                case SECURITY_STATE_BAD_CERTIFICATE:
-                    mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_severe);
-                    break;
-                case SECURITY_STATE_NOT_SECURE:
-                default:
-                    mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_normal);
-            }
-        }
-        if (mLockIcon == null) return;
-        if (d == null) {
-            mLockIcon.setVisibility(View.GONE);
-        } else {
-            mLockIcon.setImageDrawable(d);
-            mLockIcon.setVisibility(View.VISIBLE);
+        switch (mSecurityState) {
+            case SECURITY_STATE_SECURE:
+                mFaviconTile.setTrustLevel(SiteTileView.TRUST_TRUSTED);
+                break;
+            case SECURITY_STATE_MIXED:
+                mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNTRUSTED);
+                break;
+            case SECURITY_STATE_BAD_CERTIFICATE:
+                mFaviconTile.setTrustLevel(SiteTileView.TRUST_AVOID);
+                break;
+            case SECURITY_STATE_NOT_SECURE:
+            default:
+                mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNKNOWN);
         }
     }
 
@@ -240,8 +275,11 @@
             setStatusAndNavigationBarColor(mUiController.getActivity(), mDefaultStatusBarColor);
         }
 
-        if (mFavicon == null) return;
-        mFavicon.setImageDrawable(mBaseUi.getFaviconDrawable(icon));
+        //Bitmap favicon = mUiController.getCurrentTopWebView().getFavicon();
+
+        if (mFaviconTile != null) {
+            mFaviconTile.replaceFavicon(mUiController.getCurrentTopWebView().getFavicon());
+        }
     }
 
     protected void showSiteSpecificSettings() {
@@ -304,8 +342,61 @@
 
     @Override
     public void onClick(View v) {
+        Tab currentTab = mUiController.getCurrentTab();
+        String url = null;
+        if (currentTab != null){
+            url = currentTab.getUrl();
+        }
         if (mMore == v) {
             showMenu(mMore);
+        } else if (mFaviconTile == v) {
+            if (urlHasSitePrefs(url)){
+                showSiteSpecificSettings();
+            }
+        } else if (mMagnify == v) {
+            startEditingUrl(true, true);
+        } else if (mVoiceButton == v) {
+            mUiController.startVoiceRecognizer();
+        } else if (mStopButton == v) {
+            stopOrRefresh();
+        } else if (mClearButton == v) {
+            clearOrClose();
+            mUrlInput.setText("");
+        }
+    }
+
+    private static boolean urlHasSitePrefs(String url) {
+        if (TextUtils.isEmpty(url)) {
+            return false;
+        }
+
+        for (int i = 0; i < noSitePrefs.length; i++) {
+            if (url.startsWith(noSitePrefs[i])) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void stopOrRefresh() {
+        if (mUiController == null) return;
+        if (mTitleBar.isInLoad()) {
+            mUiController.stopLoading();
+        } else {
+            if (mUiController.getCurrentTopWebView() != null) {
+                stopEditingUrl();
+                mUiController.getCurrentTopWebView().reload();
+            }
+        }
+    }
+
+    private void clearOrClose() {
+        if (TextUtils.isEmpty(mUrlInput.getText())) {
+            // close
+            mUrlInput.clearFocus();
+        } else {
+            // clear
+            mUrlInput.setText("");
         }
     }
 
@@ -610,11 +701,25 @@
     }
 
     public void onProgressStarted() {
-        mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_normal);
+        mFaviconTile.setExtraBlockedObjectsCount(0);
+        mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNKNOWN);
+        mFaviconTile.replaceFavicon(mDefaultFavicon);
         mSecurityState = Tab.SecurityState.SECURITY_STATE_NOT_SECURE;
+        mHandler.removeMessages(WEBREFINER_COUNTER_MSG);
+        mHandler.sendEmptyMessageDelayed(WEBREFINER_COUNTER_MSG,
+                WEBREFINER_COUNTER_MSG_DELAY);
+        mStopButton.setImageResource(R.drawable.ic_action_stop);
+        mStopButton.setContentDescription(getResources().
+                getString(R.string.accessibility_button_stop));
     }
 
     public void onProgressStopped() {
+        if (!isEditingUrl()) {
+            mFaviconTile.setVisibility(View.VISIBLE);
+        }
+        mStopButton.setImageResource(R.drawable.ic_action_reload);
+        mStopButton.setContentDescription(getResources().
+                getString(R.string.accessibility_button_refresh));
     }
 
     public void onTabDataChanged(Tab tab) {
@@ -636,14 +741,41 @@
 
     @Override
     public void onStateChanged(int state) {
+        mVoiceButton.setVisibility(View.GONE);
         switch(state) {
             case STATE_NORMAL:
+                mFaviconTile.setVisibility(View.VISIBLE);
+                mMagnify.setVisibility(View.GONE);
+                mClearButton.setVisibility(View.GONE);
                 mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
+                if (mUiController != null) {
+                    Tab currentTab = mUiController.getCurrentTab();
+                    if (currentTab != null){
+                        if (TextUtils.isEmpty(currentTab.getUrl())) {
+                            mFaviconTile.setVisibility(View.GONE);
+                            mMagnify.setVisibility(View.VISIBLE);
+                        }
+                    }
+                    mUiController.setWindowDimming(0.0f);
+                }
+
                 break;
             case STATE_HIGHLIGHTED:
+                mFaviconTile.setVisibility(View.GONE);
+                mMagnify.setVisibility(View.GONE);
+                mClearButton.setVisibility(View.GONE);
                 mMore.setVisibility(View.GONE);
+                if (mUiController != null) {
+                    mUiController.setWindowDimming(0.75f);
+                    if (mUiController.supportsVoice()) {
+                        mVoiceButton.setVisibility(View.VISIBLE);
+                    }
+                }
                 break;
             case STATE_EDITED:
+                mFaviconTile.setVisibility(View.GONE);
+                mMagnify.setVisibility(View.VISIBLE);
+                mClearButton.setVisibility(View.VISIBLE);
                 mMore.setVisibility(View.GONE);
                 break;
         }
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index e5f76ff..5b2bb75 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -16,53 +16,24 @@
 package com.android.browser;
 
 import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.view.View;
 
-import org.codeaurora.swe.Engine;
-import org.codeaurora.swe.WebRefiner;
-import org.codeaurora.swe.WebView;
 import org.codeaurora.swe.util.Activator;
 import org.codeaurora.swe.util.Observable;
 
-import android.widget.ImageView;
 import android.widget.TextView;
 import com.android.browser.UrlInputView.StateListener;
-import com.android.browser.preferences.AboutPreferencesFragment;
-import com.android.browser.preferences.SiteSpecificPreferencesFragment;
 
-import java.io.ByteArrayOutputStream;
+public class NavigationBarPhone extends NavigationBarBase implements StateListener {
 
-public class NavigationBarPhone extends NavigationBarBase implements
-        StateListener {
-
-    private ImageView mStopButton;
-    private ImageView mMagnify;
-    private ImageView mClearButton;
-    private ImageView mVoiceButton;
-    private Drawable mStopDrawable;
-    private Drawable mRefreshDrawable;
-    private String mStopDescription;
-    private String mRefreshDescription;
     private View mTabSwitcher;
     private TextView mTabText;
-    private View mComboIcon;
     private View mIncognitoIcon;
     private float mTabSwitcherInitialTextSize = 0;
     private float mTabSwitcherCompressedTextSize = 0;
 
-    private static final int MSG_UPDATE_NOTIFICATION_COUNTER = 4242;
-    private static final int NOTIFICATION_COUNTER_UPDATE_DELAY = 3000;
-    private TextView mNotificationCounter;
-    private Handler mHandler;
-
     public NavigationBarPhone(Context context) {
         super(context);
     }
@@ -78,24 +49,10 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mStopButton = (ImageView) findViewById(R.id.stop);
-        mStopButton.setOnClickListener(this);
-        mClearButton = (ImageView) findViewById(R.id.clear);
-        mClearButton.setOnClickListener(this);
-        mVoiceButton = (ImageView) findViewById(R.id.voice);
-        mVoiceButton.setOnClickListener(this);
-        mMagnify = (ImageView) findViewById(R.id.magnify);
         mTabSwitcher = findViewById(R.id.tab_switcher);
         mTabSwitcher.setOnClickListener(this);
         mTabText = (TextView) findViewById(R.id.tab_switcher_text);
-        mComboIcon = findViewById(R.id.iconcombo);
-        mComboIcon.setOnClickListener(this);
         setFocusState(false);
-        Resources res = getContext().getResources();
-        mStopDrawable = res.getDrawable(R.drawable.ic_action_stop);
-        mRefreshDrawable = res.getDrawable(R.drawable.ic_action_reload);
-        mStopDescription = res.getString(R.string.accessibility_button_stop);
-        mRefreshDescription = res.getString(R.string.accessibility_button_refresh);
         mUrlInput.setContainer(this);
         mUrlInput.setStateListener(this);
         mIncognitoIcon = findViewById(R.id.incognito_icon);
@@ -104,26 +61,6 @@
             mTabSwitcherInitialTextSize = mTabText.getTextSize();
             mTabSwitcherCompressedTextSize = (float) (mTabSwitcherInitialTextSize / 1.2);
         }
-
-        mNotificationCounter = (TextView) findViewById(R.id.notification_counter);
-        mHandler = new Handler() {
-            @Override
-            public void handleMessage(Message m) {
-                switch (m.what) {
-                    case MSG_UPDATE_NOTIFICATION_COUNTER:
-                        WebView wv = mUiController.getCurrentTopWebView();
-                        if (wv != null && WebRefiner.isInitialized()) {
-                            int count = WebRefiner.getInstance().getBlockedURLCount(wv);
-                            if (count > 0) {
-                                mNotificationCounter.setText(String.valueOf(count));
-                                mNotificationCounter.setVisibility(View.VISIBLE);
-                            }
-                        }
-                        mHandler.sendEmptyMessageDelayed(MSG_UPDATE_NOTIFICATION_COUNTER, NOTIFICATION_COUNTER_UPDATE_DELAY);
-                    break;
-                }
-            }
-        };
     }
 
     @Override
@@ -134,9 +71,11 @@
                     @Override
                     public void onChange(Object... params) {
                         if ((Integer)params[0] > 9) {
-                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTabSwitcherCompressedTextSize);
+                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+                                    mTabSwitcherCompressedTextSize);
                         } else {
-                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTabSwitcherInitialTextSize);
+                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+                                    mTabSwitcherInitialTextSize);
                         }
 
                         mTabText.setText(Integer.toString((Integer) params[0]));
@@ -146,30 +85,8 @@
     }
 
     @Override
-    public void onProgressStarted() {
-        super.onProgressStarted();
-        /*if (mStopButton.getDrawable() != mStopDrawable) {
-            mStopButton.setImageDrawable(mStopDrawable);
-            mStopButton.setContentDescription(mStopDescription);
-            if (mStopButton.getVisibility() != View.VISIBLE) {
-                mComboIcon.setVisibility(View.GONE);
-                mStopButton.setVisibility(View.VISIBLE);
-            }
-        }*/
-        mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_normal);
-        mNotificationCounter.setVisibility(View.INVISIBLE);
-        mHandler.removeMessages(MSG_UPDATE_NOTIFICATION_COUNTER);
-        mHandler.sendEmptyMessageDelayed(MSG_UPDATE_NOTIFICATION_COUNTER, NOTIFICATION_COUNTER_UPDATE_DELAY);
-    }
-
-    @Override
     public void onProgressStopped() {
         super.onProgressStopped();
-        //mStopButton.setImageDrawable(mRefreshDrawable);
-        //mStopButton.setContentDescription(mRefreshDescription);
-        if (!isEditingUrl()) {
-            mComboIcon.setVisibility(View.VISIBLE);
-        }
         onStateChanged(mUrlInput.getState());
     }
 
@@ -199,25 +116,8 @@
 
     @Override
     public void onClick(View v) {
-        if (v == mStopButton) {
-            if (mTitleBar.isInLoad()) {
-                mUiController.stopLoading();
-            } else {
-                WebView web = mBaseUi.getWebView();
-                if (web != null) {
-                    stopEditingUrl();
-                    Tab currentTab = mUiController.getTabControl().getCurrentTab();
-                    web.reload();
-                }
-            }
-        } else if (v == mTabSwitcher) {
+        if (v == mTabSwitcher) {
             ((PhoneUi) mBaseUi).toggleNavScreen();
-        } else if (mClearButton == v) {
-            mUrlInput.setText("");
-        } else if (mComboIcon == v) {
-            showSiteSpecificSettings();
-        } else if (mVoiceButton == v) {
-            mUiController.startVoiceRecognizer();
         } else {
             super.onClick(v);
         }
@@ -226,57 +126,39 @@
     @Override
     public void onFocusChange(View view, boolean hasFocus) {
         if (view == mUrlInput && !hasFocus) {
-            setDisplayTitle(mUrlInput.getText().toString());
+            Tab currentTab = mUiController.getTabControl().getCurrentTab();
+            setDisplayTitle(currentTab.getUrl());
         }
         super.onFocusChange(view, hasFocus);
     }
 
     @Override
     public void onStateChanged(int state) {
-        super.onStateChanged(state);
-        mVoiceButton.setVisibility(View.GONE);
         switch(state) {
         case StateListener.STATE_NORMAL:
-            mComboIcon.setVisibility(View.VISIBLE);
             mStopButton.setVisibility(View.GONE);
-            mClearButton.setVisibility(View.GONE);
-            mMagnify.setVisibility(View.GONE);
             mTabSwitcher.setVisibility(View.VISIBLE);
             mTabText.setVisibility(View.VISIBLE);
-            if (mUiController != null) {
-                mUiController.setWindowDimming(0.0f);
-            }
             break;
         case StateListener.STATE_HIGHLIGHTED:
-            mComboIcon.setVisibility(View.GONE);
-            mStopButton.setVisibility(View.VISIBLE);
-            mClearButton.setVisibility(View.GONE);
-            if ((mUiController != null) && mUiController.supportsVoice()) {
-                mVoiceButton.setVisibility(View.VISIBLE);
-            }
-            mMagnify.setVisibility(View.GONE);
-            mTabSwitcher.setVisibility(View.GONE);
-            mTabText.setVisibility(View.GONE);
-
             if (!mUrlInput.getText().toString().equals(mUrlInput.getTag())) {
                 // only change text if different
                 mUrlInput.setText((String) mUrlInput.getTag(), false);
                 mUrlInput.selectAll();
             }
 
-            if (mUiController != null) {
-                mUiController.setWindowDimming(0.75f);
-            }
+            mStopButton.setVisibility(View.VISIBLE);
+            mTabSwitcher.setVisibility(View.GONE);
+            mTabText.setVisibility(View.GONE);
+
             break;
         case StateListener.STATE_EDITED:
-            mComboIcon.setVisibility(View.GONE);
             mStopButton.setVisibility(View.GONE);
-            mClearButton.setVisibility(View.VISIBLE);
-            mMagnify.setVisibility(View.VISIBLE);
             mTabSwitcher.setVisibility(View.GONE);
             mTabText.setVisibility(View.GONE);
             break;
         }
+        super.onStateChanged(state);
     }
 
     @Override
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index c6c88cd..ce482d9 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -15,18 +15,10 @@
  */
 package com.android.browser;
 
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.ImageButton;
@@ -34,33 +26,17 @@
 
 import com.android.browser.UI.ComboViews;
 import com.android.browser.UrlInputView.StateListener;
-import com.android.browser.preferences.SiteSpecificPreferencesFragment;
-
-import org.codeaurora.swe.WebRefiner;
-import org.codeaurora.swe.WebView;
-
-import java.io.ByteArrayOutputStream;
 
 public class NavigationBarTablet extends NavigationBarBase implements StateListener {
 
-    private Drawable mStopDrawable;
-    private Drawable mReloadDrawable;
-    private String mStopDescription;
-    private String mRefreshDescription;
-
     private View mUrlContainer;
     private ImageButton mBackButton;
     private ImageButton mForwardButton;
     private ImageView mStar;
-    private ImageView mUrlIcon;
     private ImageView mSearchButton;
-    private ImageView mStopButton;
     private View mAllButton;
-    private View mClearButton;
-    private View mVoiceButton;
     private View mNavButtons;
     private boolean mHideNavButtons;
-    private Drawable mFaviconDrawable;
 
     public NavigationBarTablet(Context context) {
         super(context);
@@ -78,41 +54,26 @@
     }
 
     private void init(Context context) {
-        Resources resources = context.getResources();
-        mStopDrawable = resources.getDrawable(R.drawable.ic_action_stop);
-        mReloadDrawable = resources.getDrawable(R.drawable.ic_action_reload);
-        mStopDescription = resources.getString(R.string.accessibility_button_stop);
-        mRefreshDescription = resources.getString(R.string.accessibility_button_refresh);
-        mHideNavButtons = resources.getBoolean(R.bool.hide_nav_buttons);
+        mHideNavButtons = getResources().getBoolean(R.bool.hide_nav_buttons);
     }
 
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
         mAllButton = findViewById(R.id.all_btn);
-        // TODO: Change enabled states based on whether you can go
-        // back/forward.  Probably should be done inside onPageStarted.
         mNavButtons = findViewById(R.id.navbuttons);
         mBackButton = (ImageButton) findViewById(R.id.back);
         mForwardButton = (ImageButton) findViewById(R.id.forward);
-        mUrlIcon = (ImageView) findViewById(R.id.url_icon);
         mStar = (ImageView) findViewById(R.id.star);
-        mStopButton = (ImageView) findViewById(R.id.stop);
         mSearchButton = (ImageView) findViewById(R.id.search);
-        mClearButton = findViewById(R.id.clear);
-        mVoiceButton = findViewById(R.id.voice);
         mUrlContainer = findViewById(R.id.urlbar_focused);
         mBackButton.setOnClickListener(this);
         mForwardButton.setOnClickListener(this);
         mStar.setOnClickListener(this);
         mAllButton.setOnClickListener(this);
-        mStopButton.setOnClickListener(this);
         mSearchButton.setOnClickListener(this);
-        mClearButton.setOnClickListener(this);
-        mVoiceButton.setOnClickListener(this);
         mUrlInput.setContainer(mUrlContainer);
         mUrlInput.setStateListener(this);
-        mUrlIcon.setOnClickListener(this);
     }
 
     public void onConfigurationChanged(Configuration config) {
@@ -121,14 +82,9 @@
         mHideNavButtons = res.getBoolean(R.bool.hide_nav_buttons);
         if (mUrlInput.hasFocus()) {
             if (mHideNavButtons && (mNavButtons.getVisibility() == View.VISIBLE)) {
-                int aw = mNavButtons.getMeasuredWidth();
-                mNavButtons.setVisibility(View.GONE);
-                mNavButtons.setAlpha(0f);
-                mNavButtons.setTranslationX(-aw);
+                hideNavButtons();
             } else if (!mHideNavButtons && (mNavButtons.getVisibility() == View.GONE)) {
-                mNavButtons.setVisibility(View.VISIBLE);
-                mNavButtons.setAlpha(1f);
-                mNavButtons.setTranslationX(0);
+                showNavButtons();
             }
         }
     }
@@ -144,7 +100,6 @@
             mBackButton.setEnabled(tab.canGoBack());
             mForwardButton.setEnabled(tab.canGoForward());
         }
-        updateUrlIcon();
     }
 
     @Override
@@ -173,47 +128,11 @@
             mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         } else if (mSearchButton == v) {
             mBaseUi.editUrl(true, true);
-        } else if (mStopButton == v) {
-            stopOrRefresh();
-        } else if (mClearButton == v) {
-            clearOrClose();
-        } else if (mVoiceButton == v) {
-            mUiController.startVoiceRecognizer();
-        } else if (mUrlIcon == v) {
-            showSiteSpecificSettings();
         } else {
             super.onClick(v);
         }
     }
 
-    private void clearOrClose() {
-        if (TextUtils.isEmpty(mUrlInput.getText())) {
-            // close
-            mUrlInput.clearFocus();
-        } else {
-            // clear
-            mUrlInput.setText("");
-        }
-    }
-
-    @Override
-    public void setFavicon(Bitmap icon) {
-        super.setFavicon(icon);
-        mFaviconDrawable = mBaseUi.getFaviconDrawable(icon);
-        updateUrlIcon();
-    }
-
-    void updateUrlIcon() {
-        if (mUrlInput.hasFocus()) {
-            mUrlIcon.setImageResource(R.drawable.ic_action_search_normal);
-        } else {
-            if (mFaviconDrawable == null) {
-                mFaviconDrawable = mBaseUi.getFaviconDrawable(null);
-            }
-            mUrlIcon.setImageDrawable(mFaviconDrawable);
-        }
-    }
-
     @Override
     protected void setFocusState(boolean focus) {
         super.setFocusState(focus);
@@ -223,85 +142,26 @@
             }
             mSearchButton.setVisibility(View.GONE);
             mStar.setVisibility(View.GONE);
-            mUrlIcon.setImageResource(R.drawable.ic_action_search_normal);
         } else {
             if (mHideNavButtons) {
                 showNavButtons();
             }
             showHideStar(mUiController.getCurrentTab());
             mSearchButton.setVisibility(View.VISIBLE);
-            updateUrlIcon();
         }
     }
 
-    private void stopOrRefresh() {
-        if (mUiController == null) return;
-        if (mTitleBar.isInLoad()) {
-            mUiController.stopLoading();
-        } else {
-            if (mUiController.getCurrentTopWebView() != null) {
-                Tab currTab = mUiController.getTabControl().getCurrentTab();
-                mUiController.getCurrentTopWebView().reload();
-            }
-        }
-    }
-
-    @Override
-    public void onProgressStarted() {
-        mStopButton.setImageDrawable(mStopDrawable);
-        mStopButton.setContentDescription(mStopDescription);
-    }
-
-    @Override
-    public void onProgressStopped() {
-        mStopButton.setImageDrawable(mReloadDrawable);
-        mStopButton.setContentDescription(mRefreshDescription);
-    }
-
-    private AnimatorSet mAnimation;
-
     private void hideNavButtons() {
-        if (mBaseUi.blockFocusAnimations()) {
-            mNavButtons.setVisibility(View.GONE);
-            return;
-        }
-        int awidth = mNavButtons.getMeasuredWidth();
-        Animator anim1 = ObjectAnimator.ofFloat(mNavButtons, View.TRANSLATION_X, 0, - awidth);
-        Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", mUrlContainer.getLeft(),
-                mUrlContainer.getPaddingLeft());
-        Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA, 1f, 0f);
-        mAnimation = new AnimatorSet();
-        mAnimation.playTogether(anim1, anim2, anim3);
-        mAnimation.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mNavButtons.setVisibility(View.GONE);
-                mAnimation = null;
-            }
-        });
-        mAnimation.setDuration(150);
-        mAnimation.start();
+        int aw = mNavButtons.getMeasuredWidth();
+        mNavButtons.setVisibility(View.GONE);
+        mNavButtons.setAlpha(0f);
+        mNavButtons.setTranslationX(-aw);
     }
 
     private void showNavButtons() {
-        if (mAnimation != null) {
-            mAnimation.cancel();
-        }
         mNavButtons.setVisibility(View.VISIBLE);
+        mNavButtons.setAlpha(1f);
         mNavButtons.setTranslationX(0);
-        if (!mBaseUi.blockFocusAnimations()) {
-            int awidth = mNavButtons.getMeasuredWidth();
-            Animator anim1 = ObjectAnimator.ofFloat(mNavButtons,
-                    View.TRANSLATION_X, -awidth, 0);
-            Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", 0,
-                    awidth);
-            Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA,
-                    0f, 1f);
-            AnimatorSet combo = new AnimatorSet();
-            combo.playTogether(anim1, anim2, anim3);
-            combo.setDuration(150);
-            combo.start();
-        }
     }
 
     private void showHideStar(Tab tab) {
@@ -315,25 +175,4 @@
             mStar.setVisibility(starVisibility);
         }
     }
-
-    @Override
-    public void onStateChanged(int state) {
-        super.onStateChanged(state);
-        mVoiceButton.setVisibility(View.GONE);
-        switch(state) {
-        case STATE_NORMAL:
-            mClearButton.setVisibility(View.GONE);
-            break;
-        case STATE_HIGHLIGHTED:
-            mClearButton.setVisibility(View.GONE);
-            if ((mUiController != null) && mUiController.supportsVoice()) {
-                mVoiceButton.setVisibility(View.VISIBLE);
-            }
-            break;
-        case STATE_EDITED:
-            mClearButton.setVisibility(View.VISIBLE);
-            break;
-        }
-    }
-
 }
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index f3a08f7..774d2ba 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -24,10 +24,7 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Rect;
 import android.os.Bundle;
-import android.os.Message;
 import android.util.Log;
 import android.view.ActionMode;
 import android.view.KeyEvent;
@@ -38,16 +35,14 @@
 import android.view.ViewStub;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.DecelerateInterpolator;
-import android.webkit.ValueCallback;
+
 import org.codeaurora.swe.WebView;
 
-import android.widget.FrameLayout;
 import android.widget.ImageView;
 
 import com.android.browser.UrlInputView.StateListener;
 
 import org.codeaurora.net.NetworkServices;
-import org.codeaurora.swe.WebView;
 
 /**
  * Ui for regular phone screen sizes
@@ -55,15 +50,12 @@
 public class PhoneUi extends BaseUi {
 
     private static final String LOGTAG = "PhoneUi";
-    private static final int MSG_INIT_NAVSCREEN = 100;
 
     private NavScreen mNavScreen;
     private AnimScreen mAnimScreen;
     private final NavigationBarPhone mNavigationBar;
-    private final Activity mBrowser;
     private boolean mNavScreenRequested = false;
 
-    boolean mAnimating;
     boolean mShowNav = false;
     private ComboView mComboView;
 
@@ -75,7 +67,6 @@
     public PhoneUi(Activity browser, UiController controller) {
         super(browser, controller);
         mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar();
-        mBrowser = browser;
     }
 
     @Override
@@ -96,8 +87,11 @@
     public void showComboView(ComboViews startingView, Bundle extras) {
 
         if (mComboView == null) {
-            mNavScreen.setVisibility(View.GONE);
-            ViewStub stub = (ViewStub) mActivity.getWindow().getDecorView().findViewById(R.id.combo_view_stub);
+            if (mNavScreen != null) {
+                mNavScreen.setVisibility(View.GONE);
+            }
+            ViewStub stub = (ViewStub) mActivity.getWindow().
+                    getDecorView().findViewById(R.id.combo_view_stub);
             mComboView = (ComboView) stub.inflate();
             mComboView.setVisibility(View.GONE);
             mComboView.setupViews(mActivity);
@@ -125,7 +119,7 @@
             mNavScreen.close(mUiController.getTabControl().getCurrentPosition());
             return true;
         }
-        if (showingComboView()) {
+        if (isComboViewShowing()) {
             hideComboView();
             return true;
         }
@@ -136,39 +130,12 @@
         return mNavScreen != null && mNavScreen.getVisibility() == View.VISIBLE;
     }
 
-    private boolean showingComboView() {
-        return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
-    }
-
     @Override
     public boolean dispatchKey(int code, KeyEvent event) {
         return false;
     }
 
     @Override
-    public void onProgressChanged(Tab tab) {
-        super.onProgressChanged(tab);
-        if (mNavScreen == null && getTitleBar().getHeight() > 0) {
-            mHandler.sendEmptyMessage(MSG_INIT_NAVSCREEN);
-        }
-    }
-
-    @Override
-    protected void handleMessage(Message msg) {
-        super.handleMessage(msg);
-        if (msg.what == MSG_INIT_NAVSCREEN) {
-            if (mNavScreen == null) {
-                mNavScreen = new NavScreen(mActivity, mUiController, this);
-                mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
-                mNavScreen.setVisibility(View.GONE);
-            }
-            if (mAnimScreen == null) {
-                mAnimScreen = new AnimScreen(mActivity);
-            }
-        }
-    }
-
-    @Override
     public void setActiveTab(final Tab tab) {
         mTitleBar.cancelTitleBarAnimation(true);
         mTitleBar.setSkipTitleBarAnimations(true);
@@ -191,8 +158,6 @@
 
         // update nav bar state
         mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
-        updateLockIconToLatest(tab);
-        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     // menu handling callbacks
@@ -223,7 +188,7 @@
             menu.setGroupVisible(R.id.NAV_MENU, false);
         }
 
-        if (showingComboView()) {
+        if (isComboViewShowing()) {
             menu.setGroupVisible(R.id.MAIN_MENU, false);
             menu.setGroupEnabled(R.id.MAIN_MENU, false);
             menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false);
@@ -273,12 +238,12 @@
 
     @Override
     public boolean isWebShowing() {
-        return super.isWebShowing() && !showingNavScreen() && !showingComboView();
+        return super.isWebShowing() && !showingNavScreen() && !isComboViewShowing();
     }
 
     @Override
     public boolean isComboViewShowing() {
-        return showingComboView();
+        return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
     }
 
     @Override
@@ -386,7 +351,8 @@
         ObjectAnimator tx = ObjectAnimator.ofInt(mAnimScreen.mContent, "left", fromLeft, toLeft);
         ObjectAnimator ty = ObjectAnimator.ofInt(mAnimScreen.mContent, "top", fromTop, toTop);
         ObjectAnimator tr = ObjectAnimator.ofInt(mAnimScreen.mContent, "right", fromRight, toRight);
-        ObjectAnimator tb = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom", fromBottom, toBottom);
+        ObjectAnimator tb = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
+                fromBottom, toBottom);
         ObjectAnimator sx = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, toScaleFactor);
         ObjectAnimator navTabsIn = mNavScreen.createToolbarInAnimator();
         mAnimScreen.mContent.layout(fromLeft, fromTop, fromRight, fromBottom);
@@ -493,7 +459,8 @@
         ObjectAnimator l = ObjectAnimator.ofInt(mAnimScreen.mContent, "left", fromLeft, toLeft);
         ObjectAnimator t = ObjectAnimator.ofInt(mAnimScreen.mContent, "top", fromTop, toTop);
         ObjectAnimator r = ObjectAnimator.ofInt(mAnimScreen.mContent, "right", fromRight, toRight);
-        ObjectAnimator b = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom", fromBottom, toBottom);
+        ObjectAnimator b = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
+                fromBottom, toBottom);
         ObjectAnimator scale = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, scaleFactor);
         set.playTogether(animAppear, l, t, r, b, scale);
         set.setInterpolator(new DecelerateInterpolator());
@@ -563,7 +530,9 @@
     }
 
     private void finishAnimateOut() {
-        mNavScreen.setVisibility(View.GONE);
+        if (mNavScreen != null) {
+            mNavScreen.setVisibility(View.GONE);
+        }
         mCustomViewContainer.setAlpha(1f);
         mCustomViewContainer.setVisibility(View.GONE);
         mAnimScreen.set(null);
@@ -582,11 +551,6 @@
         }
     }
 
-    @Override
-    public boolean shouldCaptureThumbnails() {
-        return true;
-    }
-
     static class AnimScreen {
 
         private View mMain;
@@ -615,15 +579,6 @@
             mContent.setImageBitmap(viewportBitmap);
         }
 
-        /*private Bitmap safeCreateBitmap(int width, int height) {
-            if (width <= 0 || height <= 0) {
-                Log.w(LOGTAG, "safeCreateBitmap failed! width: " + width
-                        + ", height: " + height);
-                return null;
-            }
-            return Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
-        }*/
-
         public void set(Bitmap image) {
             mContent.setImageBitmap(image);
         }
diff --git a/src/com/android/browser/SiteTileView.java b/src/com/android/browser/SiteTileView.java
index 36f21c9..e22404f 100644
--- a/src/com/android/browser/SiteTileView.java
+++ b/src/com/android/browser/SiteTileView.java
@@ -57,12 +57,12 @@
  */
 public class SiteTileView extends View {
 
-    // external configuration constants
-    public static final int TYPE_SMALL = 1;
-    public static final int TYPE_MEDIUM = 2;
-    public static final int TYPE_LARGE = 3;
-    private static final int TYPE_AUTO = 0;
-    private static final int COLOR_AUTO = 0;
+    // public trust level constants
+    public static final int TRUST_UNKNOWN   =    0; // default
+    public static final int TRUST_AVOID     = 0x01;
+    public static final int TRUST_UNTRUSTED = 0x02;
+    public static final int TRUST_TRUSTED   = 0x04;
+    private static final int TRUST_MASK     = 0x07;
 
 
     // static configuration
@@ -72,8 +72,19 @@
     private static final int BACKGROUND_DRAWABLE_RES = R.drawable.img_tile_background;
     private static final float FILLER_RADIUS_DP = 2f; // sync with the bg image radius
     private static final int FILLER_FALLBACK_COLOR = Color.WHITE; // in case there is no favicon
-    private static final int OVERLINE_WIDTH_RES = R.dimen.SiteTileOverline;
-    private static final int OVERLINE_COLOR_RES = R.color.SiteTileOverline;
+    private static final int OVERLINE_WIDTH_RES = R.dimen.SiteTileOverlineWidth;
+    private static final int OVERLINE_COLOR_DEFAULT_RES = R.color.SiteTileOverlineUnknown;
+    private static final int OVERLINE_COLOR_TRUSTED_RES = R.color.SiteTileOverlineTrusted;
+    private static final int OVERLINE_COLOR_UNTRUSTED_RES = R.color.SiteTileOverlineUntrusted;
+    private static final int OVERLINE_COLOR_AVOID_RES = R.color.SiteTileOverlineAvoid;
+    private static final boolean SHOW_EXTRAS_BLOCKED_COUNT = true;
+
+    // internal enums
+    private static final int TYPE_SMALL = 1;
+    private static final int TYPE_MEDIUM = 2;
+    private static final int TYPE_LARGE = 3;
+    private static final int TYPE_AUTO = 0;
+    private static final int COLOR_AUTO = 0;
 
 
     // configuration
@@ -83,6 +94,20 @@
     private int mFaviconHeight = 0;
     private int mForcedType = TYPE_AUTO;
     private int mForcedFundamentalColor = COLOR_AUTO;
+    private boolean mFloating = false;
+    private int mTrustLevel = TRUST_UNKNOWN;
+    private int mExtraBlockedObjectsCount = 0;
+    private boolean mExtrasShown = false;
+
+    // runtime params set on Layout
+    private int mCurrentWidth = 0;
+    private int mCurrentHeight = 0;
+    private int mCurrentType = TYPE_MEDIUM;
+    private int mPaddingLeft = 0;
+    private int mPaddingTop = 0;
+    private int mPaddingRight = 0;
+    private int mPaddingBottom = 0;
+    private boolean mCurrentBackgroundDrawn = false;
 
     // static objects, to be recycled amongst instances (this is an optimization)
     private static int sMediumPxThreshold = -1;
@@ -90,6 +115,7 @@
     private static int sLargeFaviconPx = -1;
     private static float sRoundedRadius = -1;
     private static Paint sBitmapPaint = null;
+    private static Paint sExtrasPaint = null;
     private static Rect sSrcRect = new Rect();
     private static Rect sDstRect = new Rect();
     private static RectF sRectF = new RectF();
@@ -97,18 +123,6 @@
     private static Drawable sBackgroundDrawable = null;
     private static Rect sBackgroundDrawablePadding = new Rect();
 
-    // runtime params set on Layout
-    private int mCurrentWidth = 0;
-    private int mCurrentHeight = 0;
-    private int mCurrentType = TYPE_MEDIUM;
-    private boolean mCurrentBackgroundDrawn = false;
-    private boolean mFloating = false;
-    private int mPaddingLeft = 0;
-    private int mPaddingTop = 0;
-    private int mPaddingRight = 0;
-    private int mPaddingBottom = 0;
-
-
 
     /* XML constructors */
 
@@ -164,10 +178,47 @@
      * @param floating true to disable the background (defaults to false)
      */
     public void setFloating(boolean floating) {
-        mFloating = floating;
-        invalidate();
+        if (mFloating != floating) {
+            mFloating = floating;
+            invalidate();
+        }
     }
 
+    /**
+     * For 'Medium' tiles updates the border and corner badges
+     * @param trustLevel one of the TRUST_ constants
+     */
+    public void setTrustLevel(int trustLevel) {
+        if (mTrustLevel != trustLevel) {
+            mTrustLevel = trustLevel;
+            if (requiresOverline())
+                invalidate();
+        }
+    }
+
+    /**
+     * Sets the number of objects blocked (a positive contribution to the page). Presentation
+     * may or may not have the number indication.
+     * @param sessionCounter Counter of blocked objects. Use 0 to not display anything.
+     */
+    public void setExtraBlockedObjectsCount(int sessionCounter) {
+        if (sessionCounter != mExtraBlockedObjectsCount) {
+            mExtraBlockedObjectsCount = sessionCounter;
+            updateExtrasShown();
+            if (SHOW_EXTRAS_BLOCKED_COUNT)
+                invalidate();
+        }
+    }
+
+    private void updateExtrasShown() {
+        boolean shouldBeShown = mExtraBlockedObjectsCount > 0;
+        if (shouldBeShown != mExtrasShown) {
+            mExtrasShown = shouldBeShown;
+            invalidate();
+        }
+    }
+
+
 
     /**
      * @return The fundamental color representing the site.
@@ -198,8 +249,14 @@
             mForcedType = TYPE_SMALL;
 
         // check if we want it floating (disable shadow and filler)
-        if (a.getBoolean(R.styleable.SiteTileView_floating, false))
-            mFloating = true;
+        setFloating(a.getBoolean(R.styleable.SiteTileView_floating, false));
+
+        // read the trust level (unknown, aka 'default', if not present)
+        setTrustLevel(a.getInteger(R.styleable.SiteTileView_trustLevel, TRUST_UNKNOWN)
+                & TRUST_MASK);
+
+        // read the amount of blocked objects (or 0 if not present)
+        setExtraBlockedObjectsCount(a.getInteger(R.styleable.SiteTileView_blockedObjects, 0));
 
         // delete attribute resolution
         a.recycle();
@@ -241,14 +298,18 @@
             sBitmapPaint.setFilterBitmap(true);
 
             // overline configuration (null if we don't need it)
-            int ovlColor = getResources().getColor(OVERLINE_COLOR_RES);
             float ovlWidthPx = getResources().getDimension(OVERLINE_WIDTH_RES);
-            if (ovlWidthPx > 0.5 && ovlColor != Color.TRANSPARENT) {
+            if (ovlWidthPx > 0.5) {
                 sOverlineOutlinePaint = new Paint();
-                sOverlineOutlinePaint.setColor(ovlColor);
                 sOverlineOutlinePaint.setStrokeWidth(ovlWidthPx);
                 sOverlineOutlinePaint.setStyle(Paint.Style.STROKE);
             }
+
+            // extras paint (anti-aliased)
+            sExtrasPaint = new Paint();
+            sExtrasPaint.setAntiAlias(true);
+            sExtrasPaint.setColor(getResources().getColor(OVERLINE_COLOR_TRUSTED_RES));
+            sExtrasPaint.setStrokeWidth(Math.max(ovlWidthPx, 1));
         }
 
         // change when clicked
@@ -421,10 +482,70 @@
         }
 
         // D. (when needed) draw the thin over-line
-        boolean requiresOverline = mCurrentType == TYPE_MEDIUM
-                && sOverlineOutlinePaint != null;
-        if (requiresOverline) {
-            canvas.drawRect(left, top, right, bottom, sOverlineOutlinePaint);
+        if (requiresOverline()) {
+            int colorRes;
+            switch (mTrustLevel) {
+                case TRUST_TRUSTED:
+                    colorRes = OVERLINE_COLOR_TRUSTED_RES;
+                    break;
+                case TRUST_UNTRUSTED:
+                    colorRes = OVERLINE_COLOR_UNTRUSTED_RES;
+                    break;
+                case TRUST_AVOID:
+                    colorRes = OVERLINE_COLOR_AVOID_RES;
+                    break;
+                default:
+                    colorRes = OVERLINE_COLOR_DEFAULT_RES;
+                    break;
+            }
+            int lineColor = getResources().getColor(colorRes);
+            if (lineColor != Color.TRANSPARENT) {
+                // draw the white inline first
+                boolean needSeparation = mTrustLevel != TRUST_UNKNOWN;
+                if (needSeparation) {
+                    sOverlineOutlinePaint.setColor(Color.WHITE);
+                    float d = sOverlineOutlinePaint.getStrokeWidth();
+                    canvas.drawRect(left + d, top + d, right - d, bottom - d, sOverlineOutlinePaint);
+                }
+
+                // then draw the outline
+                sOverlineOutlinePaint.setColor(lineColor);
+                canvas.drawRect(left, top, right, bottom, sOverlineOutlinePaint);
+            }
+        }
+
+        // E. show extra, if requested
+        if (mExtrasShown) {
+            // as default, we show a bubble
+            int eRad = Math.min(2 * contentWidth / 5, sMediumPxThreshold / 4);
+            int eCX = Math.min(right - eRad / 2, mCurrentWidth - eRad); //left + (4 * contentWidth / 5) - eRad;
+            int eCY = Math.min(bottom - eRad / 4, mCurrentHeight - eRad);
+
+            // circle back
+            //canvas.drawCircle(eCX, eCY, eRad, sExtrasPaint);
+
+            // round rect back
+            sRectF.set(eCX - eRad, eCY - eRad, eCX + eRad, eCY + eRad);
+            sExtrasPaint.setStyle(Paint.Style.FILL);
+            sExtrasPaint.setColor(0xff666666);
+            canvas.drawRoundRect(sRectF, eRad / 2, eRad / 2, sExtrasPaint);
+
+            // DEBUG! -- draw blocked count
+            if (SHOW_EXTRAS_BLOCKED_COUNT && mExtraBlockedObjectsCount > 0) {
+                final Paint paint = new Paint();
+                float textSize = eRad * 1.2f;
+                paint.setColor(Color.WHITE);
+                paint.setAntiAlias(true);
+                paint.setTextSize(textSize);
+                String text = String.valueOf(mExtraBlockedObjectsCount);
+                int textWidth = Math.round(paint.measureText(text) / 2);
+                canvas.drawText(text, eCX - textWidth - 1, eCY + textSize / 3 + 1, paint);
+            }
+
+            // round rect stroke
+            sExtrasPaint.setStyle(Paint.Style.STROKE);
+            sExtrasPaint.setColor(0xFFeeeeee);
+            canvas.drawRoundRect(sRectF, eRad / 2, eRad / 2, sExtrasPaint);
         }
 
         /*if (true) { // DEBUG TYPE
@@ -435,6 +556,10 @@
         }*/
     }
 
+    private boolean requiresOverline() {
+        return mCurrentType == TYPE_MEDIUM && sOverlineOutlinePaint != null && !mFloating;
+    }
+
 
     /**
      * Creates a fill Paint from the favicon, or using the forced color (if not COLOR_AUTO)
@@ -499,11 +624,30 @@
      * @return Color, but if it's 0, you should discard it (not representative)
      */
     private static int sampleColor(Bitmap bitmap, int x, int y) {
-        int color = bitmap.getPixel(x, y);
+        final int color = bitmap.getPixel(x, y);
+
         // discard semi-transparent pixels, because they're probably from a spurious border
+        //if ((color >>> 24) <= 128)
+        //    return 0;
+
+        // compose transparent pixels with white, since the BG will be white anyway
+        final int alpha = Color.alpha(color);
+        if (alpha == 0)
+            return Color.WHITE;
+        if (alpha < 255) {
+            // perform simplified Porter-Duff source-over
+            int dstContribution = 255 - alpha;
+            return Color.argb(255,
+                    ((alpha * Color.red(color)) >> 8) + dstContribution,
+                    ((alpha * Color.green(color)) >> 8) + dstContribution,
+                    ((alpha * Color.blue(color)) >> 8) + dstContribution
+            );
+        }
+
         // discard black pixels, because black is not a color (well, not a good looking one)
-        if ((color >>> 24) <= 128 || (color & 0xFFFFFF) == 0)
+        if ((color & 0xFFFFFF) == 0)
             return 0;
+
         return color;
     }
 
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 8aa6995..e446145 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -423,7 +423,6 @@
             public void onAnimationEnd(Animator animation) {
                 mTabs.removeTab(tv);
                 mTabMap.remove(tab);
-                mUi.onRemoveTabCompleted(tab);
             }
 
             @Override
@@ -449,7 +448,6 @@
 
             @Override
             public void onAnimationEnd(Animator animation) {
-                mUi.onAddTabCompleted(tab);
             }
 
             @Override
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 254e73d..f4a3f5b 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -21,7 +21,6 @@
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.PaintDrawable;
@@ -37,9 +36,6 @@
 import android.webkit.WebChromeClient;
 
 import org.codeaurora.swe.WebView;
-import org.codeaurora.swe.util.ColorUtils;
-
-import com.android.browser.R;
 
 import java.util.List;
 
@@ -82,7 +78,8 @@
 
     public void showComboView(ComboViews startWith, Bundle extras) {
         if (mComboView == null) {
-            ViewStub stub = (ViewStub) mActivity.getWindow().getDecorView().findViewById(R.id.combo_view_stub);
+            ViewStub stub = (ViewStub) mActivity.getWindow().getDecorView().
+                    findViewById(R.id.combo_view_stub);
             mComboView = (ComboView) stub.inflate();
             mComboView.setVisibility(View.GONE);
             mComboView.setupViews(mActivity);
@@ -102,7 +99,7 @@
 
     @Override
     public void hideComboView() {
-        if (showingComboView()) {
+        if (isComboViewShowing()) {
             mComboView.hideViews();
             mActionBar = mActivity.getActionBar();
             setupActionBar();
@@ -114,30 +111,22 @@
 
     @Override
     public boolean onBackKey() {
-        if (showingComboView()) {
+        if (isComboViewShowing()) {
             hideComboView();
             return true;
         }
         return super.onBackKey();
     }
 
-    private boolean showingComboView() {
-        return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
-    }
-
     @Override
     public boolean isComboViewShowing() {
-        return showingComboView();
-    }
-
-    private void checkHideActionBar() {
+        return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
     }
 
     @Override
     public void onResume() {
         super.onResume();
         mNavBar.clearCompletions();
-        checkHideActionBar();
     }
 
     @Override
@@ -185,10 +174,6 @@
         mTabBar.onNewTab(tab);
     }
 
-    protected void onAddTabCompleted(Tab tab) {
-        checkHideActionBar();
-    }
-
     @Override
     public void setActiveTab(final Tab tab) {
         mTitleBar.cancelTitleBarAnimation(true);
@@ -202,14 +187,11 @@
             return;
         }
         mTabBar.onSetActiveTab(tab);
-        updateLockIconToLatest(tab);
-        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     @Override
     public void updateTabs(List<Tab> tabs) {
         mTabBar.updateTabs(tabs);
-        checkHideActionBar();
     }
 
     @Override
@@ -229,10 +211,6 @@
             mActionBar.hide();
     }
 
-    protected void onRemoveTabCompleted(Tab tab) {
-        checkHideActionBar();
-    }
-
     int getContentWidth() {
         if (mContentView != null) {
             return mContentView.getWidth();
@@ -257,7 +235,6 @@
 
     @Override
     public void onActionModeFinished(boolean inLoad) {
-        checkHideActionBar();
         if (inLoad) {
             // the titlebar was removed when the CAB was shown
             // if the page is loading, show it again
@@ -295,7 +272,6 @@
     @Override
     public void onHideCustomView() {
         super.onHideCustomView();
-        checkHideActionBar();
         if (mActionBar != null)
             mActionBar.show();
     }
@@ -328,10 +304,6 @@
         return evt.getUnicodeChar() > 0;
     }
 
-    TabBar getTabBar() {
-        return mTabBar;
-    }
-
     @Override
     public boolean shouldCaptureThumbnails() {
         return false;
@@ -363,7 +335,8 @@
             d.setLayerInset(1, 2, 2, 2, 2);
             return d;
         }
-        return icon == null ? getGenericFavicon() : new BitmapDrawable(mActivity.getResources(), icon);
+        return icon == null ? getGenericFavicon() :
+                new BitmapDrawable(mActivity.getResources(), icon);
     }
 
 }
