diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 4d8c5a7..b0f9129 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -281,7 +281,9 @@
     public void addTab(Tab tab) {
     }
 
-    @Override
+    public void cancelNavScreenRequest(){
+    }
+
     public void setActiveTab(final Tab tab) {
         if (tab == null) return;
         Tab tabToRemove = null;
@@ -298,6 +300,7 @@
             }
         }
         mActiveTab = tab;
+
         BrowserWebView web = (BrowserWebView) mActiveTab.getWebView();
         updateUrlBarAutoShowManagerTarget();
         attachTabToContentView(tab);
@@ -764,6 +767,7 @@
     }
 
     protected WebView getWebView() {
+
         if (mActiveTab != null) {
             return mActiveTab.getWebView();
         } else {
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 6b5e424..dd3d76c 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -2874,9 +2874,14 @@
     public void setActiveTab(Tab tab) {
         // monkey protection against delayed start
         if (tab != null) {
+
+            //Not going to the Nav Screen AnyMore. Unless NavScreen is already showing.
+            mUi.cancelNavScreenRequest();
             mTabControl.setCurrentTab(tab);
             // the tab is guaranteed to have a webview after setCurrentTab
             mUi.setActiveTab(tab);
+
+
             tab.setTimeStamp();
             //Purge active tabs
             MemoryMonitor.purgeActiveTabs(mActivity.getApplicationContext(), this, mSettings);
@@ -2892,6 +2897,8 @@
     }
 
     protected void reuseTab(Tab appTab, UrlData urlData) {
+        //Cancel navscreen request
+        mUi.cancelNavScreenRequest();
         // Dismiss the subwindow if applicable.
         dismissSubWindow(appTab);
         // Since we might kill the WebView, remove it from the
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 5a656a2..7edaa7f 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -53,6 +53,7 @@
     private AnimScreen mAnimScreen;
     private NavigationBarPhone mNavigationBar;
     private Activity mBrowser;
+    private boolean mNavScreenRequested = false;
 
     boolean mAnimating;
     boolean mShowNav = false;
@@ -232,26 +233,50 @@
         hideNavScreen(mUiController.getTabControl().getCurrentPosition(), animate);
     }
 
+    //Unblock touch events
+    private void unblockEvents() {
+        mUiController.setBlockEvents(false);
+    }
+    //Block touch events
+    private void blockEvents() {
+        mUiController.setBlockEvents(true);
+    }
+
+    @Override
+    public void cancelNavScreenRequest() {
+        mNavScreenRequested = false;
+    }
+
     void showNavScreen() {
         WebView webView = getWebView();
         if (webView != null) {
-            mShowNav = true;
-            dismissIME();
-            mUiController.setBlockEvents(true);
-
+            blockEvents();
+            mNavScreenRequested = true;
             webView.getContentBitmapAsync(1.0f,
                             new Rect(),
                             new ValueCallback<Bitmap>() {
                                 @Override
                                 public void onReceiveValue(Bitmap bitmap) {
-                                    onShowNavScreenContinue(bitmap);
+
+                                    // If something interrupted the NavScreen request, discard
+                                    // the callback
+                                    if (mNavScreenRequested) {
+                                        onShowNavScreenContinue(bitmap);
+                                    } else {
+                                        unblockEvents();
+                                    }
+
                                 }
                             });
         }
     }
 
-    void onShowNavScreenContinue(Bitmap viewportBitmap) {
 
+
+    void onShowNavScreenContinue(Bitmap viewportBitmap) {
+        dismissIME();
+        mShowNav = true;
+        mNavScreenRequested = false;
         if (mNavScreen == null) {
             mNavScreen = new NavScreen(mActivity, mUiController, this);
             mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
@@ -315,12 +340,12 @@
             public void onAnimationEnd(Animator anim) {
                 mCustomViewContainer.removeView(mAnimScreen.mMain);
                 finishAnimationIn();
-                mUiController.setBlockEvents(false);
+                unblockEvents();
             }
         });
         set1.playSequentially(inanim, disappear);
         set1.start();
-        mUiController.setBlockEvents(false);
+        unblockEvents();
     }
 
     private void finishAnimationIn() {
@@ -332,6 +357,7 @@
     }
 
     void hideNavScreen(int position, boolean animate) {
+
         mShowNav = false;
         if (!showingNavScreen()) return;
         final Tab tab = mUiController.getTabControl().getTab(position);
@@ -356,7 +382,7 @@
             finishAnimateOut();
             return;
         }
-        mUiController.setBlockEvents(true);
+        blockEvents();
         mUiController.setActiveTab(tab);
         mContentView.setVisibility(View.VISIBLE);
         if (mAnimScreen == null) {
@@ -466,7 +492,7 @@
             public void onAnimationEnd(Animator anim) {
                 mCustomViewContainer.removeView(mAnimScreen.mMain);
                 finishAnimateOut();
-                mUiController.setBlockEvents(false);
+                unblockEvents();
             }
         });
         otheralpha.setInterpolator(new DecelerateInterpolator());
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
index e916a35..172509b 100644
--- a/src/com/android/browser/UI.java
+++ b/src/com/android/browser/UI.java
@@ -60,6 +60,8 @@
 
     public void setActiveTab(Tab tab);
 
+    public void cancelNavScreenRequest();
+
     public void updateTabs(List<Tab> tabs);
 
     public void detachTab(Tab tab);
