diff --git a/res/menu/browser.xml b/res/menu/browser.xml
index 2b651c3..bf95574 100644
--- a/res/menu/browser.xml
+++ b/res/menu/browser.xml
@@ -44,12 +44,6 @@
             android:icon="@drawable/ic_bookmark_on_holo_dark"
             android:alphabeticShortcut="d"
             android:visible="@bool/menu_show_bookmarks" />
-        <item
-            android:id="@+id/bookmarks_menu_id"
-            android:title="@string/bookmarks"
-            android:icon="@drawable/ic_bookmarks_history_holo_dark"
-            android:alphabeticShortcut="b"
-            android:visible="@bool/menu_show_bookmarks" />
         <group
             android:id="@+id/LIVE_MENU">
             <item
@@ -74,6 +68,16 @@
                 android:id="@+id/snapshot_go_live"
                 android:title="@string/snapshot_go_live" />
         </group>
+        <group
+            android:id="@+id/COMBO_MENU">
+            <item
+                android:id="@+id/history_menu_id"
+                android:title="@string/tab_history"
+                android:alphabeticShortcut="h" />
+            <item
+                android:id="@+id/snapshots_menu_id"
+                android:title="@string/tab_snapshots" />
+        </group>
         <item
             android:id="@+id/page_info_menu_id"
             android:title="@string/page_info" />
@@ -97,8 +101,6 @@
             android:alphabeticShortcut="j" />
         <item android:id="@+id/homepage_menu_id"
             android:alphabeticShortcut="&#32;" />
-        <item android:id="@+id/classic_history_menu_id"
-            android:alphabeticShortcut="h" />
         <item android:id="@+id/zoom_in_menu_id"
             android:alphabeticShortcut="i" />
         <item android:id="@+id/zoom_out_menu_id"
@@ -128,6 +130,8 @@
             android:alphabeticShortcut="f" />
         <item android:id="@+id/page_info_menu_id"
             android:alphabeticShortcut="g" />
+        <item android:id="@+id/bookmarks_menu_id"
+            android:alphabeticShortcut="b" />
     </group>
     <!-- these items are toggled in and out of @+id/stop_reload_menu_id -->
     <item android:id="@+id/stop_menu_id"
diff --git a/res/xml/accessibility_preferences.xml b/res/xml/accessibility_preferences.xml
index ac96e6e..8eca917 100644
--- a/res/xml/accessibility_preferences.xml
+++ b/res/xml/accessibility_preferences.xml
@@ -33,6 +33,12 @@
             android:max="30" />
 
         <com.android.browser.preferences.SeekBarSummaryPreference
+            android:key="double_tap_zoom"
+            android:title="@string/pref_zoom_on_double_tap"
+            android:defaultValue="5"
+            android:max="10" />
+
+        <com.android.browser.preferences.SeekBarSummaryPreference
             android:key="min_font_size"
             android:title="@string/pref_min_font_size"
             android:defaultValue="0"
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 145178b..f92e53b 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -95,6 +95,11 @@
     private static final int TEXT_ZOOM_START_VAL = 10;
     // The size of a single step in the text zoom range, in percent
     private static final int TEXT_ZOOM_STEP = 5;
+    // The initial value in the double tap zoom range
+    // This is what represents 100% in the SeekBarPreference range
+    private static final int DOUBLE_TAP_ZOOM_START_VAL = 5;
+    // The size of a single step in the double tap zoom range, in percent
+    private static final int DOUBLE_TAP_ZOOM_STEP = 5;
 
     private static BrowserSettings sInstance;
 
@@ -248,6 +253,7 @@
         settings.setForceUserScalable(forceEnableUserScalable());
         settings.setPluginState(getPluginState());
         settings.setTextZoom(getTextZoom());
+        settings.setDoubleTapZoom(getDoubleTapZoom());
         settings.setAutoFillEnabled(isAutofillEnabled());
         settings.setLayoutAlgorithm(getLayoutAlgorithm());
         settings.setJavaScriptCanOpenWindowsAutomatically(!blockPopupWindows());
@@ -546,6 +552,15 @@
         return (percent - 100) / TEXT_ZOOM_STEP + TEXT_ZOOM_START_VAL;
     }
 
