diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 666b997..354e901 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -110,10 +110,8 @@
     private View mVideoProgressView;
 
     private boolean mActivityPaused;
-    protected boolean mUseQuickControls;
     protected TitleBar mTitleBar;
     private NavigationBarBase mNavigationBar;
-    protected PieControl mPieControl;
     private boolean mBlockFocusAnimations;
 
     public BaseUi(Activity browser, UiController controller) {
@@ -206,21 +204,6 @@
         return false;
     }
 
-    @Override
-    public void setUseQuickControls(boolean useQuickControls) {
-        mUseQuickControls = useQuickControls;
-        mTitleBar.setUseQuickControls(mUseQuickControls);
-        if (useQuickControls) {
-            mPieControl = new PieControl(mActivity, mUiController, this);
-            mPieControl.attachToContainer(mContentView);
-        } else {
-            if (mPieControl != null) {
-                mPieControl.removeFromContainer(mContentView);
-            }
-        }
-        updateUrlBarAutoShowManagerTarget();
-    }
-
     // Tab callbacks
     @Override
     public void onTabDataChanged(Tab tab) {
@@ -290,14 +273,8 @@
         attachTabToContentView(tab);
         if (web != null) {
             // Request focus on the top window.
-            if (mUseQuickControls) {
-                mPieControl.forceToTop(mContentView);
-                web.setTitleBar(null);
-                mTitleBar.hide();
-            } else {
-                web.setTitleBar(mTitleBar);
-                mTitleBar.onScrollChanged();
-            }
+            web.setTitleBar(mTitleBar);
+            mTitleBar.onScrollChanged();
             tabToWaitFor = mActiveTab;
         }
         mTitleBar.bringToFront();
@@ -367,10 +344,8 @@
 
     protected void updateUrlBarAutoShowManagerTarget() {
         WebView web = mActiveTab != null ? mActiveTab.getWebView() : null;
-        if (!mUseQuickControls && web instanceof BrowserWebView) {
+        if (web instanceof BrowserWebView) {
             mUrlBarAutoShowManager.setTarget((BrowserWebView) web);
-        } else {
-            mUrlBarAutoShowManager.setTarget(null);
         }
     }
 
@@ -828,8 +803,7 @@
                 mTitleBar.setEnabled(true);
             }
 
-            if (!mUseQuickControls)
-                mTitleBar.setTranslationY(topControlsOffsetYPix);
+            mTitleBar.setTranslationY(topControlsOffsetYPix);
         }
     }
 
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index c033647..0318f8f 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -427,10 +427,6 @@
             if (mController != null && mController.getUi() != null) {
                 mController.getUi().setFullscreen(useFullscreen());
             }
-        } else if (PREF_ENABLE_QUICK_CONTROLS.equals(key)) {
-            if (mController != null && mController.getUi() != null) {
-                mController.getUi().setUseQuickControls(sharedPreferences.getBoolean(key, false));
-            }
         } else if (PREF_LINK_PREFETCH.equals(key)) {
             updateConnectionType();
         }
@@ -958,10 +954,6 @@
     // getter/setters for lab_preferences.xml
     // -----------------------------
 
-    public boolean useQuickControls() {
-        return mPrefs.getBoolean(PREF_ENABLE_QUICK_CONTROLS, false);
-    }
-
     public boolean useMostVisitedHomepage() {
         return HomeProvider.MOST_VISITED.equals(getHomePage());
     }
diff --git a/src/com/android/browser/BrowserWebViewFactory.java b/src/com/android/browser/BrowserWebViewFactory.java
index 6e18dc1..48ad91c 100644
--- a/src/com/android/browser/BrowserWebViewFactory.java
+++ b/src/com/android/browser/BrowserWebViewFactory.java
@@ -68,8 +68,6 @@
         // settings
         final BrowserSettings s = BrowserSettings.getInstance();
         s.startManagingSettings(w.getSettings());
-        if (s.useQuickControls())
-            w.updateTopControls(true, false, false);
 
         //Enable remote debugging by default
         WebView.setWebContentsDebuggingEnabled(true);
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 100e8d7..ec18786 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -372,9 +372,6 @@
     void startEditingUrl(boolean clearInput, boolean forceIME) {
         // editing takes preference of progress
         setVisibility(View.VISIBLE);
-        if (mTitleBar.useQuickControls()) {
-            mTitleBar.getProgressView().setVisibility(View.GONE);
-        }
         if (!mUrlInput.hasFocus()) {
             mUrlInput.requestFocus();
         }
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index ebe40ea..a965e0a 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -229,11 +229,7 @@
                 showNavButtons();
             }
             showHideStar(mUiController.getCurrentTab());
-            if (mTitleBar.useQuickControls()) {
-                mSearchButton.setVisibility(View.GONE);
-            } else {
-                mSearchButton.setVisibility(View.VISIBLE);
-            }
+            mSearchButton.setVisibility(View.VISIBLE);
             updateUrlIcon();
         }
         mUrlContainer.setBackgroundDrawable(focus
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 35e6ad3..d74e988 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -66,7 +66,6 @@
      */
     public PhoneUi(Activity browser, UiController controller) {
         super(browser, controller);
-        setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
         mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar();
         mBrowser = browser;
     }
@@ -78,9 +77,6 @@
 
     @Override
     public void editUrl(boolean clearInput, boolean forceIME) {
-        if (mUseQuickControls) {
-            mTitleBar.setShowProgressOnly(false);
-        }
         //Do nothing while at Nav show screen.
         if (mShowNav) return;
         super.editUrl(clearInput, forceIME);
@@ -148,13 +144,8 @@
             return;
         }
         // Request focus on the top window.
-        if (mUseQuickControls) {
-            mPieControl.forceToTop(mContentView);
-            view.setTitleBar(null);
-            mTitleBar.setShowProgressOnly(true);
-        } else {
-            view.setTitleBar(mTitleBar);
-        }
+        view.setTitleBar(mTitleBar);
+
         // update nav bar state
         mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
         updateLockIconToLatest(tab);
@@ -184,12 +175,12 @@
             info.setVisible(false);
         }
         MenuItem newtab = menu.findItem(R.id.new_tab_menu_id);
