diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index f92368e..368021a 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -793,7 +793,8 @@
      * as if the user is editing the URL bar or if the page is loading
      */
     public void suggestHideTitleBar() {
-        if (!isLoading() && !isEditingUrl() && !mTitleBar.wantsToBeVisible()) {
+        if (!isLoading() && !isEditingUrl() && !mTitleBar.wantsToBeVisible()
+                && !mNavigationBar.isMenuShowing()) {
             hideTitleBar();
         }
     }
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index aa8b79f..94d6530 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -33,6 +33,7 @@
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnDismissListener;
 import android.widget.PopupMenu.OnMenuItemClickListener;
 
 import com.android.browser.UI.DropdownChangeListener;
@@ -43,7 +44,7 @@
 
 public class NavigationBarBase extends LinearLayout implements OnClickListener,
         OnMenuItemClickListener, UrlInputListener, OnFocusChangeListener,
-        TextChangeWatcher {
+        TextChangeWatcher, OnDismissListener {
 
     protected BaseUi mBaseUi;
     protected TitleBar mTitleBar;
@@ -54,6 +55,8 @@
     private ImageView mFavicon;
     private ImageView mLockIcon;
     private View mUaSwitcher;
+    private boolean mUaSwitcherShowing;
+    private PopupMenu mUaSwitcherMenu;
 
     public NavigationBarBase(Context context) {
         super(context);
@@ -116,9 +119,9 @@
             WebView web = mTitleBar.getCurrentWebView();
             if (web == null) return;
             boolean desktop = settings.hasDesktopUseragent(web);
-            PopupMenu popup = new PopupMenu(mContext, mUaSwitcher);
-            Menu menu = popup.getMenu();
-            popup.getMenuInflater().inflate(R.menu.ua_switcher, menu);
+            mUaSwitcherMenu = new PopupMenu(mContext, mUaSwitcher);
+            Menu menu = mUaSwitcherMenu.getMenu();
+            mUaSwitcherMenu.getMenuInflater().inflate(R.menu.ua_switcher, menu);
             menu.findItem(R.id.ua_mobile_menu_id).setChecked(!desktop);
             menu.findItem(R.id.ua_desktop_menu_id).setChecked(desktop);
             Tab tab = mUiController.getCurrentTab();
@@ -126,8 +129,10 @@
             saveSnapshot.setVisible(tab != null && !tab.isSnapshot());
             MenuItem find = menu.findItem(R.id.find_menu_id);
             find.setVisible(tab != null && !tab.isSnapshot());
-            popup.setOnMenuItemClickListener(this);
-            popup.show();
+            mUaSwitcherMenu.setOnMenuItemClickListener(this);
+            mUaSwitcherMenu.setOnDismissListener(this);
+            mUaSwitcherShowing = true;
+            mUaSwitcherMenu.show();
         }
     }
 
@@ -335,4 +340,17 @@
     public void onProgressStopped() {
     }
 
+    @Override
+    public void onDismiss(PopupMenu menu) {
+        if (mUaSwitcherMenu == menu) {
+            mUaSwitcherShowing = false;
+            mUaSwitcherMenu = null;
+            mBaseUi.showTitleBarForDuration();
+        }
+    }
+
+    public boolean isMenuShowing() {
+        return mUaSwitcherShowing;
+    }
+
 }
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index 49228db..0cb0764 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -15,14 +15,11 @@
  */
 package com.android.browser;
 
-import android.app.Activity;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
-import android.view.ContextMenu;
 import android.view.Menu;
-import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewConfiguration;
@@ -34,7 +31,7 @@
 import com.android.browser.UrlInputView.StateListener;
 
 public class NavigationBarPhone extends NavigationBarBase implements
-        StateListener, OnDismissListener {
+        StateListener {
 
     private ImageView mStopButton;
     private ImageView mVoiceButton;
@@ -48,7 +45,7 @@
     private View mMore;
     private Drawable mTextfieldBgDrawable;
     private PopupMenu mPopupMenu;
-    private boolean mMenuShowing;
+    private boolean mOverflowMenuShowing;
     private boolean mNeedsMenu;
 
     public NavigationBarPhone(Context context) {
@@ -162,12 +159,13 @@
         }
     }
 
+    @Override
     public boolean isMenuShowing() {
-        return mMenuShowing;
+        return super.isMenuShowing() || mOverflowMenuShowing;
     }
 
     void showMenu(View anchor) {
-        mMenuShowing = true;
+        mOverflowMenuShowing = true;
         mPopupMenu = new PopupMenu(mContext, anchor);
         Menu menu = mPopupMenu.getMenu();
         mPopupMenu.getMenuInflater().inflate(R.menu.browser, menu);
@@ -179,7 +177,10 @@
 
     @Override
     public void onDismiss(PopupMenu menu) {
-        onMenuHidden();
+        if (menu == mPopupMenu) {
+            onMenuHidden();
+        }
+        super.onDismiss(menu);
     }
 
     @Override
@@ -193,7 +194,7 @@
     }
 
     private void onMenuHidden() {
-        mMenuShowing = false;
+        mOverflowMenuShowing = false;
         mPopupMenu = null;
         mBaseUi.showTitleBarForDuration();
     }
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index bb6b63e..e453296 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -141,18 +141,6 @@
         mTitleBar.setSkipTitleBarAnimations(false);
     }
 
-    /**
-     * 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 (!mNavigationBar.isMenuShowing()) {
-            super.suggestHideTitleBar();
-        }
-    }
-
     // menu handling callbacks
 
     @Override
