diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 3a05724..2d53daa 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -72,9 +72,6 @@
         ViewGroup.LayoutParams.MATCH_PARENT,
         Gravity.CENTER);
 
-    private static final int MSG_HIDE_TITLEBAR = 1;
-    public static final int HIDE_TITLEBAR_DELAY = 1500; // in ms
-
     Activity mActivity;
     UiController mUiController;
     TabControl mTabControl;
@@ -90,8 +87,6 @@
     private CustomViewCallback mCustomViewCallback;
     private int mOriginalOrientation;
 
-    private UrlBarAutoShowManager mUrlBarAutoShowManager;
-
     private Toast mStopToast;
 
     // the default <video> poster
@@ -131,7 +126,6 @@
                 mContentView);
         mTitleBar.setProgress(100);
         mNavigationBar = mTitleBar.getNavigationBar();
-        mUrlBarAutoShowManager = new UrlBarAutoShowManager(this);
 
         // install system ui visibility listeners
         mDecorView = mActivity.getWindow().getDecorView();
@@ -219,6 +213,12 @@
         return false;
     }
 
+    public boolean isFullScreen() {
+        if (mTabControl.getCurrentTab() != null)
+            return mTabControl.getCurrentTab().isTabFullScreen();
+        return false;
+    }
+
     @Override
     public boolean onMenuKey() {
         return false;
@@ -281,7 +281,6 @@
 
         // block unnecessary focus change animations during tab switch
         mBlockFocusAnimations = true;
-        mHandler.removeMessages(MSG_HIDE_TITLEBAR);
         if ((tab != mActiveTab) && (mActiveTab != null)) {
             tabToRemove = mActiveTab;
             WebView web = mActiveTab.getWebView();
@@ -292,7 +291,6 @@
         mActiveTab = tab;
 
         BrowserWebView web = (BrowserWebView) mActiveTab.getWebView();
-        updateUrlBarAutoShowManagerTarget();
         attachTabToContentView(tab);
         if (web != null) {
             // Request focus on the top window.
@@ -310,7 +308,6 @@
         scheduleRemoveTab(tabToRemove, tabToWaitFor);
 
         updateTabSecurityState(tab);
-        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     Tab mTabToRemove = null;
@@ -378,13 +375,6 @@
         mTabToWaitFor = null;
     }
 
-    protected void updateUrlBarAutoShowManagerTarget() {
-        WebView web = mActiveTab != null ? mActiveTab.getWebView() : null;
-        if (web instanceof BrowserWebView) {
-            mUrlBarAutoShowManager.setTarget((BrowserWebView) web);
-        }
-    }
-
     Tab getActiveTab() {
         return mActiveTab;
     }
@@ -598,15 +588,14 @@
     }
 
     protected void showTitleBar() {
-        mHandler.removeMessages(MSG_HIDE_TITLEBAR);
         if (canShowTitleBar()) {
-            mTitleBar.show();
+            mTitleBar.showTopControls(false);
         }
     }
 
     protected void hideTitleBar() {
         if (mTitleBar.isShowing()) {
-            mTitleBar.hide();
+            mTitleBar.enableTopControls(false);
         }
     }
 
@@ -871,36 +860,34 @@
         if (getWebView() != null) {
             BrowserWebView bwv = (BrowserWebView) getWebView();
             if (fullScreen) {
-                //hide topbar
-                bwv.enableTopControls(false);
+                // hide titlebar
                 mTitleBar.hideTopControls(true);
             } else {
-                bwv.enableTopControls(true);
-                //show the topbar
-                mTitleBar.showTopControls(true);
-                //enable for auto-hide
+                // show titlebar
+                mTitleBar.showTopControls(false);
+                // enable auto hide titlebar
                 if (!mTitleBar.isFixed())
-                    mTitleBar.enableTopControls(true);
+                    mTitleBar.enableTopControls(false);
             }
         }
     }
 
     public void translateTitleBar(float topControlsOffsetYPix) {
-        if (mTitleBar != null && !mInActionMode) {
+        if (mTitleBar == null || mTitleBar.isFixed())
+            return;
+        if (!mInActionMode) {
             if (topControlsOffsetYPix != 0.0) {
                 mTitleBar.setEnabled(false);
             } else {
                 mTitleBar.setEnabled(true);
             }
-            if (!mTitleBar.isFixed()) {
-                float currentY = mTitleBar.getTranslationY();
-                float height = mNavigationBar.getHeight();
-                if ((height + currentY) <= 0 && (height + topControlsOffsetYPix) > 0) {
-                    mTitleBar.requestLayout();
-                } else if ((height + topControlsOffsetYPix) <= 0) {
-                    topControlsOffsetYPix -= 1;
-                    mTitleBar.getParent().requestTransparentRegion(mTitleBar);
-                }
+            float currentY = mTitleBar.getTranslationY();
+            float height = mNavigationBar.getHeight();
+            if ((height + currentY) <= 0 && (height + topControlsOffsetYPix) > 0) {
+                mTitleBar.requestLayout();
+            } else if ((height + topControlsOffsetYPix) <= 0) {
+                topControlsOffsetYPix -= 1;
+                mTitleBar.getParent().requestTransparentRegion(mTitleBar);
             }
             // This was done to get HTML5 fullscreen API to work with fixed mode since
             // topcontrols are used to implement HTML5 fullscreen
@@ -931,28 +918,6 @@
         return mActiveTab != null ? mActiveTab.inPageLoad() : false;
     }
 
-    /**
-     * Suggest to the UI that the title bar can be hidden. The UI will then
-     * decide whether or not to hide based off a number of factors, such
-     * as if the user is editing the URL bar or if the page is loading
-     */
-    public void suggestHideTitleBar() {
-        if (!isLoading() && !isEditingUrl() && !mTitleBar.wantsToBeVisible()
-                && !mNavigationBar.isMenuShowing()) {
-            hideTitleBar();
-        }
-    }
-
-    protected final void showTitleBarForDuration() {
-        showTitleBarForDuration(HIDE_TITLEBAR_DELAY);
-    }
-
-    protected final void showTitleBarForDuration(long duration) {
-        showTitleBar();
-        Message msg = Message.obtain(mHandler, MSG_HIDE_TITLEBAR);
-        mHandler.sendMessageDelayed(msg, duration);
-    }
-
     protected void setMenuItemVisibility(Menu menu, int id,
                                          boolean visibility) {
         MenuItem item = menu.findItem(id);
@@ -965,9 +930,6 @@
 
         @Override
         public void handleMessage(Message msg) {
-            if (msg.what == MSG_HIDE_TITLEBAR) {
-                suggestHideTitleBar();
-            }
             BaseUi.this.handleMessage(msg);
         }
     };
diff --git a/src/com/android/browser/BrowserConfigBase.java b/src/com/android/browser/BrowserConfigBase.java
index 495e735..e2ef779 100644
--- a/src/com/android/browser/BrowserConfigBase.java
+++ b/src/com/android/browser/BrowserConfigBase.java
@@ -83,10 +83,8 @@
 
     public void initCommandLineSwitches() {
         //SWE-hide-title-bar - enable following flags
-        BrowserCommandLine.appendSwitch(BrowserSwitches.ENABLE_TOP_CONTROLS);
         BrowserCommandLine.appendSwitchWithValue(BrowserSwitches.TOP_CONTROLS_SHOW_THRESHOLD, "0.5");
         BrowserCommandLine.appendSwitchWithValue(BrowserSwitches.TOP_CONTROLS_HIDE_THRESHOLD, "0.5");
-        BrowserCommandLine.appendSwitch(BrowserSwitches.ENABLE_SWE);
 
         // Allow to override UserAgent
         overrideUserAgent();
diff --git a/src/com/android/browser/BrowserSwitches.java b/src/com/android/browser/BrowserSwitches.java
index 137b259..1a9767e 100644
--- a/src/com/android/browser/BrowserSwitches.java
+++ b/src/com/android/browser/BrowserSwitches.java
@@ -50,7 +50,7 @@
 
     public static final String ENABLE_SWE = "enabled-swe";
 
-    public static final String ENABLE_TOP_CONTROLS = "enable-top-controls-position-calculation";
+    public static final String DISABLE_TOP_CONTROLS = "disable-top-controls";
 
     public static final String TOP_CONTROLS_HIDE_THRESHOLD = "top-controls-hide-threshold";
 
@@ -68,4 +68,4 @@
 
     public static final String AUTO_UPDATE_SERVER_CMD = "auto-update-server";
 
-}
\ No newline at end of file
+}
diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java
index 0159cb7..9aa044c 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -21,6 +21,7 @@
 import android.content.res.Resources;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
+import android.view.MotionEvent;
 import android.view.View;
 import org.codeaurora.swe.WebChromeClient;
 import org.codeaurora.swe.WebView;
@@ -161,6 +162,17 @@
     }
 
     @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        // block touch event if title bar is selected
+        if (mTitleBar.isEditingUrl()) {
+            requestFocus();
+            return true;
+        }
+        else
+            return super.onTouchEvent(event);
+    }
+
+    @Override
     public void onScrollChanged(int l, int t, int oldl, int oldt) {
         // NOTE: this function seems to not be called when the WebView is scrolled (it may be fine)
         super.onScrollChanged(l, t, oldl, oldt);
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index e7c4be6..80201da 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -243,10 +243,8 @@
                         mTabViews.remove(tab);
                     } else if (tabview.isTitle(v)) {
                         switchToTab(tab);
-                        mUi.getTitleBar().setSkipTitleBarAnimations(true);
                         close(position, false);
                         mUi.editUrl(false, true);
-                        mUi.getTitleBar().setSkipTitleBarAnimations(false);
                     } else if (tabview.isWebView(v)) {
                         close(position);
                     }
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index f063cdb..7de1a5d 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -466,7 +466,6 @@
                     setDisplayTitle(currentTab.getUrl());
                 }
             }