-        if (newtab != null && !mUseQuickControls) {
+        if (newtab != null) {
             newtab.setVisible(false);
         }
         MenuItem incognito = menu.findItem(R.id.incognito_menu_id);
         if (incognito != null) {
-            incognito.setVisible(showingNavScreen() || mUseQuickControls);
+            incognito.setVisible(showingNavScreen());
         }
         MenuItem closeOthers = menu.findItem(R.id.close_other_tabs_id);
         if (closeOthers != null) {
@@ -244,9 +235,6 @@
     public void onActionModeFinished(boolean inLoad) {
         super.onActionModeFinished(inLoad);
         if (inLoad) {
-            if (mUseQuickControls) {
-                mTitleBar.setShowProgressOnly(true);
-            }
             showTitleBar();
         }
     }
diff --git a/src/com/android/browser/PieControl.java b/src/com/android/browser/PieControl.java
deleted file mode 100644
index 68f7983..0000000
--- a/src/com/android/browser/PieControl.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import org.codeaurora.swe.WebView;
-import android.widget.BaseAdapter;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.TextView;
-
-import com.android.browser.R;
-import com.android.browser.UI.ComboViews;
-import com.android.browser.view.PieItem;
-import com.android.browser.view.PieMenu;
-import com.android.browser.view.PieStackView;
-import com.android.browser.view.PieMenu.PieView.OnLayoutListener;
-import com.android.browser.view.PieStackView.OnCurrentListener;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Controller for Quick Controls pie menu
- */
-public class PieControl implements PieMenu.PieController, OnClickListener {
-
-    protected Activity mActivity;
-    protected UiController mUiController;
-    protected PieMenu mPie;
-    protected int mItemSize;
-    protected TextView mTabsCount;
-    private BaseUi mUi;
-    private PieItem mBack;
-    private PieItem mForward;
-    private PieItem mRefresh;
-    private PieItem mUrl;
-    private PieItem mOptions;
-    private PieItem mBookmarks;
-    private PieItem mHistory;
-    private PieItem mAddBookmark;
-    private PieItem mNewTab;
-    private PieItem mIncognito;
-    private PieItem mClose;
-    private PieItem mShowTabs;
-    private PieItem mInfo;
-    private PieItem mFind;
-    private PieItem mShare;
-    private PieItem mRDS;
-    private TabAdapter mTabAdapter;
-
-    public PieControl(Activity activity, UiController controller, BaseUi ui) {
-        mActivity = activity;
-        mUiController = controller;
-        mItemSize = (int) activity.getResources().getDimension(R.dimen.qc_item_size);
-        mUi = ui;
-    }
-
-    public void stopEditingUrl() {
-        mUi.stopEditingUrl();
-    }
-
-    protected void attachToContainer(FrameLayout container) {
-        if (mPie == null) {
-            mPie = new PieMenu(mActivity);
-            LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
-                    LayoutParams.MATCH_PARENT);
-            mPie.setLayoutParams(lp);
-            populateMenu();
-            mPie.setController(this);
-        }
-        container.addView(mPie);
-    }
-
-    protected void removeFromContainer(FrameLayout container) {
-        container.removeView(mPie);
-    }
-
-    protected void forceToTop(FrameLayout container) {
-        if (mPie.getParent() != null) {
-            container.removeView(mPie);
-            container.addView(mPie);
-        }
-    }
-
-    protected void setClickListener(OnClickListener listener, PieItem... items) {
-        for (PieItem item : items) {
-            item.getView().setOnClickListener(listener);
-        }
-    }
-
-    @Override
-    public boolean onOpen() {
-        int n = mUiController.getTabControl().getTabCount();
-        mTabsCount.setText(Integer.toString(n));
-        Tab tab = mUiController.getCurrentTab();
-        if (tab != null) {
-            mForward.setEnabled(tab.canGoForward());
-        }
-        WebView view = mUiController.getCurrentWebView();
-        if (view != null) {
-            ImageView icon = (ImageView) mRDS.getView();
-            if (mUiController.getSettings().hasDesktopUseragent(view)) {
-                icon.setImageResource(R.drawable.ic_mobile);
-            } else {
-                icon.setImageResource(R.drawable.ic_desktop_holo_dark);
-            }
-        }
-        return true;
-    }
-
-    protected void populateMenu() {
-        mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
-        mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
-        mBookmarks = makeItem(R.drawable.ic_bookmarks_holo_dark, 1);
-        mHistory = makeItem(R.drawable.ic_history_holo_dark, 1);
-        mAddBookmark = makeItem(R.drawable.ic_bookmark_on_holo_dark, 1);
-        mRefresh = makeItem(R.drawable.ic_refresh_holo_dark, 1);
-        mForward = makeItem(R.drawable.ic_forward_holo_dark, 1);
-        mNewTab = makeItem(R.drawable.ic_new_window_holo_dark, 1);
-        mIncognito = makeItem(R.drawable.ic_new_incognito_holo_dark, 1);
-        mClose = makeItem(R.drawable.ic_close_window_holo_dark, 1);
-        mInfo = makeItem(android.R.drawable.ic_menu_info_details, 1);
-        mFind = makeItem(R.drawable.ic_search_holo_dark, 1);
-        mShare = makeItem(R.drawable.ic_share_holo_dark, 1);
-        View tabs = makeTabsView();
-        mShowTabs = new PieItem(tabs, 1);
-        mOptions = makeItem(R.drawable.ic_settings_holo_dark, 1);
-        mRDS = makeItem(R.drawable.ic_desktop_holo_dark, 1);
-        mTabAdapter = new TabAdapter(mActivity, mUiController);
-        PieStackView stack = new PieStackView(mActivity);
-        stack.setLayoutListener(new OnLayoutListener() {
-            @Override
-            public void onLayout(int ax, int ay, boolean left) {
-                buildTabs();
-            }
-        });
-        stack.setOnCurrentListener(mTabAdapter);
-        stack.setAdapter(mTabAdapter);
-        mShowTabs.setPieView(stack);
-        setClickListener(this, mBack, mRefresh, mForward, mUrl, mFind, mInfo,
-                mShare, mBookmarks, mNewTab, mIncognito, mClose, mHistory,
-                mAddBookmark, mOptions, mRDS);
-        if (!BrowserActivity.isTablet(mActivity)) {
-            mShowTabs.getView().setOnClickListener(this);
-        }
-        // level 1
-        mPie.addItem(mOptions);
-        mOptions.addItem(mRDS);
-        mOptions.addItem(makeFiller());
-        mOptions.addItem(makeFiller());
-        mOptions.addItem(makeFiller());
-        mPie.addItem(mBack);
-        mBack.addItem(mRefresh);
-        mBack.addItem(mForward);
-        mBack.addItem(makeFiller());
-        mBack.addItem(makeFiller());
-        mPie.addItem(mUrl);
-        mUrl.addItem(mFind);
-        mUrl.addItem(mShare);
-        mUrl.addItem(makeFiller());
-        mUrl.addItem(makeFiller());
-        mPie.addItem(mShowTabs);
-        mShowTabs.addItem(mClose);
-        mShowTabs.addItem(mIncognito);
-        mShowTabs.addItem(mNewTab);
-        mShowTabs.addItem(makeFiller());
-        mPie.addItem(mBookmarks);
-        mBookmarks.addItem(makeFiller());
-        mBookmarks.addItem(makeFiller());
-        mBookmarks.addItem(mAddBookmark);
-        mBookmarks.addItem(mHistory);
-    }
-
-    @Override
-    public void onClick(View v) {
-        Tab tab = mUiController.getTabControl().getCurrentTab();
-        WebView web = tab.getWebView();
-        if (mBack.getView() == v) {
-            tab.goBack();
-        } else if (mForward.getView() == v) {
-            tab.goForward();
-        } else if (mRefresh.getView() == v) {
-            if (tab.inPageLoad()) {
-                web.stopLoading();
-            } else {
-                web.reload();
-            }
-        } else if (mUrl.getView() == v) {
-            mUi.editUrl(false, true);
-        } else if (mBookmarks.getView() == v) {
-            mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
-        } else if (mHistory.getView() == v) {
-            mUiController.bookmarksOrHistoryPicker(ComboViews.History);
-        } else if (mAddBookmark.getView() == v) {
-            mUiController.bookmarkCurrentPage();
-        } else if (mNewTab.getView() == v) {
-            mUiController.openTabToHomePage();
-            mUi.editUrl(false, true);
-        } else if (mIncognito.getView() == v) {
-            mUiController.openIncognitoTab();
-            mUi.editUrl(false, true);
-        } else if (mClose.getView() == v) {
-            mUiController.closeCurrentTab();
-        } else if (mOptions.getView() == v) {
-            mUiController.openPreferences();
-        } else if (mShare.getView() == v) {
-            mUiController.shareCurrentPage();
-        } else if (mInfo.getView() == v) {
-            mUiController.showPageInfo();
-        } else if (mFind.getView() == v) {
-            mUiController.findOnPage();
-        } else if (mRDS.getView() == v) {
-            mUiController.toggleUserAgent();
-        } else if (mShowTabs.getView() == v) {
-            ((PhoneUi) mUi).showNavScreen();
-        }
-    }
-
-    private void buildTabs() {
-        final List<Tab> tabs = mUiController.getTabs();
-        mUi.getActiveTab().capture();
-        mTabAdapter.setTabs(tabs);
-        PieStackView sym = (PieStackView) mShowTabs.getPieView();
-        sym.setCurrent(mUiController.getTabControl().getCurrentPosition());
-    }
-
-    protected PieItem makeItem(int image, int l) {
-        ImageView view = new ImageView(mActivity);
-        view.setImageResource(image);
-        view.setMinimumWidth(mItemSize);
-        view.setMinimumHeight(mItemSize);
-        view.setScaleType(ScaleType.CENTER);
-        LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
-        view.setLayoutParams(lp);
-        return new PieItem(view, l);
-    }
-
-    protected PieItem makeFiller() {
-        return new PieItem(null, 1);
-    }
-
-    protected View makeTabsView() {
-        View v = mActivity.getLayoutInflater().inflate(R.layout.qc_tabs_view, null);
-        mTabsCount = (TextView) v.findViewById(R.id.label);
-        mTabsCount.setText("1");
-        ImageView image = (ImageView) v.findViewById(R.id.icon);
-        image.setImageResource(R.drawable.ic_windows_holo_dark);
-        image.setScaleType(ScaleType.CENTER);
-        LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
-        v.setLayoutParams(lp);
-        return v;
-    }
-
-    static class TabAdapter extends BaseAdapter implements OnCurrentListener {
-
-        LayoutInflater mInflater;
-        UiController mUiController;
-        private List<Tab> mTabs;
-        private int mCurrent;
-
-        public TabAdapter(Context ctx, UiController ctl) {
-            mInflater = LayoutInflater.from(ctx);
-            mUiController = ctl;
-            mTabs = new ArrayList<Tab>();
-            mCurrent = -1;
-        }
-
-        public void setTabs(List<Tab> tabs) {
-            mTabs = tabs;
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public int getCount() {
-            return mTabs.size();
-        }
-
-        @Override
-        public Tab getItem(int position) {
-            return mTabs.get(position);
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            final Tab tab = mTabs.get(position);
-            View view = mInflater.inflate(R.layout.qc_tab,
-                    null);
-            ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
-            TextView title1 = (TextView) view.findViewById(R.id.title1);
-            TextView title2 = (TextView) view.findViewById(R.id.title2);
-            Bitmap b = tab.getScreenshot();
-            if (b != null) {
-                thumb.setImageBitmap(b);
-            }
-            if (position > mCurrent) {
-                title1.setVisibility(View.GONE);
-                title2.setText(tab.getTitle());
-            } else {
-                title2.setVisibility(View.GONE);
-                title1.setText(tab.getTitle());
-            }
-            view.setOnClickListener(new OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    mUiController.switchToTab(tab);
-                }
-            });
-            return view;
-        }
-
-        @Override
-        public void onSetCurrent(int index) {
-            mCurrent = index;
-        }
-
-    }
-
-}
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index 83dc371..6f2acd4 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -83,7 +83,6 @@
     // ----------------------
     // Keys for lab_preferences.xml
     // ----------------------