+    public int getAdjustedDoubleTapZoom(int rawValue) {
+        rawValue = (rawValue - DOUBLE_TAP_ZOOM_START_VAL) * DOUBLE_TAP_ZOOM_STEP;
+        return (int) ((rawValue + 100) * mFontSizeMult);
+    }
+
+    static int getRawDoubleTapZoom(int percent) {
+        return (percent - 100) / DOUBLE_TAP_ZOOM_STEP + DOUBLE_TAP_ZOOM_START_VAL;
+    }
+
     public SharedPreferences getPreferences() {
         return mPrefs;
     }
@@ -579,6 +594,16 @@
         mPrefs.edit().putInt(PREF_TEXT_ZOOM, getRawTextZoom(percent)).apply();
     }
 
+    public int getDoubleTapZoom() {
+        requireInitialization();
+        int doubleTapZoom = mPrefs.getInt(PREF_DOUBLE_TAP_ZOOM, 5);
+        return getAdjustedDoubleTapZoom(doubleTapZoom);
+    }
+
+    public void setDoubleTapZoom(int percent) {
+        mPrefs.edit().putInt(PREF_DOUBLE_TAP_ZOOM, getRawDoubleTapZoom(percent)).apply();
+    }
+
     // -----------------------------
     // getter/setters for advanced_preferences.xml
     // -----------------------------
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 0fc9b8a..9710669 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -357,7 +357,7 @@
             getCurrentWebView().setJsFlags(jsFlags);
         }
         if (BrowserActivity.ACTION_SHOW_BOOKMARKS.equals(intent.getAction())) {
-            bookmarksOrHistoryPicker(false);
+            bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         }
     }
 