-            mBaseUi.suggestHideTitleBar();
         }
         mUrlInput.clearNeedsUpdate();
     }
@@ -819,7 +818,6 @@
 
     private void onMenuHidden() {
         mOverflowMenuShowing = false;
-        mBaseUi.showTitleBarForDuration();
     }
 
 
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 91f0d3f..063a21c 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -138,8 +138,6 @@
 
     @Override
     public void setActiveTab(final Tab tab) {
-        mTitleBar.cancelTitleBarAnimation(true);
-        mTitleBar.setSkipTitleBarAnimations(true);
         super.setActiveTab(tab);
 
         //if at Nav screen show, detach tab like what showNavScreen() do.
diff --git a/src/com/android/browser/SnapshotBar.java b/src/com/android/browser/SnapshotBar.java
index 29f2a90..344e732 100644
--- a/src/com/android/browser/SnapshotBar.java
+++ b/src/com/android/browser/SnapshotBar.java
@@ -44,7 +44,7 @@
 public class SnapshotBar extends LinearLayout implements OnClickListener {
 
     private static final int MSG_SHOW_TITLE = 1;
-    private static final long DURATION_SHOW_DATE = BaseUi.HIDE_TITLEBAR_DELAY;
+    private static final long DURATION_SHOW_DATE = 1500;
 
     private ImageView mFavicon;
     private ImageView mSnapshoticon;
@@ -100,7 +100,6 @@
             if (msg.what == MSG_SHOW_TITLE) {
                 mIsAnimating = false;
                 showTitle();
-                mTitleBar.getUi().showTitleBarForDuration();
             }
         }
     };
