diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index b9f5f01..40ada94 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -59,31 +59,30 @@
 import android.os.Message;
 import android.os.PowerManager;
 import android.os.Process;
-import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.provider.Browser;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.Intents.Insert;
 import android.provider.Downloads;
 import android.provider.MediaStore;
-import android.provider.ContactsContract.Intents.Insert;
 import android.speech.RecognizerResultsIntent;
 import android.text.TextUtils;
 import android.text.format.DateFormat;
 import android.util.Log;
 import android.util.Patterns;
 import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
 import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
+import android.view.MenuItem.OnMenuItemClickListener;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.MenuItem.OnMenuItemClickListener;
 import android.view.accessibility.AccessibilityManager;
 import android.webkit.CookieManager;
 import android.webkit.CookieSyncManager;
@@ -103,6 +102,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.browser.ScrollWebView.ScrollListener;
 import com.android.common.Search;
 import com.android.common.speech.LoggingEvents;
 
@@ -216,13 +216,14 @@
 
         // Create the tab control and our initial tab
         mTabControl = new TabControl(this);
-
-
         if (mXLargeScreenSize) {
-            mTitleBar = new TitleBarXLarge(this, mTabControl);
+            mTitleBar = new TitleBarXLarge(this);
+            mTitleBar.setProgress(100);
+            mFakeTitleBar = new TitleBarXLarge(this);
+            mTabBar = new TabBar(this, mTabControl, (TitleBarXLarge) mFakeTitleBar);
             LinearLayout layout = (LinearLayout) mBrowserFrameLayout.
                     findViewById(R.id.vertical_layout);
-            layout.addView(mTitleBar, 0, new LinearLayout.LayoutParams(
+            layout.addView(mTabBar, 0, new LinearLayout.LayoutParams(
                     ViewGroup.LayoutParams.MATCH_PARENT,
                     ViewGroup.LayoutParams.WRAP_CONTENT));
         } else {
@@ -234,7 +235,6 @@
             mFakeTitleBar = new TitleBar(this);
         }
 
-
         // Open the icon database and retain all the bookmark urls for favicons
         retainIconsOnStartup();
 
@@ -394,6 +394,10 @@
         mSystemAllowGeolocationOrigins.start();
     }
 
+    ScrollListener getScrollListener() {
+        return mTabBar;
+    }
+
     /**
      * Feed the previously stored results strings to the BrowserProvider so that
      * the SearchDialog will show them instead of the standard searches.
@@ -724,20 +728,14 @@
     /* package */ void showVoiceTitleBar(String title) {
         mTitleBar.setInVoiceMode(true);
         mTitleBar.setDisplayTitle(title);
-
-        if (!mXLargeScreenSize) {
-            mFakeTitleBar.setInVoiceMode(true);
-            mFakeTitleBar.setDisplayTitle(title);
-        }
+        mFakeTitleBar.setInVoiceMode(true);
+        mFakeTitleBar.setDisplayTitle(title);
     }
     /* package */ void revertVoiceTitleBar() {
         mTitleBar.setInVoiceMode(false);
         mTitleBar.setDisplayTitle(mUrl);
-
-        if (!mXLargeScreenSize) {
-            mFakeTitleBar.setInVoiceMode(false);
-            mFakeTitleBar.setDisplayTitle(mUrl);
-        }
+        mFakeTitleBar.setInVoiceMode(false);
+        mFakeTitleBar.setDisplayTitle(mUrl);
     }
     /* package */ static String fixUrl(String inUrl) {
         // FIXME: Converting the url to lower case
@@ -800,7 +798,7 @@
      * would change its appearance, use a different TitleBar to show overlayed
      * at the top of the screen, when the menu is open or the page is loading.
      */
-    private TitleBar mFakeTitleBar;
+    private TitleBarBase mFakeTitleBar;
 
     /**
      * Keeps track of whether the options menu is open.  This is important in
@@ -856,16 +854,8 @@
         return true;
     }
 
-    private void rebuildTitleBar() {
-        if (mXLargeScreenSize) {
-            ((TitleBarXLarge) mTitleBar).rebuildLayout();
-        }
-    }
-
-    private void showFakeTitleBar() {
-        if (mXLargeScreenSize) return;
-        if (mFakeTitleBar.getParent() == null && mActiveTabsPage == null
-                && !mActivityInPause) {
+    void showFakeTitleBar() {
+        if (!isFakeTitleBarShowing() && mActiveTabsPage == null && !mActivityInPause) {
             WebView mainView = mTabControl.getCurrentWebView();
             // if there is no current WebView, don't show the faked title bar;
             if (mainView == null) {
@@ -878,23 +868,26 @@
                 // find or select dialog.
                 return;
             }
+            if (mXLargeScreenSize) {
+                mContentView.addView(mFakeTitleBar);
+                mTabBar.onShowTitleBar();
+            } else {
+                WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
 
-            WindowManager manager
-                    = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
-
-            // Add the title bar to the window manager so it can receive touches
-            // while the menu is up
-            WindowManager.LayoutParams params
-                    = new WindowManager.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT,
-                    WindowManager.LayoutParams.TYPE_APPLICATION,
-                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
-                    PixelFormat.TRANSLUCENT);
-            params.gravity = Gravity.TOP;
-            boolean atTop = mainView.getScrollY() == 0;
-            params.windowAnimations = atTop ? 0 : R.style.TitleBar;
-            manager.addView(mFakeTitleBar, params);
+                // Add the title bar to the window manager so it can receive
+                // touches
+                // while the menu is up
+                WindowManager.LayoutParams params =
+                        new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                                ViewGroup.LayoutParams.WRAP_CONTENT,
+                                WindowManager.LayoutParams.TYPE_APPLICATION,
+                                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
+                                PixelFormat.TRANSLUCENT);
+                params.gravity = Gravity.TOP;
+                boolean atTop = mainView.getScrollY() == 0;
+                params.windowAnimations = atTop ? 0 : R.style.TitleBar;
+                manager.addView(mFakeTitleBar, params);
+            }
         }
     }
 
@@ -911,21 +904,34 @@
         }
     }
 
-    private void hideFakeTitleBar() {
-        if (mXLargeScreenSize || mFakeTitleBar.getParent() == null) return;
-        WindowManager.LayoutParams params = (WindowManager.LayoutParams)
-                mFakeTitleBar.getLayoutParams();
-        WebView mainView = mTabControl.getCurrentWebView();
-        // Although we decided whether or not to animate based on the current
-        // scroll position, the scroll position may have changed since the
-        // fake title bar was displayed.  Make sure it has the appropriate
-        // animation/lack thereof before removing.
-        params.windowAnimations = mainView != null && mainView.getScrollY() == 0
-                ? 0 : R.style.TitleBar;
-        WindowManager manager
-                    = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
-        manager.updateViewLayout(mFakeTitleBar, params);
-        manager.removeView(mFakeTitleBar);
+    void stopScrolling() {
+        ((ScrollWebView) mTabControl.getCurrentWebView()).stopScroll();
+    }
+
+    void hideFakeTitleBar() {
+        if (!isFakeTitleBarShowing()) return;
+        if (mXLargeScreenSize) {
+            mContentView.removeView(mFakeTitleBar);
+            mTabBar.onHideTitleBar();
+        } else {
+            WindowManager.LayoutParams params =
+                    (WindowManager.LayoutParams) mFakeTitleBar.getLayoutParams();
+            WebView mainView = mTabControl.getCurrentWebView();
+            // Although we decided whether or not to animate based on the
+            // current
+            // scroll position, the scroll position may have changed since the
+            // fake title bar was displayed. Make sure it has the appropriate
+            // animation/lack thereof before removing.
+            params.windowAnimations =
+                    mainView != null && mainView.getScrollY() == 0 ? 0 : R.style.TitleBar;
+            WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
+            manager.updateViewLayout(mFakeTitleBar, params);
+            manager.removeView(mFakeTitleBar);
+        }
+    }
+
+    boolean isFakeTitleBarShowing() {
+        return (mFakeTitleBar.getParent() != null);
     }
 
     /**
@@ -1071,7 +1077,6 @@
             showHttpAuthentication(mHttpAuthHandler, null, null, title,
                     name, password, focusId);
         }
-        rebuildTitleBar();
     }
 
     @Override
@@ -1547,21 +1552,19 @@
      */
     public void closeDialogs() {
         if (!(closeDialog(mFindDialog) || closeDialog(mSelectDialog))) return;
-        if (!mXLargeScreenSize) {
-            // If the Find was being performed in the main WebView, replace the
-            // embedded title bar.
-            Tab currentTab = mTabControl.getCurrentTab();
-            if (currentTab.getSubWebView() == null) {
-                WebView mainView = currentTab.getWebView();
-                if (mainView != null) {
-                    mainView.setEmbeddedTitleBar(mTitleBar);
-                }
+        // If the Find was being performed in the main WebView, replace the
+        // embedded title bar.
+        Tab currentTab = mTabControl.getCurrentTab();
+        if (currentTab.getSubWebView() == null) {
+            WebView mainView = currentTab.getWebView();
+            if (mainView != null) {
+                mainView.setEmbeddedTitleBar(mTitleBar);
             }
         }
         mMenuState = R.id.MAIN_MENU;
         if (mInLoad) {
             // The title bar was hidden, because otherwise it would cover up the
-            // find or select dialog.  Now that the dialog has been removed,
+            // find or select dialog. Now that the dialog has been removed,
             // show the fake title bar once again.
             showFakeTitleBar();
         }
@@ -1807,10 +1810,8 @@
                                                   ViewGroup.LayoutParams.WRAP_CONTENT));
         }
 
-        if (!mXLargeScreenSize){
-            WebView view = t.getWebView();
-            view.setEmbeddedTitleBar(mTitleBar);
-        }
+        WebView view = t.getWebView();
+        view.setEmbeddedTitleBar(mTitleBar);
         if (t.isInVoiceSearchMode()) {
             showVoiceTitleBar(t.getVoiceDisplayTitle());
         } else {
@@ -1818,6 +1819,9 @@
         }
         // Request focus on the top window.
         t.getTopWindow().requestFocus();
+        if (mTabControl.getTabChangeListener() != null) {
+            mTabControl.getTabChangeListener().onCurrentTab(t);
+        }
     }
 
     // Attach a sub window to the main WebView of the given tab.
@@ -1836,11 +1840,9 @@
             mErrorConsoleContainer.removeView(errorConsole);
         }
 
