diff --git a/src/com/android/browser/PieControlPhone.java b/src/com/android/browser/PieControlPhone.java
index 0b62cef..f12c49a 100644
--- a/src/com/android/browser/PieControlPhone.java
+++ b/src/com/android/browser/PieControlPhone.java
@@ -17,13 +17,12 @@
 package com.android.browser;
 
 import android.app.Activity;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.webkit.WebView;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.TextView;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnMenuItemClickListener;
 
 import com.android.browser.view.PieItem;
 import com.android.browser.view.PieMenu.PieView.OnLayoutListener;
@@ -34,13 +33,15 @@
 /**
  * controller for Quick Controls pie menu
  */
-public class PieControlPhone extends PieControlBase implements OnClickListener {
+public class PieControlPhone extends PieControlBase implements OnClickListener,
+        OnMenuItemClickListener {
 
     private PhoneUi mUi;
-    private PieItem mBack;
     private PieItem mUrl;
     private PieItem mShowTabs;
+    private PieItem mOptions;
     private TabAdapter mTabAdapter;
+    private PopupMenu mPopup;
 
     public PieControlPhone(Activity activity, UiController controller, PhoneUi ui) {
         super(activity, controller);
@@ -48,7 +49,6 @@
     }
 
     protected void populateMenu() {
-        mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
         mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
         View tabs = makeTabsView();
         mShowTabs = new PieItem(tabs, 1);
@@ -63,13 +63,31 @@
         stack.setOnCurrentListener(mTabAdapter);
         stack.setAdapter(mTabAdapter);
         mShowTabs.setPieView(stack);
+        mOptions = makeItem(com.android.internal.R.drawable.ic_menu_moreoverflow_normal_holo_dark,
+                1);
+
         // level 1
-        mPie.addItem(mBack);
-        mPie.addItem(mUrl);
         mPie.addItem(mShowTabs);
-        setClickListener(this, mBack, mUrl, mShowTabs);
+        mPie.addItem(mUrl);
+        mPie.addItem(mOptions);
+        setClickListener(this, mUrl, mShowTabs, mOptions);
+        mPopup = new PopupMenu(mActivity, mUi.getTitleBar());
+        Menu menu = mPopup.getMenu();
+        mPopup.getMenuInflater().inflate(R.menu.browser, menu);
+        mPopup.setOnMenuItemClickListener(this);
     }
 
+    protected void showMenu() {
+        mUiController.updateMenuState(mUiController.getCurrentTab(), mPopup.getMenu());
+        mPopup.show();
+    }
+
+    @Override
+    public boolean onMenuItemClick(MenuItem item) {
+        return mUiController.onOptionsItemSelected(item);
+    }
+
+
     private void buildTabs() {
         final List<Tab> tabs = mUiController.getTabs();
         mUi.getActiveTab().capture();
@@ -81,15 +99,13 @@
 
     @Override
     public void onClick(View v) {
-        Tab tab = mUiController.getTabControl().getCurrentTab();
-        if (mBack.getView() == v) {
-            tab.goBack();
-        } else if (mUrl.getView() == v) {
+        if (mUrl.getView() == v) {
             mUi.editUrl(false);
         } else if (mShowTabs.getView() == v) {
             mUi.showNavScreen();
+        } else if (mOptions.getView() == v) {
+            showMenu();
         }
     }
 
-
 }
diff --git a/src/com/android/browser/PieControlXLarge.java b/src/com/android/browser/PieControlXLarge.java
index 95f586e..0072aea 100644
--- a/src/com/android/browser/PieControlXLarge.java
+++ b/src/com/android/browser/PieControlXLarge.java
@@ -27,6 +27,7 @@
 import android.view.ViewGroup.LayoutParams;
 import android.webkit.WebView;
 import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
 import android.widget.TextView;
 
 import com.android.browser.view.PieItem;
@@ -61,6 +62,12 @@
         mUi = ui;
     }
 
+    @Override
+    protected void attachToContainer(FrameLayout container) {
+        super.attachToContainer(container);
+        mPie.setUseBackground(true);
+    }
+
     protected void populateMenu() {
         mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
         mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
diff --git a/src/com/android/browser/view/PieMenu.java b/src/com/android/browser/view/PieMenu.java
index 99750f9..536ac92 100644
--- a/src/com/android/browser/view/PieMenu.java
+++ b/src/com/android/browser/view/PieMenu.java
@@ -89,6 +89,8 @@
     // touch handling
     PieItem mCurrentItem;
 
+    private boolean mUseBackground;
+
     /**
      * @param context
      * @param attrs
@@ -142,6 +144,10 @@
         mController = ctl;
     }
 
+    public void setUseBackground(boolean useBackground) {
+        mUseBackground = useBackground;
+    }
+
     public void addItem(PieItem item) {
         // add the item to the pie itself
         mItems.add(item);
@@ -245,18 +251,20 @@
     @Override
     protected void onDraw(Canvas canvas) {
         if (mOpen) {
-            int w = mBackground.getIntrinsicWidth();
-            int h = mBackground.getIntrinsicHeight();
-            int left = mCenter.x - w;
-            int top = mCenter.y - h / 2;
-            mBackground.setBounds(left, top, left + w, top + h);
             int state;
-            state = canvas.save();
-            if (onTheLeft()) {
-                canvas.scale(-1, 1);
+            if (mUseBackground) {
+                int w = mBackground.getIntrinsicWidth();
+                int h = mBackground.getIntrinsicHeight();
+                int left = mCenter.x - w;
+                int top = mCenter.y - h / 2;
+                mBackground.setBounds(left, top, left + w, top + h);
+                state = canvas.save();
+                if (onTheLeft()) {
+                    canvas.scale(-1, 1);
+                }
+                mBackground.draw(canvas);
+                canvas.restoreToCount(state);
             }
-            mBackground.draw(canvas);
-            canvas.restoreToCount(state);
             for (PieItem item : mItems) {
                 Paint p = item.isSelected() ? mSelectedPaint : mNormalPaint;
                 state = canvas.save();