@@ -209,7 +208,7 @@
         } else if (mToggleContainer == v && !mIsAnimating) {
             mIsAnimating = true;
             showDate();
-            mTitleBar.getUi().showTitleBar();
+            mTitleBar.showTopControls(false);
             Message m = mHandler.obtainMessage(MSG_SHOW_TITLE);
             mHandler.sendMessageDelayed(m, DURATION_SHOW_DATE);
         }
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 3fc6eb5..36aae4c 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -707,10 +707,16 @@
 
         @Override
         public void onKeyboardStateChange(boolean popup) {
+            boolean keyboardWasShowing = isKeyboardShowing();
             mIsKeyboardUp = popup;
+            Controller controller = (Controller)mWebViewController;
+            BaseUi ui = (BaseUi) controller.getUi();
+            // lock the title bar
+            if (popup)
+                ui.getTitleBar().showTopControls(true);
+            if (keyboardWasShowing && popup)
+                ui.getTitleBar().enableTopControls(true);
             if (BrowserSettings.getInstance().useFullscreen()) {
-                Controller controller = (Controller) mWebViewController;
-                BaseUi ui = (BaseUi) controller.getUi();
                 ui.forceDisableFullscreenMode(popup);
             }
         }
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
index 3c2b5f1..03c207a 100644
--- a/src/com/android/browser/TitleBar.java
+++ b/src/com/android/browser/TitleBar.java
@@ -16,9 +16,6 @@
 
 package com.android.browser;
 
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.ObjectAnimator;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -29,7 +26,8 @@
 import android.view.ViewStub;
 import android.view.ViewTreeObserver;
 import android.view.accessibility.AccessibilityManager;