-        if (!mXLargeScreenSize) {
-            WebView view = t.getWebView();
-            if (view != null) {
-                view.setEmbeddedTitleBar(null);
-            }
+        WebView view = t.getWebView();
+        if (view != null) {
+            view.setEmbeddedTitleBar(null);
         }
     }
 
@@ -2079,9 +2081,7 @@
         // If we are in voice search mode, the title has already been set.
         if (mTabControl.getCurrentTab().isInVoiceSearchMode()) return;
         mTitleBar.setDisplayTitle(url);
-        if (!mXLargeScreenSize) {
-            mFakeTitleBar.setDisplayTitle(url);
-        }
+        mFakeTitleBar.setDisplayTitle(url);
     }
 
     /**
@@ -2124,9 +2124,7 @@
     // Set the favicon in the title bar.
     void setFavicon(Bitmap icon) {
         mTitleBar.setFavicon(icon);
-        if (!mXLargeScreenSize) {
-            mFakeTitleBar.setFavicon(icon);
-        }
+        mFakeTitleBar.setFavicon(icon);
     }
 
     /**
@@ -2803,14 +2801,11 @@
     // -------------------------------------------------------------------------
 
     void onProgressChanged(WebView view, int newProgress) {
-        if (mXLargeScreenSize) {
-            mTitleBar.setProgress(newProgress);
-        } else {
-            // On the phone, the fake title bar will always cover up the
-            // regular title bar (or the regular one is offscreen), so only the
-            // fake title bar needs to change its progress
-            mFakeTitleBar.setProgress(newProgress);
-        }
+
+        // On the phone, the fake title bar will always cover up the
+        // regular title bar (or the regular one is offscreen), so only the
+        // fake title bar needs to change its progress
+        mFakeTitleBar.setProgress(newProgress);
 
         if (newProgress == 100) {
             // onProgressChanged() may continue to be called after the main
@@ -3246,9 +3241,7 @@
             d = mMixLockIcon;
         }
         mTitleBar.setLock(d);
-        if (!mXLargeScreenSize) {
-            mFakeTitleBar.setLock(d);
-        }
+        mFakeTitleBar.setLock(d);
     }
 
     /**
@@ -4269,6 +4262,7 @@
     private Toast mStopToast;
 
     private TitleBarBase mTitleBar;
+    private TabBar mTabBar;
 
     private LinearLayout mErrorConsoleContainer = null;
     private boolean mShouldShowErrorConsole = false;
diff --git a/src/com/android/browser/ScrollWebView.java b/src/com/android/browser/ScrollWebView.java
new file mode 100644
index 0000000..16404aa
--- /dev/null
+++ b/src/com/android/browser/ScrollWebView.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.webkit.WebView;
+
+import java.util.Map;
+
+/**
+ *  Manage WebView scroll events
+ */
+public class ScrollWebView extends WebView {
+
+    private ScrollListener mScrollListener;
+    private boolean mIsCancelled;
+    private Runnable mScrollRunnable;
+
+    /**
+     * @param context
+     * @param attrs
+     * @param defStyle
+     * @param javascriptInterfaces
+     */
+    public ScrollWebView(Context context, AttributeSet attrs, int defStyle,
+            Map<String, Object> javascriptInterfaces, boolean privateBrowsing) {
+        super(context, attrs, defStyle, javascriptInterfaces, privateBrowsing);
+    }
+
+    /**
+     * @param context
+     * @param attrs
+     * @param defStyle
+     */
+    public ScrollWebView(Context context, AttributeSet attrs, int defStyle,
+            boolean privateBrowsing) {
+        super(context, attrs, defStyle, privateBrowsing);
+    }
+
+    /**
+     * @param context
+     * @param attrs
+     */
+    public ScrollWebView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    /**
+     * @param context
+     */
+    public ScrollWebView(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void setEmbeddedTitleBar(final View title) {
+        super.setEmbeddedTitleBar(title);
+        if (title != null && mScrollListener != null) {
+            // allow the scroll listener to initialize its state
+            post(new Runnable() {
+                @Override
+                public void run() {
+                    mScrollListener.onScroll((title.getHeight() == 0 ||
+                            getVisibleTitleHeight() > 0));
+                }
+            });
+        }
+    }
+
+    @Override
+    public void stopScroll() {
+        mIsCancelled = true;
+        super.stopScroll();
+    }
+
+    @Override
+    protected void onScrollChanged(int l, final int t, int ol, int ot) {
+        super.onScrollChanged(l, t, ol, ot);
+        if (!mIsCancelled) {
+            post(mScrollRunnable);
+        } else {
+            mIsCancelled = false;
+        }
+    }
+
+    void setScrollListener(ScrollListener l) {
+        mScrollListener = l;
+        if (mScrollListener != null) {
+            mScrollRunnable = new Runnable() {
+                public void run() {
+                    if (!mIsCancelled) {
+                        mScrollListener.onScroll(getVisibleTitleHeight() > 0);
+                    }
+                }
+            };
+        }
+    }
+
+    // callback for scroll events
+
+    interface ScrollListener {
+        public void onScroll(boolean titleVisible);
+    }
+
+}
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
new file mode 100644
index 0000000..f73185f
--- /dev/null
+++ b/src/com/android/browser/TabBar.java
@@ -0,0 +1,416 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.graphics.drawable.PaintDrawable;
+import android.view.ContextMenu;
+import android.view.LayoutInflater;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.webkit.WebView;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.browser.ScrollWebView.ScrollListener;
+import com.android.browser.TabControl.TabChangeListener;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * tabbed title bar for xlarge screen browser
+ */
+public class TabBar extends LinearLayout
+        implements TabChangeListener, ScrollListener, OnClickListener {
+
+    private static final int PROGRESS_MAX = 100;
+
+    private static final int TAB_WIDTH_SELECTED = 300;
+    private static final int TAB_WIDTH_UNSELECTED = 300;
+
+    private BrowserActivity mBrowserActivity;
+
+    private final float mTabWidthSelected;
+    private final float mTabWidthUnselected;
+
+    private TitleBarXLarge mTitleBar;
+
+    private TabScrollView mTabs;
+    private View mNewButton;
+    private View mShowUrlButton;
+    private TabControl mControl;
+
+    private Map<Tab, TabViewData> mTabMap;
+
+    private float mDensityScale;
+    private boolean mUserRequestedUrlbar;
+    private boolean mTitleVisible;
+
+    public TabBar(BrowserActivity context, TabControl tabcontrol, TitleBarXLarge titlebar) {
+        super(context);
+        Resources res = context.getResources();
+        mTabWidthSelected = res.getDimension(R.dimen.tab_width_selected);
+        mTabWidthUnselected = res.getDimension(R.dimen.tab_width_unselected);
+
+        mTitleBar = titlebar;
+        mTitleBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
+                LayoutParams.WRAP_CONTENT));
+        mDensityScale = context.getResources().getDisplayMetrics().density;
+        mTabMap = new HashMap<Tab, TabViewData>();
+        mBrowserActivity = context;
+        mControl = tabcontrol;
+        Resources resources = context.getResources();
+        LayoutInflater factory = LayoutInflater.from(context);
+        factory.inflate(R.layout.tab_bar, this);
+        mTabs = (TabScrollView) findViewById(R.id.tabs);
+        mNewButton = findViewById(R.id.newtab);
+        mShowUrlButton = findViewById(R.id.showurl);
+
+        // TODO: Change enabled states based on whether you can go
+        // back/forward.  Probably should be done inside onPageStarted.
+
+        mNewButton.setOnClickListener(this);
+        mShowUrlButton.setOnClickListener(this);
+
+        // build tabs
+        int tabcount = mControl.getTabCount();
+        for (int i = 0; i < tabcount; i++) {
+            Tab tab = mControl.getTab(i);
+            TabViewData data = buildTab(tab);
+            TabView tv = buildView(data);
+        }
+        mTabs.setSelectedTab(mControl.getCurrentIndex());
+
+        // register the tab change listener
+        mControl.setOnTabChangeListener(this);
+        mUserRequestedUrlbar = false;
+        mTitleVisible = true;
+    }
+
+    public void onClick(View view) {
+        if (mShowUrlButton == view) {
+            mBrowserActivity.stopScrolling();
+            mBrowserActivity.showFakeTitleBar();
+            mUserRequestedUrlbar = true;
+        } else if (mNewButton == view) {
+            mBrowserActivity.openTabToHomePage();
+        } else if (mTabs.getSelectedTab() == view) {
+            mBrowserActivity.showFakeTitleBar();
+            mTitleBar.requestUrlInputFocus();
+        } else {
+            TabViewData data = (TabViewData) view.getTag();
+            int ix = mControl.getTabIndex(data.mTab);
+            mTabs.setSelectedTab(ix);
+            mBrowserActivity.switchToTab(ix);
+        }
+    }
+
+    void onShowTitleBar() {
+        mShowUrlButton.setVisibility(View.INVISIBLE);
+    }
+
+    void onHideTitleBar() {
+        mShowUrlButton.setVisibility(mTitleVisible ? View.INVISIBLE : View.VISIBLE);
+        Tab tab = mControl.getCurrentTab();
+        tab.getWebView().requestFocus();
+        mUserRequestedUrlbar = false;
+    }
+
+    // UrlInputListener implementation
+
+    @Override
+    public void createContextMenu(ContextMenu menu) {
+        MenuInflater inflater = mBrowserActivity.getMenuInflater();
+        inflater.inflate(R.menu.title_context, menu);
+        mBrowserActivity.onCreateContextMenu(menu, this, null);
+    }
+
+    private TabViewData buildTab(Tab tab) {
+        TabViewData data = new TabViewData(tab);
+        mTabMap.put(tab, data);
+        return data;
+    }
+
+    private TabView buildView(final TabViewData data) {
+        TabView tv = new TabView(mBrowserActivity, data);
+        tv.setTag(data);
+        tv.setOnClickListener(this);
+        mTabs.addTab(tv);
+        return tv;
+    }
+
+    /**
+     * View used in the tab bar
+     */
+    class TabView extends LinearLayout implements OnClickListener {
+
+        TabViewData mTabData;
+        View mTabContent;
+        TextView mTitle;
+        ImageView mIconView;
+        ImageView mLock;
+        ImageView mClose;
+        boolean mSelected;
+        boolean mInLoad;
+
+        /**
+         * @param context
+         */
+        public TabView(Context context, TabViewData tab) {
+            super(context);
+            mTabData = tab;
+            LayoutInflater inflater = LayoutInflater.from(mContext);
+            mTabContent = inflater.inflate(R.layout.tab_title, this);
+            mTitle = (TextView) mTabContent.findViewById(R.id.title);
+            mIconView = (ImageView) mTabContent.findViewById(R.id.favicon);
+            mLock = (ImageView) mTabContent.findViewById(R.id.lock);
+            mClose = (ImageView) mTabContent.findViewById(R.id.close);
+            mClose.setOnClickListener(this);
+            mSelected = false;
+            mInLoad = false;
+            // update the status
+            updateFromData();
+        }
+
+        @Override
+        public void onClick(View v) {
+            if (v == mClose) {
+                closeTab();
+            }
+        }
+
+        private void updateFromData() {
+            mTabData.mTabView = this;
+            if (mTabData.mUrl != null) {
+                setDisplayTitle(mTabData.mUrl);
+            }
+            if (mTabData.mTitle != null) {
+                setDisplayTitle(mTabData.mTitle);
+            }
+            setProgress(mTabData.mProgress);
+            if (mTabData.mIcon != null) {
+                setFavicon(mTabData.mIcon);
+            }
+            if (mTabData.mLock != null) {
+                setLock(mTabData.mLock);
+            }
+        }
+
+        @Override
+        public void setSelected(boolean selected) {
+            mSelected = selected;
+            mClose.setVisibility(mSelected ? View.VISIBLE : View.GONE);
+            mTitle.setTextColor(mSelected ? Color.BLACK : Color.GRAY);
+            super.setSelected(selected);
+            setLayoutParams(new LayoutParams(selected ?
+                    (int) (TAB_WIDTH_SELECTED * mDensityScale)
+                    : (int) (TAB_WIDTH_UNSELECTED * mDensityScale),
+                    LayoutParams.MATCH_PARENT));
+        }
+
+        void setDisplayTitle(String title) {
+            mTitle.setText(title);
+        }
+
+        void setFavicon(Drawable d) {
+            mIconView.setImageDrawable(d);
+        }
+
+        void setLock(Drawable d) {
+            if (null == d) {
+                mLock.setVisibility(View.GONE);
+            } else {
+                mLock.setImageDrawable(d);
+                mLock.setVisibility(View.VISIBLE);
+            }
+        }
+
+        void setTitleCompoundDrawables(Drawable left, Drawable top,
+                Drawable right, Drawable bottom) {
+            mTitle.setCompoundDrawables(left, top, right, bottom);
+        }
+
+        void setProgress(int newProgress) {
+            if (newProgress >= PROGRESS_MAX) {
+                mInLoad = false;
+            } else {
+                if (!mInLoad && getWindowToken() != null) {
+                    mInLoad = true;
+                }
+            }
+        }
+
+        private void closeTab() {
+            if (mTabData.mTab == mControl.getCurrentTab()) {
+                mBrowserActivity.closeCurrentWindow();
+            } else {
+                mBrowserActivity.closeTab(mTabData.mTab);
+            }
+        }
+
+    }
+
+    /**
+     * Store tab state within the title bar
+     */
+    class TabViewData {
+
+        Tab mTab;
+        TabView mTabView;
+        int mProgress;
+        Drawable mIcon;
+        Drawable mLock;
+        String mTitle;
+        String mUrl;
+
+        TabViewData(Tab tab) {
+            mTab = tab;
+        }
+
+        void setUrlAndTitle(String url, String title) {
+            mUrl = url;
+            mTitle = title;
+            if (mTabView != null) {
+                if (title != null) {
+                    mTabView.setDisplayTitle(title);
+                } else if (url != null) {
+                    mTabView.setDisplayTitle(url);
+                }
+            }
+        }
+
+        void setProgress(int newProgress) {
+            mProgress = newProgress;
+            if (mTabView != null) {
+                mTabView.setProgress(mProgress);
+            }
+        }
+
+        void setFavicon(Bitmap icon) {
+            Drawable[] array = new Drawable[3];
+            array[0] = new PaintDrawable(Color.BLACK);
+            array[1] = new PaintDrawable(Color.WHITE);
+            if (icon == null) {
+//                array[2] = mGenericFavicon;
+            } else {
+                array[2] = new BitmapDrawable(icon);
+            }
+            LayerDrawable d = new LayerDrawable(array);
+            d.setLayerInset(1, 1, 1, 1, 1);
+            d.setLayerInset(2, 2, 2, 2, 2);
+            mIcon = d;
+            if (mTabView != null) {
+                mTabView.setFavicon(mIcon);
+            }
+        }
+
+    }
+
+    // TabChangeListener implementation
+
+    @Override
+    public void onCurrentTab(Tab tab) {
+        mTabs.setSelectedTab(mControl.getCurrentIndex());
+        TabViewData tvd = mTabMap.get(tab);
+        if (tvd != null) {
+            tvd.setProgress(tvd.mProgress);
+            // update the scroll state
+            WebView webview = tab.getWebView();
+            onScroll(webview.getVisibleTitleHeight() > 0);
+        }
+    }
+
+    @Override
+    public void onFavicon(Tab tab, Bitmap favicon) {
+        TabViewData tvd = mTabMap.get(tab);
+        if (tvd != null) {
+            tvd.setFavicon(favicon);
+        }
+    }
+
+    @Override
+    public void onNewTab(Tab tab) {
+        TabViewData tvd = buildTab(tab);
+        buildView(tvd);
+        mShowUrlButton.setVisibility(View.INVISIBLE);
+    }
+
+    @Override
+    public void onProgress(Tab tab, int progress) {
+        TabViewData tvd = mTabMap.get(tab);
+        if (tvd != null) {
+            tvd.setProgress(progress);
+        }
+    }
+
+    @Override
+    public void onRemoveTab(Tab tab) {
+        TabViewData tvd = mTabMap.get(tab);
+        TabView tv = tvd.mTabView;
+        if (tv != null) {
+            mTabs.removeTab(tv);
+        }
+        mTabMap.remove(tab);
+    }
+
+    @Override
+    public void onUrlAndTitle(Tab tab, String url, String title) {
+        TabViewData tvd = mTabMap.get(tab);
+        if (tvd != null) {
+            tvd.setUrlAndTitle(url, title);
+        }
+    }
+
+    @Override
+    public void onPageFinished(Tab tab) {
+    }
+
+    @Override
+    public void onPageStarted(Tab tab) {
+    }
+
+
+    private boolean isLoading() {
+        return mTabMap.get(mControl.getCurrentTab()).mTabView.mInLoad;
+    }
+
+    // webview scroll listener
+
+    @Override
+    public void onScroll(boolean titleVisible) {
+        mTitleVisible = titleVisible;
+        boolean buttonVisible = (mShowUrlButton.getVisibility() == View.VISIBLE);
+        if (!buttonVisible && !mTitleVisible && !isLoading()) {
+            mShowUrlButton.setVisibility(View.VISIBLE);
+            if (mUserRequestedUrlbar) {
+                mBrowserActivity.hideFakeTitleBar();
+            }
+        } else if (mTitleVisible && !isLoading()) {
+            mShowUrlButton.setVisibility(View.INVISIBLE);
+        }
+    }
+
+}
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index d850b1e..333ce91 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -546,8 +546,9 @@
      */
     private WebView createNewWebView(boolean privateBrowsing) {
         // Create a new WebView
-        WebView w = new WebView(mActivity, null,
+        ScrollWebView w = new ScrollWebView(mActivity, null,
                 com.android.internal.R.attr.webViewStyle, privateBrowsing);
+        w.setScrollListener(mActivity.getScrollListener());
         w.setScrollbarFadingEnabled(true);
         w.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
         w.setMapTrackballToArrowKeys(false); // use trackball directly
@@ -634,9 +635,6 @@
                 mainView.loadUrl(BrowserSettings.getInstance().getHomePage());
             }
         }
