diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index a04f5e0..9dbfe24 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -63,7 +63,7 @@
  */
 public abstract class BaseUi implements UI {
 
-    private static final String LOGTAG = "BaseUi";
+    protected static final boolean ENABLE_BORDER_AROUND_FAVICON = false;
 
     protected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
         new FrameLayout.LayoutParams(
@@ -117,9 +117,10 @@
         mActivity = browser;
         mUiController = controller;
         mTabControl = controller.getTabControl();
-        Resources res = mActivity.getResources();
         mInputManager = (InputMethodManager)
                 browser.getSystemService(Activity.INPUT_METHOD_SERVICE);
+        // This assumes that the top-level root of our layout has the 'android.R.id.content' id
+        // it's used in place of setContentView because we're attaching a <merge> here.
         FrameLayout frameLayout = (FrameLayout) mActivity.getWindow()
                 .getDecorView().findViewById(android.R.id.content);
         LayoutInflater.from(mActivity)
@@ -856,19 +857,22 @@
     }
 
     public Drawable getFaviconDrawable(Bitmap icon) {
-        Drawable[] array = new Drawable[3];
-        array[0] = new PaintDrawable(Color.BLACK);
-        PaintDrawable p = new PaintDrawable(Color.WHITE);
-        array[1] = p;
-        if (icon == null) {
-            array[2] = getGenericFavicon();
-        } else {
-            array[2] = new BitmapDrawable(icon);
+        if (ENABLE_BORDER_AROUND_FAVICON) {
+            Drawable[] array = new Drawable[3];
+            array[0] = new PaintDrawable(Color.BLACK);
+            PaintDrawable p = new PaintDrawable(Color.WHITE);
+            array[1] = p;
+            if (icon == null) {
+                array[2] = getGenericFavicon();
+            } else {
+                array[2] = new BitmapDrawable(mActivity.getResources(), icon);
+            }
+            LayerDrawable d = new LayerDrawable(array);
+            d.setLayerInset(1, 1, 1, 1, 1);
+            d.setLayerInset(2, 2, 2, 2, 2);
+            return d;
         }
-        LayerDrawable d = new LayerDrawable(array);
-        d.setLayerInset(1, 1, 1, 1, 1);
-        d.setLayerInset(2, 2, 2, 2, 2);
-        return d;
+        return icon == null ? getGenericFavicon() : new BitmapDrawable(mActivity.getResources(), icon);
     }
 
     public boolean isLoading() {
@@ -897,6 +901,14 @@
         mHandler.sendMessageDelayed(msg, duration);
     }
 
+    protected void setMenuItemVisibility(Menu menu, int id,
+                                         boolean visibility) {
+        MenuItem item = menu.findItem(id);
+        if (item != null) {
+            item.setVisible(visibility);
+        }
+    }
+
     protected Handler mHandler = new Handler() {
 
         @Override
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 3b95ee9..4b9f48c 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -305,7 +305,7 @@
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
-        return mController.onPrepareOptionsMenu(menu);
+        return false;
     }
 
     @Override
diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java
index 5d71ce3..e2348a5 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -30,6 +30,7 @@
  * Manage WebView scroll events
  */
 public class BrowserWebView extends WebView implements WebView.TitleBarDelegate {
+    private static final boolean ENABLE_ROOTVIEW_BACKREMOVAL_OPTIMIZATION = true;
 
     public interface OnScrollChangedListener {
         void onScrollChanged(int l, int t, int oldl, int oldt);
@@ -121,13 +122,17 @@
     @Override
     public void onDraw(Canvas c) {
         super.onDraw(c);
-        if (!mBackgroundRemoved && getRootView().getBackground() != null) {
-            mBackgroundRemoved = true;
-            post(new Runnable() {
-                public void run() {
-                    getRootView().setBackgroundDrawable(null);
-                }
-            });
+
+        // if enabled, removes the background from the main view (assumes coverage with opaqueness)
+        if (ENABLE_ROOTVIEW_BACKREMOVAL_OPTIMIZATION) {
+            if (!mBackgroundRemoved && getRootView().getBackground() != null) {
+                mBackgroundRemoved = true;
+                post(new Runnable() {
+                    public void run() {
+                        getRootView().setBackgroundDrawable(null);
+                    }
+                });
+            }
         }
     }
 
@@ -137,6 +142,7 @@
 
     @Override
     public void onScrollChanged(int l, int t, int oldl, int oldt) {
+        // NOTE: this function seems to not be called when the WebView is scrolled (it may be fine)
         super.onScrollChanged(l, t, oldl, oldt);
         if (mTitleBar != null) {
             mTitleBar.onScrollChanged();
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index b0657c9..77f4032 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -2281,7 +2281,7 @@
     private void showExitDialog(final Activity activity) {
         new AlertDialog.Builder(activity)
                 .setTitle(R.string.exit_browser_title)
-                .setIcon(android.R.drawable.ic_dialog_alert)
+                /* disabled, was worrying people: .setIcon(android.R.drawable.ic_dialog_alert) */
                 .setMessage(R.string.exit_browser_msg)
                 .setNegativeButton(R.string.exit_minimize, new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int which) {
@@ -2295,7 +2295,6 @@
                         mHandler.postDelayed(new Runnable() {
                             @Override
                             public void run() {
-                                // TODO Auto-generated method stub
                                 mCrashRecoveryHandler.clearState(true);
                                 int pid = android.os.Process.myPid();
                                 android.os.Process.killProcess(pid);
@@ -3216,7 +3215,7 @@
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0) {
             // Hardware menu key
-            mAppMenuHandler.showAppMenu(mActivity.findViewById(R.id.more_browser_settings),
+            mAppMenuHandler.showAppMenu(mActivity.findViewById(R.id.taburlbar),
                     true, false);
             return true;
         }
diff --git a/src/com/android/browser/GeolocationPermissionsPrompt.java b/src/com/android/browser/GeolocationPermissionsPrompt.java
index d0e94ad..cab6deb 100755
--- a/src/com/android/browser/GeolocationPermissionsPrompt.java
+++ b/src/com/android/browser/GeolocationPermissionsPrompt.java
@@ -16,8 +16,6 @@
 
 package com.android.browser;
 
-import com.android.browser.R;
-
 import org.codeaurora.swe.GeolocationPermissions;
 import org.json.JSONArray;
 
@@ -29,11 +27,11 @@
 import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.CompoundButton;
-import android.widget.RelativeLayout;
+import android.widget.LinearLayout;
 import android.widget.TextView;
 import android.widget.Toast;
 
-public class GeolocationPermissionsPrompt extends RelativeLayout {
+public class GeolocationPermissionsPrompt extends LinearLayout {
     private TextView mMessage;
     private Button mShareButton;
     private Button mShareForLimitedTimeButton;
diff --git a/src/com/android/browser/LocationButton.java b/src/com/android/browser/LocationButton.java
index 4136d6e..c80c0e8 100644
--- a/src/com/android/browser/LocationButton.java
+++ b/src/com/android/browser/LocationButton.java
@@ -208,10 +208,10 @@
                             public void onReceiveValue(Boolean allowed) {
                                 if (allowed != null) {
                                     if (allowed.booleanValue()) {
-                                        LocationButton.this.setImageResource(R.drawable.ic_gps_on_holo_dark);
+                                        LocationButton.this.setImageResource(R.drawable.ic_action_gps_on);
                                         LocationButton.this.setVisibility(VISIBLE);
                                     } else {
-                                        LocationButton.this.setImageResource(R.drawable.ic_gps_denied_holo_dark);
+                                        LocationButton.this.setImageResource(R.drawable.ic_action_gps_off);
                                         LocationButton.this.setVisibility(VISIBLE);
                                     }
                                 }
@@ -230,8 +230,8 @@
     @Override
     public void onGeolocationPolicyAdded(String origin, boolean allow) {
         if (mCurrentOrigin != null && mCurrentOrigin.equals(origin)) {
-            this.setImageResource(allow ? R.drawable.ic_gps_on_holo_dark :
-                R.drawable.ic_gps_denied_holo_dark);
+            this.setImageResource(allow ? R.drawable.ic_action_gps_on :
+                R.drawable.ic_action_gps_off);
             this.setVisibility(VISIBLE);
         }
     }
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index 64243e3..0962449 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -27,20 +27,14 @@
 import android.view.ViewConfiguration;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
-import android.widget.FrameLayout;
 import android.widget.ImageButton;
-import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.PopupMenu;
 import android.widget.PopupMenu.OnMenuItemClickListener;
 import android.widget.RelativeLayout;
-import android.widget.TextView;
 
-import com.android.browser.R;
-import com.android.browser.NavTabScroller.OnLayoutListener;
 import com.android.browser.NavTabScroller.OnRemoveListener;
 import com.android.browser.TabControl.OnThumbnailUpdatedListener;
-import com.android.browser.UI.ComboViews;
 
 import java.util.HashMap;
 
@@ -50,19 +44,12 @@
 
     UiController mUiController;
     PhoneUi mUi;
-    Tab mTab;
     Activity mActivity;
 
-    ImageButton mRefresh;
-    ImageButton mForward;
-    ImageButton mBookmarks;
+    View mToolbarLayout;
     ImageButton mMore;
     ImageButton mNewTab;
-    FrameLayout mHolder;
-
-    TextView mTitle;
-    ImageView mFavicon;
-    ImageButton mCloseTab;
+    ImageButton mNewIncognitoTab;
 
     NavTabScroller mScroller;
     TabAdapter mAdapter;
@@ -94,10 +81,6 @@
         return mUiController.onOptionsItemSelected(item);
     }
 
-    protected float getToolbarHeight() {
-        return mActivity.getResources().getDimension(R.dimen.toolbar_height);
-    }
-
     @Override
     protected void onConfigurationChanged(Configuration newconfig) {
         if (newconfig.orientation != mOrientation) {
@@ -119,10 +102,11 @@
         LayoutInflater.from(getContext()).inflate(R.layout.nav_screen, this);
         setContentDescription(getContext().getResources().getString(
                 R.string.accessibility_transition_navscreen));
-        mBookmarks = (ImageButton) findViewById(R.id.bookmarks);
+        mToolbarLayout = findViewById(R.id.nav_toolbar_animate);
+        mNewIncognitoTab = (ImageButton) findViewById(R.id.newincognitotab);
         mNewTab = (ImageButton) findViewById(R.id.newtab);
         mMore = (ImageButton) findViewById(R.id.more);
-        mBookmarks.setOnClickListener(this);
+        mNewIncognitoTab.setOnClickListener(this);
         mNewTab.setOnClickListener(this);
         mMore.setOnClickListener(this);
         mScroller = (NavTabScroller) findViewById(R.id.scroller);
@@ -148,10 +132,10 @@
 
     @Override
     public void onClick(View v) {
-        if (mBookmarks == v) {
-            mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
-        } else if (mNewTab == v) {
+        if (mNewTab == v) {
             openNewTab();
+        } else if (mNewIncognitoTab == v) {
+            openNewIncognitoTab();
         } else if (mMore == v) {
             showMenu();
         }
@@ -168,6 +152,18 @@
         }
     }
 
+    private void openNewIncognitoTab() {
+        final Tab tab = mUiController.openIncognitoTab();
+        if (tab != null) {
+            mUiController.setBlockEvents(true);
+            final int tix = mUi.mTabControl.getTabPosition(tab);
+            switchToTab(tab);
+            mUi.hideNavScreen(tix, true);
+            mScroller.handleDataChanged(tix);
+            mUiController.setBlockEvents(false);
+        }
+    }
+
     private void openNewTab() {
         // need to call openTab explicitely with setactive false
         final Tab tab = mUiController.openTab(BrowserSettings.getInstance().getHomePage(),
diff --git a/src/com/android/browser/NavTabScroller.java b/src/com/android/browser/NavTabScroller.java
index a23ebe9..39c73ac 100644
--- a/src/com/android/browser/NavTabScroller.java
+++ b/src/com/android/browser/NavTabScroller.java
@@ -135,7 +135,7 @@
     }
 
     private void calcPadding() {
-        if (mAdapter.getCount() > 0) {
+        if (mAdapter != null && mAdapter.getCount() > 0) {
             View v = mContentView.getChildAt(0);
             if (mHorizontal) {
                 int pad = (getMeasuredWidth() - v.getMeasuredWidth()) / 2 + 2;
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index ec18786..01435b6 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -15,6 +15,7 @@
  */
 package com.android.browser;
 
+import android.app.Activity;
 import android.app.SearchManager;
 import android.content.ActivityNotFoundException;
 import android.content.Context;
@@ -28,11 +29,15 @@
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnFocusChangeListener;
+import android.view.ViewConfiguration;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+import android.widget.PopupMenu;
 import android.widget.Toast;
 
 import com.android.browser.R;
@@ -45,7 +50,8 @@
 
 public class NavigationBarBase extends LinearLayout implements
         OnClickListener, UrlInputListener, OnFocusChangeListener,
-        TextWatcher {
+        TextWatcher, UrlInputView.StateListener,
+        PopupMenu.OnMenuItemClickListener, PopupMenu.OnDismissListener {
 
     private final static String TAG = "NavigationBarBase";
 
@@ -58,6 +64,10 @@
     private ImageView mFavicon;
     private ImageView mLockIcon;
 
+    private View mMore;
+    private PopupMenu mPopupMenu;
+    private boolean mOverflowMenuShowing;
+    private boolean mNeedsMenu;
 
     public NavigationBarBase(Context context) {
         super(context);
@@ -82,6 +92,9 @@
         mUrlInput.setOnFocusChangeListener(this);
         mUrlInput.setSelectAllOnFocus(true);
         mUrlInput.addTextChangedListener(this);
+        mMore = findViewById(R.id.more_browser_settings);
+        mMore.setOnClickListener(this);
+        mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
     }
 
     public void setTitleBar(TitleBar titleBar) {
@@ -108,6 +121,30 @@
 
     @Override
     public void onClick(View v) {
+        if (mMore == v) {
+            showMenu(mMore);
+        }
+    }
+
+    void showMenu(View anchor) {
+        Activity activity = mUiController.getActivity();
+        if (mPopupMenu == null) {
+            mPopupMenu = new PopupMenu(getContext(), anchor);
+            mPopupMenu.setOnMenuItemClickListener(this);
+            mPopupMenu.setOnDismissListener(this);
+            if (!activity.onCreateOptionsMenu(mPopupMenu.getMenu())) {
+                mPopupMenu = null;
+                return;
+            }
+        }
+        Menu menu = mPopupMenu.getMenu();
+
+        if (mUiController instanceof Controller) {
+            Controller controller = (Controller) mUiController;
+            if (controller.onPrepareOptionsMenu(menu)) {
+                mOverflowMenuShowing = true;
+            }
+        }
     }
 
     @Override
@@ -389,10 +426,6 @@
     public void onProgressStopped() {
     }
 
-    public boolean isMenuShowing() {
-        return false;
-    }
-
     public void onTabDataChanged(Tab tab) {
         mLocationButton.onTabDataChanged(tab);
     }
@@ -411,4 +444,41 @@
     @Override
     public void afterTextChanged(Editable s) { }
 
+    @Override
+    public void onStateChanged(int state) {
+        switch(state) {
+            case STATE_NORMAL:
+                mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
+                break;
+            case STATE_HIGHLIGHTED:
+                mMore.setVisibility(View.GONE);
+                break;
+            case STATE_EDITED:
+                mMore.setVisibility(View.GONE);
+                break;
+        }
+    }
+
+    public boolean isMenuShowing() {
+        return mOverflowMenuShowing;
+    }
+
+
+    @Override
+    public void onDismiss(PopupMenu popupMenu) {
+        if (popupMenu == mPopupMenu) {
+            onMenuHidden();
+        }
+    }
+
+    private void onMenuHidden() {
+        mOverflowMenuShowing = false;
+        mBaseUi.showTitleBarForDuration();
+    }
+
+
+    @Override
+    public boolean onMenuItemClick(MenuItem item) {
+        return mUiController.onOptionsItemSelected(item);
+    }
 }
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index fe5ca28..f528e8f 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -15,26 +15,22 @@
  */
 package com.android.browser;
 
-import android.app.Activity;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
-import android.view.Menu;
-import android.view.MenuItem;
+import android.util.TypedValue;
 import android.view.View;
-import android.view.ViewConfiguration;
 import org.codeaurora.swe.WebView;
-import android.widget.ImageView;
-import android.widget.PopupMenu;
-import android.widget.PopupMenu.OnDismissListener;
-import android.widget.PopupMenu.OnMenuItemClickListener;
+import org.codeaurora.swe.util.Activator;
+import org.codeaurora.swe.util.Observable;
 
-import com.android.browser.R;
+import android.widget.ImageView;
+import android.widget.TextView;
 import com.android.browser.UrlInputView.StateListener;
 
 public class NavigationBarPhone extends NavigationBarBase implements
-        StateListener, OnMenuItemClickListener, OnDismissListener {
+        StateListener {
 
     private ImageView mStopButton;
     private ImageView mMagnify;
@@ -45,14 +41,12 @@
     private String mStopDescription;
     private String mRefreshDescription;
     private View mTabSwitcher;
+    private TextView mTabText;
     private View mComboIcon;
-    private View mTitleContainer;
-    private View mMore;
-    private Drawable mTextfieldBgDrawable;
-    private PopupMenu mPopupMenu;
-    private boolean mOverflowMenuShowing;
-    private boolean mNeedsMenu;
     private View mIncognitoIcon;
+    private float mTabSwitcherInitialTextSize = 0;
+    private float mTabSwitcherCompressedTextSize = 0;
+
 
     public NavigationBarPhone(Context context) {
         super(context);
@@ -78,22 +72,42 @@
         mMagnify = (ImageView) findViewById(R.id.magnify);
         mTabSwitcher = findViewById(R.id.tab_switcher);
         mTabSwitcher.setOnClickListener(this);
-        mMore = findViewById(R.id.more_browser_settings);
-        mMore.setOnClickListener(this);
+        mTabText = (TextView) findViewById(R.id.tab_switcher_text);
         mComboIcon = findViewById(R.id.iconcombo);
         mComboIcon.setOnClickListener(this);
-        mTitleContainer = findViewById(R.id.title_bg);
         setFocusState(false);
         Resources res = getContext().getResources();
-        mStopDrawable = res.getDrawable(R.drawable.ic_stop_holo_dark);
-        mRefreshDrawable = res.getDrawable(R.drawable.ic_refresh_holo_dark);
+        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);
-        mTextfieldBgDrawable = res.getDrawable(R.drawable.textfield_active_holo_dark);
         mUrlInput.setContainer(this);
         mUrlInput.setStateListener(this);
-        mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
         mIncognitoIcon = findViewById(R.id.incognito_icon);
+
+        if (mTabSwitcherInitialTextSize == 0) {
+            mTabSwitcherInitialTextSize = mTabText.getTextSize();
+            mTabSwitcherCompressedTextSize = (float) (mTabSwitcherInitialTextSize / 1.2);
+        }
+    }
+
+    @Override
+    public void setTitleBar(TitleBar titleBar) {
+        super.setTitleBar(titleBar);
+        Activator.activate(
+                new Observable.Observer() {
+                    @Override
+                    public void onChange(Object... params) {
+                        if ((Integer)params[0] > 9) {
+                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTabSwitcherCompressedTextSize);
+                        } else {
+                            mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTabSwitcherInitialTextSize);
+                        }
+
+                        mTabText.setText(Integer.toString((Integer) params[0]));
+                    }
+                },
+                mUiController.getTabControl().getTabCountObservable());
     }
 
     @Override
@@ -160,8 +174,6 @@
             }
         } else if (v == mTabSwitcher) {
             ((PhoneUi) mBaseUi).toggleNavScreen();
-        } else if (mMore == v) {
-            showMenu(mMore);
         } else if (mClearButton == v) {
             mUrlInput.setText("");
         } else if (mComboIcon == v) {
@@ -174,40 +186,6 @@
     }
 
     @Override
-    public boolean isMenuShowing() {
-        return super.isMenuShowing() || mOverflowMenuShowing;
-    }
-
-    void showMenu(View anchor) {
-        Activity activity = mUiController.getActivity();
-        if (mPopupMenu == null) {
-            mPopupMenu = new PopupMenu(getContext(), anchor);
-            mPopupMenu.setOnMenuItemClickListener(this);
-            mPopupMenu.setOnDismissListener(this);
-            if (!activity.onCreateOptionsMenu(mPopupMenu.getMenu())) {
-                mPopupMenu = null;
-                return;
-            }
-        }
-        Menu menu = mPopupMenu.getMenu();
-        if (activity.onPrepareOptionsMenu(menu)) {
-            mOverflowMenuShowing = true;
-        }
-    }
-
-    @Override
-    public void onDismiss(PopupMenu menu) {
-        if (menu == mPopupMenu) {
-            onMenuHidden();
-        }
-    }
-
-    private void onMenuHidden() {
-        mOverflowMenuShowing = false;
-        mBaseUi.showTitleBarForDuration();
-    }
-
-    @Override
     public void onFocusChange(View view, boolean hasFocus) {
         if (view == mUrlInput && !hasFocus) {
             setDisplayTitle(mUrlInput.getText().toString());
@@ -217,6 +195,7 @@
 
     @Override
     public void onStateChanged(int state) {
+        super.onStateChanged(state);
         mVoiceButton.setVisibility(View.GONE);
         switch(state) {
         case StateListener.STATE_NORMAL:
@@ -225,8 +204,7 @@
             mClearButton.setVisibility(View.GONE);
             mMagnify.setVisibility(View.GONE);
             mTabSwitcher.setVisibility(View.VISIBLE);
-            mTitleContainer.setBackgroundDrawable(null);
-            mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
+            mTabText.setVisibility(View.VISIBLE);
             if (mUiController != null) {
                 mUiController.setWindowDimming(0f);
             }
@@ -240,8 +218,7 @@
             }
             mMagnify.setVisibility(View.GONE);
             mTabSwitcher.setVisibility(View.GONE);
-            mMore.setVisibility(View.GONE);
-            mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
+            mTabText.setVisibility(View.GONE);
 
             if (!mUrlInput.getText().toString().equals(mUrlInput.getTag())) {
                 // only change text if different
@@ -259,8 +236,7 @@
             mClearButton.setVisibility(View.VISIBLE);
             mMagnify.setVisibility(View.VISIBLE);
             mTabSwitcher.setVisibility(View.GONE);
-            mMore.setVisibility(View.GONE);
-            mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
+            mTabText.setVisibility(View.GONE);
             break;
         }
     }
@@ -271,10 +247,4 @@
         mIncognitoIcon.setVisibility(tab.isPrivateBrowsingEnabled()
                 ? View.VISIBLE : View.GONE);
     }
-
-    @Override
-    public boolean onMenuItemClick(MenuItem item) {
-        return mUiController.onOptionsItemSelected(item);
-    }
-
 }
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index a965e0a..17f7398 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -31,7 +31,6 @@
 import android.widget.ImageButton;
 import android.widget.ImageView;
 
-import com.android.browser.R;
 import com.android.browser.UI.ComboViews;
 import com.android.browser.UrlInputView.StateListener;
 
@@ -53,8 +52,6 @@
     private View mClearButton;
     private View mVoiceButton;
     private View mNavButtons;
-    private Drawable mFocusDrawable;
-    private Drawable mUnfocusDrawable;
     private boolean mHideNavButtons;
     private Drawable mFaviconDrawable;
 
@@ -75,14 +72,10 @@
 
     private void init(Context context) {
         Resources resources = context.getResources();
-        mStopDrawable = resources.getDrawable(R.drawable.ic_stop_holo_dark);
-        mReloadDrawable = resources.getDrawable(R.drawable.ic_refresh_holo_dark);
+        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);
-        mFocusDrawable = resources.getDrawable(
-                R.drawable.textfield_active_holo_dark);
-        mUnfocusDrawable = resources.getDrawable(
-                R.drawable.textfield_default_holo_dark);
         mHideNavButtons = resources.getBoolean(R.bool.hide_nav_buttons);
     }
 
@@ -140,12 +133,8 @@
 
     void updateNavigationState(Tab tab) {
         if (tab != null) {
-            mBackButton.setImageResource(tab.canGoBack()
-                    ? R.drawable.ic_back_holo_dark
-                    : R.drawable.ic_back_disabled_holo_dark);
-            mForwardButton.setImageResource(tab.canGoForward()
-                    ? R.drawable.ic_forward_holo_dark
-                    : R.drawable.ic_forward_disabled_holo_dark);
+            mBackButton.setEnabled(tab.canGoBack());
+            mForwardButton.setEnabled(tab.canGoBack());
         }
         updateUrlIcon();
     }
@@ -205,7 +194,7 @@
 
     void updateUrlIcon() {
         if (mUrlInput.hasFocus()) {
-            mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
+            mUrlIcon.setImageResource(R.drawable.ic_action_search_normal);
         } else {
             if (mFaviconDrawable == null) {
                 mFaviconDrawable = mBaseUi.getFaviconDrawable(null);
@@ -223,7 +212,7 @@
             }
             mSearchButton.setVisibility(View.GONE);
             mStar.setVisibility(View.GONE);
-            mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
+            mUrlIcon.setImageResource(R.drawable.ic_action_search_normal);
         } else {
             if (mHideNavButtons) {
                 showNavButtons();
@@ -232,8 +221,6 @@
             mSearchButton.setVisibility(View.VISIBLE);
             updateUrlIcon();
         }
-        mUrlContainer.setBackgroundDrawable(focus
-                ? mFocusDrawable : mUnfocusDrawable);
     }
 
     private void stopOrRefresh() {
@@ -324,6 +311,7 @@
 
     @Override
     public void onStateChanged(int state) {
+        super.onStateChanged(state);
         mVoiceButton.setVisibility(View.GONE);
         switch(state) {
         case STATE_NORMAL:
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index ca478c2..5dc87f3 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -23,12 +23,10 @@
 import android.app.Activity;
 import android.content.Context;
 import android.graphics.Bitmap;
-import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.os.Message;
 import android.util.Log;
-import android.util.TypedValue;
 import android.view.ActionMode;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -36,11 +34,11 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.DecelerateInterpolator;
 import android.webkit.ValueCallback;
 import org.codeaurora.swe.WebView;
 import android.widget.ImageView;
 
-import com.android.browser.R;
 import com.android.browser.UrlInputView.StateListener;
 
 /**
@@ -160,14 +158,6 @@
         return true;
     }
 
-    private void setMenuItemVisibility(Menu menu, int id,
-                                       boolean visibility) {
-        MenuItem item = menu.findItem(id);
-        if (item != null) {
-            item.setVisible(visibility);
-        }
-    }
-
     @Override
     public void updateMenuState(Tab tab, Menu menu) {
         MenuItem bm = menu.findItem(R.id.bookmarks_menu_id);
@@ -273,7 +263,6 @@
             mAnimScreen = new AnimScreen(mActivity);
         } else {
             mAnimScreen.mMain.setAlpha(1f);
-            mAnimScreen.mTitle.setAlpha(1f);
             mAnimScreen.setScaleFactor(1f);
         }
         mAnimScreen.set(getTitleBar(), viewportBitmap);
@@ -295,37 +284,40 @@
         int toTop = ((fromBottom - (ntth + height)) / 2 + ntth);
         int toRight = toLeft + width;
         int toBottom = toTop + height;
-        float scaleFactor = width / (float) mContentView.getWidth();
-        mContentView.setVisibility(View.GONE);
-        AnimatorSet set1 = new AnimatorSet();
-        AnimatorSet inanim = new AnimatorSet();
-        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 title = ObjectAnimator.ofFloat(mAnimScreen.mTitle, "alpha",
-                1f, 0f);
-        ObjectAnimator sx = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor",
-                1f, scaleFactor);
-        ObjectAnimator blend1 = ObjectAnimator.ofFloat(mAnimScreen.mMain,
-                "alpha", 1f, 0f);
-        blend1.setDuration(100);
+        float toScaleFactor = width / (float) mContentView.getWidth();
+        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 sx = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, toScaleFactor);
+        ObjectAnimator navTabsIn = ObjectAnimator.ofFloat(mNavScreen.mToolbarLayout, "translationY",
+                -mNavScreen.getResources().getDimensionPixelSize(R.dimen.toolbar_height), 0f);
+        mAnimScreen.mContent.layout(fromLeft, fromTop, fromRight, fromBottom);
+        mAnimScreen.setScaleFactor(1f);
 
-        inanim.playTogether(tx, ty, tr, tb, sx, title);
+        AnimatorSet inanim = new AnimatorSet();
+        inanim.playTogether(tx, ty, tr, tb, sx, navTabsIn);
+        inanim.setInterpolator(new DecelerateInterpolator());
         inanim.setDuration(200);
+
+        ObjectAnimator disappear = ObjectAnimator.ofFloat(mAnimScreen.mMain, "alpha", 1f, 0f);
+        disappear.setInterpolator(new DecelerateInterpolator());
+        disappear.setDuration(100);
+
+        AnimatorSet set1 = new AnimatorSet();
         set1.addListener(new AnimatorListenerAdapter() {
             @Override
+            public void onAnimationStart(Animator animation) {
+                mContentView.setVisibility(View.GONE);
+            }
+            @Override
             public void onAnimationEnd(Animator anim) {
                 mCustomViewContainer.removeView(mAnimScreen.mMain);
                 finishAnimationIn();
                 mUiController.setBlockEvents(false);
             }
         });
-        set1.playSequentially(inanim, blend1);
+        set1.playSequentially(inanim, disappear);
         set1.start();
         mUiController.setBlockEvents(false);
     }
@@ -396,39 +388,33 @@
         mAnimScreen.mContent.setRight(fromRight);
         mAnimScreen.mContent.setBottom(fromBottom);
         mAnimScreen.setScaleFactor(1f);
-        AnimatorSet set1 = new AnimatorSet();
-        ObjectAnimator fade2 = ObjectAnimator.ofFloat(mAnimScreen.mMain, "alpha", 0f, 1f);
-        ObjectAnimator fade1 = ObjectAnimator.ofFloat(mNavScreen, "alpha", 1f, 0f);
-        set1.playTogether(fade1, fade2);
-        set1.setDuration(100);
-        AnimatorSet set2 = new AnimatorSet();
-        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 scale = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor",
-                1f, scaleFactor);
-        set2.playTogether(l, t, r, b, scale);
-        set2.setDuration(200);
-        AnimatorSet combo = new AnimatorSet();
-        combo.playSequentially(set1, set2);
-        combo.addListener(new AnimatorListenerAdapter() {
+        //ObjectAnimator fade2 = ObjectAnimator.ofFloat(mNavScreen, "alpha", 1f, 0f);
+        //fade2.setDuration(100);
+        AnimatorSet set = new AnimatorSet();
+        ObjectAnimator animAppear = ObjectAnimator.ofFloat(mAnimScreen.mMain, "alpha", 0f, 1f);
+        animAppear.setDuration(100);
+        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 scale = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, scaleFactor);
+        set.playTogether(animAppear, l, t, r, b, scale);
+        set.setInterpolator(new DecelerateInterpolator());
+        set.setDuration(200);
+        set.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator anim) {
                 checkTabReady();
             }
         });
-        combo.start();
+        set.start();
     }
 
 
     private int mNumTries = 0;
     private void checkTabReady() {
         boolean isready = true;
+        boolean zeroTries = mNumTries == 0;
         Tab tab = mUiController.getTabControl().getCurrentTab();
         BrowserWebView webview = null;
         if (tab == null)
@@ -456,11 +442,16 @@
         }
         mNumTries = 0;
         final boolean hasCrashed = (webview == null) ? false : webview.hasCrashed();
+        // fast path: don't wait if we've been ready for a while
+        if (zeroTries) {
+            fadeOutCustomViewContainer(hasCrashed);
+            return;
+        }
         mCustomViewContainer.postDelayed(new Runnable() {
-                public void run() {
-                    fadeOutCustomViewContainer(hasCrashed);
-                }
-        }, 33); //WebView is ready, but give it extra 2 frame's time to display and finish the swaps
+            public void run() {
+                fadeOutCustomViewContainer(hasCrashed);
+            }
+        }, 32); //WebView is ready, but give it extra 2 frame's time to display and finish the swaps
     }
 
     private void fadeOutCustomViewContainer(boolean hasCrashed) {
@@ -477,6 +468,7 @@
                 mUiController.setBlockEvents(false);
             }
         });
+        otheralpha.setInterpolator(new DecelerateInterpolator());
         otheralpha.start();
     }
 
@@ -509,16 +501,18 @@
     static class AnimScreen {
 
         private View mMain;
-        private ImageView mTitle;
         private ImageView mContent;
         private float mScale;
-        private Bitmap mTitleBarBitmap;
 
         public AnimScreen(Context ctx) {
-            mMain = LayoutInflater.from(ctx).inflate(R.layout.anim_screen,
-                    null);
-            mTitle = (ImageView) mMain.findViewById(R.id.title);
-            mContent = (ImageView) mMain.findViewById(R.id.content);
+            mMain = LayoutInflater.from(ctx).inflate(R.layout.anim_screen, null);
+            mMain.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    // just eat clicks when this view is visible
+                }
+            });
+            mContent = (ImageView) mMain.findViewById(R.id.anim_screen_content);
             mContent.setScaleType(ImageView.ScaleType.MATRIX);
             mContent.setImageMatrix(new Matrix());
             mScale = 1.0f;
@@ -529,47 +523,26 @@
             if (tbar == null) {
                 return;
             }
-            int embTbarHeight = tbar.getEmbeddedHeight();
-            int tbarHeight = tbar.isFixed() ? tbar.calculateEmbeddedHeight() : embTbarHeight;
-            if (tbar.getWidth() > 0 && tbarHeight > 0) {
-                if (mTitleBarBitmap == null
-                        || mTitleBarBitmap.getWidth() != tbar.getWidth()
-                        || mTitleBarBitmap.getHeight() != tbarHeight) {
-                    mTitleBarBitmap = safeCreateBitmap(tbar.getWidth(),
-                            tbarHeight);
-                }
-                if (mTitleBarBitmap != null) {
-                    Canvas c = new Canvas(mTitleBarBitmap);
-                    tbar.draw(c);
-                    c.setBitmap(null);
-                }
-            } else {
-                mTitleBarBitmap = null;
-            }
-            mTitle.setImageBitmap(mTitleBarBitmap);
-            mTitle.setVisibility(View.VISIBLE);
-
             mContent.setImageBitmap(viewportBitmap);
         }
 
-        private Bitmap safeCreateBitmap(int width, int height) {
+        /*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) {
-            mTitle.setVisibility(View.GONE);
             mContent.setImageBitmap(image);
         }
 
         private void setScaleFactor(float sf) {
             mScale = sf;
             Matrix m = new Matrix();
-            m.postScale(sf,sf);
+            m.postScale(sf, sf);
             mContent.setImageMatrix(m);
         }
 
diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index 41d2b74..78c454f 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -178,16 +178,16 @@
         switch (item.type) {
             case TYPE_SUGGEST:
             case TYPE_SEARCH:
-                id = R.drawable.ic_search_category_suggest;
+                id = R.drawable.ic_suggest_search_normal;
                 break;
             case TYPE_BOOKMARK:
-                id = R.drawable.ic_search_category_bookmark;
+                id = R.drawable.ic_suggest_bookmark_normal;
                 break;
             case TYPE_HISTORY:
-                id = R.drawable.ic_search_category_history;
+                id = R.drawable.ic_suggest_history_normal;
                 break;
             case TYPE_SUGGEST_URL:
-                id = R.drawable.ic_search_category_browser;
+                id = R.drawable.ic_suggest_browser_normal;
                 break;
             default:
                 id = -1;
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index a4e039d..c8a4815 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -25,12 +25,10 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
-import android.graphics.BitmapShader;
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Path;
-import android.graphics.Shader;
 import android.graphics.drawable.Drawable;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -45,8 +43,6 @@
 import java.util.List;
 import java.util.Map;
 
-import com.android.browser.R;
-
 /**
  * tabbed title bar for xlarge screen browser
  */
@@ -71,8 +67,8 @@
     private int mCurrentTextureWidth = 0;
     private int mCurrentTextureHeight = 0;
 
-    private Drawable mActiveDrawable;
-    private Drawable mInactiveDrawable;
+    ///private Drawable mActiveDrawable;
+    ///private Drawable mInactiveDrawable;
 
     private final Paint mActiveShaderPaint = new Paint();
     private final Paint mInactiveShaderPaint = new Paint();
@@ -80,8 +76,8 @@
     private final Matrix mActiveMatrix = new Matrix();
     private final Matrix mInactiveMatrix = new Matrix();
 
-    private BitmapShader mActiveShader;
-    private BitmapShader mInactiveShader;
+    ///private BitmapShader mActiveShader;
+    ///private BitmapShader mInactiveShader;
 
     private int mTabOverlap;
     private int mAddTabOverlap;
@@ -95,8 +91,8 @@
         mUi = ui;
         Resources res = activity.getResources();
         mTabWidth = (int) res.getDimension(R.dimen.tab_width);
-        mActiveDrawable = res.getDrawable(R.drawable.bg_urlbar);
-        mInactiveDrawable = res.getDrawable(R.drawable.browsertab_inactive);
+        ///mActiveDrawable = res.getDrawable(R.drawable.bg_urlbar);
+        ///mInactiveDrawable = res.getDrawable(R.drawable.browsertab_inactive);
 
         mTabMap = new HashMap<Tab, TabView>();
         LayoutInflater factory = LayoutInflater.from(activity);
@@ -226,7 +222,7 @@
         TextView mTitle;
         View mIncognito;
         View mSnapshot;
-        ImageView mIconView;
+        ImageView mFaviconView;
         ImageView mLock;
         ImageView mClose;
         boolean mSelected;
@@ -250,7 +246,7 @@
             LayoutInflater inflater = LayoutInflater.from(getContext());
             mTabContent = inflater.inflate(R.layout.tab_title, this, true);
             mTitle = (TextView) mTabContent.findViewById(R.id.title);
-            mIconView = (ImageView) mTabContent.findViewById(R.id.favicon);
+            mFaviconView = (ImageView) mTabContent.findViewById(R.id.favicon);
             mLock = (ImageView) mTabContent.findViewById(R.id.lock);
             mClose = (ImageView) mTabContent.findViewById(R.id.close);
             mClose.setOnClickListener(this);
@@ -292,7 +288,7 @@
         public void setActivated(boolean selected) {
             mSelected = selected;
             mClose.setVisibility(mSelected ? View.VISIBLE : View.GONE);
-            mIconView.setVisibility(mSelected ? View.GONE : View.VISIBLE);
+            mFaviconView.setVisibility(mSelected ? View.GONE : View.VISIBLE);
             mTitle.setTextAppearance(mActivity, mSelected ?
                     R.style.TabTitleSelected : R.style.TabTitleUnselected);
             setHorizontalFadingEdgeEnabled(!mSelected);
@@ -314,7 +310,7 @@
         }
 
         void setFavicon(Drawable d) {
-            mIconView.setImageDrawable(d);
+            mFaviconView.setImageDrawable(d);
         }
 
         void setLock(Drawable d) {
@@ -341,7 +337,7 @@
             setFocusPath(mFocusPath, 0, 0, r - l, b - t);
         }
 
-        @Override
+        /*@Override
         protected void dispatchDraw(Canvas canvas) {
             if (mCurrentTextureWidth != mUi.getContentWidth() ||
                     mCurrentTextureHeight != getHeight()) {
@@ -383,7 +379,7 @@
             if (isFocused()) {
                 canvas.drawPath(mFocusPath, mFocusPaint);
             }
-        }
+        }*/
 
         private void setTabPath(Path path, int l, int t, int r, int b) {
             path.reset();
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 84330c1..0d16b59 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -21,6 +21,7 @@
 
 import org.codeaurora.swe.GeolocationPermissions;
 import org.codeaurora.swe.WebView;
+import org.codeaurora.swe.util.Observable;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -56,6 +57,8 @@
 
     private OnThumbnailUpdatedListener mOnThumbnailUpdatedListener;
 
+    private Observable mTabCountObservable;
+
     /**
      * Construct a new TabControl object
      */
@@ -64,12 +67,18 @@
         mMaxTabs = mController.getMaxTabs();
         mTabs = new ArrayList<Tab>(mMaxTabs);
         mTabQueue = new ArrayList<Tab>(mMaxTabs);
+        mTabCountObservable = new Observable();
+        mTabCountObservable.set(0);
     }
 
     synchronized static long getNextId() {
         return sNextId++;
     }
 
+    Observable getTabCountObservable() {
+        return mTabCountObservable;
+    }
+
     /**
      * Return the current tab's main WebView. This will always return the main
      * WebView for a given tab and not a subwindow.
@@ -181,6 +190,7 @@
             }
         }
         mTabs.add(tab);
+        mTabCountObservable.set(mTabs.size());
         tab.setController(mController);
         mController.onSetWebView(tab, tab.getWebView());
         tab.putInBackground();
@@ -207,6 +217,7 @@
         // Create a new tab and add it to the tab list
         Tab t = new Tab(mController, w, state);
         mTabs.add(t);
+        mTabCountObservable.set(mTabs.size());
         if (privateBrowsing) {
             mNumIncognito += 1;
         }
@@ -226,6 +237,7 @@
     SnapshotTab createSnapshotTab(long snapshotId) {
         SnapshotTab t = new SnapshotTab(mController, snapshotId);
         mTabs.add(t);
+        mTabCountObservable.set(mTabs.size());
         return t;
     }
 
@@ -253,6 +265,7 @@
 
         // Remove t from our list of tabs.
         mTabs.remove(t);
+        mTabCountObservable.set(mTabs.size());
 
         //Clear incognito geolocation state if this is the last incognito tab.
         if (t.isPrivateBrowsingEnabled()) {
@@ -435,6 +448,7 @@
                 Tab t = new Tab(mController, state);
                 tabMap.put(id, t);
                 mTabs.add(t);
+                mTabCountObservable.set(mTabs.size());
                 // added the tab to the front as they are not current
                 mTabQueue.add(0, t);
             }
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
index 4fc56c6..741dc41 100644
--- a/src/com/android/browser/TitleBar.java
+++ b/src/com/android/browser/TitleBar.java
@@ -34,8 +34,6 @@
 import android.view.animation.DecelerateInterpolator;
 import org.codeaurora.swe.WebView;
 
-import com.android.browser.R;
-
 import android.widget.FrameLayout;
 import android.widget.RelativeLayout;
 
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 83d7439..a87b045 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -104,6 +104,9 @@
         if (bm != null) {
             bm.setVisible(false);
         }
+
+        menu.setGroupVisible(R.id.NAV_MENU, false);
+
         return true;
     }
 
@@ -262,16 +265,19 @@
 
     @Override
     public Drawable getFaviconDrawable(Bitmap icon) {
-        Drawable[] array = new Drawable[2];
-        array[0] = getFaviconBackground();
-        if (icon == null) {
-            array[1] = getGenericFavicon();
-        } else {
-            array[1] = new BitmapDrawable(mActivity.getResources(), icon);
+        if (ENABLE_BORDER_AROUND_FAVICON) {
+            Drawable[] array = new Drawable[2];
+            array[0] = getFaviconBackground();
+            if (icon == null) {
+                array[1] = getGenericFavicon();
+            } else {
+                array[1] = new BitmapDrawable(mActivity.getResources(), icon);
+            }
+            LayerDrawable d = new LayerDrawable(array);
+            d.setLayerInset(1, 2, 2, 2, 2);
+            return d;
         }
-        LayerDrawable d = new LayerDrawable(array);
-        d.setLayerInset(1, 2, 2, 2, 2);
-        return d;
+        return icon == null ? getGenericFavicon() : new BitmapDrawable(mActivity.getResources(), icon);
     }
 
 }
diff --git a/src/com/android/browser/appmenu/AppMenu.java b/src/com/android/browser/appmenu/AppMenu.java
index a0ff710..66ddc9f 100644
--- a/src/com/android/browser/appmenu/AppMenu.java
+++ b/src/com/android/browser/appmenu/AppMenu.java
@@ -235,6 +235,9 @@
             // The menu is displayed above the anchored view, so shift the menu up by the bottom
             // padding of the background.
             int verticalOffset = appRect.height() - popup.getHeight() + padding.bottom;
+            if (anchorLocation[1] > 0) {
+                verticalOffset -= anchorHeight;
+            }
             popup.setVerticalOffset(verticalOffset);
         } else {
             // The menu is displayed over and below the anchored view, so shift the menu up by the
diff --git a/src/com/android/browser/appmenu/AppMenuAdapter.java b/src/com/android/browser/appmenu/AppMenuAdapter.java
index 6a8cdb4..425e91c 100644
--- a/src/com/android/browser/appmenu/AppMenuAdapter.java
+++ b/src/com/android/browser/appmenu/AppMenuAdapter.java
@@ -292,7 +292,6 @@
                 } else {
                     holder = (FourButtonMenuItemViewHolder) convertView.getTag();
                 }
-
                 setupImageButton(holder.buttons[0], item.getSubMenu().getItem(0));
                 setupImageButton(holder.buttons[1], item.getSubMenu().getItem(1));
                 setupImageButton(holder.buttons[2], item.getSubMenu().getItem(2));
@@ -391,17 +390,13 @@
     }
 
     private void setupMenuButton(ImageButton button) {
-        button.setImageResource(R.drawable.ic_menu_overflow);
-        button.setEnabled(true);
-        button.setFocusable(true);
+        button.setSelected(true);
         button.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                 mAppMenu.dismiss();
             }
         });
-
-        button.setScaleType(ScaleType.CENTER);
     }
 
     /**
diff --git a/src/com/android/browser/preferences/WebsiteSettingsFragment.java b/src/com/android/browser/preferences/WebsiteSettingsFragment.java
index 38c1926..020492c 100644
--- a/src/com/android/browser/preferences/WebsiteSettingsFragment.java
+++ b/src/com/android/browser/preferences/WebsiteSettingsFragment.java
@@ -227,9 +227,9 @@
             mUsageHighIcon = BitmapFactory.decodeResource(getResources(),
                     R.drawable.ic_list_data_large);
             mLocationAllowedIcon = BitmapFactory.decodeResource(getResources(),
-                    R.drawable.ic_gps_on_holo_dark);
+                    R.drawable.ic_action_gps_on);
             mLocationDisallowedIcon = BitmapFactory.decodeResource(getResources(),
-                    R.drawable.ic_gps_denied_holo_dark);
+                    R.drawable.ic_action_gps_off);
             mCurrentSite = site;
             if (mCurrentSite == null) {
                 askForOrigins();
diff --git a/src/com/android/browser/provider/BrowserProvider.java b/src/com/android/browser/provider/BrowserProvider.java
index 0d27d8d..c86ae84 100644
--- a/src/com/android/browser/provider/BrowserProvider.java
+++ b/src/com/android/browser/provider/BrowserProvider.java
@@ -608,16 +608,16 @@
                         if (type == 1) {
                             if (mHistoryCursor.getInt(3) == 1) {
                                 return Integer.valueOf(
-                                        R.drawable.ic_search_category_bookmark)
+                                        R.drawable.ic_suggest_bookmark_normal)
                                         .toString();
                             } else {
                                 return Integer.valueOf(
-                                        R.drawable.ic_search_category_history)
+                                        R.drawable.ic_suggest_history_normal)
                                         .toString();
                             }
                         } else {
                             return Integer.valueOf(
-                                    R.drawable.ic_search_category_suggest)
+                                    R.drawable.ic_suggest_search_normal)
                                     .toString();
                         }
 
diff --git a/src/com/android/browser/search/OpenSearchSearchEngine.java b/src/com/android/browser/search/OpenSearchSearchEngine.java
index 2cd4670..eb7c97e 100644
--- a/src/com/android/browser/search/OpenSearchSearchEngine.java
+++ b/src/com/android/browser/search/OpenSearchSearchEngine.java
@@ -246,7 +246,7 @@
                         Log.w(TAG, "Error", e);
                     }
                 } else if (column == COLUMN_INDEX_ICON) {
-                    return String.valueOf(R.drawable.magnifying_glass);
+                    return String.valueOf(R.drawable.ic_action_search_normal);
                 }
             }
             return null;
diff --git a/src/com/android/browser/view/StopProgressView.java b/src/com/android/browser/view/StopProgressView.java
deleted file mode 100644
index 3df099d..0000000
--- a/src/com/android/browser/view/StopProgressView.java
+++ /dev/null
@@ -1,98 +0,0 @@
-
-package com.android.browser.view;
-
-import com.android.browser.R;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.widget.ProgressBar;
-
-
-public class StopProgressView extends ProgressBar {
-
-    Drawable mOverlayDrawable;
-    Drawable mProgressDrawable;
-    int mWidth;
-    int mHeight;
-
-    /**
-     * @param context
-     * @param attrs
-     * @param defStyle
-     * @param styleRes
-     */
-    public StopProgressView(Context context, AttributeSet attrs, int defStyle, int styleRes) {
-        super(context, attrs, defStyle);
-        init(attrs);
-    }
-
-    /**
-     * @param context
-     * @param attrs
-     * @param defStyle
-     */
-    public StopProgressView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        init(attrs);
-    }
-
-    /**
-     * @param context
-     * @param attrs
-     */
-    public StopProgressView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init(attrs);
-    }
-
-    /**
-     * @param context
-     */
-    public StopProgressView(Context context) {
-        super(context);
-        init(null);
-    }
-
-    private void init(AttributeSet attrs) {
-        mProgressDrawable = getIndeterminateDrawable();
-        setImageDrawable(getContext().getResources()
-                .getDrawable(R.drawable.ic_stop_holo_dark));
-    }
-
-    public void hideProgress() {
-        setIndeterminateDrawable(null);
-    }
-
-    public void showProgress() {
-        setIndeterminateDrawable(mProgressDrawable);
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        super.onLayout(changed, left, top, right, bottom);
-        mWidth = (right - left) * 2 / 3;
-        mHeight = (bottom - top) * 2 / 3;
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-        if (mOverlayDrawable != null) {
-            int l = (getWidth() - mWidth) / 2;
-            int t = (getHeight() - mHeight) / 2;
-            mOverlayDrawable.setBounds(l, t, l + mWidth, t + mHeight);
-            mOverlayDrawable.draw(canvas);
-        }
-    }
-
-    public Drawable getDrawable() {
-        return mOverlayDrawable;
-    }
-
-    public void setImageDrawable(Drawable d) {
-        mOverlayDrawable = d;
-    }
-
-}