-import android.view.animation.DecelerateInterpolator;
+
+import org.codeaurora.swe.BrowserCommandLine;
 import org.codeaurora.swe.WebView;
 
 import android.widget.FrameLayout;
@@ -54,8 +52,6 @@
     //state
     private boolean mShowing;
     private boolean mInLoad;
-    private boolean mSkipTitleBarAnimations;
-    private Animator mTitleBarAnimator;
     private boolean mIsFixedTitleBar;
     private float mCurrentTranslationY;
     private boolean mUpdateTranslationY = false;
@@ -127,7 +123,8 @@
     }
 
     private void setFixedTitleBar() {
-        boolean isFixed = !getContext().getResources().getBoolean(R.bool.hide_title);
+        boolean isFixed = !getContext().getResources().getBoolean(R.bool.hide_title) ||
+                BrowserCommandLine.hasSwitch(BrowserSwitches.DISABLE_TOP_CONTROLS);
 
         isFixed |= mAccessibilityManager.isEnabled() &&
             mAccessibilityManager.isTouchExplorationEnabled();
@@ -135,9 +132,7 @@
         ViewGroup parent = (ViewGroup)getParent();
         if (mIsFixedTitleBar == isFixed && parent != null) return;
         mIsFixedTitleBar = isFixed;
-        setSkipTitleBarAnimations(true);
-        show();
-        setSkipTitleBarAnimations(false);
+        showTopControls(false);
         if (parent != null) {
             parent.removeView(this);
         }
@@ -161,98 +156,10 @@
         }
     }
 
-    void setSkipTitleBarAnimations(boolean skip) {
-        mSkipTitleBarAnimations = skip;
-    }
-
-    void setupTitleBarAnimator(Animator animator) {
-        Resources res = getContext().getResources();
-        int duration = res.getInteger(R.integer.titlebar_animation_duration);
-        animator.setInterpolator(new DecelerateInterpolator(
-                ANIM_TITLEBAR_DECELERATE));
-        animator.setDuration(duration);
-    }
-
-    //Disable stock autohide behavior in favor of top controls
-    private static final  boolean bOldStyleAutoHideDisabled = true;
-    void show() {
-        cancelTitleBarAnimation(false);
-        if (mSkipTitleBarAnimations) {
-            this.setVisibility(View.VISIBLE);
-            this.setTranslationY(0);
-            // reaffirm top-controls
-            if (isFixed() || isInLoad())
-                showTopControls(false);
-            else
-                enableTopControls(true);
-        } else if (!bOldStyleAutoHideDisabled) {
-            int visibleHeight = getVisibleTitleHeight();
-            float startPos = (-getEmbeddedHeight() + visibleHeight);
-            if (getTranslationY() != 0) {
-                startPos = Math.max(startPos, getTranslationY());
-            }
-            mTitleBarAnimator = ObjectAnimator.ofFloat(this,
-                    "translationY",
-                    startPos, 0);
-            setupTitleBarAnimator(mTitleBarAnimator);
-            mTitleBarAnimator.start();
-        }
-
-        mShowing = true;
-    }
-
-    void hide() {
-        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();
-        }
-        mShowing = false;
-    }
-
     boolean isShowing() {
         return mShowing;
     }
 