-        if (mTabChangeListener != null) {
-            mTabChangeListener.onCurrentTab(newTab);
-        }
         return true;
     }
 
diff --git a/src/com/android/browser/TabScrollView.java b/src/com/android/browser/TabScrollView.java
index 6d8b91b..13abb50 100644
--- a/src/com/android/browser/TabScrollView.java
+++ b/src/com/android/browser/TabScrollView.java
@@ -66,7 +66,7 @@
         mContentView = new LinearLayout(mContext);
         mContentView.setOrientation(LinearLayout.HORIZONTAL);
         mContentView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
-                LayoutParams.WRAP_CONTENT));
+                LayoutParams.MATCH_PARENT));
         addView(mContentView);
         mSelected = -1;
     }
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index fd6d67b..4e65375 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -19,87 +19,56 @@
 import android.app.SearchManager;
 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.Color;
-import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.graphics.drawable.PaintDrawable;
 import android.view.ContextMenu;
 import android.view.LayoutInflater;
 import android.view.MenuInflater;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
 
-import com.android.browser.TabControl.TabChangeListener;
 import com.android.browser.UrlInputView.UrlInputListener;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * tabbed title bar for xlarge screen browser
  */
 public class TitleBarXLarge extends TitleBarBase
-    implements TabChangeListener, UrlInputListener {
+    implements UrlInputListener, OnClickListener {
 
     private static final int PROGRESS_MAX = 100;
 
-    private static final int TAB_WIDTH_SELECTED = 400;
-    private static final int TAB_WIDTH_UNSELECTED = 150;
+    private BrowserActivity mBrowserActivity;
+    private Drawable mStopDrawable;
+    private Drawable mReloadDrawable;
+    private Drawable mProgressDrawable;
 
-    private BrowserActivity       mBrowserActivity;
-    private Drawable              mStopDrawable;
-    private Drawable              mReloadDrawable;
-    private Drawable              mSelectedBackground;
-    private Drawable              mUnselectedBackground;
+    private View mBackButton;
+    private View mForwardButton;
+    private View mStar;
+    private View mSearchButton;
+    private ImageView mStopButton;
+    private View mMenu;
+    private View mAllButton;
+    private ImageView mProgressView;
+    private UrlInputView mUrlView;
+    private boolean mInLoad;
 
-    private View                  mBackButton;
-    private View                  mForwardButton;
-    private View                  mStar;
-    private View                  mMenu;
-    private View                  mAllButton;
-    private TabScrollView         mTabs;
-    private View                  mNewButton;
-    private TabControl            mControl;
-    private UrlInputView          mUrlView;
-
-    private boolean               mIsInLandscape;
-    private Map<Tab, TabViewData> mTabMap;
-
-    private float                 mDensityScale;
-
-    public TitleBarXLarge(BrowserActivity context, TabControl tabcontrol) {
+    public TitleBarXLarge(BrowserActivity context) {
         super(context);
-        mDensityScale = context.getResources().getDisplayMetrics().density;
-        mTabMap = new HashMap<Tab, TabViewData>();
         mBrowserActivity = context;
-        mControl = tabcontrol;
         Resources resources = context.getResources();
-        mSelectedBackground = resources.getDrawable(R.drawable.tab_selected_bg);
-        mUnselectedBackground = resources.getDrawable(R.drawable.tab_unselected_bg);
-        mStopDrawable = resources.getDrawable(R.drawable.progress_stop);
+        mStopDrawable = resources.getDrawable(R.drawable.ic_stop);
         mReloadDrawable = resources.getDrawable(R.drawable.ic_reload);
         rebuildLayout(context, true);
-        // register the tab change listener
-        mControl.setOnTabChangeListener(this);
-    }
-
-    void rebuildLayout() {
-        rebuildLayout(mBrowserActivity, false);
     }
 
     private void rebuildLayout(Context context, boolean rebuildData) {
         removeAllViews();
         LayoutInflater factory = LayoutInflater.from(context);
-        factory.inflate(R.layout.title_bar_tabbed, this);
+        factory.inflate(R.layout.url_bar, this);
 
-        mTabs = (TabScrollView) findViewById(R.id.tabs);
-        mNewButton = findViewById(R.id.newtab);
         mUrlView = (UrlInputView) findViewById(R.id.editurl);
         mAllButton = findViewById(R.id.all_btn);
         // TODO: Change enabled states based on whether you can go
@@ -108,67 +77,55 @@
         mForwardButton = findViewById(R.id.forward);
         mStar = findViewById(R.id.star);
         mMenu = findViewById(R.id.menu);
-        View.OnClickListener listener = new View.OnClickListener() {
-            public void onClick(View v) {
-                if (mBackButton == v) {
-                    mBrowserActivity.getTopWindow().goBack();
-                } else if (mForwardButton == v) {
-                    mBrowserActivity.getTopWindow().goForward();
-                } else if (mStar == v) {
-                    mBrowserActivity.promptAddOrInstallBookmark();
-                } else if (mMenu == v) {
-                    mBrowserActivity.openOptionsMenu();
-                } else if (mAllButton == v) {
-                    // TODO: Show the new bookmarks/windows view.
-                    mBrowserActivity.bookmarksOrHistoryPicker(false);
-                } else if (mNewButton == v) {
-                    mBrowserActivity.openTabToHomePage();
-                }
-            }
-        };
-        mBackButton.setOnClickListener(listener);
-        mForwardButton.setOnClickListener(listener);
-        mStar.setOnClickListener(listener);
-        mAllButton.setOnClickListener(listener);
-        mMenu.setOnClickListener(listener);
-        mNewButton.setOnClickListener(listener);
+        mStopButton = (ImageView) findViewById(R.id.stop);
+        mSearchButton = findViewById(R.id.search);
+        mLockIcon = (ImageView) findViewById(R.id.lock);
+        mProgressView = (ImageView) findViewById(R.id.progress);
+        mProgressDrawable = mProgressView.getDrawable();
 
-        mIsInLandscape = mBrowserActivity.getResources().getConfiguration().orientation
-                == Configuration.ORIENTATION_LANDSCAPE;
-        mUrlView.setVisibility(mIsInLandscape ? View.GONE : View.VISIBLE);
+        mBackButton.setOnClickListener(this);
+        mForwardButton.setOnClickListener(this);
+        mStar.setOnClickListener(this);
+        mAllButton.setOnClickListener(this);
+        mStopButton.setOnClickListener(this);
+        mSearchButton.setOnClickListener(this);
+        mMenu.setOnClickListener(this);
         mUrlView.setUrlInputListener(this);
-        buildTabs(rebuildData);
-        // ensure title bar state
-        onCurrentTab(mControl.getCurrentTab());
     }
 
-    void showUrlEditor(TabViewData tabdata) {
-        mUrlView.setVisibility(View.VISIBLE);
-        if (mIsInLandscape) {
-            mTabs.setVisibility(View.GONE);
-            mUrlView.requestFocus();
-            mUrlView.forceIme();
+    @Override
+    public void onClick(View v) {
+        if (mBackButton == v) {
+            mBrowserActivity.getTopWindow().goBack();
+        } else if (mForwardButton == v) {
+            mBrowserActivity.getTopWindow().goForward();
+        } else if (mStar == v) {
+            mBrowserActivity.promptAddOrInstallBookmark();
+        } else if (mMenu == v) {
+            mBrowserActivity.openOptionsMenu();
+        } else if (mAllButton == v) {
+            // TODO: Show the new bookmarks/windows view.
+            mBrowserActivity.bookmarksOrHistoryPicker(false);
+        } else if (mSearchButton == v) {
+            search();
+        } else if (mStopButton == v) {
+            stopOrRefresh();
         }
     }
 
-    void hideUrlEditor() {
-        Tab tab = mControl.getCurrentTab();
-        if (mIsInLandscape) {
-            mUrlView.setVisibility(View.GONE);
-            mTabs.setVisibility(View.VISIBLE);
-        } else {
-            // portrait mode
-            mUrlView.setText(tab.getWebView().getUrl());
-        }
-        tab.getWebView().requestFocus();
+    void requestUrlInputFocus() {
+        mUrlView.requestFocus();
     }
 
+    @Override
+    void setFavicon(Bitmap icon) { }
 
     // UrlInputListener implementation
 
     @Override
     public void onAction(String text) {
-        hideUrlEditor();
+        mBrowserActivity.getTabControl().getCurrentTopWebView().requestFocus();
+        mBrowserActivity.hideFakeTitleBar();
         Intent i = new Intent();
         i.setAction(Intent.ACTION_SEARCH);
         i.putExtra(SearchManager.QUERY, text);
@@ -177,7 +134,8 @@
 
     @Override
     public void onDismiss() {
-        hideUrlEditor();
+        mBrowserActivity.getTabControl().getCurrentTopWebView().requestFocus();
+        mBrowserActivity.hideFakeTitleBar();
     }
 
     @Override
@@ -187,321 +145,41 @@
         mBrowserActivity.onCreateContextMenu(menu, this, null);
     }
 
-    @Override
-    /* package */ void setLock(Drawable d) {
-        // TODO: handle in tab specific callback
+    private void search() {
+        mUrlView.setText("");
+        mUrlView.requestFocus();
     }
 
-    @Override
-    /* package */ void setFavicon(Bitmap icon) {
-        // this is handled in the tab specific callback
+    private void stopOrRefresh() {
+        if (mInLoad) {
+            mBrowserActivity.stopLoading();
+        } else {
+            mBrowserActivity.getTopWindow().reload();
+        }
     }
 
     /**
      * Update the progress, from 0 to 100.
      */
     @Override
-    /* package */ void setProgress(int newProgress) {
-        // this is handled in tab specific callback
+    void setProgress(int newProgress) {
+        if (newProgress >= PROGRESS_MAX) {
+            mProgressView.setVisibility(View.GONE);
+            mInLoad = false;
+            mStopButton.setImageDrawable(mReloadDrawable);
+        } else {
+            if (!mInLoad) {
+                mProgressView.setVisibility(View.VISIBLE);
+                mInLoad = true;
+                mStopButton.setImageDrawable(mStopDrawable);
+            }
+            mProgressDrawable.setLevel(newProgress*10000/PROGRESS_MAX);
+        }
     }
 
     @Override
     /* package */ void setDisplayTitle(String title) {
-        // this is done in tab specific callback
-    }
-
-    private void buildTabs(boolean needsRebuilding) {
-        mTabs.clearTabs();
-        for (int i = 0; i < mControl.getTabCount(); i++) {
-            Tab tab = mControl.getTab(i);
-            TabViewData data = buildTab(needsRebuilding, tab);
-            TabView tv = buildView(data);
-        }
-        mTabs.setSelectedTab(mControl.getCurrentIndex());
-    }
-
-    private TabViewData buildTab(boolean needsRebuilding, Tab tab) {
-        TabViewData data = null;
-        if (needsRebuilding) {
-            data = new TabViewData(tab);
-            mTabMap.put(tab, data);
-        } else {
-            data = mTabMap.get(tab);
-        }
-        return data;
-    }
-
-    private TabView buildView(final TabViewData data) {
-        TabView tv = new TabView(mBrowserActivity, data);
-        tv.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mTabs.getSelectedTab() == v) {
-                    showUrlEditor(data);
-                } else {
-                    int ix = mControl.getTabIndex(data.mTab);
-                    mTabs.setSelectedTab(ix);
-                    mBrowserActivity.switchToTab(ix);
-                }
-            }
-        });
-        mTabs.addTab(tv);
-        return tv;
-    }
-
-    /**
-     * the views used in the tab bar
-     */
-    class TabView extends LinearLayout {
-
-        TabViewData          mTabData;
-        View                 mTabContent;
-        TextView             mTitle;
-        ImageView            mIconView;
-        ImageView            mLock;
-        CircularProgressView mStop;
-        ImageView            mClose;
-        boolean              mSelected;
-        boolean              mInLoad;
-
-        /**
-         * @param context
-         */
-        public TabView(Context context, TabViewData tab) {
-            super(context);
-            mTabData = tab;
-            LayoutInflater inflater = LayoutInflater.from(mContext);
-            mTabContent = inflater.inflate(R.layout.tab_title, this);
-            mTitle = (TextView) mTabContent.findViewById(R.id.title);
-            mIconView = (ImageView) mTabContent.findViewById(R.id.favicon);
-            mLock = (ImageView) mTabContent.findViewById(R.id.lock);
-            mStop = (CircularProgressView) mTabContent.findViewById(R.id.stop);
-            mStop.setMaxProgress(PROGRESS_MAX);
-            mClose = (ImageView) mTabContent.findViewById(R.id.close);
-            mClose.setOnClickListener(new OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    closeTab();
-                }
-            });
-            mStop.setOnClickListener(new OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (mInLoad) {
-                        mBrowserActivity.stopLoading();
-                    } else {
-                        mBrowserActivity.getTopWindow().reload();
-                    }
-                }
-            });
-            mSelected = false;
-            mInLoad = false;
-            // update the status
-            updateFromData();
-        }
-
-        private void updateFromData() {
-            mTabData.mTabView = this;
-            if (mTabData.mUrl != null) {
-                setDisplayTitle(mTabData.mUrl);
-            }
-            if (mTabData.mTitle != null) {
-                setDisplayTitle(mTabData.mTitle);
-            }
-            setProgress(mTabData.mProgress);
-            if (mTabData.mIcon != null) {
-                setFavicon(mTabData.mIcon);
-            }
-            if (mTabData.mLock != null) {
-                setLock(mTabData.mLock);
-            }
-        }
-
-        @Override
-        public void setSelected(boolean selected) {
-            mSelected = selected;
-            mStop.setVisibility(mSelected ? View.VISIBLE : View.GONE);
-            mIconView.setVisibility(mSelected ? View.VISIBLE : View.GONE);
-            super.setSelected(selected);
-            setBackgroundDrawable(selected ? mSelectedBackground
-                    : mUnselectedBackground);
-            setLayoutParams(new LayoutParams(selected ?
-                    (int) (TAB_WIDTH_SELECTED * mDensityScale)
-                    : (int) (TAB_WIDTH_UNSELECTED * mDensityScale),
-                    LayoutParams.WRAP_CONTENT));
-        }
-
-        void setDisplayTitle(String title) {
-            mTitle.setText(title);
-        }
-
-        void setFavicon(Drawable d) {
-            mIconView.setImageDrawable(d);
-        }
-
-        void setLock(Drawable d) {
-            if (null == d) {
-                mLock.setVisibility(View.GONE);
-            } else {
-                mLock.setImageDrawable(d);
-                mLock.setVisibility(View.VISIBLE);
-            }
-        }
-
-        void setTitleCompoundDrawables(Drawable left, Drawable top,
-                                              Drawable right, Drawable bottom) {
-            mTitle.setCompoundDrawables(left, top, right, bottom);
-        }
-
-        void setProgress(int newProgress) {
-            mStop.setProgress(newProgress);
-            if (newProgress >= PROGRESS_MAX) {
-                mInLoad = false;
-                mStop.setImageDrawable(mReloadDrawable);
-            } else {
-                if (!mInLoad && getWindowToken() != null) {
-                    // checking the window token lets us be sure that we
-                    // are attached to a window before starting the animation,
-                    // preventing a potential race condition
-                    // (fix for bug http://b/2115736)
-                    mInLoad = true;
-                    mStop.setImageDrawable(mStopDrawable);
-                }
-            }
-        }
-
-        private void closeTab() {
-            if (mTabData.mTab == mControl.getCurrentTab()) {
-                mBrowserActivity.closeCurrentWindow();
-            } else {
-                mBrowserActivity.closeTab(mTabData.mTab);
-            }
-        }
-
-    }
-
-    /**
-     * class to store tab state within the title bar
-     */
-    class TabViewData {
-
-        Tab mTab;
-        TabView mTabView;
-        int mProgress;
-        Drawable mIcon;
-        Drawable mLock;
-        String mTitle;
-        String mUrl;
-
-        TabViewData(Tab tab) {
-            mTab = tab;
-        }
-
-        void setUrlAndTitle(String url, String title) {
-            mUrl = url;
-            mTitle = title;
-            if (mTabView != null) {
-                if (title != null) {
-                    mTabView.setDisplayTitle(title);
-                } else if (url != null) {
-                    mTabView.setDisplayTitle(url);
-                }
-            }
-        }
-
-        void setProgress(int newProgress) {
-            mProgress = newProgress;
-            if (mTabView != null) {
-                mTabView.setProgress(mProgress);
-            }
-        }
-
-        void setFavicon(Bitmap icon) {
-            Drawable[] array = new Drawable[3];
-            array[0] = new PaintDrawable(Color.BLACK);
-            array[1] = new PaintDrawable(Color.WHITE);
-            if (icon == null) {
-                array[2] = mGenericFavicon;
-            } else {
-                array[2] = new BitmapDrawable(icon);
-            }
-            LayerDrawable d = new LayerDrawable(array);
-            d.setLayerInset(1, 1, 1, 1, 1);
-            d.setLayerInset(2, 2, 2, 2, 2);
-            mIcon = d;
-            if (mTabView != null) {
-                mTabView.setFavicon(mIcon);
-            }
-        }
-
-    }
-
-    // TabChangeListener implementation
-
-    @Override
-    public void onCurrentTab(Tab tab) {
-        mTabs.setSelectedTab(mControl.getCurrentIndex());
-        TabViewData tvd = mTabMap.get(tab);
-        if (tvd != null) {
-            if (tvd.mUrl != null) {
-                mUrlView.setText(tvd.mUrl);
-            }
-            setProgress(tvd.mProgress);
-        }
-    }
-
-    @Override
-    public void onFavicon(Tab tab, Bitmap favicon) {
-        TabViewData tvd = mTabMap.get(tab);
-        if (tvd != null) {
-            tvd.setFavicon(favicon);
-        }
-    }
-
-    @Override
-    public void onNewTab(Tab tab) {
-        TabViewData tvd = buildTab(true, tab);
-        buildView(tvd);
-    }
-
-    @Override
-    public void onProgress(Tab tab, int progress) {
-        TabViewData tvd = mTabMap.get(tab);
-        if (tvd != null) {
-            tvd.setProgress(progress);
-        }
-        if (tab == mControl.getCurrentTab()) {
-            setProgress(progress);
-        }
-    }
-
-    @Override
-    public void onRemoveTab(Tab tab) {
-        TabViewData tvd = mTabMap.get(tab);
-        TabView tv = tvd.mTabView;
-        if (tv != null) {
-            mTabs.removeTab(tv);
-        }
-        mTabMap.remove(tab);
-    }
-
-    @Override
-    public void onUrlAndTitle(Tab tab, String url, String title) {
-        TabViewData tvd = mTabMap.get(tab);
-        if (tvd != null) {
-            tvd.setUrlAndTitle(url, title);
-        }
-        if ((url != null) && (tab == mControl.getCurrentTab())) {
-            mUrlView.setText(url);
-        }
-    }
-
-    @Override
-    public void onPageFinished(Tab tab) {
-    }
-
-    @Override
-    public void onPageStarted(Tab tab) {
+        mUrlView.setText(title);
     }
 
 }
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 3841257..f564d6a 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -25,28 +25,28 @@
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.View.OnFocusChangeListener;
 import android.view.ViewGroup;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
 import android.widget.AutoCompleteTextView;
 import android.widget.CursorAdapter;
 import android.widget.Filterable;
 import android.widget.ImageView;
 import android.widget.TextView;
