diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 7d7fda1..17ba4d7 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -804,10 +804,14 @@
         }
     }
 
-    protected void showTitleBarForDuration() {
+    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, HIDE_TITLEBAR_DELAY);
+        mHandler.sendMessageDelayed(msg, duration);
     }
 
     private Handler mHandler = new Handler() {
diff --git a/src/com/android/browser/UrlBarAutoShowManager.java b/src/com/android/browser/UrlBarAutoShowManager.java
index 25192ca..0db31ff 100644
--- a/src/com/android/browser/UrlBarAutoShowManager.java
+++ b/src/com/android/browser/UrlBarAutoShowManager.java
@@ -31,6 +31,8 @@
         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;
@@ -39,10 +41,10 @@
 
     private float mStartTouchX;
     private float mStartTouchY;
-    private float mLastTouchX;
-    private float mLastTouchY;
     private boolean mIsTracking;
     private boolean mHasTriggered;
+    private long mLastScrollTime;
+    private long mTriggeredTime;
 
     public UrlBarAutoShowManager(BaseUi ui) {
         mUi = ui;
@@ -66,11 +68,15 @@
 
     @Override
     public void onScrollChanged(int l, int t, int oldl, int oldt) {
+        mLastScrollTime = System.currentTimeMillis();
         if (t != oldt) {
             if (t != 0) {
                 // If it is showing, extend it
                 if (mUi.isTitleBarShowing()) {
-                    mUi.showTitleBarForDuration();
+                    long remaining = mLastScrollTime - mTriggeredTime;
+                    remaining = Math.max(BaseUi.HIDE_TITLEBAR_DELAY - remaining,
+                            SCROLL_TIMEOUT_DURATION);
+                    mUi.showTitleBarForDuration(remaining);
                 }
             } else {
                 mUi.suggestHideTitleBar();
@@ -95,6 +101,11 @@
         switch (event.getAction()) {
         case MotionEvent.ACTION_DOWN:
             if (!mIsTracking && event.getPointerCount() == 1) {
+                long sinceLastScroll =
+                        System.currentTimeMillis() - mLastScrollTime;
+                if (sinceLastScroll < IGNORE_INTERVAL) {
+                    break;
+                }
                 mStartTouchY = event.getY();
                 mStartTouchX = event.getX();
                 mIsTracking = true;
@@ -113,6 +124,7 @@
                     if (dy > mSlop && angle > V_TRIGGER_ANGLE
                             && !mUi.isTitleBarShowing()
                             && web.getVisibleTitleHeight() == 0) {
+                        mTriggeredTime = System.currentTimeMillis();
                         mUi.showTitleBar();
                     }
                 }
