diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 7890485..e6cb473 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -23,6 +23,7 @@
 import android.app.ActionBar;
 import android.app.Activity;
 import android.app.AlertDialog;
+import android.app.Dialog;
 import android.app.ProgressDialog;
 import android.app.SearchManager;
 import android.content.ActivityNotFoundException;
@@ -105,6 +106,7 @@
 import android.widget.EditText;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
+import android.widget.PopupMenu;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -126,7 +128,8 @@
 import java.util.regex.Pattern;
 
 public class BrowserActivity extends Activity
-    implements View.OnCreateContextMenuListener, DownloadListener {
+    implements View.OnCreateContextMenuListener, DownloadListener,
+    PopupMenu.OnMenuItemClickListener {
 
     /* Define some aliases to make these debugging flags easier to refer to.
      * This file imports android.provider.Browser, so we can't just refer to "Browser.DEBUG".
@@ -226,6 +229,8 @@
             mTitleBar.setProgress(100);
             mFakeTitleBar = new TitleBarXLarge(this);
             ActionBar actionBar = getActionBar();
+            actionBar.setBackgroundDrawable(getResources().
+                    getDrawable(R.drawable.tabbar_bg));
             mTabBar = new TabBar(this, mTabControl, (TitleBarXLarge) mFakeTitleBar);
             actionBar.setCustomNavigationMode(mTabBar);
             // disable built in zoom controls
@@ -3869,45 +3874,70 @@
 
     }
 
-    /* package*/ void promptAddOrInstallBookmark() {
+    /* package */ void promptAddOrInstallBookmark(View anchor) {
+        PopupMenu popup = new PopupMenu(this, anchor);
+        popup.getMenuInflater().inflate(R.menu.bookmark_shortcut, popup.getMenu());
+        popup.setOnMenuItemClickListener(this);
+        popup.show();
+    }
+    
+    /**
+     * popup menu item click listener
+     * @param item
+     */
+    public boolean onMenuItemClick(MenuItem item) {
+        switch(item.getItemId()) {
+            case R.id.add_bookmark_menu_id:
+                bookmarkCurrentPage();
+                return true;
+            case R.id.shortcut_to_home_menu_id:
+                Tab current = mTabControl.getCurrentTab();
+                current.populatePickerData();
+                String touchIconUrl = mTabControl.getCurrentWebView().getTouchIconUrl();
+                if (touchIconUrl != null) {
+                    // Download the touch icon for this site then save
+                    // it to the
+                    // homescreen.
+                    Bundle b = new Bundle();
+                    b.putString("url", current.getUrl());
+                    b.putString("title", current.getTitle());
+                    b.putParcelable("favicon", current.getFavicon());
+                    Message msg = mHandler.obtainMessage(TOUCH_ICON_DOWNLOADED);
+                    msg.setData(b);
+                    new DownloadTouchIcon(BrowserActivity.this, msg,
+                            mTabControl.getCurrentWebView().getSettings().getUserAgentString())
+                            .execute(touchIconUrl);
+                } else {
+                    // add to homescreen, can do it immediately as there
+                    // is no touch
+                    // icon.
+                    showSaveToHomescreenDialog(
+                            current.getUrl(), current.getTitle(), null, current.getFavicon());
+                }
+                return true;
+            default:
+                return false;
+        }
+    }
+    
+    /* package */Dialog makeAddOrInstallDialog() {
         final Tab current = mTabControl.getCurrentTab();
         Resources resources = getResources();
-        CharSequence[] choices = {
-                resources.getString(R.string.save_to_bookmarks),
-                resources.getString(R.string.create_shortcut_bookmark)
-        };
+        CharSequence[] choices =
+                {resources.getString(R.string.save_to_bookmarks),
+                        resources.getString(R.string.create_shortcut_bookmark)};
 
         AlertDialog.Builder builder = new AlertDialog.Builder(this);
         builder.setTitle(R.string.add_new_bookmark);
         builder.setItems(choices, new DialogInterface.OnClickListener() {
-                public void onClick(DialogInterface dialog, int item) {
-                    if (item == 0) {
-                        bookmarkCurrentPage();
-                    } else if (item == 1) {
-                        current.populatePickerData();
-                        String touchIconUrl = mTabControl.getCurrentWebView().getTouchIconUrl();
-                        if (touchIconUrl != null) {
-                            // Download the touch icon for this site then save it to the
-                            // homescreen.
-                            Bundle b = new Bundle();
-                            b.putString("url", current.getUrl());
-                            b.putString("title", current.getTitle());
-                            b.putParcelable("favicon", current.getFavicon());
-                            Message msg = mHandler.obtainMessage(TOUCH_ICON_DOWNLOADED);
-                            msg.setData(b);
-                            new DownloadTouchIcon(BrowserActivity.this, msg,
-                                    mTabControl.getCurrentWebView().getSettings()
-                                    .getUserAgentString()).execute(touchIconUrl);
-                        } else {
-                            // add to homescreen, can do it immediately as there is no touch
-                            // icon.
-                            showSaveToHomescreenDialog(current.getUrl(), current.getTitle(),
-                                    null, current.getFavicon());
-                        }
-                     }
-                 }
+            public void onClick(DialogInterface dialog, int item) {
+                if (item == 0) {
+                    bookmarkCurrentPage();
+                } else if (item == 1) {
+                }
+            }
         });
-        builder.create().show();
+        return builder.create();
     }
 
     /**
diff --git a/src/com/android/browser/PageProgressView.java b/src/com/android/browser/PageProgressView.java
new file mode 100644
index 0000000..183566a
--- /dev/null
+++ b/src/com/android/browser/PageProgressView.java
@@ -0,0 +1,94 @@
+
+/*
+ * 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.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+/**
+ *
+ */
+public class PageProgressView extends ImageView {
+
+    private int mProgress;
+    private int mMaxProgress;
+    private Rect mBounds;
+
+    /**
+     * @param context
+     * @param attrs
+     * @param defStyle
+     */
+    public PageProgressView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(context);
+    }
+
+    /**
+     * @param context
+     * @param attrs
+     */
+    public PageProgressView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(context);
+    }
+
+    /**
+     * @param context
+     */
+    public PageProgressView(Context context) {
+        super(context);
+        init(context);
+    }
+
+    private void init(Context ctx) {
+        mMaxProgress = 10000;
+        mBounds = new Rect(0,0,0,0);
+        mProgress = 0;
+    }
+
+    @Override
+    public void onLayout(boolean f, int l, int t, int r, int b) {
+        mBounds.left = 0;
+        mBounds.right = (r - l) * mProgress / mMaxProgress;
+        mBounds.top = 0;
+        mBounds.bottom = b-t;
+    }
+
+    void setMaxProgress(int max) {
+        mMaxProgress = max;
+    }
+
+    void setProgress(int progress) {
+        mProgress = progress;
+        mBounds.right = getWidth()*mProgress/mMaxProgress;
+        invalidate();
+    }
+
+    @Override
+    public void onDraw(Canvas canvas) {
+//        super.onDraw(canvas);
+        Drawable d = getDrawable();
+        d.setBounds(mBounds);
+        d.draw(canvas);
+    }
+
+}
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 3d8a44f..cf0f27c 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -55,13 +55,9 @@
     private final int mTabWidthSelected;
     private final int mTabWidthUnselected;
 
-    private final Drawable mShowUrlDrawable;
-    private final Drawable mHideUrlDrawable;
-
     private TitleBarXLarge mTitleBar;
 
     private TabScrollView mTabs;
-    private ImageButton mShowUrlButton;
     private TabControl mControl;
 
     private Map<Tab, TabViewData> mTabMap;
@@ -76,8 +72,6 @@
         Resources res = context.getResources();
         mTabWidthSelected = (int) res.getDimension(R.dimen.tab_width_selected);
         mTabWidthUnselected = (int) res.getDimension(R.dimen.tab_width_unselected);
-        mShowUrlDrawable = res.getDrawable(R.drawable.ic_menu_showurl);
-        mHideUrlDrawable = res.getDrawable(R.drawable.ic_menu_hideurl);
 
         mTitleBar = titlebar;
         mTitleBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
@@ -90,13 +84,10 @@
         LayoutInflater factory = LayoutInflater.from(context);
         factory.inflate(R.layout.tab_bar, this);
         mTabs = (TabScrollView) findViewById(R.id.tabs);
-        mShowUrlButton = (ImageButton) findViewById(R.id.showurl);
 
         // TODO: Change enabled states based on whether you can go
         // back/forward.  Probably should be done inside onPageStarted.
 
-        mShowUrlButton.setOnClickListener(this);
-
         // build tabs
         int tabcount = mControl.getTabCount();
         for (int i = 0; i < tabcount; i++) {
@@ -113,15 +104,7 @@
     }
 
     public void onClick(View view) {
-        if (mShowUrlButton == view) {
-            if (mShowUrlMode) {
-                showUrlBar();
-            } else if (!isLoading()) {
-                ScrollWebView swv = (ScrollWebView) mControl.getCurrentWebView();
-                swv.hideEmbeddedTitleBar();
-                mBrowserActivity.hideFakeTitleBar();
-            }
-        } else if (mTabs.getSelectedTab() == view) {
+        if (mTabs.getSelectedTab() == view) {
             if (mBrowserActivity.isFakeTitleBarShowing() && !isLoading()) {
                 mBrowserActivity.hideFakeTitleBar();
             } else {
@@ -145,8 +128,6 @@
 
     private void setShowUrlMode(boolean showUrl) {
         mShowUrlMode = showUrl;
-        Drawable newDrawable = mShowUrlMode ? mShowUrlDrawable : mHideUrlDrawable;
-        mShowUrlButton.setImageDrawable(newDrawable);
     }
 
     // callback after fake titlebar is shown
@@ -272,7 +253,10 @@
         public void setSelected(boolean selected) {
             mSelected = selected;
             mClose.setVisibility(mSelected ? View.VISIBLE : View.GONE);
-            mTitle.setTextColor(mSelected ? Color.BLACK : Color.GRAY);
+            mTitle.setTextAppearance(mBrowserActivity, mSelected ?
+                    R.style.TabTitleSelected : R.style.TabTitleUnselected);
+            setHorizontalFadingEdgeEnabled(!mSelected);
+            setFadingEdgeLength(50);
             super.setSelected(selected);
             setLayoutParams(new LayoutParams(selected ?
                     mTabWidthSelected : mTabWidthUnselected,
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
index f45025d..bbb55ad 100644
--- a/src/com/android/browser/TitleBar.java
+++ b/src/com/android/browser/TitleBar.java
@@ -205,7 +205,7 @@
                     } else if (mInLoad) {
                         mBrowserActivity.stopLoading();
                     } else {
-                        mBrowserActivity.promptAddOrInstallBookmark();
+                        mBrowserActivity.promptAddOrInstallBookmark(button);
                     }
                     button.setPressed(false);
                 } else if (mTitleBg.isPressed()) {
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index a7957ab..e305c07 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -16,42 +16,51 @@
 
 package com.android.browser;
 
+import com.android.browser.UrlInputView.UrlInputListener;
+
+import android.app.AlertDialog;
 import android.app.SearchManager;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Message;
 import android.view.ContextMenu;
 import android.view.LayoutInflater;
 import android.view.MenuInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.view.View.OnFocusChangeListener;
 import android.widget.ImageView;
 
-import com.android.browser.UrlInputView.UrlInputListener;
-
 /**
  * tabbed title bar for xlarge screen browser
  */
 public class TitleBarXLarge extends TitleBarBase
-    implements UrlInputListener, OnClickListener {
+    implements UrlInputListener, OnClickListener, OnFocusChangeListener {
 
     private static final int PROGRESS_MAX = 100;
 
     private BrowserActivity mBrowserActivity;
     private Drawable mStopDrawable;
     private Drawable mReloadDrawable;
-    private Drawable mProgressDrawable;
+    private Drawable mFocusDrawable;
+    private Drawable mUnFocusDrawable;
+
 
     private View mContainer;
     private View mBackButton;
     private View mForwardButton;
     private View mStar;
     private View mSearchButton;
+    private View mInputContainer;
     private ImageView mStopButton;
     private View mAllButton;
-    private ImageView mProgressView;
+    private PageProgressView mProgressView;
     private UrlInputView mUrlView;
     private boolean mInLoad;
 
@@ -59,13 +68,14 @@
         super(context);
         mBrowserActivity = context;
         Resources resources = context.getResources();
-        mStopDrawable = resources.getDrawable(R.drawable.ic_stop);
-        mReloadDrawable = resources.getDrawable(R.drawable.ic_reload);
+        mStopDrawable = resources.getDrawable(R.drawable.ic_stop_normal);
+        mReloadDrawable = resources.getDrawable(R.drawable.ic_refresh_normal);
+        mFocusDrawable = resources.getDrawable(R.drawable.text_field_results);
+        mUnFocusDrawable = resources.getDrawable(R.drawable.text_field);
         rebuildLayout(context, true);
     }
 
     private void rebuildLayout(Context context, boolean rebuildData) {
-        removeAllViews();
         LayoutInflater factory = LayoutInflater.from(context);
         factory.inflate(R.layout.url_bar, this);
 
@@ -80,8 +90,8 @@
         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();
+        mProgressView = (PageProgressView) findViewById(R.id.progress);
+        mInputContainer = findViewById(R.id.urlbar);
 
         mBackButton.setOnClickListener(this);
         mForwardButton.setOnClickListener(this);
@@ -90,6 +100,15 @@
         mStopButton.setOnClickListener(this);
         mSearchButton.setOnClickListener(this);
         mUrlView.setUrlInputListener(this);
+        mUrlView.setOnFocusChangeListener(this);
+        mInputContainer.setBackgroundDrawable(mUnFocusDrawable);
+        mUrlView.setTextColor(Color.GRAY);
+
+    }
+    
+    public void onFocusChange(View v, boolean hasFocus) {
+        mInputContainer.setBackgroundDrawable(hasFocus ? mFocusDrawable : mUnFocusDrawable);
+        mUrlView.setTextColor(hasFocus ? Color.BLACK : Color.GRAY);
     }
 
     @Override
@@ -99,7 +118,7 @@
         } else if (mForwardButton == v) {
             mBrowserActivity.getTopWindow().goForward();
         } else if (mStar == v) {
-            mBrowserActivity.promptAddOrInstallBookmark();
+            mBrowserActivity.promptAddOrInstallBookmark(mStar);
         } else if (mAllButton == v) {
             mBrowserActivity.bookmarksOrHistoryPicker(false, false);
         } else if (mSearchButton == v) {
@@ -174,7 +193,7 @@
                 mInLoad = true;
                 mStopButton.setImageDrawable(mStopDrawable);
             }
-            mProgressDrawable.setLevel(newProgress*10000/PROGRESS_MAX);
+            mProgressView.setProgress(newProgress*10000/PROGRESS_MAX);
         }
     }
 
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 77d7daf..9ae464b 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -22,8 +22,10 @@
 import android.database.Cursor;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnFocusChangeListener;
 import android.view.ViewGroup;
@@ -47,7 +49,8 @@
     private UrlInputListener   mListener;
     private InputMethodManager mInputManager;
     private SuggestionsAdapter mAdapter;
-    private Drawable           mFocusDrawable;
+
+    private OnFocusChangeListener mWrappedFocusListener;
 
     public UrlInputView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
@@ -65,16 +68,21 @@
     }
 
     private void init(Context ctx) {
-        mFocusDrawable = ctx.getResources().getDrawable(R.drawable.textfield_stroke);
         mInputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
         setOnEditorActionListener(this);
-        setOnFocusChangeListener(this);
+        super.setOnFocusChangeListener(this);
         final ContentResolver cr = mContext.getContentResolver();
         mAdapter = new SuggestionsAdapter(mContext,
                 BrowserProvider.getBookmarksSuggestions(cr, null));
         setAdapter(mAdapter);
         setOnItemClickListener(this);
-        setSelectAllOnFocus(true);
+        setSelectAllOnFocus(false);
+        
+    }
+
+    @Override
+    public void setOnFocusChangeListener(OnFocusChangeListener focusListener) {
+        mWrappedFocusListener = focusListener;
     }
 
     @Override
@@ -82,15 +90,30 @@
         finishInput(getText().toString());
         return true;
     }
-
+    
+    @Override
+    public boolean onTouchEvent(MotionEvent evt) {
+        
+        if ((evt.getAction() == MotionEvent.ACTION_DOWN) && !this.hasFocus()) {
+            Log.i("test","onTouch");
+            selectAll();
+            requestFocus();
+            return true;
+        } else {
+            return super.onTouchEvent(evt);
+        }
+    }
+    
     @Override
     public void onFocusChange(View v, boolean hasFocus) {
-        setBackgroundDrawable(hasFocus ? mFocusDrawable : null);
         if (hasFocus) {
             forceIme();
         } else {
             finishInput(null);
         }
+        if (mWrappedFocusListener != null) {
+            mWrappedFocusListener.onFocusChange(v, hasFocus);
+        }
     }
 
     @Override
@@ -110,6 +133,7 @@
 
     private void finishInput(String url) {
         this.dismissDropDown();
+        this.setSelection(0,0);
         mInputManager.hideSoftInputFromWindow(getWindowToken(), 0);
         if (url == null) {
             mListener.onDismiss();
