diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 4ea96bb..f5d72ac 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -1614,7 +1614,6 @@
                     final MenuItem newtab = menu.findItem(R.id.new_tab_menu_id);
                     newtab.setEnabled(mTabControl.canCreateNewTab());
                 }
-
                 // decide whether to show the share link option
                 PackageManager pm = getPackageManager();
                 Intent send = new Intent(Intent.ACTION_SEND);
@@ -3873,7 +3872,7 @@
         popup.setOnMenuItemClickListener(this);
         popup.show();
     }
-    
+
     /**
      * popup menu item click listener
      * @param item
@@ -3912,7 +3911,7 @@
                 return false;
         }
     }
-    
+
     /* package */Dialog makeAddOrInstallDialog() {
         final Tab current = mTabControl.getCurrentTab();
         Resources resources = getResources();
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 4c8ab26..9217ef2 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -16,6 +16,9 @@
 
 package com.android.browser;
 
+import com.android.browser.ScrollWebView.ScrollListener;
+import com.android.browser.TabControl.TabChangeListener;
+
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -36,9 +39,6 @@
 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;
 
@@ -59,10 +59,11 @@
 
     private TabScrollView mTabs;
     private TabControl mControl;
+    private ImageButton mNewTab;
+    private int mButtonWidth;
 
     private Map<Tab, TabViewData> mTabMap;
 
-    private float mDensityScale;
     private boolean mUserRequestedUrlbar;
     private boolean mTitleVisible;
     private boolean mShowUrlMode;
@@ -76,7 +77,6 @@
         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;
@@ -84,6 +84,8 @@
         LayoutInflater factory = LayoutInflater.from(context);
         factory.inflate(R.layout.tab_bar, this);
         mTabs = (TabScrollView) findViewById(R.id.tabs);
+        mNewTab = (ImageButton) findViewById(R.id.newtab);
+        mNewTab.setOnClickListener(this);
 
         // TODO: Change enabled states based on whether you can go
         // back/forward.  Probably should be done inside onPageStarted.
@@ -101,22 +103,38 @@
         mControl.setOnTabChangeListener(this);
         mUserRequestedUrlbar = false;
         mTitleVisible = true;
+        mButtonWidth = -1;
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        if (mButtonWidth == -1) {
+            mButtonWidth = mNewTab.getMeasuredWidth();
+        }
+        int sw = mTabs.getMeasuredWidth();
+        int w = right-left;
+        if (w-sw < mButtonWidth) {
+            sw = w - mButtonWidth;
+        }
+        mTabs.layout(0, 0, sw, bottom-top );
+        mNewTab.layout(sw, 0, sw+mButtonWidth, bottom-top);
     }
 
     public void onClick(View view) {
-        if (mTabs.getSelectedTab() == view) {
+        if (mNewTab == view) {
+            mBrowserActivity.openTabToHomePage();
+        } else if (mTabs.getSelectedTab() == view) {
             if (mBrowserActivity.isFakeTitleBarShowing() && !isLoading()) {
                 mBrowserActivity.hideFakeTitleBar();
             } else {
                 showUrlBar();
             }
-            // temporarily disabled
-            // mTitleBar.requestUrlInputFocus();
         } else {
-            TabViewData data = (TabViewData) view.getTag();
-            int ix = mControl.getTabIndex(data.mTab);
-            mTabs.setSelectedTab(ix);
-            mBrowserActivity.switchToTab(ix);
+            int ix = mTabs.getChildIndex(view);
+            if (ix >= 0) {
+                mTabs.setSelectedTab(ix);
+                mBrowserActivity.switchToTab(ix);
+            }
         }
     }
 
diff --git a/src/com/android/browser/TabScrollView.java b/src/com/android/browser/TabScrollView.java
index 435362d..fcd5a80 100644
--- a/src/com/android/browser/TabScrollView.java
+++ b/src/com/android/browser/TabScrollView.java
@@ -27,10 +27,8 @@
  */
 public class TabScrollView extends HorizontalScrollView {
 
-    private Context mContext;
-
+    private BrowserActivity mBrowserActivity;
     private LinearLayout mContentView;
-
     private int mSelected;
 
     /**
@@ -61,9 +59,9 @@
     }
 
     private void init(Context ctx) {
-        mContext = ctx;
+        mBrowserActivity = (BrowserActivity)ctx;
         setHorizontalScrollBarEnabled(false);
-        mContentView = new LinearLayout(mContext);
+        mContentView = new LinearLayout(mBrowserActivity);
         mContentView.setOrientation(LinearLayout.HORIZONTAL);
         mContentView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                 LayoutParams.MATCH_PARENT));
@@ -90,6 +88,10 @@
         requestLayout();
     }
 
+    int getChildIndex(View v) {
+        return mContentView.indexOfChild(v);
+    }
+
     View getSelectedTab() {
         if ((mSelected >= 0) && (mSelected < mContentView.getChildCount())) {
             return mContentView.getChildAt(mSelected);
@@ -107,11 +109,6 @@
         tab.setActivated(false);
     }
 
-    void addTab(View tab, int pos) {
-        mContentView.addView(tab, pos);
-        tab.setActivated(false);
-    }
-
     void removeTab(View tab) {
         int ix = mContentView.indexOfChild(tab);
         if (ix == mSelected) {
@@ -138,5 +135,4 @@
         }
     }
 
-
 }