-    static final String PREF_ENABLE_QUICK_CONTROLS = "enable_quick_controls";
     static final String PREF_FULLSCREEN = "fullscreen";
 
     // ----------------------
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index d4d6cba..2254e4a 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -741,7 +741,7 @@
         if (getWebView() != null) {
             if (fullScreen)
                 getWebView().updateTopControls(true, false, true);
-            else if (!mSettings.useQuickControls())
+            else
                 getWebView().updateTopControls(true, true, true);
         }
 
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 4078ba4..a4e039d 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -86,7 +86,6 @@
     private int mTabOverlap;
     private int mAddTabOverlap;
     private int mTabSliceWidth;
-    private boolean mUseQuickControls;
 
     public TabBar(Activity activity, UiController controller, XLargeUi ui) {
         super(activity);
@@ -135,12 +134,6 @@
         mTabs.updateLayout();
     }
 
-    void setUseQuickControls(boolean useQuickControls) {
-        mUseQuickControls = useQuickControls;
-        mNewTab.setVisibility(mUseQuickControls ? View.GONE
-                : View.VISIBLE);
-    }
-
     int getTabCount() {
         return mTabMap.size();
     }
@@ -160,9 +153,7 @@
         super.onMeasure(hspec, vspec);
         int w = getMeasuredWidth();
         // adjust for new tab overlap
-        if (!mUseQuickControls) {
-            w -= mAddTabOverlap;
-        }
+        w -= mAddTabOverlap;
         setMeasuredDimension(w, getMeasuredHeight());
     }
 
@@ -173,35 +164,22 @@
         int pt = getPaddingTop();
         int sw = mTabs.getMeasuredWidth();
         int w = right - left - pl;
