diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index e305c07..3408108 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -18,17 +18,13 @@
 
 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.util.Log;
 import android.view.ContextMenu;
 import android.view.LayoutInflater;
 import android.view.MenuInflater;
@@ -36,6 +32,7 @@
 import android.view.View.OnClickListener;
 import android.view.View.OnFocusChangeListener;
 import android.widget.ImageView;
+import android.widget.TextView;
 
 /**
  * tabbed title bar for xlarge screen browser
@@ -48,8 +45,6 @@
     private BrowserActivity mBrowserActivity;
     private Drawable mStopDrawable;
     private Drawable mReloadDrawable;
-    private Drawable mFocusDrawable;
-    private Drawable mUnFocusDrawable;
 
 
     private View mContainer;
@@ -57,11 +52,14 @@
     private View mForwardButton;
     private View mStar;
     private View mSearchButton;
-    private View mInputContainer;
+    private View mFocusContainer;
+    private View mUnfocusContainer;
+    private View mGoButton;
     private ImageView mStopButton;
     private View mAllButton;
     private PageProgressView mProgressView;
-    private UrlInputView mUrlView;
+    private UrlInputView mUrlFocused;
+    private TextView mUrlUnfocused;
     private boolean mInLoad;
 
     public TitleBarXLarge(BrowserActivity context) {
@@ -70,8 +68,6 @@
         Resources resources = context.getResources();
         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);
     }
 
@@ -80,7 +76,8 @@
         factory.inflate(R.layout.url_bar, this);
 
         mContainer = findViewById(R.id.taburlbar);
-        mUrlView = (UrlInputView) findViewById(R.id.editurl);
+        mUrlFocused = (UrlInputView) findViewById(R.id.url_focused);
+        mUrlUnfocused = (TextView) findViewById(R.id.url_unfocused);
         mAllButton = findViewById(R.id.all_btn);
         // TODO: Change enabled states based on whether you can go
         // back/forward.  Probably should be done inside onPageStarted.
@@ -90,8 +87,10 @@
         mStopButton = (ImageView) findViewById(R.id.stop);
         mSearchButton = findViewById(R.id.search);
         mLockIcon = (ImageView) findViewById(R.id.lock);
+        mGoButton = findViewById(R.id.go);
         mProgressView = (PageProgressView) findViewById(R.id.progress);
-        mInputContainer = findViewById(R.id.urlbar);
+        mFocusContainer = findViewById(R.id.urlbar_focused);
+        mUnfocusContainer = findViewById(R.id.urlbar_unfocused);
 
         mBackButton.setOnClickListener(this);
         mForwardButton.setOnClickListener(this);
@@ -99,16 +98,19 @@
         mAllButton.setOnClickListener(this);
         mStopButton.setOnClickListener(this);
         mSearchButton.setOnClickListener(this);
-        mUrlView.setUrlInputListener(this);
-        mUrlView.setOnFocusChangeListener(this);
-        mInputContainer.setBackgroundDrawable(mUnFocusDrawable);
-        mUrlView.setTextColor(Color.GRAY);
-
+        mGoButton.setOnClickListener(this);
+        mUrlFocused.setUrlInputListener(this);
+        mUrlUnfocused.setOnFocusChangeListener(this);
     }
     
     public void onFocusChange(View v, boolean hasFocus) {
-        mInputContainer.setBackgroundDrawable(hasFocus ? mFocusDrawable : mUnFocusDrawable);
-        mUrlView.setTextColor(hasFocus ? Color.BLACK : Color.GRAY);
+        if (hasFocus) {
+            swapUrlContainer(true);
+            mUrlFocused.selectAll();
+            mUrlFocused.requestFocus();
+            mUrlFocused.setDropDownWidth(mUnfocusContainer.getWidth());
+            mUrlFocused.setDropDownHorizontalOffset(-mUrlFocused.getLeft());
+        }
     }
 
     @Override
@@ -125,6 +127,8 @@
             search();
         } else if (mStopButton == v) {
             stopOrRefresh();
+        } else if (mGoButton == v) {
+            onAction(mUrlFocused.getText().toString());
         }
     }
 
@@ -132,10 +136,6 @@
         return mContainer.getHeight();
     }
 
-    void requestUrlInputFocus() {
-        mUrlView.requestFocus();
-    }
-
     @Override
     void setFavicon(Bitmap icon) { }
 
@@ -149,13 +149,29 @@
         i.setAction(Intent.ACTION_SEARCH);
         i.putExtra(SearchManager.QUERY, text);
         mBrowserActivity.onNewIntent(i);
+        swapUrlContainer(false);
+        setDisplayTitle(text);
     }
 
     @Override
     public void onDismiss() {
         mBrowserActivity.getTabControl().getCurrentTopWebView().requestFocus();
         mBrowserActivity.hideFakeTitleBar();
-        mUrlView.setText(mBrowserActivity.getTabControl().getCurrentWebView().getUrl());
+        setDisplayTitle(mBrowserActivity.getTabControl().getCurrentWebView().getUrl());
+        swapUrlContainer(false);
+    }
+
+    @Override
+    public void onEdit(String text) {
+        setDisplayTitle(text);
+        if (text != null) {
+            mUrlFocused.setSelection(text.length());
+        }
+    }
+
+    private void swapUrlContainer(boolean focus) {
+        mUnfocusContainer.setVisibility(focus ? View.GONE : View.VISIBLE);
+        mFocusContainer.setVisibility(focus ? View.VISIBLE : View.GONE);
     }
 
     @Override
@@ -166,8 +182,8 @@
     }
 
     private void search() {
-        mUrlView.setText("");
-        mUrlView.requestFocus();
+        setDisplayTitle("");
+        mUrlUnfocused.requestFocus();
     }
 
     private void stopOrRefresh() {
@@ -199,7 +215,8 @@
 
     @Override
     /* package */ void setDisplayTitle(String title) {
-        mUrlView.setText(title);
+        mUrlFocused.setText(title);
+        mUrlUnfocused.setText(title);
     }
 
 }
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 9ae464b..96a5980 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -20,21 +20,26 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.Cursor;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
+import android.text.Editable;
+import android.text.SpannableStringBuilder;
+import android.text.TextWatcher;
+import android.text.style.BackgroundColorSpan;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.view.ActionMode;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
-import android.view.MotionEvent;
 import android.view.View;