@@ -474,7 +474,7 @@
             public void handleMessage(Message msg) {
                 switch (msg.what) {
                     case OPEN_BOOKMARKS:
-                        bookmarksOrHistoryPicker(false);
+                        bookmarksOrHistoryPicker(ComboViews.Bookmarks);
                         break;
                     case FOCUS_NODE_HREF:
                     {
@@ -1204,7 +1204,7 @@
      *                         Otherwise, start with the bookmarks tab.
      */
     @Override
-    public void bookmarksOrHistoryPicker(boolean startWithHistory) {
+    public void bookmarksOrHistoryPicker(ComboViews startView) {
         if (mTabControl.getCurrentWebView() == null) {
             return;
         }
@@ -1216,8 +1216,7 @@
         // Disable opening in a new window if we have maxed out the windows
         extras.putBoolean(BrowserBookmarksPage.EXTRA_DISABLE_WINDOW,
                 !mTabControl.canCreateNewTab());
-        mUi.showComboView(startWithHistory
-                ? ComboViews.History : ComboViews.Bookmarks, extras);
+        mUi.showComboView(startView, extras);
     }
 
     // combo view callbacks
@@ -1520,6 +1519,7 @@
         uaSwitcher.setChecked(isDesktopUa);
         menu.setGroupVisible(R.id.LIVE_MENU, isLive);
         menu.setGroupVisible(R.id.SNAPSHOT_MENU, !isLive);
+        menu.setGroupVisible(R.id.COMBO_MENU, false);
 
         mUi.updateMenuState(tab, menu);
     }
@@ -1554,7 +1554,15 @@
                 break;
 
             case R.id.bookmarks_menu_id:
-                bookmarksOrHistoryPicker(false);
+                bookmarksOrHistoryPicker(ComboViews.Bookmarks);
+                break;
+
+            case R.id.history_menu_id:
+                bookmarksOrHistoryPicker(ComboViews.History);
+                break;
+
+            case R.id.snapshots_menu_id:
+                bookmarksOrHistoryPicker(ComboViews.Snapshots);
                 break;
 
             case R.id.add_bookmark_menu_id:
@@ -1634,17 +1642,13 @@
                 break;
 
             case R.id.page_info_menu_id:
-                mPageDialogsHandler.showPageInfo(mTabControl.getCurrentTab(), false, null);
+                showPageInfo();
                 break;
 
             case R.id.snapshot_go_live:
                 goLive();
                 return true;
 
-            case R.id.classic_history_menu_id:
-                bookmarksOrHistoryPicker(true);
-                break;
-
             case R.id.share_page_menu_id:
                 Tab currentTab = mTabControl.getCurrentTab();
                 if (null == currentTab) {
@@ -1713,6 +1717,11 @@
         t.loadUrl(t.getUrl(), null);
     }
 
+    @Override
+    public void showPageInfo() {
+        mPageDialogsHandler.showPageInfo(mTabControl.getCurrentTab(), false, null);
+    }
+
     public boolean onContextItemSelected(MenuItem item) {
         // Let the History and Bookmark fragments handle menus they created.
         if (item.getGroupId() == R.id.CONTEXT_MENU) {
@@ -2685,7 +2694,7 @@
         switch(keyCode) {
         case KeyEvent.KEYCODE_BACK:
             if (mUi.isWebShowing()) {
-                bookmarksOrHistoryPicker(true);
+                bookmarksOrHistoryPicker(ComboViews.History);
                 return true;
             }
             break;
diff --git a/src/com/android/browser/CrashRecoveryHandler.java b/src/com/android/browser/CrashRecoveryHandler.java
index 396985a..3202016 100644
--- a/src/com/android/browser/CrashRecoveryHandler.java
+++ b/src/com/android/browser/CrashRecoveryHandler.java
@@ -200,12 +200,13 @@
             parcel.unmarshall(data, 0, data.length);
             parcel.setDataPosition(0);
             state = parcel.readBundle();
+            if (state != null && !state.isEmpty()) {
+                return state;
+            }
         } catch (FileNotFoundException e) {
             // No state to recover
-            state = null;
         } catch (Throwable e) {
             Log.w(LOGTAG, "Failed to recover state!", e);
-            state = null;
         } finally {
             parcel.recycle();
             if (fin != null) {
@@ -214,9 +215,6 @@
                 } catch (IOException e) { }
             }
         }
-        if (state != null && !state.isEmpty()) {
-            return state;
-        }
         return null;
     }
 
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index c76197d..e5ddb47 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -32,6 +32,7 @@
 import android.text.TextUtils;
 import android.util.Patterns;
 
+import com.android.browser.UI.ComboViews;
 import com.android.browser.search.SearchEngine;
 import com.android.common.Search;
 import com.android.common.speech.LoggingEvents;
@@ -85,7 +86,7 @@
             return;
         }
         if (BrowserActivity.ACTION_SHOW_BOOKMARKS.equals(action)) {
-            mController.bookmarksOrHistoryPicker(false);
+            mController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
             return;
         }
 
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index 14b1e84..d5b4347 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -26,7 +26,6 @@
 import android.view.View.OnClickListener;
 import android.view.ViewConfiguration;
 import android.view.ViewGroup;
-import android.webkit.WebView;
 import android.widget.BaseAdapter;
 import android.widget.FrameLayout;
 import android.widget.ImageButton;
@@ -40,6 +39,7 @@
 import com.android.browser.NavTabScroller.OnLayoutListener;
 import com.android.browser.NavTabScroller.OnRemoveListener;
 import com.android.browser.TabControl.OnThumbnailUpdatedListener;
+import com.android.browser.UI.ComboViews;
 
 import java.util.HashMap;
 
@@ -89,7 +89,6 @@
 
     @Override
     public boolean onMenuItemClick(MenuItem item) {
-        mUi.hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
         return mUiController.onOptionsItemSelected(item);
     }
 
@@ -148,7 +147,7 @@
     @Override
     public void onClick(View v) {
         if (mBookmarks == v) {
-            mUiController.bookmarksOrHistoryPicker(false);
+            mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         } else if (mNewTab == v) {
             openNewTab();
         } else if (mMore == v) {
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index a1e778d..2e206fb 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -80,6 +80,7 @@
         mMore = findViewById(R.id.more);
         mMore.setOnClickListener(this);
         mComboIcon = findViewById(R.id.iconcombo);
+        mComboIcon.setOnClickListener(this);
         mTitleContainer = findViewById(R.id.title_bg);
         setFocusState(false);
         Resources res = getContext().getResources();
@@ -164,6 +165,8 @@
             showMenu(mMore);
         } else if (mClearButton == v) {
             mUrlInput.setText("");
+        } else if (mComboIcon == v) {
+            mUiController.showPageInfo();
         } else {
             super.onClick(v);
         }
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index be3a9ab..ef29a49 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -31,6 +31,8 @@
 import android.widget.ImageButton;
 import android.widget.ImageView;
 
+import com.android.browser.UI.ComboViews;
+
 import java.util.List;
 
 public class NavigationBarTablet extends NavigationBarBase {
@@ -173,7 +175,7 @@
                 getContext().startActivity(intent);
             }
         } else if (mAllButton == v) {
-            mUiController.bookmarksOrHistoryPicker(false);
+            mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         } else if (mSearchButton == v) {
             mBaseUi.editUrl(true);
         } else if (mStopButton == v) {
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index b0f3d74..ffcaaf8 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -194,34 +194,35 @@
 
     @Override
     public void updateMenuState(Tab tab, Menu menu) {
-        MenuItem bm = menu.findItem(R.id.bookmarks_menu_id);
-        if (bm != null) {
-            boolean isDataUrl = false;
-            if (tab != null) {
-                String url = tab.getUrl();
-                isDataUrl = DataUri.isDataUri(url);
-            }
-            bm.setVisible(!showingNavScreen() && !isDataUrl);
-        }
-        MenuItem nt = menu.findItem(R.id.new_tab_menu_id);
-        if (nt != null) {
-            nt.setVisible(!showingNavScreen());
-        }
         MenuItem abm = menu.findItem(R.id.add_bookmark_menu_id);
         if (abm != null) {
             abm.setVisible((tab != null) && !tab.isSnapshot() && !showingNavScreen());
         }
+        MenuItem info = menu.findItem(R.id.page_info_menu_id);
+        if (info != null) {
+            info.setVisible(false);
+        }
+        MenuItem newtab = menu.findItem(R.id.new_tab_menu_id);
+        if (newtab != null && !mUseQuickControls) {
+            newtab.setVisible(false);
+        }
+        MenuItem incognito = menu.findItem(R.id.incognito_menu_id);
+        if (incognito != null) {
+            incognito.setVisible(showingNavScreen() || mUseQuickControls);
+        }
         if (showingNavScreen()) {
             menu.setGroupVisible(R.id.LIVE_MENU, false);
             menu.setGroupVisible(R.id.SNAPSHOT_MENU, false);
-            menu.findItem(R.id.page_info_menu_id).setVisible(false);
             menu.setGroupVisible(R.id.NAV_MENU, false);
+            menu.setGroupVisible(R.id.COMBO_MENU, true);
         }
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        if (showingNavScreen()) {
+        if (showingNavScreen()
+                && (item.getItemId() != R.id.history_menu_id)
+                && (item.getItemId() != R.id.snapshots_menu_id)) {
             hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
         }
         return false;
@@ -521,6 +522,9 @@
         }
 
         public void set(TitleBar tbar, WebView web) {
+            if (tbar == null || web == null) {
+                return;
+            }
             if (tbar.getWidth() > 0 && tbar.getEmbeddedHeight() > 0) {
                 if (mTitleBarBitmap == null
                         || mTitleBarBitmap.getWidth() != tbar.getWidth()
diff --git a/src/com/android/browser/PieControlXLarge.java b/src/com/android/browser/PieControlXLarge.java
index 0072aea..fcc8840 100644
--- a/src/com/android/browser/PieControlXLarge.java
+++ b/src/com/android/browser/PieControlXLarge.java
@@ -30,6 +30,7 @@
 import android.widget.FrameLayout;
 import android.widget.TextView;
 
+import com.android.browser.UI.ComboViews;
 import com.android.browser.view.PieItem;
 import com.android.browser.view.PieListView;
 import com.android.browser.view.PieMenu.PieView.OnLayoutListener;
@@ -148,7 +149,7 @@
         } else if (mUrl.getView() == v) {
             mUi.editUrl(false);
         } else if (mBookmarks.getView() == v) {
-            mUiController.bookmarksOrHistoryPicker(false);
+            mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         } else if (mNewTab.getView() == v) {
             mUiController.openTabToHomePage();
             mUi.editUrl(false);
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index 89fcbfc..15ccfe5 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -27,6 +27,7 @@
     static final String PREF_MIN_FONT_SIZE = "min_font_size";
     static final String PREF_TEXT_SIZE = "text_size";
     static final String PREF_TEXT_ZOOM = "text_zoom";
+    static final String PREF_DOUBLE_TAP_ZOOM = "double_tap_zoom";
     static final String PREF_FORCE_USERSCALABLE = "force_userscalable";
     static final String PREF_INVERTED = "inverted";
     static final String PREF_INVERTED_CONTRAST = "inverted_contrast";
diff --git a/src/com/android/browser/SnapshotBar.java b/src/com/android/browser/SnapshotBar.java
index 2fb90d2..51e1226 100644
--- a/src/com/android/browser/SnapshotBar.java
+++ b/src/com/android/browser/SnapshotBar.java
@@ -31,6 +31,8 @@
 import android.widget.PopupMenu.OnMenuItemClickListener;
 import android.widget.TextView;
 
+import com.android.browser.UI.ComboViews;
+
 import java.text.DateFormat;
 import java.util.Date;
 
@@ -164,7 +166,7 @@
     @Override
     public void onClick(View v) {
         if (mBookmarks == v) {
-            mTitleBar.getUiController().bookmarksOrHistoryPicker(false);
+            mTitleBar.getUiController().bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         } else if (mTabSwitcher == v) {
             ((PhoneUi) mTitleBar.getUi()).toggleNavScreen();
         } else if (mOverflowMenu == v) {
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
index 97e99a9..9b48c46 100644
--- a/src/com/android/browser/UiController.java
+++ b/src/com/android/browser/UiController.java
@@ -22,6 +22,7 @@
 import android.view.MenuItem;
 import android.webkit.WebView;
 
+import com.android.browser.UI.ComboViews;
 import com.android.browser.UI.DropdownChangeListener;
 
 import java.util.List;
@@ -63,7 +64,7 @@
 
     Intent createBookmarkCurrentPageIntent(boolean canBeAnEdit);
 
-    void bookmarksOrHistoryPicker(boolean openHistory);
+    void bookmarksOrHistoryPicker(ComboViews startView);
 
     void startVoiceSearch();
 
@@ -103,4 +104,6 @@
 
     Activity getActivity();
 
+    void showPageInfo();
+
 }
diff --git a/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java b/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
index 6adfd23..c07c184 100644
--- a/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
+++ b/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
@@ -45,6 +45,9 @@
         e = findPreference(PreferenceKeys.PREF_TEXT_ZOOM);
         e.setOnPreferenceChangeListener(this);
         updateTextZoomSummary(e, settings.getTextZoom());
+        e = findPreference(PreferenceKeys.PREF_DOUBLE_TAP_ZOOM);
+        e.setOnPreferenceChangeListener(this);
+        updateDoubleTapZoomSummary(e, settings.getDoubleTapZoom());
         e = findPreference(PreferenceKeys.PREF_INVERTED_CONTRAST);
         e.setOnPreferenceChangeListener(this);
         updateInvertedContrastSummary(e, (int) (settings.getInvertedContrast() * 100));
@@ -59,6 +62,10 @@
         pref.setSummary(mFormat.format(textZoom / 100.0));
     }
 
+    void updateDoubleTapZoomSummary(Preference pref, int doubleTapZoom) {
+        pref.setSummary(mFormat.format(doubleTapZoom / 100.0));
+    }
+
     void updateInvertedContrastSummary(Preference pref, int contrast) {
         pref.setSummary(mFormat.format(contrast / 100.0));
     }
@@ -80,6 +87,11 @@
             updateTextZoomSummary(pref, settings
                     .getAdjustedTextZoom((Integer) objValue));
         }
+        if (PreferenceKeys.PREF_DOUBLE_TAP_ZOOM.equals(pref.getKey())) {
+            BrowserSettings settings = BrowserSettings.getInstance();
+            updateDoubleTapZoomSummary(pref, settings
+                    .getAdjustedDoubleTapZoom((Integer) objValue));
+        }
         if (PreferenceKeys.PREF_INVERTED_CONTRAST.equals(pref.getKey())) {
             updateInvertedContrastSummary(pref,
                     (int) ((10 + (Integer) objValue) * 10));
diff --git a/src/com/android/browser/provider/SnapshotProvider.java b/src/com/android/browser/provider/SnapshotProvider.java
index c0aad23..437a867 100644
--- a/src/com/android/browser/provider/SnapshotProvider.java
+++ b/src/com/android/browser/provider/SnapshotProvider.java
@@ -72,7 +72,7 @@
     final static class SnapshotDatabaseHelper extends SQLiteOpenHelper {
 
         static final String DATABASE_NAME = "snapshots.db";
-        static final int DATABASE_VERSION = 1;
+        static final int DATABASE_VERSION = 2;
 
         public SnapshotDatabaseHelper(Context context) {
             super(context, getFullDatabaseName(context), null, DATABASE_VERSION);
@@ -99,7 +99,10 @@
 
         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-            // Not needed yet
+            if (oldVersion < 2) {
+                db.execSQL("DROP TABLE " + TABLE_SNAPSHOTS);
+                onCreate(db);
+            }
         }
 
     }
