diff --git a/src/com/android/browser/PieControl.java b/src/com/android/browser/PieControl.java
index 23dcced..2e2eba4 100644
--- a/src/com/android/browser/PieControl.java
+++ b/src/com/android/browser/PieControl.java
@@ -64,22 +64,22 @@
             LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
                     LayoutParams.MATCH_PARENT);
             mPie.setLayoutParams(lp);
-            mForward = makeMenuView(R.drawable.ic_pie_forward);
-            mPie.addItem(mForward);
-            mRefresh = makeMenuView(R.drawable.ic_pie_refresh);
-            mPie.addItem(mRefresh);
+            mNewTab = makeMenuView(R.drawable.ic_pie_new_tab);
+            mPie.addItem(mNewTab);
             mBack = makeMenuView(R.drawable.ic_pie_back);
             mPie.addItem(mBack);
             mUrl = makeMenuView(R.drawable.ic_pie_web);
             mPie.addItem(mUrl);
             mBookmarks = makeMenuView(R.drawable.ic_pie_bookmarks);
             mPie.addItem(mBookmarks);
-            mNewTab = makeMenuView(R.drawable.ic_pie_new_tab);
-            mPie.addItem(mNewTab);
             mOptions = makeMenuView(R.drawable.ic_pie_more);
             mPie.addItem(mOptions);
-            setClickListener(mBack, mForward, mRefresh, mUrl, mOptions,
-                    mBookmarks, mNewTab);
+            setClickListener(mBack,
+                    mUrl,
+                    mOptions,
+                    mBookmarks,
+                    mNewTab
+                    );
             mPie.setController(this);
         }
         container.addView(mPie);
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index 14e7c72..d5a6f97 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -170,17 +170,6 @@
         mUseQuickControls = useQuickControls;
         mUrlInput.setUseQuickControls(mUseQuickControls);
         setLayoutParams(makeLayoutParams());
-        if (mUseQuickControls) {
-            mBackButton.setVisibility(View.GONE);
-            mForwardButton.setVisibility(View.GONE);
-            mStopButton.setVisibility(View.GONE);
-            mAllButton.setVisibility(View.GONE);
-        } else {
-            mBackButton.setVisibility(View.VISIBLE);
-            mForwardButton.setVisibility(View.VISIBLE);
-            mStopButton.setVisibility(View.VISIBLE);
-            mAllButton.setVisibility(View.VISIBLE);
-        }
     }
 
     void setShowProgressOnly(boolean progress) {
@@ -207,6 +196,9 @@
         } else if (!mUrlInput.needsUpdate()) {
             mUrlInput.dismissDropDown();
             mUrlInput.hideIME();
+            if (mUseQuickControls) {
+                mUi.hideTitleBar();
+            }
         }
         mUrlInput.clearNeedsUpdate();
     }
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 2ec2111..c9f4c6a 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -57,7 +57,6 @@
     private View mContainer;
     private boolean mLandscape;
     private boolean mIncognitoMode;
-    private int mVOffset;
     private boolean mNeedsUpdate;
 
     public UrlInputView(Context context, AttributeSet attrs, int defStyle) {
@@ -84,7 +83,6 @@
         onConfigurationChanged(ctx.getResources().getConfiguration());
         setThreshold(1);
         setOnItemClickListener(this);
-        mVOffset = 0;
         mNeedsUpdate = false;
     }
 
@@ -109,9 +107,6 @@
     }
 
     void setUseQuickControls(boolean useQuickControls) {
-        mVOffset = (useQuickControls
-                ? (int) getResources().getDimension(R.dimen.dropdown_offset)
-                : 0);
         mAdapter.setReverseResults(useQuickControls);
     }
 
@@ -159,7 +154,6 @@
         if (getLeft() != -getDropDownHorizontalOffset()) {
             setDropDownHorizontalOffset(-getLeft());
         }
-        setDropDownVerticalOffset(mVOffset);
     }
 
     @Override
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 8c7756b..d3f83f9 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -32,6 +32,7 @@
 import android.view.View;
 import android.webkit.WebChromeClient.CustomViewCallback;
 import android.webkit.WebView;
+import android.widget.FrameLayout;
 
 import java.util.List;
 