-    void cancelTitleBarAnimation(boolean reset) {
-        if (mTitleBarAnimator != null) {
-            mTitleBarAnimator.cancel();
-            mTitleBarAnimator = null;
-        }
-        if (reset) {
-            setTranslationY(0);
-        }
-    }
-
-    private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() {
-
-        @Override
-        public void onAnimationStart(Animator animation) {
-        }
-
-        @Override
-        public void onAnimationRepeat(Animator animation) {
-        }
-
-        @Override
-        public void onAnimationEnd(Animator animation) {
-            // update position
-            onScrollChanged();
-        }
-
-        @Override
-        public void onAnimationCancel(Animator animation) {
-        }
-    };
-
     private int getVisibleTitleHeight() {
         Tab tab = mBaseUi.getActiveTab();
         WebView webview = tab != null ? tab.getWebView() : null;
@@ -260,20 +167,28 @@
     }
 
     protected void hideTopControls(boolean animate) {
+        if (mIsFixedTitleBar)
+            return;
         Tab tab = mBaseUi.getActiveTab();
         WebView view = tab != null ? tab.getWebView() : null;
-        if (view != null)
+        if (view != null) {
             view.updateTopControls(true, false, animate);
+        }
+        mShowing = false;
     }
 
     protected void showTopControls(boolean animate) {
         Tab tab = mBaseUi.getActiveTab();
         WebView view = tab != null ? tab.getWebView() : null;
-        if (view != null)
+        if (view != null) {
             view.updateTopControls(false, true, animate);
+        }
+        mShowing = true;
     }
 
     protected void enableTopControls(boolean animate) {
+        if (mIsFixedTitleBar)
+            return;
         Tab tab = mBaseUi.getActiveTab();
         WebView view = tab != null ? tab.getWebView() : null;
         if (view != null)
@@ -290,15 +205,8 @@
             mProgress.setVisibility(View.GONE);
             mInLoad = false;
             mNavBar.onProgressStopped();
-            // check if needs to be hidden
-            if (!isEditingUrl() && !wantsToBeVisible()) {
-                mBaseUi.showTitleBarForDuration();
-            }
-
             //onPageFinished
-            showTopControls(false);
-            if(!isFixed())
-                enableTopControls(true);
+            enableTopControls(true);
 
         } else {
             if (!mInLoad) {
@@ -310,9 +218,6 @@
             }
             mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS
                     / PROGRESS_MAX);
-            if (!mShowing) {
-                show();
-            }
             showTopControls(false);
         }
     }