-        if (mUseQuickControls) {
-            mButtonWidth = 0;
-        } else {
-            mButtonWidth = mNewTab.getMeasuredWidth() - mAddTabOverlap;
-            if (w-sw < mButtonWidth) {
-                sw = w - mButtonWidth;
-            }
+        mButtonWidth = mNewTab.getMeasuredWidth() - mAddTabOverlap;
+        if (w-sw < mButtonWidth) {
+            sw = w - mButtonWidth;
         }
         mTabs.layout(pl, pt, pl + sw, bottom - top);
         // adjust for overlap
-        if (!mUseQuickControls) {
-            mNewTab.layout(pl + sw - mAddTabOverlap, pt,
-                    pl + sw + mButtonWidth - mAddTabOverlap, bottom - top);
-        }
+        mNewTab.layout(pl + sw - mAddTabOverlap, pt,
+                pl + sw + mButtonWidth - mAddTabOverlap, bottom - top);
+
     }
 
     public void onClick(View view) {
         if (mNewTab == view) {
             mUiController.openTabToHomePage();
         } else if (mTabs.getSelectedTab() == view) {
-            if (mUseQuickControls) {
-                if (mUi.isTitleBarShowing() && !isLoading()) {
-                    mUi.stopEditingUrl();
-                    mUi.hideTitleBar();
-                } else {
-                    mUi.stopWebViewScrolling();
-                    mUi.editUrl(false, false);
-                }
-            } else if (mUi.isTitleBarShowing() && !isLoading()) {
+            if (mUi.isTitleBarShowing() && !isLoading()) {
                 mUi.stopEditingUrl();
                 mUi.hideTitleBar();
             } else {
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
index 6c9130a..1ea4dad 100644
--- a/src/com/android/browser/TitleBar.java
+++ b/src/com/android/browser/TitleBar.java
@@ -55,7 +55,6 @@
     private AccessibilityManager mAccessibilityManager;
 
     private NavigationBarBase mNavBar;
-    private boolean mUseQuickControls;
     private SnapshotBar mSnapshotBar;
 
     //state
@@ -113,8 +112,7 @@
     }
 
     private void setFixedTitleBar() {
-        boolean isFixed = !mUseQuickControls
-                && !getContext().getResources().getBoolean(R.bool.hide_title);
+        boolean isFixed = !getContext().getResources().getBoolean(R.bool.hide_title);
 
         isFixed |= mAccessibilityManager.isEnabled();
         // If getParent() returns null, we are initializing
@@ -143,18 +141,6 @@
         return mUiController;
     }
 
-    public void setUseQuickControls(boolean use) {
-        mUseQuickControls = use;
-        setFixedTitleBar();
-        if (use) {
-            this.setVisibility(View.GONE);
-            hideTopControls();
-        } else {
-            this.setVisibility(View.VISIBLE);
-            enableTopControls();
-        }
-    }
-
     void setShowProgressOnly(boolean progress) {
         if (progress && !wantsToBeVisible()) {
             mNavBar.setVisibility(View.GONE);
@@ -179,7 +165,7 @@
     private static final  boolean bOldStyleAutoHideDisabled = true;
     void show() {
         cancelTitleBarAnimation(false);
-        if (mUseQuickControls || mSkipTitleBarAnimations) {
+        if (mSkipTitleBarAnimations) {
             this.setVisibility(View.VISIBLE);
             this.setTranslationY(0);
             hideTopControls();
@@ -200,23 +186,18 @@
     }
 
     void hide() {
-        if (mUseQuickControls) {
-            this.setVisibility(View.GONE);
-            hideTopControls();
+        if (mIsFixedTitleBar || bOldStyleAutoHideDisabled) return;
+        if (!mSkipTitleBarAnimations) {
+            cancelTitleBarAnimation(false);
+            int visibleHeight = getVisibleTitleHeight();
+            mTitleBarAnimator = ObjectAnimator.ofFloat(this,
+                    "translationY", getTranslationY(),
+                    (-getEmbeddedHeight() + visibleHeight));
+            mTitleBarAnimator.addListener(mHideTileBarAnimatorListener);
+            setupTitleBarAnimator(mTitleBarAnimator);
+            mTitleBarAnimator.start();
         } else {
-            if (mIsFixedTitleBar || bOldStyleAutoHideDisabled) return;
-            if (!mSkipTitleBarAnimations) {
-                cancelTitleBarAnimation(false);
-                int visibleHeight = getVisibleTitleHeight();
-                mTitleBarAnimator = ObjectAnimator.ofFloat(this,
-                        "translationY", getTranslationY(),
-                        (-getEmbeddedHeight() + visibleHeight));
-                mTitleBarAnimator.addListener(mHideTileBarAnimatorListener);
-                setupTitleBarAnimator(mTitleBarAnimator);
-                mTitleBarAnimator.start();
-            } else {
-                onScrollChanged();
-            }
+            onScrollChanged();
         }
         mShowing = false;
     }
@@ -298,19 +279,11 @@
             mNavBar.onProgressStopped();
             // check if needs to be hidden
             if (!isEditingUrl() && !wantsToBeVisible()) {
-                if (mUseQuickControls) {
-                    hide();
-                } else {
-                    mBaseUi.showTitleBarForDuration();
-                }
+                mBaseUi.showTitleBarForDuration();
             }
 
             //onPageFinished
-            if (mUseQuickControls) {
-                hideTopControls();
-            } else {
-                enableTopControls();
-            }
+            enableTopControls();
 
         } else {
             if (!mInLoad) {
@@ -319,17 +292,10 @@
                 mNavBar.onProgressStarted();
 
                 //onPageStarted
-                if (mUseQuickControls) {
-                    hideTopControls();
-                } else {
-                    showTopControls();
-                }
+                showTopControls();
             }
             mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS
                     / PROGRESS_MAX);
-            if (mUseQuickControls && !isEditingUrl()) {
-                setShowProgressOnly(true);
-            }
             if (!mShowing) {
                 show();
             }
@@ -337,7 +303,7 @@
     }
 
     public int getEmbeddedHeight() {
-        if (mUseQuickControls || mIsFixedTitleBar) return 0;
+        if (mIsFixedTitleBar) return 0;
         return calculateEmbeddedHeight();
     }
 
@@ -376,10 +342,6 @@
         return mNavBar;
     }
 
-    public boolean useQuickControls() {
-        return mUseQuickControls;
-    }
-
     public boolean isInLoad() {
         return mInLoad;
     }
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
index f24f8f3..a374203 100644
--- a/src/com/android/browser/UI.java
+++ b/src/com/android/browser/UI.java
@@ -138,8 +138,6 @@
 
     void setFullscreen(boolean enabled);
 
-    void setUseQuickControls(boolean enabled);
-
     void translateTitleBar(float topControlsOffsetYPix);
 
     public boolean shouldCaptureThumbnails();
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 8dd31d8..08d742e 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -64,7 +64,6 @@
         mTabBar = new TabBar(mActivity, mUiController, this);
         mActionBar = mActivity.getActionBar();
         setupActionBar();
-        setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
     }
 
     private void setupActionBar() {
@@ -75,33 +74,9 @@
 
     public void showComboView(ComboViews startWith, Bundle extras) {
         super.showComboView(startWith, extras);
-        if (mUseQuickControls) {
-            mActionBar.show();
-        }
-    }
-
-    @Override
-    public void setUseQuickControls(boolean useQuickControls) {
-        super.setUseQuickControls(useQuickControls);
-        checkHideActionBar();
-        if (!useQuickControls) {
-            mActionBar.show();
-        }
-        mTabBar.setUseQuickControls(mUseQuickControls);
-        // We need to update the tabs with this change
-        for (Tab t : mTabControl.getTabs()) {
-            t.updateShouldCaptureThumbnails();
-        }
     }
 
     private void checkHideActionBar() {
-        if (mUseQuickControls) {
-            mHandler.post(new Runnable() {
-                public void run() {
-                    mActionBar.hide();
-                }
-            });
-        }
     }
 
     @Override
@@ -189,9 +164,6 @@
 
     @Override
     public void editUrl(boolean clearInput, boolean forceIME) {
-        if (mUseQuickControls) {
-            mTitleBar.setShowProgressOnly(false);
-        }
         super.editUrl(clearInput, forceIME);
     }
 
@@ -211,9 +183,6 @@
         if (inLoad) {
             // the titlebar was removed when the CAB was shown
             // if the page is loading, show it again
-            if (mUseQuickControls) {
-                mTitleBar.setShowProgressOnly(true);
-            }
             showTitleBar();
         }
     }
@@ -276,7 +245,7 @@
 
     @Override
     public boolean shouldCaptureThumbnails() {
-        return mUseQuickControls;
+        return false;
     }
 
     private Drawable getFaviconBackground() {
diff --git a/src/com/android/browser/view/BasePieView.java b/src/com/android/browser/view/BasePieView.java
deleted file mode 100644
index b9178be..0000000
--- a/src/com/android/browser/view/BasePieView.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser.view;
-
-import android.database.DataSetObserver;
-import android.graphics.Canvas;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.Adapter;
-
-import java.util.ArrayList;
-
-/**
- * common code for pie views
- */
-public abstract class BasePieView implements PieMenu.PieView {
-
-    protected Adapter mAdapter;
-    private DataSetObserver mObserver;
-    protected ArrayList<View> mViews;
-
-    protected OnLayoutListener mListener;
-
-    protected int mCurrent;
-    protected int mChildWidth;
-    protected int mChildHeight;
-    protected int mWidth;
-    protected int mHeight;
-    protected int mLeft;
-    protected int mTop;
-
-    public BasePieView() {
-    }
-
-    public void setLayoutListener(OnLayoutListener l) {
-        mListener = l;
-    }
-
-    public void setAdapter(Adapter adapter) {
-        mAdapter = adapter;
-        if (adapter == null) {
-            if (mAdapter != null) {
-                mAdapter.unregisterDataSetObserver(mObserver);
-            }
-            mViews = null;
-            mCurrent = -1;
-        } else {
-            mObserver = new DataSetObserver() {
-                @Override
-                public void onChanged() {
-                    buildViews();
-                }
-
-                @Override
-                public void onInvalidated() {
-                    mViews.clear();
-                }
-            };
-            mAdapter.registerDataSetObserver(mObserver);
-            setCurrent(0);
-        }
-    }
-
-    public void setCurrent(int ix) {
-        mCurrent = ix;
-    }
-
-    public Adapter getAdapter() {
-        return mAdapter;
-    }
-
-    protected void buildViews() {
-        if (mAdapter != null) {
-            final int n = mAdapter.getCount();
-            if (mViews == null) {
-                mViews = new ArrayList<View>(n);
-            } else {
-                mViews.clear();
-            }
-            mChildWidth = 0;
-            mChildHeight = 0;
-            for (int i = 0; i < n; i++) {
-                View view = mAdapter.getView(i, null, null);
-                view.measure(View.MeasureSpec.UNSPECIFIED,
-                        View.MeasureSpec.UNSPECIFIED);
-                mChildWidth = Math.max(mChildWidth, view.getMeasuredWidth());
-                mChildHeight = Math.max(mChildHeight, view.getMeasuredHeight());
-                mViews.add(view);
-            }
-        }
-    }
-
-    /**
-     * this will be called before the first draw call
-     * needs to set top, left, width, height
-     */
-    @Override
-    public void layout(int anchorX, int anchorY, boolean left, float angle,
-            int parentHeight) {
-        if (mListener != null) {
-            mListener.onLayout(anchorX, anchorY, left);
-        }
-    }
-
-
-    @Override
-    public abstract void draw(Canvas canvas);
-
-    protected void drawView(View view, Canvas canvas) {
-        final int state = canvas.save();
-        canvas.translate(view.getLeft(), view.getTop());
-        view.draw(canvas);
-        canvas.restoreToCount(state);
-    }
-
-    protected abstract int findChildAt(int y);
-
-    @Override
-    public boolean onTouchEvent(MotionEvent evt) {
-        int action = evt.getActionMasked();
-        int evtx = (int) evt.getX();
-        int evty = (int) evt.getY();
-        if ((evtx < mLeft) || (evtx >= mLeft + mWidth)
-                || (evty < mTop) || (evty >= mTop + mHeight)) {
-            return false;
-        }
-        switch (action) {
-            case MotionEvent.ACTION_MOVE:
-                View v = mViews.get(mCurrent);
-                setCurrent(Math.max(0, Math.min(mViews.size() -1,
-                        findChildAt(evty))));
-                View v1 = mViews.get(mCurrent);
-                if (v != v1) {
-                    v.setPressed(false);
-                    v1.setPressed(true);
-                }
-                break;
-            case MotionEvent.ACTION_UP:
-                mViews.get(mCurrent).performClick();
-                mViews.get(mCurrent).setPressed(false);
-                break;
-            default:
-                break;
-        }
-        return true;
-    }
-
-}
diff --git a/src/com/android/browser/view/PieItem.java b/src/com/android/browser/view/PieItem.java
deleted file mode 100644
index 9e04ecb..0000000
--- a/src/com/android/browser/view/PieItem.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.browser.view;
-
-import android.view.View;
-
-import com.android.browser.view.PieMenu.PieView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Pie menu item
- */
-public class PieItem {
-
-    private View mView;
-    private PieView mPieView;
-    private int level;
-    private float start;
-    private float sweep;
-    private float animate;
-    private int inner;
-    private int outer;
-    private boolean mSelected;
-    private boolean mEnabled;
-    private List<PieItem> mItems;
-
-    public PieItem(View view, int level) {
-        mView = view;
-        this.level = level;
-        mEnabled = true;
-        setAnimationAngle(getAnimationAngle());
-        setAlpha(getAlpha());
-    }
-
-    public PieItem(View view, int level, PieView sym) {
-        mView = view;
-        this.level = level;
-        mPieView = sym;
-        mEnabled = false;
-    }
-
-    public boolean hasItems() {
-        return mItems != null;
-    }
-
-    public List<PieItem> getItems() {
-        return mItems;
-    }
-
-    public void addItem(PieItem item) {
-        if (mItems == null) {
-            mItems = new ArrayList<PieItem>();
-        }
-        mItems.add(item);
-    }
-
-    public void setAlpha(float alpha) {
-        if (mView != null) {
-            mView.setAlpha(alpha);
-        }
-    }
-
-    public float getAlpha() {
-        if (mView != null) {
-            return mView.getAlpha();
-        }
-        return 1;
-    }
-
-    public void setAnimationAngle(float a) {
-        animate = a;
-    }
-
-    public float getAnimationAngle() {
-        return animate;
-    }
-
-    public void setEnabled(boolean enabled) {
-        mEnabled = enabled;
-    }
-
-    public void setSelected(boolean s) {
-        mSelected = s;
-        if (mView != null) {
-            mView.setSelected(s);
-        }
-    }
-
-    public boolean isSelected() {
-        return mSelected;
-    }
-
-    public int getLevel() {
-        return level;
-    }
-
-    public void setGeometry(float st, float sw, int inside, int outside) {
-        start = st;
-        sweep = sw;
-        inner = inside;
-        outer = outside;
-    }
-
-    public float getStart() {
-        return start;
-    }
-
-    public float getStartAngle() {
-        return start + animate;
-    }
-
-    public float getSweep() {
-        return sweep;
-    }
-
-    public int getInnerRadius() {
-        return inner;
-    }
-
-    public int getOuterRadius() {
-        return outer;
-    }
-
-    public boolean isPieView() {
-        return (mPieView != null);
-    }
-
-    public View getView() {
-        return mView;
-    }
-
-    public void setPieView(PieView sym) {
-        mPieView = sym;
-    }
-
-    public PieView getPieView() {
-        if (mEnabled) {
-            return mPieView;
-        }
-        return null;
-    }
-
-}
diff --git a/src/com/android/browser/view/PieListView.java b/src/com/android/browser/view/PieListView.java
deleted file mode 100644
index 1043fc7..0000000
--- a/src/com/android/browser/view/PieListView.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser.view;
-
-import com.android.browser.R;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.view.View;
-
-/**
- * shows views in a menu style list
- */
-public class PieListView extends BasePieView {
-
-    private Paint mBgPaint;
-
-    public PieListView(Context ctx) {
-        mBgPaint = new Paint();
-        mBgPaint.setColor(ctx.getResources().getColor(R.color.qcMenuBackground));
-    }
-
-    /**
-     * this will be called before the first draw call
-     */
-    @Override
-    public void layout(int anchorX, int anchorY, boolean left, float angle,
-            int pHeight) {
-        super.layout(anchorX, anchorY, left, angle, pHeight);
-        buildViews();
-        mWidth = mChildWidth;
-        mHeight = mChildHeight * mAdapter.getCount();
-        mLeft = anchorX + (left ? 0 : - mChildWidth);
-        mTop = Math.max(anchorY - mHeight / 2, 0);
-        if (mTop + mHeight > pHeight) {
-            mTop = pHeight - mHeight;
-        }
-        if (mViews != null) {
-            layoutChildrenLinear();
-        }
-    }
-
-    protected void layoutChildrenLinear() {
-        final int n = mViews.size();
-        int top = mTop;
-        for (View view : mViews) {
-            view.layout(mLeft, top, mLeft + mChildWidth, top + mChildHeight);
-            top += mChildHeight;
-        }
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        canvas.drawRect(mLeft, mTop, mLeft + mWidth, mTop + mHeight, mBgPaint);
-        if (mViews != null) {
-            for (View view : mViews) {
-                drawView(view, canvas);
-            }
-        }
-    }
-
-    @Override
-    protected int findChildAt(int y) {
-        final int ix = (y - mTop) * mViews.size() / mHeight;
-        return ix;
-    }
-
-}
diff --git a/src/com/android/browser/view/PieMenu.java b/src/com/android/browser/view/PieMenu.java
deleted file mode 100644
index 1699c27..0000000
--- a/src/com/android/browser/view/PieMenu.java
+++ /dev/null
@@ -1,636 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser.view;
-
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.Point;
-import android.graphics.PointF;
-import android.graphics.RectF;
-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;
-
-import com.android.browser.R;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class PieMenu extends FrameLayout {
-
-    private static final int MAX_LEVELS = 5;
-    private static final long ANIMATION = 80;
-
-    public interface PieController {
-        /**
-         * called before menu opens to customize menu
-         * returns if pie state has been changed
-         */
-        public boolean onOpen();
-        public void stopEditingUrl();
-
-    }
-
-    /**
-     * A view like object that lives off of the pie menu
-     */
-    public interface PieView {
-
-        public interface OnLayoutListener {
-            public void onLayout(int ax, int ay, boolean left);
-        }
-
-        public void setLayoutListener(OnLayoutListener l);
-
-        public void layout(int anchorX, int anchorY, boolean onleft, float angle,
-                int parentHeight);
-
-        public void draw(Canvas c);
-
-        public boolean onTouchEvent(MotionEvent evt);
-
-    }
-
-    private Point mCenter;
-    private int mRadius;
-    private int mRadiusInc;
-    private int mSlop;
-    private int mTouchOffset;
-    private Path mPath;
-
-    private boolean mOpen;
-    private PieController mController;
-
-    private List<PieItem> mItems;
-    private int mLevels;
-    private int[] mCounts;
-    private PieView mPieView = null;
-
-    // sub menus
-    private List<PieItem> mCurrentItems;
-    private PieItem mOpenItem;
-
-    private Drawable mBackground;
-    private Paint mNormalPaint;
-    private Paint mSelectedPaint;
-    private Paint mSubPaint;
-
-    // touch handling
-    private PieItem mCurrentItem;
-
-    private boolean mUseBackground;
-    private boolean mAnimating;
-
-    /**
-     * @param context
-     * @param attrs
-     * @param defStyle
-     */
-    public PieMenu(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        init(context);
-    }
-
-    /**
-     * @param context
-     * @param attrs
-     */
-    public PieMenu(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init(context);
-    }
-
-    /**
-     * @param context
-     */
-    public PieMenu(Context context) {
-        super(context);
-        init(context);
-    }
-
-    private void init(Context ctx) {
-        mItems = new ArrayList<PieItem>();
-        mLevels = 0;
-        mCounts = new int[MAX_LEVELS];
-        Resources res = ctx.getResources();
-        mRadius = (int) res.getDimension(R.dimen.qc_radius_start);
-        mRadiusInc = (int) res.getDimension(R.dimen.qc_radius_increment);
-        mSlop = (int) res.getDimension(R.dimen.qc_slop);
-        mTouchOffset = (int) res.getDimension(R.dimen.qc_touch_offset);
-        mOpen = false;
-        setWillNotDraw(false);
-        setDrawingCacheEnabled(false);
-        mCenter = new Point(0,0);
-        mBackground = res.getDrawable(R.drawable.qc_background_normal);
-        mNormalPaint = new Paint();
-        mNormalPaint.setColor(res.getColor(R.color.qc_normal));
-        mNormalPaint.setAntiAlias(true);
-        mSelectedPaint = new Paint();
-        mSelectedPaint.setColor(res.getColor(R.color.qc_selected));
-        mSelectedPaint.setAntiAlias(true);
-        mSubPaint = new Paint();
-        mSubPaint.setAntiAlias(true);
-        mSubPaint.setColor(res.getColor(R.color.qc_sub));
-    }
-
-    public void setController(PieController ctl) {
-        mController = ctl;
-    }
-
-    public void setUseBackground(boolean useBackground) {
-        mUseBackground = useBackground;
-    }
-
-    public void addItem(PieItem item) {
-        // add the item to the pie itself
-        mItems.add(item);
-        int l = item.getLevel();
-        mLevels = Math.max(mLevels, l);
-        mCounts[l]++;
-    }
-
-    public void removeItem(PieItem item) {
-        mItems.remove(item);
-    }
-
-    public void clearItems() {
-        mItems.clear();
-    }
-
-    private boolean onTheLeft() {
-        return mCenter.x < mSlop;
-    }
-
-    /**
-     * guaranteed has center set
-     * @param show
-     */
-    private void show(boolean show) {
-        mOpen = show;
-        if (mOpen) {
-            // ensure clean state
-            mAnimating = false;
-            mCurrentItem = null;
-            mOpenItem = null;
-            mPieView = null;
-            mController.stopEditingUrl();
-            mCurrentItems = mItems;
-            for (PieItem item : mCurrentItems) {
-                item.setSelected(false);
-            }
-            if (mController != null) {
-                boolean changed = mController.onOpen();
-            }
-            layoutPie();
-            animateOpen();
-        }
-        invalidate();
-    }
-
-    private void animateOpen() {
-        ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
-        anim.addUpdateListener(new AnimatorUpdateListener() {
-            @Override
-            public void onAnimationUpdate(ValueAnimator animation) {
-                for (PieItem item : mCurrentItems) {
-                    item.setAnimationAngle((1 - animation.getAnimatedFraction()) * (- item.getStart()));
-                }
-                invalidate();
-            }
-
-        });
-        anim.setDuration(2*ANIMATION);
-        anim.start();
-    }
-
-    private void setCenter(int x, int y) {
-        if (x < mSlop) {
-            mCenter.x = 0;
-        } else {
-            mCenter.x = getWidth();
-        }
-        mCenter.y = y;
-    }
-
-    private void layoutPie() {
-        float emptyangle = (float) Math.PI / 16;
-        int rgap = 2;
-        int inner = mRadius + rgap;
-        int outer = mRadius + mRadiusInc - rgap;
-        int gap = 1;
-        for (int i = 0; i < mLevels; i++) {
-            int level = i + 1;
-            float sweep = (float) (Math.PI - 2 * emptyangle) / mCounts[level];
-            float angle = emptyangle + sweep / 2;
-            mPath = makeSlice(getDegrees(0) - gap, getDegrees(sweep) + gap, outer, inner, mCenter);
-            for (PieItem item : mCurrentItems) {
-                if (item.getLevel() == level) {
-                    View view = item.getView();
-                    if (view != null) {
-                        view.measure(view.getLayoutParams().width,
-                                view.getLayoutParams().height);
-                        int w = view.getMeasuredWidth();
-                        int h = view.getMeasuredHeight();
-                        int r = inner + (outer - inner) * 2 / 3;
-                        int x = (int) (r * Math.sin(angle));
-                        int y = mCenter.y - (int) (r * Math.cos(angle)) - h / 2;
-                        if (onTheLeft()) {
-                            x = mCenter.x + x - w / 2;
-                        } else {
-                            x = mCenter.x - x - w / 2;
-                        }
-                        view.layout(x, y, x + w, y + h);
-                    }
-                    float itemstart = angle - sweep / 2;
-                    item.setGeometry(itemstart, sweep, inner, outer);
-                    angle += sweep;
-                }
-            }
-            inner += mRadiusInc;
-            outer += mRadiusInc;
-        }
-    }
-
-
-    /**
-     * converts a
-     *
-     * @param angle from 0..PI to Android degrees (clockwise starting at 3
-     *        o'clock)
-     * @return skia angle
-     */
-    private float getDegrees(double angle) {
-        return (float) (270 - 180 * angle / Math.PI);
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        if (mOpen) {
-            int state;
-            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);
-            }
-            // draw base menu
-            PieItem last = mCurrentItem;
-            if (mOpenItem != null) {
-                last = mOpenItem;
-            }
-            for (PieItem item : mCurrentItems) {
-                if (item != last) {
-                    drawItem(canvas, item);
-                }
-            }
-            if (last != null) {
-                drawItem(canvas, last);
-            }
-            if (mPieView != null) {
-                mPieView.draw(canvas);
-            }
-        }
-    }
-
-    private void drawItem(Canvas canvas, PieItem item) {
-        if (item.getView() != null) {
-            Paint p = item.isSelected() ? mSelectedPaint : mNormalPaint;
-            if (!mItems.contains(item)) {
-                p = item.isSelected() ? mSelectedPaint : mSubPaint;
-            }
-            int state = canvas.save();
-            if (onTheLeft()) {
-                canvas.scale(-1, 1);
-            }
-            float r = getDegrees(item.getStartAngle()) - 270; // degrees(0)
-            canvas.rotate(r, mCenter.x, mCenter.y);
-            canvas.drawPath(mPath, p);
-            canvas.restoreToCount(state);
-            // draw the item view
-            View view = item.getView();
-            state = canvas.save();
-            canvas.translate(view.getX(), view.getY());
-            view.draw(canvas);
-            canvas.restoreToCount(state);
-        }
-    }
-
-    private Path makeSlice(float start, float end, int outer, int inner, Point center) {
-        RectF bb =
-                new RectF(center.x - outer, center.y - outer, center.x + outer,
-                        center.y + outer);
-        RectF bbi =
-                new RectF(center.x - inner, center.y - inner, center.x + inner,
-                        center.y + inner);
-        Path path = new Path();
-        path.arcTo(bb, start, end - start, true);
-        path.arcTo(bbi, end, start - end);
-        path.close();
-        return path;
-    }
-
-    // touch handling for pie
-
-    @Override
-    public boolean onTouchEvent(MotionEvent evt) {
-        float x = evt.getX();
-        float y = evt.getY();
-        int action = evt.getActionMasked();
-        if (MotionEvent.ACTION_DOWN == action) {
-            if ((x > getWidth() - mSlop) || (x < mSlop)) {
-                setCenter((int) x, (int) y);
-                show(true);
-                return true;
-            }
-        } else if (MotionEvent.ACTION_UP == action) {
-            if (mOpen) {
-                boolean handled = false;
-                if (mPieView != null) {
-                    handled = mPieView.onTouchEvent(evt);
-                }
-                PieItem item = mCurrentItem;
-                if (!mAnimating) {
-                    deselect();
-                }
-                show(false);
-                if (!handled && (item != null) && (item.getView() != null)) {
-                    if ((item == mOpenItem) || !mAnimating) {
-                        item.getView().performClick();
-                    }
-                }
-                return true;
-            }
-        } else if (MotionEvent.ACTION_CANCEL == action) {
-            if (mOpen) {
-                show(false);
-            }
-            if (!mAnimating) {
-                deselect();
-                invalidate();
-            }
-            return false;
-        } else if (MotionEvent.ACTION_MOVE == action) {
-            if (mAnimating) return false;
-            boolean handled = false;
-            PointF polar = getPolar(x, y);
-            int maxr = mRadius + mLevels * mRadiusInc + 50;
-            if (mPieView != null) {
-                handled = mPieView.onTouchEvent(evt);
-            }
-            if (handled) {
-                invalidate();
-                return false;
-            }
-            if (polar.y < mRadius) {
-                if (mOpenItem != null) {
-                    closeSub();
-                } else if (!mAnimating) {
-                    deselect();
-                    invalidate();
-                }
-                return false;
-            }
-            if (polar.y > maxr) {
-                deselect();
-                show(false);
-                evt.setAction(MotionEvent.ACTION_DOWN);
-                if (getParent() != null) {
-                    ((ViewGroup) getParent()).dispatchTouchEvent(evt);
-                }
-                return false;
-            }
-            PieItem item = findItem(polar);
-            if (item == null) {
-            } else if (mCurrentItem != item) {
-                onEnter(item);
-                if ((item != null) && item.isPieView() && (item.getView() != null)) {
-                    int cx = item.getView().getLeft() + (onTheLeft()
-                            ? item.getView().getWidth() : 0);
-                    int cy = item.getView().getTop();
-                    mPieView = item.getPieView();
-                    layoutPieView(mPieView, cx, cy,
-                            (item.getStartAngle() + item.getSweep()) / 2);
-                }
-                invalidate();
-            }
-        }
-        // always re-dispatch event
-        return false;
-    }
-
-    private void layoutPieView(PieView pv, int x, int y, float angle) {
-        pv.layout(x, y, onTheLeft(), angle, getHeight());
-    }
-
-    /**
-     * enter a slice for a view
-     * updates model only
-     * @param item
-     */
-    private void onEnter(PieItem item) {
-        // deselect
-        if (mCurrentItem != null) {
-            mCurrentItem.setSelected(false);
-        }
-        if (item != null) {
-            // clear up stack
-            playSoundEffect(SoundEffectConstants.CLICK);
-            item.setSelected(true);
-            mPieView = null;
-            mCurrentItem = item;
-            if ((mCurrentItem != mOpenItem) && mCurrentItem.hasItems()) {
-                openSub(mCurrentItem);
-                mOpenItem = item;
-            }
-        } else {
-            mCurrentItem = null;
-        }
-
-    }
-
-    private void animateOut(final PieItem fixed, AnimatorListener listener) {
-        if ((mCurrentItems == null) || (fixed == null)) return;
-        final float target = fixed.getStartAngle();
-        ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
-        anim.addUpdateListener(new AnimatorUpdateListener() {
-            @Override
-            public void onAnimationUpdate(ValueAnimator animation) {
-                for (PieItem item : mCurrentItems) {
-                    if (item != fixed) {
-                        item.setAnimationAngle(animation.getAnimatedFraction()
-                                * (target - item.getStart()));
-                    }
-                }
-                invalidate();
-            }
-        });
-        anim.setDuration(ANIMATION);
-        anim.addListener(listener);
-        anim.start();
-    }
-
-    private void animateIn(final PieItem fixed, AnimatorListener listener) {
-        if ((mCurrentItems == null) || (fixed == null)) return;
-        final float target = fixed.getStartAngle();
-        ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
-        anim.addUpdateListener(new AnimatorUpdateListener() {
-            @Override
-            public void onAnimationUpdate(ValueAnimator animation) {
-                for (PieItem item : mCurrentItems) {
-                    if (item != fixed) {
-                        item.setAnimationAngle((1 - animation.getAnimatedFraction())
-                                * (target - item.getStart()));
-                    }
-                }
-                invalidate();
-
-            }
-
-        });
-        anim.setDuration(ANIMATION);
-        anim.addListener(listener);
-        anim.start();
-    }
-
-    private void openSub(final PieItem item) {
-        mAnimating = true;
-        animateOut(item, new AnimatorListenerAdapter() {
-            public void onAnimationEnd(Animator a) {
-                for (PieItem item : mCurrentItems) {
-                    item.setAnimationAngle(0);
-                }
-                mCurrentItems = new ArrayList<PieItem>(mItems.size());
-                int i = 0, j = 0;
-                while (i < mItems.size()) {
-                    if (mItems.get(i) == item) {
-                        mCurrentItems.add(item);
-                    } else {
-                        mCurrentItems.add(item.getItems().get(j++));
-                    }
-                    i++;
-                }
-                layoutPie();
-                animateIn(item, new AnimatorListenerAdapter() {
-                    public void onAnimationEnd(Animator a) {
-                        for (PieItem item : mCurrentItems) {
-                            item.setAnimationAngle(0);
-                        }
-                        mAnimating = false;
-                    }
-                });
-            }
-        });
-    }
-
-    private void closeSub() {
-        mAnimating = true;
-        if (mCurrentItem != null) {
-            mCurrentItem.setSelected(false);
-        }
-        animateOut(mOpenItem, new AnimatorListenerAdapter() {
-            public void onAnimationEnd(Animator a) {
-                for (PieItem item : mCurrentItems) {
-                    item.setAnimationAngle(0);
-                }
-                mCurrentItems = mItems;
-                mPieView = null;
-                animateIn(mOpenItem, new AnimatorListenerAdapter() {
-                    public void onAnimationEnd(Animator a) {
-                        for (PieItem item : mCurrentItems) {
-                            item.setAnimationAngle(0);
-                        }
-                        mAnimating = false;
-                        mOpenItem = null;
-                        mCurrentItem = null;
-                    }
-                });
-            }
-        });
-    }
-
-    private void deselect() {
-        if (mCurrentItem != null) {
-            mCurrentItem.setSelected(false);
-        }
-        if (mOpenItem != null) {
-            mOpenItem = null;
-            mCurrentItems = mItems;
-        }
-        mCurrentItem = null;
-        mPieView = null;
-    }
-
-    private PointF getPolar(float x, float y) {
-        PointF res = new PointF();
-        // get angle and radius from x/y
-        res.x = (float) Math.PI / 2;
-        x = mCenter.x - x;
-        if (mCenter.x < mSlop) {
-            x = -x;
-        }
-        y = mCenter.y - y;
-        res.y = (float) Math.sqrt(x * x + y * y);
-        if (y > 0) {
-            res.x = (float) Math.asin(x / res.y);
-        } else if (y < 0) {
-            res.x = (float) (Math.PI - Math.asin(x / res.y ));
-        }
-        return res;
-    }
-
-    /**
-     *
-     * @param polar x: angle, y: dist
-     * @return the item at angle/dist or null
-     */
-    private PieItem findItem(PointF polar) {
-        // find the matching item:
-        for (PieItem item : mCurrentItems) {
-            if (inside(polar, mTouchOffset, item)) {
-                return item;
-            }
-        }
-        return null;
-    }
-
-    private boolean inside(PointF polar, float offset, PieItem item) {
-        return (item.getInnerRadius() - offset < polar.y)
-        && (item.getOuterRadius() - offset > polar.y)
-        && (item.getStartAngle() < polar.x)
-        && (item.getStartAngle() + item.getSweep() > polar.x);
-    }
-
-}
diff --git a/src/com/android/browser/view/PieStackView.java b/src/com/android/browser/view/PieStackView.java
deleted file mode 100644
index e1f41bd..0000000
--- a/src/com/android/browser/view/PieStackView.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser.view;
-
-import com.android.browser.R;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.view.View;
-
-/**
- * shows views in a stack
- */
-public class PieStackView extends BasePieView {
-
-    private static final int SLOP = 5;
-
-    private OnCurrentListener mCurrentListener;
-    private int mMinHeight;
-
-    public interface OnCurrentListener {
-        public void onSetCurrent(int index);
-    }
-
-    public PieStackView(Context ctx) {
-        mMinHeight = (int) ctx.getResources()
-                .getDimension(R.dimen.qc_tab_title_height);
-    }
-
-    public void setOnCurrentListener(OnCurrentListener l) {
-        mCurrentListener = l;
-    }
-
-    @Override
-    public void setCurrent(int ix) {
-        super.setCurrent(ix);
-        if (mCurrentListener != null) {
-            mCurrentListener.onSetCurrent(ix);
-        }
-    }
-
-    /**
-     * this will be called before the first draw call
-     */
-    @Override
-    public void layout(int anchorX, int anchorY, boolean left, float angle,
-            int pHeight) {
-        super.layout(anchorX, anchorY, left, angle, pHeight);
-        buildViews();
-        mWidth = mChildWidth;
-        mHeight = mChildHeight + (mViews.size() - 1) * mMinHeight;
-        mLeft = anchorX + (left ? SLOP : -(SLOP + mChildWidth));
-        mTop = anchorY - mHeight / 2;
-        if (mViews != null) {
-            layoutChildrenLinear();
-        }
-    }
-
-    private void layoutChildrenLinear() {
-        final int n = mViews.size();
-        int top = mTop;
-        int dy = (n == 1) ? 0 : (mHeight - mChildHeight) / (n - 1);
-        for (View view : mViews) {
-            int x = mLeft;
-            view.layout(x, top, x + mChildWidth, top + mChildHeight);
-            top += dy;
-        }
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        if ((mViews != null) && (mCurrent > -1)) {
-            final int n = mViews.size();
-            for (int i = 0; i < mCurrent; i++) {
-                drawView(mViews.get(i), canvas);
-            }
-            for (int i = n - 1; i > mCurrent; i--) {
-                drawView(mViews.get(i), canvas);
-            }
-            drawView(mViews.get(mCurrent), canvas);
-        }
-    }
-
-    @Override
-    protected int findChildAt(int y) {
-        final int ix = (y - mTop) * mViews.size() / mHeight;
-        return ix;
-    }
-
-}