-import android.widget.AdapterView.OnItemClickListener;
 
 /**
  * url/search input view
  * handling suggestions
  */
-public class UrlInputView extends AutoCompleteTextView {
+public class UrlInputView extends AutoCompleteTextView
+        implements OnFocusChangeListener, OnItemClickListener {
 
     private UrlInputListener   mListener;
     private InputMethodManager mInputManager;
     private SuggestionsAdapter mAdapter;
     private Drawable           mFocusDrawable;
-    private Drawable           mNoFocusDrawable;
-
 
     public UrlInputView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
@@ -65,7 +65,6 @@
 
     private void init(Context ctx) {
         mFocusDrawable = ctx.getResources().getDrawable(R.drawable.textfield_stroke);
-        mNoFocusDrawable = ctx.getResources().getDrawable(R.drawable.textfield_nostroke);
         mInputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
         setOnEditorActionListener(new OnEditorActionListener() {
             @Override
@@ -74,26 +73,32 @@
                 return true;
             }
         });
-        setOnFocusChangeListener(new OnFocusChangeListener() {
-            @Override
-            public void onFocusChange(View v, boolean hasFocus) {
-                setBackgroundDrawable(hasFocus ? mFocusDrawable : mNoFocusDrawable);
-            }
-        });
+        setOnFocusChangeListener(this);
         final ContentResolver cr = mContext.getContentResolver();
         mAdapter = new SuggestionsAdapter(mContext,
                 BrowserProvider.getBookmarksSuggestions(cr, null));
         setAdapter(mAdapter);
-        setOnItemClickListener(new OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                String url = mAdapter.getViewString(view);
-                finishInput(url);
-            }
-        });
+        setOnItemClickListener(this);
         setSelectAllOnFocus(true);
     }
 
+    @Override
+    public void onFocusChange(View v, boolean hasFocus) {
+        setBackgroundDrawable(hasFocus ? mFocusDrawable : null);
+        if (hasFocus) {
+            forceIme();
+        } else {
+            finishInput(null);
+        }
+    }
+
+    @Override
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        String url = mAdapter.getViewString(view);
+        finishInput(url);
+    }
+
+
     public void setUrlInputListener(UrlInputListener listener) {
         mListener = listener;
     }
@@ -110,7 +115,6 @@
         } else {
             mListener.onAction(url);
         }
-
     }
 
     @Override
@@ -124,11 +128,8 @@
     }
 
     interface UrlInputListener {
-
         public void onDismiss();
-
         public void onAction(String text);
-
     }
 
     /**