diff --git a/src/com/android/browser/UrlBarAutoShowManager.java b/src/com/android/browser/UrlBarAutoShowManager.java
deleted file mode 100644
index 4ef1765..0000000
--- a/src/com/android/browser/UrlBarAutoShowManager.java
+++ /dev/null
@@ -1,144 +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.os.SystemClock;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.view.ViewConfiguration;
-import org.codeaurora.swe.WebView;
-
-import com.android.browser.BrowserWebView.OnScrollChangedListener;
-
-/**
- * Helper class to manage when to show the URL bar based off of touch
- * input, and when to begin the hide timer.
- */
-public class UrlBarAutoShowManager implements OnTouchListener,
-        OnScrollChangedListener {
-
-    private static float V_TRIGGER_ANGLE = .9f;
-    private static long SCROLL_TIMEOUT_DURATION = 150;
-    private static long IGNORE_INTERVAL = 250;
-
-    private BrowserWebView mTarget;
-    private BaseUi mUi;
-
-    private int mSlop;
-
-    private float mStartTouchX;
-    private float mStartTouchY;
-    private boolean mIsTracking;
-    private boolean mHasTriggered;
-    private long mLastScrollTime;
-    private long mTriggeredTime;
-    private boolean mIsScrolling;
-
-    public UrlBarAutoShowManager(BaseUi ui) {
-        mUi = ui;
-        ViewConfiguration config = ViewConfiguration.get(mUi.getActivity());
-        mSlop = config.getScaledTouchSlop() * 2;
-    }
-
-    public void setTarget(BrowserWebView v) {
-        if (mTarget == v) return;
-
-        if (mTarget != null) {
-            mTarget.setOnTouchListener(null);
-            mTarget.setOnScrollChangedListener(null);
-        }
-        mTarget = v;
-        if (mTarget != null) {
-            mTarget.setOnTouchListener(this);
-            mTarget.setOnScrollChangedListener(this);
-        }
-    }
-
-    @Override
-    public void onScrollChanged(int l, int t, int oldl, int oldt) {
-        mLastScrollTime = SystemClock.uptimeMillis();
-        mIsScrolling = true;
-        if (t != 0) {
-            // If it is showing, extend it
-            if (mUi.isTitleBarShowing()) {
-                long remaining = mLastScrollTime - mTriggeredTime;
-                remaining = Math.max(BaseUi.HIDE_TITLEBAR_DELAY - remaining,
-                        SCROLL_TIMEOUT_DURATION);
-                mUi.showTitleBarForDuration(remaining);
-            }
-        } else {
-            mUi.suggestHideTitleBar();
-        }
-    }
-
-    void stopTracking() {
-        if (mIsTracking) {
-            mIsTracking = false;
-            mIsScrolling = false;
-            if (mUi.isTitleBarShowing()) {
-                mUi.showTitleBarForDuration();
-            }
-        }
-    }
-
-    @Override
-    public boolean onTouch(View v, MotionEvent event) {
-        if (event.getPointerCount() > 1) {
-            stopTracking();
-        }
-        switch (event.getAction()) {
-        case MotionEvent.ACTION_DOWN:
-            if (!mIsTracking && event.getPointerCount() == 1) {
-                long sinceLastScroll =
-                        SystemClock.uptimeMillis() - mLastScrollTime;
-                if (sinceLastScroll < IGNORE_INTERVAL) {
-                    break;
-                }
-                mStartTouchY = event.getY();
-                mStartTouchX = event.getX();
-                mIsTracking = true;
-                mHasTriggered = false;
-            }
-            break;
-        case MotionEvent.ACTION_MOVE:
-            if (mIsTracking && !mHasTriggered) {
-                WebView web = (WebView) v;
-                float dy = event.getY() - mStartTouchY;
-                float ady = Math.abs(dy);
-                float adx = Math.abs(event.getX() - mStartTouchX);
-                if (ady > mSlop) {
-                    mHasTriggered = true;
-                    float angle = (float) Math.atan2(ady, adx);
-                    if (dy > mSlop && angle > V_TRIGGER_ANGLE
-                            && !mUi.isTitleBarShowing()
-                            && (web.getVisibleTitleHeight() == 0
-                            || (!mIsScrolling && web.getScrollY() > 0))) {
-                        mTriggeredTime = SystemClock.uptimeMillis();
-                        mUi.showTitleBar();
-                    }
-                }
-            }
-            break;
-        case MotionEvent.ACTION_CANCEL:
-        case MotionEvent.ACTION_UP:
-            stopTracking();
-            break;
-        }
-        return false;
-    }
-
-}
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index f4a3f5b..92e30ad 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -176,8 +176,6 @@
 
     @Override
     public void setActiveTab(final Tab tab) {
-        mTitleBar.cancelTitleBarAnimation(true);
-        mTitleBar.setSkipTitleBarAnimations(true);
         super.setActiveTab(tab);
         BrowserWebView view = (BrowserWebView) tab.getWebView();
         // TabControl.setCurrentTab has been called before this,
@@ -196,11 +194,8 @@
 
     @Override
     public void removeTab(Tab tab) {
-        mTitleBar.cancelTitleBarAnimation(true);
-        mTitleBar.setSkipTitleBarAnimations(true);
         super.removeTab(tab);
         mTabBar.onRemoveTab(tab);
-        mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     @Override
