diff --git a/res/drawable-mdpi/qc_background_normal.png b/res/drawable-mdpi/qc_background_normal.png
new file mode 100644
index 0000000..539b45d
--- /dev/null
+++ b/res/drawable-mdpi/qc_background_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/qc_background_selected.png b/res/drawable-mdpi/qc_background_selected.png
new file mode 100644
index 0000000..c0a6efc
--- /dev/null
+++ b/res/drawable-mdpi/qc_background_selected.png
Binary files differ
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
index f0230bd..5054254 100644
--- a/res/values/dimensions.xml
+++ b/res/values/dimensions.xml
@@ -45,7 +45,6 @@
     <dimen name="list_favicon_padding">5dip</dimen>
     <dimen name="list_favicon_corner_radius">3dip</dimen>
     <dimen name="tab_favicon_corner_radius">2dip</dimen>
-    <dimen name="dropdown_offset">8dip</dimen>
     <dimen name="widgetThumbnailHeight">104dip</dimen>
     <dimen name="widgetHorizontalSpacing">14dip</dimen>
     <dimen name="widgetVerticalSpacing">12dip</dimen>
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) {