+import android.view.View.OnClickListener;
 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.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
 import android.widget.TextView.OnEditorActionListener;
@@ -44,7 +49,7 @@
  * handling suggestions
  */
 public class UrlInputView extends AutoCompleteTextView
-        implements OnFocusChangeListener, OnItemClickListener, OnEditorActionListener {
+        implements OnFocusChangeListener, OnClickListener, OnEditorActionListener {
 
     private UrlInputListener   mListener;
     private InputMethodManager mInputManager;
@@ -75,9 +80,13 @@
         mAdapter = new SuggestionsAdapter(mContext,
                 BrowserProvider.getBookmarksSuggestions(cr, null));
         setAdapter(mAdapter);
-        setOnItemClickListener(this);
         setSelectAllOnFocus(false);
-        
+    }
+
+    @Override
+    public ActionMode startActionMode(ActionMode.Callback callback) {
+        // suppress selection action mode
+        return null;
     }
 
     @Override
@@ -92,19 +101,6 @@
     }
     
     @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) {
         if (hasFocus) {
             forceIme();
@@ -117,12 +113,18 @@
     }
 
     @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        String url = mAdapter.getViewString(view);
-        finishInput(url);
+    public void onClick(View view) {
+        if (view instanceof ImageButton) {
+            // user pressed edit search button
+            String text = mAdapter.getViewString((View)view.getParent());
+            mListener.onEdit(text);
+        } else {
+            // user selected dropdown item
+            String url = mAdapter.getViewString(view);
+            finishInput(url);
+        }
     }
 
-
     public void setUrlInputListener(UrlInputListener listener) {
         mListener = listener;
     }
@@ -155,6 +157,7 @@
     interface UrlInputListener {
         public void onDismiss();
         public void onAction(String text);
+        public void onEdit(String text);
     }
 
     /**
@@ -190,7 +193,7 @@
         public View newView(Context context, Cursor cursor, ViewGroup parent) {
             final LayoutInflater inflater = LayoutInflater.from(context);
             final View view = inflater.inflate(
-                    R.layout.simple_dropdown_item_2line, parent, false);
+                    R.layout.url_dropdown_item, parent, false);
             bindView(view, context, cursor);
             return view;
         }
@@ -200,16 +203,20 @@
             TextView tv1 = (TextView) view.findViewById(android.R.id.text1);
             TextView tv2 = (TextView) view.findViewById(android.R.id.text2);
             ImageView ic1 = (ImageView) view.findViewById(R.id.icon1);
+            View ic2 = view.findViewById(R.id.icon2);
             tv1.setText(cursor.getString(mIndexText1));
             String url = cursor.getString(mIndexText2);
             tv2.setText((url != null) ? url : "");
+            ic2.setOnClickListener(UrlInputView.this);
             // assume an id
             try {
                 int id = Integer.parseInt(cursor.getString(mIndexIcon));
                 Drawable d = context.getResources().getDrawable(id);
                 ic1.setImageDrawable(d);
+                ic2.setVisibility((id == R.drawable.ic_search_category_suggest)? View.VISIBLE : View.GONE);
             } catch (NumberFormatException nfx) {
             }
+            view.setOnClickListener(UrlInputView.this);
         }
 
         @Override
