diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 3638bbf..9de2c57 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -824,7 +824,7 @@
         }
     }
 
-    private void showTitleBarForDuration() {
+    protected void showTitleBarForDuration() {
         mHandler.removeMessages(MSG_HIDE_TITLEBAR);
         showTitleBar();
         Message msg = Message.obtain(mHandler, MSG_HIDE_TITLEBAR);
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index a841989..43a38e0 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -32,16 +32,13 @@
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
-import android.widget.ListPopupWindow;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnMenuItemClickListener;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
-import com.android.browser.view.Gallery.OnItemSelectedListener;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class NavScreen extends RelativeLayout implements OnClickListener {
+public class NavScreen extends RelativeLayout
+        implements OnClickListener, OnMenuItemClickListener {
 
     UiController mUiController;
     PhoneUi mUi;
@@ -65,7 +62,6 @@
     int mTabWidth;
     int mTabHeight;
     TabAdapter mAdapter;
-    ListPopupWindow mPopup;
     int mOrientation;
 
     public NavScreen(Activity activity, UiController ctl, PhoneUi ui) {
@@ -82,32 +78,23 @@
     }
 
     protected void showMenu() {
-        Menu menu = mUi.getMenu();
+        PopupMenu popup = new PopupMenu(mContext, mMore);
+        Menu menu = popup.getMenu();
+        popup.getMenuInflater().inflate(R.menu.browser, menu);
         menu.setGroupVisible(R.id.NAV_MENU, false);
-
-        MenuAdapter menuAdapter = new MenuAdapter(mContext);
-        menuAdapter.setMenu(menu);
-        ListPopupWindow popup = new ListPopupWindow(mContext);
-        popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
-        popup.setAdapter(menuAdapter);
-        popup.setModal(true);
-        popup.setAnchorView(mMore);
-        popup.setWidth((int) mContext.getResources().getDimension(
-                R.dimen.menu_width));
+        popup.setOnMenuItemClickListener(this);
         popup.show();
-        mPopup = popup;
+    }
+
+    @Override
+    public boolean onMenuItemClick(MenuItem item) {
+        return mUiController.onOptionsItemSelected(item);
     }
 
     protected float getToolbarHeight() {
         return mActivity.getResources().getDimension(R.dimen.toolbar_height);
     }
 
-    protected void dismissMenu() {
-        if (mPopup != null) {
-            mPopup.dismiss();
-        }
-    }
-
     // for configuration changes
     @Override
     protected void onConfigurationChanged(Configuration newconfig) {
@@ -284,64 +271,4 @@
 
     }
 
-    private class MenuAdapter extends BaseAdapter implements OnClickListener {
-
-        List<MenuItem> mItems;
-        LayoutInflater mInflater;
-
-        public MenuAdapter(Context ctx) {
-            mInflater = LayoutInflater.from(ctx);
-            mItems = new ArrayList<MenuItem>();
-        }
-
-        public void setMenu(Menu menu) {
-            mItems.clear();
-            for (int i = 0; i < menu.size(); i++) {
-                MenuItem item = menu.getItem(i);
-                if (item.isEnabled() && item.isVisible()) {
-                    mItems.add(item);
-                }
-            }
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public int getCount() {
-            return mItems.size();
-        }
-
-        @Override
-        public MenuItem getItem(int position) {
-            return mItems.get(position);
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public void onClick(View v) {
-            if (v.getTag() != null) {
-                dismissMenu();
-                mActivity.closeOptionsMenu();
-                mUi.hideNavScreen(false);
-                mUiController.onOptionsItemSelected((MenuItem) v.getTag());
-            }
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            final MenuItem item = mItems.get(position);
-            View view = mInflater.inflate(R.layout.qc_menu_item, null);
-            TextView label = (TextView) view.findViewById(R.id.title);
-            label.setText(item.getTitle());
-            label.setTag(item);
-            label.setOnClickListener(this);
-            return label;
-        }
-
-    }
-
-
 }
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 20c90f6..d1db578 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -183,6 +183,18 @@
         return mTitleBar;
     }
 
+    /**
+     * Suggest to the UI that the title bar can be hidden. The UI will then
+     * decide whether or not to hide based off a number of factors, such
+     * as if the user is editing the URL bar or if the page is loading
+     */
+    @Override
+    public void suggestHideTitleBar() {
+        if (!isLoading() && !isEditingUrl() && !mTitleBar.isMenuShowing()) {
+            hideTitleBar();
+        }
+    }
+
     // active tabs page
 
     @Override
diff --git a/src/com/android/browser/TitleBarPhone.java b/src/com/android/browser/TitleBarPhone.java
index f41eca7..66b4648 100644
--- a/src/com/android/browser/TitleBarPhone.java
+++ b/src/com/android/browser/TitleBarPhone.java
@@ -21,13 +21,18 @@
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.view.ContextMenu;
+import android.view.Menu;
 import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnFocusChangeListener;
+import android.view.ViewConfiguration;
 import android.webkit.WebView;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnDismissListener;
 
 import com.android.browser.UrlInputView.StateListener;
 import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher;
@@ -39,7 +44,7 @@
  * browser.
  */
 public class TitleBarPhone extends TitleBarBase implements OnFocusChangeListener,
-        OnClickListener, TextChangeWatcher, StateListener {
+        OnClickListener, TextChangeWatcher, StateListener, OnDismissListener {
 
     private Activity mActivity;
     private ImageView mStopButton;
@@ -49,11 +54,15 @@
     private View mTabSwitcher;
     private View mComboIcon;
     private View mTitleContainer;
+    private View mMore;
     private Drawable mTextfieldBgDrawable;
+    private boolean mMenuShowing;
+    private boolean mNeedsMenu;
 
     public TitleBarPhone(Activity activity, UiController controller, PhoneUi ui,
             FrameLayout parent) {
         super(activity, controller, ui, parent);
+        mNeedsMenu = !ViewConfiguration.get(activity).hasPermanentMenuKey();
         mActivity = activity;
         initLayout(activity, R.layout.title_bar);
     }
@@ -69,6 +78,8 @@
         mVoiceButton.setOnClickListener(this);
         mTabSwitcher = findViewById(R.id.tab_switcher);
         mTabSwitcher.setOnClickListener(this);
+        mMore = findViewById(R.id.more);
+        mMore.setOnClickListener(this);
         mComboIcon = findViewById(R.id.iconcombo);
         mTitleContainer = findViewById(R.id.title_bg);
         setFocusState(false);
@@ -164,11 +175,48 @@
             mUiController.startVoiceSearch();
         } else if (v == mTabSwitcher) {
             mBaseUi.onMenuKey();
+        } else if (mMore == v) {
+            showMenu();
         } else {
             super.onClick(v);
         }
     }
 
+    public boolean isMenuShowing() {
+        return mMenuShowing;
+    }
+
+    private void showMenu() {
+        mMenuShowing = true;
+        PopupMenu popup = new PopupMenu(mContext, mMore);
+        Menu menu = popup.getMenu();
+        popup.getMenuInflater().inflate(R.menu.browser, menu);
+        menu.setGroupVisible(R.id.NAV_MENU, false);
+        popup.setOnMenuItemClickListener(this);
+        popup.setOnDismissListener(this);
+        popup.show();
+    }
+
+    @Override
+    public void onDismiss(PopupMenu menu) {
+        onMenuHidden();
+    }
+
+    @Override
+    public boolean onMenuItemClick(MenuItem item) {
+        onMenuHidden();
+        boolean res = mUiController.onOptionsItemSelected(item);
+        if (!res) {
+            return super.onMenuItemClick(item);
+        }
+        return res;
+    }
+
+    private void onMenuHidden() {
+        mMenuShowing = false;
+        mBaseUi.showTitleBarForDuration();
+    }
+
     @Override
     public void onStateChanged(int state) {
         switch(state) {
@@ -178,12 +226,14 @@
             setSearchMode(false);
             mTabSwitcher.setVisibility(View.VISIBLE);
             mTitleContainer.setBackgroundDrawable(null);
+            mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
             break;
         case StateListener.STATE_HIGHLIGHTED:
             mComboIcon.setVisibility(View.GONE);
             mStopButton.setVisibility(View.VISIBLE);
             setSearchMode(true);
             mTabSwitcher.setVisibility(View.GONE);
+            mMore.setVisibility(View.GONE);
             mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
             break;
         case StateListener.STATE_EDITED:
@@ -191,6 +241,7 @@
             mStopButton.setVisibility(View.GONE);
             setSearchMode(false);
             mTabSwitcher.setVisibility(View.GONE);
+            mMore.setVisibility(View.GONE);
             mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
             break;
         }