@@ -333,7 +334,6 @@
     protected void showTitleBar() {
         if (canShowTitleBar()) {
             if (mUseQuickControls) {
-                setTitleGravity(Gravity.BOTTOM);
                 mContentView.addView(mTitleBar);
             } else {
                 setTitleGravity(Gravity.TOP);
@@ -347,9 +347,10 @@
     protected void hideTitleBar() {
         if (isTitleBarShowing()) {
             mTabBar.onHideTitleBar();
-            setTitleGravity(Gravity.NO_GRAVITY);
             if (mUseQuickControls) {
                 mContentView.removeView(mTitleBar);
+            } else {
+                setTitleGravity(Gravity.NO_GRAVITY);
             }
             super.hideTitleBar();
         }
@@ -364,6 +365,18 @@
         return mTitleBar;
     }
 
+    @Override
+    protected void setTitleGravity(int gravity) {
+        if (mUseQuickControls) {
+            FrameLayout.LayoutParams lp =
+                (FrameLayout.LayoutParams) mTitleBar.getLayoutParams();
+            lp.gravity = gravity;
+            mTitleBar.setLayoutParams(lp);
+        } else {
+            super.setTitleGravity(gravity);
+        }
+    }
+
     // action mode callbacks
 
     @Override
diff --git a/src/com/android/browser/view/PieMenu.java b/src/com/android/browser/view/PieMenu.java
index 5185adb..080c257 100644
--- a/src/com/android/browser/view/PieMenu.java
+++ b/src/com/android/browser/view/PieMenu.java
@@ -20,15 +20,21 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
 import android.graphics.Canvas;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.RectF;
+import android.graphics.Shader;
+import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
+import android.view.SoundEffectConstants;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
@@ -64,6 +70,17 @@
 
     private boolean mDirty;
 
+    private Drawable mActiveDrawable;
+    private Drawable mInactiveDrawable;
+    private final Paint mActiveShaderPaint = new Paint();
+    private final Paint mInactiveShaderPaint = new Paint();
+    private final Matrix mActiveMatrix = new Matrix();
+    private final Matrix mInactiveMatrix = new Matrix();
+
+    private BitmapShader mActiveShader;
+    private BitmapShader mInactiveShader;
+
+
     /**
      * @param context
      * @param attrs
@@ -111,6 +128,37 @@
         setDrawingCacheEnabled(false);
         mCenter = new Point(0,0);
         mDirty = true;
+        mActiveShaderPaint.setStyle(Paint.Style.FILL);
+        mActiveShaderPaint.setAntiAlias(true);
+
+        mInactiveShaderPaint.setStyle(Paint.Style.FILL);
+        mInactiveShaderPaint.setAntiAlias(true);
+        mActiveDrawable = res.getDrawable(R.drawable.qc_background_selected);
+        mInactiveDrawable = res.getDrawable(R.drawable.qc_background_normal);
+
+        Bitmap activeTexture = getDrawableAsBitmap(mActiveDrawable,
+                mActiveDrawable.getIntrinsicWidth(),
+                mActiveDrawable.getIntrinsicHeight());
+        Bitmap inactiveTexture = getDrawableAsBitmap(mInactiveDrawable,
+                mInactiveDrawable.getIntrinsicWidth(),
+                mInactiveDrawable.getIntrinsicHeight());
+
+        mActiveShader = new BitmapShader(activeTexture,
+                Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+        mActiveShaderPaint.setShader(mActiveShader);
+
+        mInactiveShader = new BitmapShader(inactiveTexture,
+                Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+        mInactiveShaderPaint.setShader(mInactiveShader);
+
+    }
+
+    private static Bitmap getDrawableAsBitmap(Drawable drawable, int width, int height) {
+        Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        Canvas c = new Canvas(b);
+        drawable.setBounds(0, 0, width, height);
+        drawable.draw(c);
+        return b;
     }
 
     public void setController(PieController ctl) {
@@ -268,10 +316,15 @@
             tag.sweep = sweep;
             tag.inner = inner;
             tag.outer = outer;
-
-            Paint p = item.isPressed() ? mSelectedPaint : mPaint;
-            canvas.drawPath(slice, p);
             int state = canvas.save();
+            int[] topLeft = new int[2];
+            getLocationInWindow(topLeft);
+            topLeft[0] = mCenter.x - outer;
+            topLeft[1] = mCenter.y - outer;
+            Paint paint = item.isPressed() ? mActiveShaderPaint : mInactiveShaderPaint;
+            drawClipped(canvas, paint, slice, topLeft, item.isPressed());
+            canvas.restoreToCount(state);
+            state = canvas.save();
             if (onTheLeft()) {
                 canvas.scale(-1, 1);
             }
@@ -287,6 +340,16 @@
         return newanchor;
     }
 
+    private void drawClipped(Canvas canvas, Paint paint, Path clipPath, int[] pos,
+            boolean selected) {
+        // TODO: We should change the matrix/shader only when needed
+        final Matrix matrix = selected ? mActiveMatrix : mInactiveMatrix;
+        matrix.setTranslate(pos[0], pos[1]);
+        (selected ? mActiveShader : mInactiveShader).setLocalMatrix(matrix);
+        canvas.drawPath(clipPath, paint);
+    }
+
+
     /**
      * converts a
      * @param angle from 0..PI to Android degrees (clockwise starting at 3 o'clock)
@@ -391,6 +454,7 @@
         }
         if (view != null) {
             // clear up stack
+            playSoundEffect(SoundEffectConstants.CLICK);
             MenuTag tag = (MenuTag) view.getTag();
             int i = mStack.size() - 1;
             while (i > 0) {
