am ab217abe: (-s ours) am 27bcac31: (-s ours) Merge "DO NOT MERGE Modify browser file origin policy."

* commit 'ab217abee18fa9a67e274f59ee5f8fc35345f3d1':
  DO NOT MERGE Modify browser file origin policy.
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3a281c9..1831462 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -41,6 +41,8 @@
     <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
+    <uses-permission android:name="android.permission.READ_PROFILE" />
+    <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>
     <uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/>
     <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
@@ -54,7 +56,7 @@
 
         <provider android:name=".provider.BrowserProvider2"
                   android:authorities="com.android.browser;browser"
-                  android:multiprocess="true"
+                  android:multiprocess="false"
                   android:readPermission="com.android.browser.permission.READ_HISTORY_BOOKMARKS"
                   android:writePermission="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS">
             <path-permission android:path="/bookmarks/search_suggest_query"
@@ -64,7 +66,7 @@
                   android:label="@string/application_name"
                   android:launchMode="singleTask"
                   android:alwaysRetainTaskState="true"
-                  android:configChanges="orientation|keyboardHidden|keyboard|screenSize"
+                  android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
                   android:theme="@style/BrowserTheme"
                   android:windowSoftInputMode="adjustResize" >
             <intent-filter>
@@ -183,7 +185,8 @@
 
         <activity android:name="AddBookmarkPage" android:label="Save bookmark"
                   android:theme="@style/DialogWhenLarge"
-                  android:configChanges="orientation|keyboardHidden|screenSize">
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:windowSoftInputMode="adjustResize">
             <intent-filter>
                 <action android:name="android.intent.action.INSERT" />
                 <category android:name="android.intent.category.DEFAULT" />
diff --git a/res/drawable-hdpi/app_web_browser_sm.png b/res/drawable-hdpi/app_web_browser_sm.png
index a3f75cc..62d5cc3 100644
--- a/res/drawable-hdpi/app_web_browser_sm.png
+++ b/res/drawable-hdpi/app_web_browser_sm.png
Binary files differ
diff --git a/res/drawable-hdpi/browsertab_add.png b/res/drawable-hdpi/browsertab_add.png
index 1e52bb1..7401eed 100644
--- a/res/drawable-hdpi/browsertab_add.png
+++ b/res/drawable-hdpi/browsertab_add.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_desktop_holo_dark.png b/res/drawable-hdpi/ic_desktop_holo_dark.png
new file mode 100644
index 0000000..76fbb85
--- /dev/null
+++ b/res/drawable-hdpi/ic_desktop_holo_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_go_holo_dark.png b/res/drawable-hdpi/ic_go_holo_dark.png
deleted file mode 100644
index b1412e8..0000000
--- a/res/drawable-hdpi/ic_go_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_mobile.png b/res/drawable-hdpi/ic_mobile.png
new file mode 100644
index 0000000..cd688c8
--- /dev/null
+++ b/res/drawable-hdpi/ic_mobile.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_voice_search_holo_dark.png b/res/drawable-hdpi/ic_voice_search_holo_dark.png
index 73bcafc..e79aa71 100644
--- a/res/drawable-hdpi/ic_voice_search_holo_dark.png
+++ b/res/drawable-hdpi/ic_voice_search_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/app_web_browser_sm.png b/res/drawable-mdpi/app_web_browser_sm.png
index 6ac62eb..0bbc682 100644
--- a/res/drawable-mdpi/app_web_browser_sm.png
+++ b/res/drawable-mdpi/app_web_browser_sm.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_desktop_holo_dark.png b/res/drawable-mdpi/ic_desktop_holo_dark.png
new file mode 100644
index 0000000..1bb8120
--- /dev/null
+++ b/res/drawable-mdpi/ic_desktop_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_go_holo_dark.png b/res/drawable-mdpi/ic_go_holo_dark.png
deleted file mode 100644
index 2e2a449..0000000
--- a/res/drawable-mdpi/ic_go_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_mobile.png b/res/drawable-mdpi/ic_mobile.png
new file mode 100644
index 0000000..6cf4283
--- /dev/null
+++ b/res/drawable-mdpi/ic_mobile.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_voice_search_holo_dark.png b/res/drawable-mdpi/ic_voice_search_holo_dark.png
index e7e4f68..f809e52 100644
--- a/res/drawable-mdpi/ic_voice_search_holo_dark.png
+++ b/res/drawable-mdpi/ic_voice_search_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/app_web_browser_sm.png b/res/drawable-xhdpi/app_web_browser_sm.png
index 501af7f..45a5f12 100644
--- a/res/drawable-xhdpi/app_web_browser_sm.png
+++ b/res/drawable-xhdpi/app_web_browser_sm.png
Binary files differ
diff --git a/res/drawable-xhdpi/browsertab_add.png b/res/drawable-xhdpi/browsertab_add.png
index e44f72b..ef7603e 100644
--- a/res/drawable-xhdpi/browsertab_add.png
+++ b/res/drawable-xhdpi/browsertab_add.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_desktop_holo_dark.png b/res/drawable-xhdpi/ic_desktop_holo_dark.png
new file mode 100644
index 0000000..1689e9d
--- /dev/null
+++ b/res/drawable-xhdpi/ic_desktop_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_go_holo_dark.png b/res/drawable-xhdpi/ic_go_holo_dark.png
deleted file mode 100644
index e4b59b3..0000000
--- a/res/drawable-xhdpi/ic_go_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_mobile.png b/res/drawable-xhdpi/ic_mobile.png
new file mode 100644
index 0000000..a055b07
--- /dev/null
+++ b/res/drawable-xhdpi/ic_mobile.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_voice_search_holo_dark.png b/res/drawable-xhdpi/ic_voice_search_holo_dark.png
index bfeb7aa..02876b7 100644
--- a/res/drawable-xhdpi/ic_voice_search_holo_dark.png
+++ b/res/drawable-xhdpi/ic_voice_search_holo_dark.png
Binary files differ
diff --git a/res/layout-port/autofill_settings_fragment.xml b/res/layout-port/autofill_settings_fragment.xml
index 097074b..9f26fd9 100644
--- a/res/layout-port/autofill_settings_fragment.xml
+++ b/res/layout-port/autofill_settings_fragment.xml
@@ -43,37 +43,19 @@
                 android:layout_width="match_parent" />
 
             <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
+                style="@style/AutofillProfileTextView"
                 android:text="@string/autofill_profile_editor_name" />
             <EditText android:id="@+id/autofill_profile_editor_name_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:inputType="textPersonName|textCapWords"
-                android:singleLine="true"
-                android:imeOptions="actionNext" />
+                style="@style/AutofillProfileEditText"
+                android:inputType="textPersonName|textCapWords" />
+
             <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
+                style="@style/AutofillProfileTextView"
                 android:text="@string/autofill_profile_editor_company_name" />
             <EditText android:id="@+id/autofill_profile_editor_company_name_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:inputType="textCapWords"
-                android:singleLine="true"
-                android:imeOptions="actionNext" />
+                style="@style/AutofillProfileEditText"
+                android:inputType="textCapWords" />
+
             <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
@@ -93,14 +75,9 @@
                     android:text="@string/autofill_profile_editor_address_line_1_hint" />
             </LinearLayout>
             <EditText android:id="@+id/autofill_profile_editor_address_line_1_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:inputType="textCapWords"
-                android:singleLine="true"
-                android:imeOptions="actionNext" />
+                style="@style/AutofillProfileEditText"
+                android:inputType="textCapWords" />
+
             <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
@@ -120,122 +97,51 @@
                     android:text="@string/autofill_profile_editor_address_line_2_hint" />
             </LinearLayout>
             <EditText android:id="@+id/autofill_profile_editor_address_line_2_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="bottom"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:inputType="textCapWords"
-                android:singleLine="true"
-                android:imeOptions="actionNext" />
+                style="@style/AutofillProfileEditText"
+                android:inputType="textCapWords" />
+
             <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
+                style="@style/AutofillProfileTextView"
                 android:text="@string/autofill_profile_editor_city" />
             <EditText android:id="@+id/autofill_profile_editor_city_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:inputType="textCapWords"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:singleLine="true"
-                android:imeOptions="actionNext" />
+                style="@style/AutofillProfileEditText"
+                android:inputType="textCapWords" />
+
             <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
+                style="@style/AutofillProfileTextView"
                 android:text="@string/autofill_profile_editor_state" />
             <EditText android:id="@+id/autofill_profile_editor_state_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:inputType="textCapWords"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:singleLine="true"
-                android:imeOptions="actionNext" />
+                style="@style/AutofillProfileEditText"
+                android:inputType="textCapWords" />
+
             <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
+                style="@style/AutofillProfileTextView"
                 android:text="@string/autofill_profile_editor_zip_code" />
             <EditText android:id="@+id/autofill_profile_editor_zip_code_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:inputType="textCapCharacters"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:singleLine="true"
-                android:imeOptions="actionNext" />
+                style="@style/AutofillProfileEditText"
+                android:inputType="textCapCharacters" />
+
             <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
+                style="@style/AutofillProfileTextView"
                 android:text="@string/autofill_profile_editor_country" />
             <EditText android:id="@+id/autofill_profile_editor_country_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:inputType="textCapWords"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:singleLine="true"
-                android:imeOptions="actionNext" />
+                style="@style/AutofillProfileEditText"
+                android:inputType="textCapWords" />
+
             <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
+                style="@style/AutofillProfileTextView"
                 android:text="@string/autofill_profile_editor_phone_number" />
             <EditText android:id="@+id/autofill_profile_editor_phone_number_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:singleLine="true"
-                android:phoneNumber="true"
-                android:imeOptions="actionNext" />
+                style="@style/AutofillProfileEditText"
+                android:phoneNumber="true" />
+
             <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
+                style="@style/AutofillProfileTextView"
                 android:text="@string/autofill_profile_editor_email_address" />
             <EditText android:id="@+id/autofill_profile_editor_email_address_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:layout_margin="2dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
+                style="@style/AutofillProfileEditText"
                 android:inputType="textEmailAddress"
-                android:singleLine="true"
-                android:imeOptions="actionDone" />
+                android:imeOptions="actionDone|flagNoExtractUi" />
         </LinearLayout>
     </ScrollView>
-
-    <View
-        android:layout_height="12dip"
-        android:layout_width="match_parent" />
-
-    <Button
-        android:id="@+id/autofill_profile_editor_save_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/autofill_profile_editor_save_profile"
-        android:textAppearance="?android:attr/textAppearanceMedium" />
-
 </LinearLayout>
diff --git a/res/layout-sw600dp/title_bar_nav.xml b/res/layout-sw600dp/title_bar_nav.xml
index e628a81..a6b8a32 100644
--- a/res/layout-sw600dp/title_bar_nav.xml
+++ b/res/layout-sw600dp/title_bar_nav.xml
@@ -28,7 +28,6 @@
             android:src="@drawable/ic_back_holo_dark"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:paddingLeft="16dip"
             android:contentDescription="@string/accessibility_button_back"
             style="@style/HoloButton" />
         <ImageButton
@@ -52,22 +51,20 @@
         android:layout_width="0dip"
         android:layout_height="match_parent"
         android:layout_weight="1.0"
-        android:layout_marginLeft="8dip"
-        android:layout_marginRight="8dip"
         android:orientation="horizontal"
         android:background="@drawable/url_background">
         <ImageView
             android:id="@+id/url_icon"
-            android:layout_width="48dip"
+            android:layout_width="32dip"
             android:layout_height="20dip"
-            android:paddingLeft="14dip"
-            android:paddingRight="14dip"
             android:src="@drawable/ic_web_holo_dark"
             android:layout_gravity="center" />
         <ImageView
             android:id="@+id/lock"
             android:layout_width="wrap_content"
-            android:layout_height="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:layout_marginLeft="0dip"
             style="@style/HoloIcon"
             android:visibility="gone" />
         <com.android.browser.UrlInputView
@@ -75,7 +72,7 @@
             android:layout_width="0dip"
             android:layout_weight="1.0"
             android:layout_height="match_parent"
-            android:paddingLeft="0dip"
+            android:paddingLeft="4dip"
             android:paddingRight="0dip"
             android:background="@null"
             android:textAppearance="?android:attr/textAppearanceMedium"
@@ -101,23 +98,14 @@
             android:layout_height="match_parent"
             android:contentDescription="@string/accessibility_button_clear"
             style="@style/HoloButton" />
-    </LinearLayout>
-    <ImageButton
-        android:id="@+id/go"
-        android:src="@drawable/ic_go_holo_dark"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:visibility="gone"
-        android:gravity="center_vertical"
-            android:contentDescription="@string/accessibility_button_go"
-        style="@style/HoloButton" />
-    <ImageButton
-        android:id="@+id/voicesearch"
-        android:src="@drawable/ic_voice_search_holo_dark"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
+        <ImageButton
+            android:id="@+id/voice"
+            android:src="@drawable/ic_voice_search_holo_dark"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
             android:contentDescription="@string/accessibility_button_voice"
-        style="@style/HoloButton" />
+            style="@style/HoloButton" />
+        </LinearLayout>
     <ImageButton
         android:id="@+id/search"
         android:src="@drawable/ic_search_holo_dark"
@@ -131,7 +119,6 @@
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:scaleType="center"
-        android:paddingRight="16dip"
         style="@style/HoloButton"
         android:contentDescription="@string/accessibility_button_bookmarks"
         android:src="@drawable/ic_bookmarks_history_holo_dark" />
diff --git a/res/layout/autofill_settings_fragment.xml b/res/layout/autofill_settings_fragment.xml
index 44bf8f0..e667b86 100644
--- a/res/layout/autofill_settings_fragment.xml
+++ b/res/layout/autofill_settings_fragment.xml
@@ -49,39 +49,19 @@
                 android:stretchColumns="1">
                 <TableRow>
                     <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        style="@style/AutofillProfileTextView"
                         android:text="@string/autofill_profile_editor_name" />
                     <EditText android:id="@+id/autofill_profile_editor_name_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
-                        android:inputType="textPersonName|textCapWords"
-                        android:singleLine="true"
-                        android:imeOptions="actionNext" />
+                        style="@style/AutofillProfileEditText"
+                        android:inputType="textPersonName|textCapWords" />
                 </TableRow>
                 <TableRow>
                     <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        style="@style/AutofillProfileTextView"
                         android:text="@string/autofill_profile_editor_company_name" />
                     <EditText android:id="@+id/autofill_profile_editor_company_name_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
-                        android:inputType="textCapWords"
-                        android:singleLine="true"
-                        android:imeOptions="actionNext" />
+                        style="@style/AutofillProfileEditText"
+                        android:inputType="textCapWords" />
                 </TableRow>
                 <TableRow>
                     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
@@ -103,14 +83,8 @@
                             android:text="@string/autofill_profile_editor_address_line_1_hint" />
                     </LinearLayout>
                     <EditText android:id="@+id/autofill_profile_editor_address_line_1_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
-                        android:inputType="textCapWords"
-                        android:singleLine="true"
-                        android:imeOptions="actionNext" />
+                        style="@style/AutofillProfileEditText"
+                        android:inputType="textCapWords" />
                 </TableRow>
                 <TableRow>
                     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
@@ -132,137 +106,60 @@
                             android:text="@string/autofill_profile_editor_address_line_2_hint" />
                     </LinearLayout>
                     <EditText android:id="@+id/autofill_profile_editor_address_line_2_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="bottom"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
-                        android:inputType="textCapWords"
-                        android:singleLine="true"
-                        android:imeOptions="actionNext" />
+                        style="@style/AutofillProfileEditText"
+                        android:inputType="textCapWords" />
                 </TableRow>
                 <TableRow>
                     <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        style="@style/AutofillProfileTextView"
                         android:text="@string/autofill_profile_editor_city" />
                     <EditText android:id="@+id/autofill_profile_editor_city_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:inputType="textCapWords"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
-                        android:singleLine="true"
-                        android:imeOptions="actionNext" />
+                        style="@style/AutofillProfileEditText"
+                        android:inputType="textCapWords" />
                 </TableRow>
                 <TableRow>
                     <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        style="@style/AutofillProfileTextView"
                         android:text="@string/autofill_profile_editor_state" />
                     <EditText android:id="@+id/autofill_profile_editor_state_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:inputType="textCapWords"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
-                        android:singleLine="true"
-                        android:imeOptions="actionNext" />
+                        style="@style/AutofillProfileEditText"
+                        android:inputType="textCapWords" />
                 </TableRow>
                 <TableRow>
                     <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        style="@style/AutofillProfileTextView"
                         android:text="@string/autofill_profile_editor_zip_code" />
                     <EditText android:id="@+id/autofill_profile_editor_zip_code_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:inputType="textCapCharacters"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
-                        android:singleLine="true"
-                        android:imeOptions="actionNext" />
+                        style="@style/AutofillProfileEditText"
+                        android:inputType="textCapCharacters" />
                 </TableRow>
                 <TableRow>
                     <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        style="@style/AutofillProfileTextView"
                         android:text="@string/autofill_profile_editor_country" />
                     <EditText android:id="@+id/autofill_profile_editor_country_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:inputType="textCapWords"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
-                        android:singleLine="true"
-                        android:imeOptions="actionNext" />
+                        style="@style/AutofillProfileEditText"
+                        android:inputType="textCapWords" />
                 </TableRow>
                 <TableRow>
                     <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        style="@style/AutofillProfileTextView"
                         android:text="@string/autofill_profile_editor_phone_number" />
                     <EditText android:id="@+id/autofill_profile_editor_phone_number_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
-                        android:singleLine="true"
-                        android:phoneNumber="true"
-                        android:imeOptions="actionNext" />
+                        style="@style/AutofillProfileEditText"
+                        android:phoneNumber="true" />
                 </TableRow>
                 <TableRow>
                     <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        style="@style/AutofillProfileTextView"
                         android:text="@string/autofill_profile_editor_email_address" />
                     <EditText android:id="@+id/autofill_profile_editor_email_address_edit"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="center_vertical"
-                        android:layout_margin="2dip"
-                        android:textAppearance="?android:attr/textAppearanceMedium"
+                        style="@style/AutofillProfileEditText"
                         android:inputType="textEmailAddress"
-                        android:singleLine="true"
-                        android:imeOptions="actionDone" />
+                        android:imeOptions="actionDone|flagNoExtractUi" />
                 </TableRow>
             </TableLayout>
        </LinearLayout>
     </ScrollView>
-
-    <View
-        android:layout_height="12dip"
-        android:layout_width="match_parent" />
-
-    <Button
-        android:id="@+id/autofill_profile_editor_save_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/autofill_profile_editor_save_profile"
-        android:textAppearance="?android:attr/textAppearanceMedium" />
-
 </LinearLayout>
 
diff --git a/res/layout/browser_subwindow.xml b/res/layout/browser_subwindow.xml
index a3868cd..fb6fa37 100644
--- a/res/layout/browser_subwindow.xml
+++ b/res/layout/browser_subwindow.xml
@@ -14,34 +14,28 @@
      limitations under the License.
 -->
 
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/subwindow_container"
+    android:orientation="vertical"
+    android:background="@android:drawable/dialog_frame"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:padding="10dip" >
-        <LinearLayout
-            android:id="@+id/inner_container"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical"
-            android:background="@android:drawable/dialog_frame" >
-        </LinearLayout>
-    </FrameLayout>
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="vertical"
+        android:background="@color/black"
         android:layout_gravity="right"
         android:gravity="right" >
         <ImageButton android:id="@+id/subwindow_close"
+            style="@style/HoloButton"
             android:focusable="true"
-            android:padding="0dip"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:background="@android:drawable/btn_default"
-            android:src="@android:drawable/ic_menu_close_clear_cancel" />
+            android:src="@drawable/ic_close_window_holo_dark" />
     </LinearLayout>
-</RelativeLayout>
+    <LinearLayout
+        android:id="@+id/inner_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical" />
+</LinearLayout>
diff --git a/res/layout/custom_screen.xml b/res/layout/custom_screen.xml
index 7a22530..61c455c 100644
--- a/res/layout/custom_screen.xml
+++ b/res/layout/custom_screen.xml
@@ -22,7 +22,8 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
     />
-    <LinearLayout android:orientation="vertical"
+    <com.android.browser.view.CustomScreenLinearLayout
+        android:orientation="vertical"
         android:id="@+id/vertical_layout"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
@@ -32,10 +33,15 @@
             android:layout_height="wrap_content"
         />
 
+        <FrameLayout android:id="@+id/fixed_titlebar_container"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+        />
+
         <FrameLayout android:id="@+id/main_content"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
         />
-    </LinearLayout>
+    </com.android.browser.view.CustomScreenLinearLayout>
 </merge>
 
diff --git a/res/layout/tab_bar.xml b/res/layout/tab_bar.xml
index 2790362..a9a70fd 100644
--- a/res/layout/tab_bar.xml
+++ b/res/layout/tab_bar.xml
@@ -20,14 +20,14 @@
     <com.android.browser.TabScrollView
         android:id="@+id/tabs"
         android:layout_width="0dip"
-        android:layout_height="44dip"
+        android:layout_height="match_parent"
         android:layout_weight="1.0"
         android:orientation="horizontal" />
     <ImageButton
         android:id="@+id/newtab"
         android:src="@drawable/ic_menu_new_window"
         android:layout_width="wrap_content"
-        android:layout_height="44dip"
+        android:layout_height="match_parent"
         style="@style/HoloButton"
         android:background="@drawable/add_tab_selector" />
 </merge>
diff --git a/res/menu/autofill_profile_editor.xml b/res/menu/autofill_profile_editor.xml
index 4e746e5..9dab635 100644
--- a/res/menu/autofill_profile_editor.xml
+++ b/res/menu/autofill_profile_editor.xml
@@ -15,6 +15,11 @@
 -->
 
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/autofill_profile_editor_save_profile_menu_id"
+        android:title="@string/autofill_profile_editor_save_profile"
+        android:icon="@android:drawable/ic_menu_save"
+        android:showAsAction="ifRoom|withText" />
+
     <item android:id="@+id/autofill_profile_editor_delete_profile_menu_id"
         android:title="@string/autofill_profile_editor_delete_profile"
         android:icon="@android:drawable/ic_menu_delete"
diff --git a/res/menu/browser.xml b/res/menu/browser.xml
index b847316..9d95e88 100644
--- a/res/menu/browser.xml
+++ b/res/menu/browser.xml
@@ -99,10 +99,6 @@
             android:id="@+id/dump_nav_menu_id"
             android:title="@string/dump_nav"
             android:visible="false" />
-        <item
-            android:id="@+id/dump_counters_menu_id"
-            android:title="@string/dump_counters"
-            android:visible="false" />
     </group>
     <group android:id="@+id/MAIN_SHORTCUT_MENU" android:visible="false">
         <item android:id="@+id/view_downloads_menu_id"
diff --git a/res/menu/browsercontext.xml b/res/menu/browsercontext.xml
index a8ae5c8..8137a67 100644
--- a/res/menu/browsercontext.xml
+++ b/res/menu/browsercontext.xml
@@ -52,6 +52,8 @@
             android:title="@string/contextmenu_view_image"/>
         <item android:id="@+id/set_wallpaper_context_menu_id"
             android:title="@string/contextmenu_set_wallpaper"/>
+        <item android:id="@+id/share_link_context_menu_id"
+            android:title="@string/contextmenu_sharelink"/>
     </group>
     <group android:id="@+id/SELECT_TEXT_MENU">
         <item android:id="@+id/select_text_menu_id"
diff --git a/res/mipmap-hdpi/ic_launcher_browser.png b/res/mipmap-hdpi/ic_launcher_browser.png
index 5680416..4f9377f 100644
--- a/res/mipmap-hdpi/ic_launcher_browser.png
+++ b/res/mipmap-hdpi/ic_launcher_browser.png
Binary files differ
diff --git a/res/mipmap-mdpi/ic_launcher_browser.png b/res/mipmap-mdpi/ic_launcher_browser.png
index 426f4a7..9bc6817 100644
--- a/res/mipmap-mdpi/ic_launcher_browser.png
+++ b/res/mipmap-mdpi/ic_launcher_browser.png
Binary files differ
diff --git a/res/mipmap-xhdpi/ic_launcher_browser.png b/res/mipmap-xhdpi/ic_launcher_browser.png
index 74ffd5b..9412fbe 100644
--- a/res/mipmap-xhdpi/ic_launcher_browser.png
+++ b/res/mipmap-xhdpi/ic_launcher_browser.png
Binary files differ
diff --git a/res/raw/folder_view.ktpl b/res/raw/folder_view.ktpl
new file mode 100644
index 0000000..2f360cc
--- /dev/null
+++ b/res/raw/folder_view.ktpl
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

+

+<html>

+<head>

+<title>Index of <%= path %></title>

+<meta name="viewport" content="width=device-width; initial-scale=1.0; user-scalable=0" />

+

+<style type="text/css">

+

+* {

+    padding: 0;

+    margin: 0;

+}

+

+body {

+    padding: 0 8px 0 8px;

+}

+

+.table {

+    border-collapse: collapse;

+}

+

+tr.header {

+    font-weight: bold;

+}

+

+tr.alt {

+    background: #EEE;

+}

+

+td.details {

+    padding-left: 2em;

+    text-align: right;

+    white-space: nowrap;

+}

+

+.row {

+    padding: 8px 0 8px 8px;

+    display: block;

+    text-decoration: none;

+}

+

+h2 {

+    padding-top: 8px;

+    padding-bottom: 8px;

+}

+

+.icon {

+    padding-left: 1.5em;

+}

+

+.file {

+    background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABHUlEQVR42o2RMW7DIBiF3498iHRJD5JKHurL+CRVBp+i2T16tTynF2gO0KSb5ZrBBl4HHDBuK/WXACH4eO9/CAAAbdvijzLGNE1TVZXfZuHg6XCAQESAZXbOKaXO57eiKG6ft9PrKQIkCQqFoIiQFBGlFIB5nvM8t9aOX2Nd18oDzjnPgCDpn/BH4zh2XZdlWVmWiUK4IgCBoFMUz9eP6zRN75cLgEQhcmTQIbl72O0f9865qLAAsURAAgKBJKEtgLXWvyjLuFsThCSstb8rBCaAQhDYWgIZ7myM+TUBjDHrHlZcbMYYk34cN0YSLcgS+wL0fe9TXDMbY33fR2AYBvyQ8L0Gk8MwREBrTfKe4TpTzwhArXWi8HI84h/1DfwI5mhxJamFAAAAAElFTkSuQmCC ") left top no-repeat;

+}

+

+.dir {

+    background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII= ") left top no-repeat;

+}

+

+.up {

+    background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU0toU0EUPfPysx/tTxuDH9SCWhUDooIbd7oRUUTMouqi2iIoCO6lceHWhegy4EJFinWjrlQUpVm0IIoFpVDEIthm0dpikpf3ZuZ6Z94nrXhhMjM3c8895977BBHB2PznK8WPtDgyWH5q77cPH8PpdXuhpQT4ifR9u5sfJb1bmw6VivahATDrxcRZ2njfoaMv+2j7mLDn93MPiNRMvGbL18L9IpF8h9/TN+EYkMffSiOXJ5+hkD+PdqcLpICWHOHc2CC+LEyA/K+cKQMnlQHJX8wqYG3MAJy88Wa4OLDvEqAEOpJd0LxHIMdHBziowSwVlF8D6QaicK01krw/JynwcKoEwZczewroTvZirlKJs5CqQ5CG8pb57FnJUA0LYCXMX5fibd+p8LWDDemcPZbzQyjvH+Ki1TlIciElA7ghwLKV4kRZstt2sANWRjYTAGzuP2hXZFpJ/GsxgGJ0ox1aoFWsDXyyxqCs26+ydmagFN/rRjymJ1898bzGzmQE0HCZpmk5A0RFIv8Pn0WYPsiu6t/Rsj6PauVTwffTSzGAGZhUG2F06hEc9ibS7OPMNp6ErYFlKavo7MkhmTqCxZ/jwzGA9Hx82H2BZSw1NTN9Gx8ycHkajU/7M+jInsDC7DiaEmo1bNl1AMr9ASFgqVu9MCTIzoGUimXVAnnaN0PdBBDCCYbEtMk6wkpQwIG0sn0PQIUF4GsTwLSIFKNqF6DVrQq+IWVrQDxAYQC/1SsYOI4pOxKZrfifiUSbDUisif7XlpGIPufXd/uvdvZm760M0no1FZcnrzUdjw7au3vu/BVgAFLXeuTxhTXVAAAAAElFTkSuQmCC ") left top no-repeat;

+}

+

+</style>

+

+</head>

+<body>

+    <h2>Index of <%= path %></h2>

+    <table class="table">

+        <tr class="header">

+            <td>Name</th>

+            <td class="details">Size</th>

+            <td class="details">Date Modified</th>

+        </tr>

+        <tr>

+            <td>

+                <a href="<%= parent_url %>" class="row">

+                    <span class="icon up">[parent directory]</span>

+                </a>

+            </td>

+            <td class="details"></td>

+            <td class="details"></td>

+        </tr>

+        <%{ files %>

+            <tr class="<%= alt %>">

+                <td>

+                    <a href="<%= url %>" class="row">

+                        <span class="icon <%= type %>"><%= name %></span>

+                    </a>

+                </td>

+                <td class="details"><%= size %></td>

+                <td class="details"><%= last_modified %></td>

+            </tr>

+        <%} files %>

+    </table>

+</body>

+</html>

diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 86cced1..eb428b8 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopieer bladsy-URL"</string>
     <string name="share_page" msgid="593756995297268343">"Deel bladsy"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Stoor vir vanlyn lees"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Stoor tans…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Kon nie stoor om vanlyn te lees nie."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> boekmerke"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Leë vouer"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Boekmerke"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Instellings"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Bladsyinhoud"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Laat verskeie oortjies per program toe"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Laai prente"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Wys prente op webbladsye"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blokkeer opspringers"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Outo-invul-teks gestoor."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Outo-invul-teks uitgevee."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Vee uit"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Die blaaier kan outomaties webvorms soos hierdie een voltooi. Wil jy jou outo-invul-teks opstel?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Die blaaier kan outomaties webvorms soos hierdie een voltooi. Wil jy nou outo-invul-teks opstel?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Jy kan altyd jou outo-invul-teks opstel in Blaaier &gt; Instellings &gt; Algemeen."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Deaktiveer outo-invul"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privaatheid en sekuriteit"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Laat blaaier toe om waarskynlike soekresultate in die agtergrond vooraf laai"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Soekresultaat word voorafgelaai"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Vooraflaai webbladsy"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nooit"</item>
+    <item msgid="1908465963242077428">"Net op Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Altyd"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Laat blaaier toe om gekoppelde webblaaie vooraf te laai in die agtergrond"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Vooraflaai webbladsy"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Verbindingsprobleem"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Lêerprobleem"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Stel tans muurpapier in..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Boekmerke"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Geen boekmerke nie."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Ander boekmerke"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Kies rekening"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sinkroniseer met Google-rekening"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 023a12e..b4d703b 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"url ገፅ ቅዳ"</string>
     <string name="share_page" msgid="593756995297268343">"ገፅ አጋራ"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"ከመስመር ውጪ የሚነበብ አስቀምጥ"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"በማስቀመጥ ላይ..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"ከመስመር ውጪ ለሚደረግ ንባብ ማስቀመጥ አልተቻለም፡፡"</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> ዕልባቶች"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"ባዶ አቃፊ"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"ዕልባቶች"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"ቅንብሮች"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"የገፅ ይዘት"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"በርካታ ትሮች በመተግበሪያ ፍቀድ"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"ምስሎች ስቀል"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"በድረ ገፆች ላይ ምስሎች አሳይ"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"ብቅባዮች አግድ"</string>
@@ -181,8 +183,8 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"ራስ ሰር-ሙላ ጽሑፍ ተቀምጧል::"</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"ራስ ሰር-ሙላ ጽሑፍ ተሰርዟል::"</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"ሰርዝ"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"አሳሹ እንደዚህ ዓይነቶቹን የድር ቅርጾች በራስ ሰር ያሟላል፡፡ የራስህን ራስ-ሙላ ጽሑፍ ማዘጋጀት ትፈልጋለህ?"</string>
-    <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"የራስህን ራስ ሰር ሙላ ጽሑፍ ከአሳሽ ላይ&gt;  ቅንጅቶች&gt;  አጠቃላይ ማያ ላይ ሁልጊዜ ማዘጋጀት ትችላለህ፡፡"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"አሳሹ እንደዚህ ዓይነቶቹን የድር ቅርጾች በራስ ሰር ያሟላል፡፡ የራስህን ራስ-ሙላ ጽሑፍ ማዘጋጀት ትፈልጋለህ?"</string>
+    <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"የራስህን ራስ ሰር ሙላ ጽሑፍ ከአሳሽ ላይ&gt;  ቅንብሮች &gt;  አጠቃላይ ማያ ላይ ሁልጊዜ ማዘጋጀት ትችላለህ፡፡"</string>
     <string name="disable_autofill" msgid="8305901059849400354">"ራስ-ሙላ አቦዝን"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"ግላዊነት&amp; ደህንነት"</string>
     <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"መሸጎጫ አጥራ"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"አሳሹ አስተማማኝ የፍለጋ ውጤቶችን በዳራ ውስጥ ቀድሞ እንዲሰቅል ይፈቅዳል።"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"የፍለጋ ውጤት አስቀድሞ በመጫን ላይ"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"የድረ-ገጽ ቅድመ-መጫን"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"በፍጹም"</item>
+    <item msgid="1908465963242077428">"በገመድ አልባ ላይ ብቻ"</item>
+    <item msgid="7647277566998527142">"ዘወትር"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"አሳሽ የተገናኙ ድረ-ገጾች በጀርባ ውስጥ ቅድሚያ እንዲጭን ፍቀድለት"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"የድረ-ገጽ ቅድመ-መጫን"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"የግንኙነት ችግር"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"ፋይል ችግር"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -326,7 +336,7 @@
     <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"ሥፍራ አጋራ"</string>
     <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"አትቀበል"</string>
     <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"ምርጫ አስታውስ"</string>
-    <string name="geolocation_permissions_prompt_toast_allowed" msgid="7201417941112726112">"ይህ ድረ ገፅ የአንተን ሥፍራ መድረስ አይችልም። በቅንጅቶች ውስጥ ይህን-&gt; ከፍተኛ-&gt; የድረ ገፅ ቅንጅቶች ለውጥ::"</string>
+    <string name="geolocation_permissions_prompt_toast_allowed" msgid="7201417941112726112">"ይህ ድረ ገፅ የአንተን ሥፍራ መድረስ አይችልም። በቅንብሮች  ውስጥ ይህን-&gt; ከፍተኛ-&gt; የድረ ገፅ ቅንብሮች  ለውጥ::"</string>
     <string name="geolocation_permissions_prompt_toast_disallowed" msgid="156443445797377409">"ይህ ድረ ገፅ የአንተን ሥፍራ መድረስ አይችልም። በቅንጅቶች ውስጥ ይህን-&gt; ከፍተኛ-&gt; የድረ ገፅ ቅንብሮች ለውጥ::"</string>
     <string name="geolocation_settings_page_title" msgid="1745477985097536528">"የስፍራ መድረሻ አጥራ"</string>
     <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"ይህ ድረ ገፅ በአሁኑ ጊዜ የእርስዎን ስፍራ መድረስ ይችላል"</string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"ልጣፍ በማቀናበር ላይ...."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"እልባቶች"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ምንም ዕልባቶች የሉም"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"ሌሎች እልባቶች"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"መለያ ምረጥ"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"ከGoogle መለያ ጋር አሳምር"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index c4992e6..6b35260 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -54,7 +54,7 @@
     <string name="stop" msgid="5687251076030630074">"إيقاف"</string>
     <string name="reload" msgid="8585220783228408062">"تحديث"</string>
     <string name="back" msgid="8414603107175713668">"رجوع"</string>
-    <string name="forward" msgid="4288210890526641577">"إعادة توجيه"</string>
+    <string name="forward" msgid="4288210890526641577">"للأمام"</string>
     <string name="save" msgid="5922311934992468496">"موافق"</string>
     <string name="do_not_save" msgid="6777633870113477714">"إلغاء"</string>
     <string name="location" msgid="3411848697912600125">"العنوان"</string>
@@ -101,7 +101,8 @@
     <string name="menu_view_download" msgid="2124570321712995120">"التنزيلات"</string>
     <string name="copy_page_url" msgid="1188679152608889555">"نسخ عنوان URL للصفحة"</string>
     <string name="share_page" msgid="593756995297268343">"مشاركة الصفحة"</string>
-    <string name="menu_save_snapshot" msgid="6935080344031126139">"حفظ للقراءة في وضع عدم الاتصال"</string>
+    <string name="menu_save_snapshot" msgid="6935080344031126139">"حفظ للقراءة بلا اتصال"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"جارٍ الحفظ..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"تعذر الحفظ للقراءة في وضع عدم الاتصال."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> من الإشارات المرجعية"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"المجلد فارغ"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"الإشارات"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"الإعدادات"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"محتوى الصفحة"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"السماح بعلامات تبويب متعددة لكل تطبيق"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"تحميل الصور"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"عرض الصور على صفحات الويب"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"حظر النوافذ المنبثقة"</string>
@@ -138,7 +140,7 @@
   </string-array>
     <string name="pref_content_open_in_background_summary" msgid="955411158407739504">"فتح علامات تبويب جديدة وراء علامة التبويب الحالية"</string>
     <string name="pref_content_homepage" msgid="3324574611613105696">"تعيين الصفحة الرئيسية"</string>
-    <string name="pref_content_search_engine" msgid="1620101310821644144">"تعين محرك بحث"</string>
+    <string name="pref_content_search_engine" msgid="1620101310821644144">"تعيين محرك بحث"</string>
     <string name="pref_content_search_engine_summary" msgid="304003941861818133">"اختر محرك بحث"</string>
     <string name="pref_set_homepage_to" msgid="7838684355145561242">"تعيين على"</string>
   <string-array name="pref_homepage_choices">
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"تم حفظ نص الملء التلقائي."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"تم حذف نص الملء التلقائي."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"حذف"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"يمكن للمتصفح إكمال نماذج الويب مثل هذه تلقائيًا. هل تريد إعداد نص الملء التلقائي؟"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"المتصفح يمكنه تلقائيًا إكمال نماذج الويب مثل هذا النموذج. هل تريد إعداد نص الملء التلقائي؟"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"يمكنك دائمًا إعداد نص الملء التلقائي من المتصفح &gt; الإعدادات &gt; الشاشة العامة."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"تعطيل الملء التلقائي"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"الخصوصية والأمان"</string>
@@ -205,7 +207,7 @@
     <string name="pref_privacy_location_title" msgid="7458378016606081067">"الموقع"</string>
     <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"تمكين الموقع"</string>
     <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"السماح للمواقع الإلكترونية بطلب الدخول إلى موقعك الجغرافي"</string>
-    <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"محو إمكانية الدخول إلى الموقع الجغرافي"</string>
+    <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"محو إمكانية الدخول إلى الموقع"</string>
     <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"محو إمكانية الدخول إلى الموقع الجغرافي بالنسبة إلى جميع مواقع الويب"</string>
     <string name="pref_privacy_clear_geolocation_access_dlg" msgid="3190928760598034346">"هل تريد محو إمكانية دخول موقع الويب إلى الموقع الجغرافي؟"</string>
     <string name="pref_security_passwords_title" msgid="5734190542383756711">"كلمات المرور"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"السماح للمتصفح بتحميل نتائج بحث عالية الثقة في الخلفية مسبقًا"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"التحميل المسبق لنتيجة البحث"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"التحميل المسبق لصفحة الويب"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"مطلقًا"</item>
+    <item msgid="1908465963242077428">"في شبكة Wi-Fi فقط"</item>
+    <item msgid="7647277566998527142">"دائمًا"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"السماح للمتصفح بتحميل صفحات الويب المرتبطة مسبقًا في الخلفية"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"تحميل صفحة الويب مسبقًا"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"مشكلة في الاتصال"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"مشكلة بالملف"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -328,7 +338,7 @@
     <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"تذكّر التفضيل"</string>
     <string name="geolocation_permissions_prompt_toast_allowed" msgid="7201417941112726112">"يتعذر على موقع الويب هذا الدخول إلى موقعك الجغرافي. يمكنك تغيير هذا من الإعدادات &gt; متقدمة &gt; شاشة موقع الويب."</string>
     <string name="geolocation_permissions_prompt_toast_disallowed" msgid="156443445797377409">"يتعذر على موقع الويب هذا الدخول إلى موقعك الجغرافي. يمكنك تغيير هذا من الإعدادات -&gt; متقدمة -&gt; إعدادات موقع الويب."</string>
-    <string name="geolocation_settings_page_title" msgid="1745477985097536528">"محو إمكانية الدخول إلى الموقع الجغرافي"</string>
+    <string name="geolocation_settings_page_title" msgid="1745477985097536528">"محو إمكانية الدخول إلى الموقع"</string>
     <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"يمكن لهذا الموقع الإلكتروني الدخول إلى موقعك الجغرافي حاليًا"</string>
     <string name="geolocation_settings_page_summary_not_allowed" msgid="7941769772784366199">"لا يمكن لموقع الويب هذا الدخول إلى موقعك الجغرافي حاليًا"</string>
     <string name="geolocation_settings_page_dialog_message" msgid="8772923416296868537">"هل تريد محو إمكانية الدخول إلى الموقع الجغرافي لموقع الويب هذا؟"</string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"جارٍ تعيين الخلفية..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"الإشارات"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ليست هناك أية إشارات مرجعية."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"إشارات مرجعية أخرى"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"اختيار حساب"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"المزامنة مع حساب Google"</string>
@@ -361,7 +372,7 @@
     <string name="instant_search_label" msgid="8769284297650716935">"Google مع البحث الفوري (ميزات اختبارية)"</string>
     <string name="preview" msgid="6450823514561689038">"معاينة"</string>
     <string name="local_bookmarks" msgid="533816851415228520">"محلية"</string>
-    <string name="ua_switcher_desktop" msgid="220097077327558435">"طلب موقع ويب لسطح المكتب"</string>
+    <string name="ua_switcher_desktop" msgid="220097077327558435">"طلب موقع ويب الكمبيوتر"</string>
     <string name="permission_preload_label" msgid="4856971662337877316">"تحميل النتائج مسبقًا"</string>
     <string name="empty_snapshots_folder" msgid="7675378008107026013">"ليست هناك أية صفحات محفوظة."</string>
     <string name="remove_snapshot" msgid="1624447424544976849">"حذف الصفحة المحفوظة"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 1047951..65a1e88 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Капіяваць URL-адрас старонкі"</string>
     <string name="share_page" msgid="593756995297268343">"Адправіць старонку"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Захаваць для чытання ў аўтаномным рэжыме"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Захаванне..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Немагчыма захаваць для чытання ў аўтаномным рэжыме."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Закладак: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Ачысцiць тэчку"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Закладкі"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Налады"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Змесцiва старонкі"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Дазв. некалькі ўкладак на прыкладанне"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Загрузіць малюнкі"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Паказваць выявы на вэб-старонках"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Блакаваць усплывальныя вокны"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Аўтазапаўненне тэксту захавана."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Аўтазапаўненне тэксту адменена."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Выдаліць"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Браўзэр можа аўтаматычна запаўняць вэб-формы, падобныя на гэту. Хочаце ўсталяваць аўтазапаўненне?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Браўзер можа аўтаматычна запаўняць вэб-формы, падобныя на гэту. Хочаце уключыць аўтазапаўненне?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Вы заўсёды можаце наладзіць аўтазапаўненне тэксту ў браўзэры: Параметры &gt; Налады &gt; Агульны экран."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Адключыць аўтаматычнае запаўненне"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Канфідэнцыяльнасць і бяспека"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Дазволіць браўзэру загадзя загружаць вынікі пошуку высокага даверу ў фоне"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Папярэдняя загрузка вынікаў пошуку"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Папярэдняя загрузка вэб-старонак"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Ніколі"</item>
+    <item msgid="1908465963242077428">"Толькі па Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Заўсёды"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Дазволіць браўзеру папярэднюю загрузку звязаных вэб-старонак у фонавым рэжыме"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Папярэдняя загрузка вэб-старонак"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Праблема злучэння"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Праблема з файлам"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Усталяванне шпалер..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Закладкі"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Няма закладак"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Іншыя закладкі"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Выбраць уліковы запіс"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Сінхранізаваць з уліковым запісам Google"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 3f3812d..44d7d31 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Копиране на URL адреса на страницата"</string>
     <string name="share_page" msgid="593756995297268343">"Споделяне на страницата"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Запазване за четене офлайн"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Запазва се…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Не можа да се запази за четене офлайн."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> отметки"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Празна папка"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Отметки"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Настройки"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Съдържание на страницата"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Разреш. на няколко раздела за приложение"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Зареждане на изображенията"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Показване на изображенията в уеб страници"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Изскачащи прозорци – блокиране"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Текстът за автоматично попълване е запазен."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Текстът за автоматично попълване е изтрит."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Изтриване"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Браузърът може автоматично да попълва уеб формуляри като този. Искате ли да зададете текст за автоматично попълване?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Браузърът може автоматично да попълва уеб формуляри като този. Искате ли да зададете текст за автоматично попълване?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Винаги можете да зададете текст за автоматично попълване от екрана „Браузър“ &gt; „Настройки“ &gt; „Общи“."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Деактивиране на автоматичното попълване"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Поверителност и сигурност"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Разрешаване на зареждането от браузъра на заден план на наистина точни резултати"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Предварително зареждане на резултати"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Предварително зареждане на уеб страници"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Никога"</item>
+    <item msgid="1908465963242077428">"Само при Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Винаги"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Разрешаване на браузъра да зарежда предв. на заден план свързани уеб страници"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Предварително зареждане на уеб страници"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Проблем с връзката"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Проблем с файла"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Тапетът се задава..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Отметки"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Няма отметки."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Други отметки"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Изберете профил"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Синхронизиране с профил в Google"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 09f1d56..36cc6f5 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Copia l\'URL de la pàgina"</string>
     <string name="share_page" msgid="593756995297268343">"Comparteix la pàgina"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Desa per a lectura fora de línia"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"S\'està desant..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"No s\'ha pogut desar per llegir-la fora de línia."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> marcadors"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Carpeta buida"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Adreces d\'interès"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Configuració"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Contingut de la pàgina"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Permet diverses pestanyes per aplicació"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Carrega les imatges"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Mostra les imatges a les pàgines web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Bloqueja finestres emergents"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"S\'ha desat el text d\'emplenament automàtic."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"S\'ha suprimit el text d\'emplenament automàtic."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Suprimeix"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"El navegador pot emplenar automàticament formularis web com aquest. Vols configurar el text d\'emplenament automàtic?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"El navegador pot emplenar automàticament formularis web com aquest. Vols configurar el text d\'emplenament automàtic?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Pots configurar el text d\'emplenament automàtic sempre que vulguis des de la pantalla Navegador &gt; Configuració &gt; General."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Desactiva l\'emplenament automàtic"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privadesa i seguretat"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Permet al naveg. carregar prèv. resultats cerca fiabilitat alta en process. fons"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Càrrega prèvia de resultats de la cerca"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Càrrega prèvia de pàgines web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Mai"</item>
+    <item msgid="1908465963242077428">"Només amb Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Sempre"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Permet que el navegador carregui prèviament les pàgines web en segon pla"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Càrrega prèvia de pàgines web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problema de connexió"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problema amb el fitxer"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"S\'està establint el fons de pantalla..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Marcadors"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"No hi ha cap marcador."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Altres marcadors"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Tria d\'un compte"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronitza amb el Compte de Google"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 017b25f..c3451a0 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -54,7 +54,7 @@
     <string name="stop" msgid="5687251076030630074">"Zastavit"</string>
     <string name="reload" msgid="8585220783228408062">"Aktualizovat"</string>
     <string name="back" msgid="8414603107175713668">"Zpět"</string>
-    <string name="forward" msgid="4288210890526641577">"Předat dál"</string>
+    <string name="forward" msgid="4288210890526641577">"Vpřed"</string>
     <string name="save" msgid="5922311934992468496">"OK"</string>
     <string name="do_not_save" msgid="6777633870113477714">"Zrušit"</string>
     <string name="location" msgid="3411848697912600125">"Adresa"</string>
@@ -102,8 +102,9 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopírovat adresu URL stránky"</string>
     <string name="share_page" msgid="593756995297268343">"Sdílet stránku"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Uložit ke čtení offline"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Ukládání…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Uložení ke čtení offline se nezdařilo."</string>
-    <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Počet záložek: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
+    <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Záložky: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Prázdná složka"</string>
     <string name="contextmenu_openlink" msgid="7237961252214188935">"Otevřít"</string>
     <string name="contextmenu_openlink_newwindow" msgid="1205313604181761403">"Otevřít na nové kartě"</string>
@@ -125,7 +126,8 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Záložky"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Nastavení"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Obsah stránky"</string>
-    <string name="pref_content_load_images" msgid="2125616852957377561">"Načíst obrázky"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Povolit více karet na aplikaci"</string>
+    <string name="pref_content_load_images" msgid="2125616852957377561">"Načítat obrázky"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Zobrazovat na webových stránkách obrázky"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blokovat vyskakovací okna"</string>
     <string name="pref_content_javascript" msgid="4570972030299516843">"Povolit JavaScript"</string>
@@ -152,13 +154,13 @@
     <string name="pref_content_autofit_summary" msgid="324810555822572112">"Přizpůsobit velikost webových stránek obrazovce"</string>
     <string name="pref_general_title" msgid="1946872771219249323">"Obecné"</string>
     <string name="pref_general_sync_title" msgid="3138637035975860324">"Synchronizace"</string>
-    <string name="pref_general_autofill_title" msgid="547881256865816858">"Automatické vyplňování"</string>
-    <string name="pref_autofill_enabled" msgid="1015751713312396713">"Automatické vyplňování formulářů"</string>
+    <string name="pref_general_autofill_title" msgid="547881256865816858">"Autovyplňování"</string>
+    <string name="pref_autofill_enabled" msgid="1015751713312396713">"Autovyplňování formulářů"</string>
     <string name="pref_autofill_enabled_summary" msgid="7659954073892471496">"Vyplňování webových formulářů jediným dotykem"</string>
-    <string name="pref_autofill_profile_editor" msgid="8934844472922113166">"Text pro automatické vyplňování"</string>
+    <string name="pref_autofill_profile_editor" msgid="8934844472922113166">"Text pro autovyplňování"</string>
     <string name="pref_autofill_profile_editor_summary" msgid="4864447251676856190">"Nastavte text, který se má vyplňovat do webových formulářů"</string>
     <string name="pref_autologin_title" msgid="4421187193809267096">"Automatické přihlašování Google"</string>
-    <string name="pref_autologin_progress" msgid="8333244467048833461">"Přihlašování do webů Google pomocí uživatelského jména <xliff:g id="ID_1">%s</xliff:g>"</string>
+    <string name="pref_autologin_progress" msgid="8333244467048833461">"Přihlašování na Google pomocí uživatelského jména <xliff:g id="ID_1">%s</xliff:g>"</string>
     <string name="autologin_bar_text" msgid="3684581827167173371">"Přihlásit se jako"</string>
     <string name="autologin_bar_login_text" msgid="3336615320510851879">"Přihlásit se"</string>
     <string name="autologin_bar_hide_text" msgid="3629355974385859580">"Skrýt"</string>
@@ -178,13 +180,13 @@
     <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefon:"</string>
     <string name="autofill_profile_editor_phone_number_invalid" msgid="6795411298467068957">"Neplatné telefonní číslo."</string>
     <string name="autofill_profile_editor_save_profile" msgid="3230301454458581157">"Uložit"</string>
-    <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Text pro automatické vyplňování byl uložen."</string>
+    <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Text pro autovyplňování byl uložen."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Text automatického vyplňování byl smazán."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Smazat"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Podobné webové formuláře může prohlížeč vyplňovat automaticky. Chcete nastavit automatické vyplňování textu?"</string>
-    <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Automatické vyplňování můžete kdykoliv nastavit na obrazovce Prohlížeč &gt; Nastavení &gt; Obecné."</string>
-    <string name="disable_autofill" msgid="8305901059849400354">"Vypnout automatické vyplňování"</string>
-    <string name="pref_privacy_security_title" msgid="3480313968942160914">"Ochrana osobních údajů a zabezpečení"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Podobné webové formuláře může prohlížeč vyplňovat automaticky. Chcete nastavit autovyplňování textu?"</string>
+    <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Autovyplňování můžete kdykoliv nastavit na obrazovce Prohlížeč &gt; Nastavení &gt; Obecné."</string>
+    <string name="disable_autofill" msgid="8305901059849400354">"Vypnout autovyplňování"</string>
+    <string name="pref_privacy_security_title" msgid="3480313968942160914">"Ochrana soukromí a zabezpečení"</string>
     <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Vymazat mezipaměť"</string>
     <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Vymazat všechen obsah a databáze uložené do místní mezipaměti"</string>
     <string name="pref_privacy_clear_cache_dlg" msgid="4344512581716422465">"Vymazat všechen obsah a databáze uložené v místní mezipaměti?"</string>
@@ -202,12 +204,12 @@
     <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Vymazat hesla"</string>
     <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Vymazat všechna uložená hesla"</string>
     <string name="pref_privacy_clear_passwords_dlg" msgid="5836576259947160045">"Vymazat všechna uložená hesla?"</string>
-    <string name="pref_privacy_location_title" msgid="7458378016606081067">"Místo"</string>
+    <string name="pref_privacy_location_title" msgid="7458378016606081067">"Poloha"</string>
     <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Povolit polohu"</string>
     <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Povolit webovým stránkám žádat o přístup k informacím o vaší poloze"</string>
     <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Zrušit přístup k poloze"</string>
     <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Zrušit všem webovým stránkám přístup k poloze"</string>
-    <string name="pref_privacy_clear_geolocation_access_dlg" msgid="3190928760598034346">"Vymazat přístup k poloze?"</string>
+    <string name="pref_privacy_clear_geolocation_access_dlg" msgid="3190928760598034346">"Zrušit přístup k poloze?"</string>
     <string name="pref_security_passwords_title" msgid="5734190542383756711">"Hesla"</string>
     <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Zapamatovat hesla"</string>
     <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Ukládat uživatelská jména a hesla pro webové stránky"</string>
@@ -225,7 +227,7 @@
     <item msgid="7201512237890458902">"Velmi velký"</item>
   </string-array>
     <string name="pref_min_font_size" msgid="8811125835817449131">"Minimální velikost písma"</string>
-    <string name="pref_min_font_size_value" msgid="2924708480509060209">"<xliff:g id="FONT_SIZE">%d</xliff:g> bodů"</string>
+    <string name="pref_min_font_size_value" msgid="2924708480509060209">"<xliff:g id="FONT_SIZE">%d</xliff:g> b."</string>
     <string name="pref_text_zoom" msgid="5171056101805125497">"Zvětšení/zmenšení textu"</string>
     <string name="pref_zoom_on_double_tap" msgid="902786475250741795">"Přiblížení dvojitým klepnutím"</string>
     <string name="pref_force_userscalable" msgid="5641500562399892621">"Vynutit aktivaci přiblížení"</string>
@@ -253,7 +255,7 @@
     <string name="pref_development_title" msgid="3263854204533056480">"Ladit"</string>
     <string name="pref_default_text_encoding" msgid="5742965543955558478">"Kódování textu"</string>
   <string-array name="pref_default_text_encoding_choices">
-    <item msgid="7275223955790513818">"Latin-1 (ISO-8859-1)"</item>
+    <item msgid="7275223955790513818">"Latinka-1 (ISO-8859-1)"</item>
     <item msgid="2456597866837587140">"Unicode (UTF-8)"</item>
     <item msgid="6122474363777211732">"Čínština (GBK)"</item>
     <item msgid="373372275931607040">"Čínština (Big5)"</item>
@@ -272,7 +274,7 @@
     <string name="pref_use_instant_search_summary" msgid="839320474961917522">"Dynamické vyhledávání ve Vyhledávání Google zobrazuje výsledky již při zadávání dotazu. (Může se zvýšit množství přenesených dat.)"</string>
     <string name="pref_lab_fullscreen" msgid="8173609016657987973">"Celá obrazovka"</string>
     <string name="pref_lab_fullscreen_summary" msgid="7694738112219376740">"Chcete-li skrýt stavový řádek, použijte režim zobrazení na celou obrazovku."</string>
-    <string name="pref_data_title" msgid="7255058703417796578">"Správa rychl. připojení"</string>
+    <string name="pref_data_title" msgid="7255058703417796578">"Správa rychlosti připojení"</string>
     <string name="pref_data_preload_title" msgid="4479320472980292873">"Předběžné načítání výsledků vyhledávání"</string>
   <string-array name="pref_data_preload_choices">
     <item msgid="5180466923190095508">"Nikdy"</item>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Umožní prohlížeči předběžně načítat pravděpodobné výsledky vyhledávání na pozadí"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Předběžné načítání výsledků vyhledávání"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Předběžné načítání webstránek"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nikdy"</item>
+    <item msgid="1908465963242077428">"Pouze v sítích Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Vždy"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Povolit prohlížeči předběžně na pozadí načítat webové stránky z odkazů"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Předběžné načítání webstránek"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problém s připojením"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problém se souborem"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -293,7 +303,7 @@
     <string name="go_home" msgid="109129207276086793">"Domovská stránka"</string>
     <string name="add_new_bookmark" msgid="3158497555612337238">"Přidat záložku"</string>
     <string name="add_bookmark_short" msgid="3783984330998103735">"Přidat"</string>
-    <string name="search_hint" msgid="4647356319916631820">"Vyhledávejte nebo zadejte adresu URL"</string>
+    <string name="search_hint" msgid="4647356319916631820">"Zadejte adresu URL"</string>
     <string name="search_button_text" msgid="5235226933877634410">"Přejít"</string>
     <string name="search_settings_description" msgid="1422401062529014107">"Záložky a webová historie"</string>
     <string name="popup_window_attempt" msgid="31565781154067629">"Umožnit tomuto webu otevřít vyskakovací okno?"</string>
@@ -322,7 +332,7 @@
     <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Zrušit"</string>
     <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB uloženo ve vašem telefonu"</string>
     <string name="loading_video" msgid="7886324933131962321">"Načítání videa..."</string>
-    <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"Web <xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> požaduje informace o vaší poloze"</string>
+    <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> žádá informace o vaší poloze"</string>
     <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Sdílet polohu"</string>
     <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Odmítnout"</string>
     <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Zapamatovat předvolbu"</string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Nastavování tapety..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Záložky"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Žádné záložky"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Jiné záložky"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Vyberte účet"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synchronizovat s účtem Google"</string>
@@ -361,7 +372,7 @@
     <string name="instant_search_label" msgid="8769284297650716935">"Google s dynamickým vyhledáváním (experimentální funkce)"</string>
     <string name="preview" msgid="6450823514561689038">"Náhled"</string>
     <string name="local_bookmarks" msgid="533816851415228520">"Lokální"</string>
-    <string name="ua_switcher_desktop" msgid="220097077327558435">"Vyžádat web pro počítače"</string>
+    <string name="ua_switcher_desktop" msgid="220097077327558435">"Verze webu pro PC"</string>
     <string name="permission_preload_label" msgid="4856971662337877316">"Předběžné načítání výsledků"</string>
     <string name="empty_snapshots_folder" msgid="7675378008107026013">"Žádné uložené stránky."</string>
     <string name="remove_snapshot" msgid="1624447424544976849">"Smazat uloženou stránku"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index a790f42..14cfe13 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -34,17 +34,17 @@
     <string name="bookmarks_search" msgid="5229596268214362873">"Browser"</string>
     <string name="cancel" msgid="3017274947407233702">"Annuller"</string>
     <string name="ok" msgid="1509280796718850364">"OK"</string>
-    <string name="title_bar_loading" msgid="7438217780834640678">"Indlæser ..."</string>
+    <string name="title_bar_loading" msgid="7438217780834640678">"Indlæser..."</string>
     <string name="page_info" msgid="4048529256302257195">"Sideoplysninger"</string>
     <string name="page_info_view" msgid="5303490449842635158">"Vis sideoplysninger"</string>
     <string name="page_info_address" msgid="2222306609532903254">"Adresse:"</string>
-    <string name="ssl_warnings_header" msgid="79744901983636370">"Der er problemer med sikkerhedscertifikatet for dette websted."</string>
+    <string name="ssl_warnings_header" msgid="79744901983636370">"Der er problemer med sikkerhedscertifikatet for dette website."</string>
     <string name="ssl_continue" msgid="8031515015829358457">"Fortsæt"</string>
     <string name="security_warning" msgid="6607795404322797541">"Sikkerhedsadvarsel"</string>
     <string name="view_certificate" msgid="1472768887529093862">"Vis certifikat"</string>
     <string name="ssl_go_back" msgid="4598951822061593819">"Tilbage"</string>
     <string name="ssl_untrusted" msgid="7754507359360636447">"Dette certifikat stammer ikke fra en troværdig autoritet."</string>
-    <string name="ssl_mismatch" msgid="3809794439740523641">"Navnet på webstedet stemmer ikke overens med navnet på certifikatet."</string>
+    <string name="ssl_mismatch" msgid="3809794439740523641">"Navnet på websitet stemmer ikke overens med navnet på certifikatet."</string>
     <string name="ssl_expired" msgid="5739349389499575559">"Dette certifikat er udløbet."</string>
     <string name="ssl_not_yet_valid" msgid="8193083327719048247">"Dette certifikat er endnu ikke gyldigt."</string>
     <string name="ssl_date_invalid" msgid="3705563379257285534">"Dette certifikat har en ugyldig dato."</string>
@@ -69,7 +69,7 @@
     <string name="add_to_other_folder_menu_option" msgid="5947586525822134105">"Anden mappe"</string>
     <string name="name" msgid="5462672162695365387">"Etiket"</string>
     <string name="http" msgid="2163722670597250102">"http://"</string>
-    <string name="save_to_bookmarks" msgid="1679286010089780932">"Gemt i bogmærker"</string>
+    <string name="save_to_bookmarks" msgid="1679286010089780932">"Gem i bogmærker"</string>
     <string name="bookmark_this_page" msgid="7530739804320811054">"Tilføj bogmærke"</string>
     <string name="remove" msgid="7820112494467011374">"Fjern"</string>
     <string name="edit_bookmark" msgid="5024089053490231905">"Rediger bogmærke"</string>
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopier sidens webadresse"</string>
     <string name="share_page" msgid="593756995297268343">"Del side"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Gem til læsning offline"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Gemmer..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Siden kunne ikke gemmes til læsning offline."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> bogmærker"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Mappen er tom"</string>
@@ -125,12 +126,13 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Bogmærker"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Indstillinger"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Sideindhold"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Tillad flere faner pr. app"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Indlæs billeder"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Vis billeder på websider"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Bloker pop op-vinduer"</string>
-    <string name="pref_content_javascript" msgid="4570972030299516843">"Aktiver Javascript"</string>
+    <string name="pref_content_javascript" msgid="4570972030299516843">"Aktivér Javascript"</string>
     <string name="pref_content_open_in_background" msgid="824123779725118663">"Åbn i baggrunden"</string>
-    <string name="pref_content_plugins" msgid="7231944644794301582">"Aktiver plugins"</string>
+    <string name="pref_content_plugins" msgid="7231944644794301582">"Aktivér plugins"</string>
   <string-array name="pref_content_plugins_choices">
     <item msgid="6745108155096660725">"Altid slået til"</item>
     <item msgid="2484126708670016519">"Påkrævet"</item>
@@ -145,7 +147,7 @@
     <item msgid="844041670142910837">"Aktuel side"</item>
     <item msgid="4430498748295169195">"Tom side"</item>
     <item msgid="5747608191946904074">"Standardside"</item>
-    <item msgid="6092441301001006473">"Mest besøgte websteder"</item>
+    <item msgid="6092441301001006473">"Mest besøgte websites"</item>
     <item msgid="6569304572171444894">"Andre"</item>
   </string-array>
     <string name="pref_content_autofit" msgid="8260474534053660809">"Tilpas sider automatisk"</string>
@@ -158,7 +160,7 @@
     <string name="pref_autofill_profile_editor" msgid="8934844472922113166">"AutoFyld-tekst"</string>
     <string name="pref_autofill_profile_editor_summary" msgid="4864447251676856190">"Opret tekst, som skal indsættes i webformularer med AutoFyld"</string>
     <string name="pref_autologin_title" msgid="4421187193809267096">"Automatisk Google-login"</string>
-    <string name="pref_autologin_progress" msgid="8333244467048833461">"Logger ind på Google-websteder med <xliff:g id="ID_1">%s</xliff:g>"</string>
+    <string name="pref_autologin_progress" msgid="8333244467048833461">"Logger ind på Google-websites med <xliff:g id="ID_1">%s</xliff:g>"</string>
     <string name="autologin_bar_text" msgid="3684581827167173371">"Log ind som"</string>
     <string name="autologin_bar_login_text" msgid="3336615320510851879">"Log ind"</string>
     <string name="autologin_bar_hide_text" msgid="3629355974385859580">"Skjul"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"AutoFyld-tekst er gemt."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"AutoFyld-teksten er slettet."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Slet"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Browseren kan automatisk udfylde webformularer som denne. Vil du oprette din AutoFyld-tekst?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Browseren kan automatisk udfylde webformularer som denne. Vil du oprette din AutoFyld-tekst?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Du kan altid oprette din AutoFyld-tekst fra skærmen Browser &gt; Indstillinger &gt; Generelt."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Deaktiver AutoFyld"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Sikkerhed og personlige oplysninger"</string>
@@ -192,8 +194,8 @@
     <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Ryd alle cookiedata"</string>
     <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Ryd alle browsercookies"</string>
     <string name="pref_privacy_clear_cookies_dlg" msgid="1493252163164621278">"Vil du slette alle cookies?"</string>
-    <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Ryd oversigt"</string>
-    <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Ryd browserens navigationsoversigt"</string>
+    <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Ryd historik"</string>
+    <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Ryd browserens navigationshistorik"</string>
     <string name="pref_privacy_clear_history_dlg" msgid="6934317391642846227">"Vil du slette browserens navigationshistorik?"</string>
     <string name="pref_privacy_formdata_title" msgid="6549813837982050424">"Formulardata"</string>
     <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Ryd formulardata"</string>
@@ -203,20 +205,20 @@
     <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Ryd alle gemte adgangskoder"</string>
     <string name="pref_privacy_clear_passwords_dlg" msgid="5836576259947160045">"Vil du slette alle gemte adgangskoder?"</string>
     <string name="pref_privacy_location_title" msgid="7458378016606081067">"Placering"</string>
-    <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Aktiver placering"</string>
-    <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Tillad, at websteder anmoder om adgang til din placering"</string>
+    <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Aktivér placering"</string>
+    <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Tillad, at websites anmoder om adgang til din placering"</string>
     <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Ryd placeringsadgang"</string>
-    <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Placeringsadgang for alle websteder ryddes"</string>
-    <string name="pref_privacy_clear_geolocation_access_dlg" msgid="3190928760598034346">"Vil du rydde webstedets placeringsadgang?"</string>
+    <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Placeringsadgang for alle websites ryddes"</string>
+    <string name="pref_privacy_clear_geolocation_access_dlg" msgid="3190928760598034346">"Vil du rydde placeringsadgang for websites?"</string>
     <string name="pref_security_passwords_title" msgid="5734190542383756711">"Adgangskoder"</string>
     <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Husk adgangskoder"</string>
-    <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Gem brugernavne og adgangskoder til websteder"</string>
+    <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Gem brugernavne og adgangskoder til websites"</string>
     <string name="pref_security_save_form_data" msgid="1213669802810198893">"Husk formulardata"</string>
     <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Husk data, jeg indtaster i formularer, til senere brug"</string>
     <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Vis sikkerhedsadvarsler"</string>
-    <string name="pref_security_show_security_warning_summary" msgid="5260098316025397525">"Vis en advarsel, hvis der er problemer med sikkerheden på et websted"</string>
+    <string name="pref_security_show_security_warning_summary" msgid="5260098316025397525">"Vis en advarsel, hvis der er problemer med sikkerheden på et website"</string>
     <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Accepter cookies"</string>
-    <string name="pref_security_accept_cookies_summary" msgid="1907951236154433751">"Tillad, at websteder gemmer og læser cookie-data"</string>
+    <string name="pref_security_accept_cookies_summary" msgid="1907951236154433751">"Tillad, at websites gemmer og læser cookie-data"</string>
   <string-array name="pref_text_size_choices">
     <item msgid="4952686548944739548">"Lillebitte"</item>
     <item msgid="1950030433642671460">"Lille"</item>
@@ -229,7 +231,7 @@
     <string name="pref_text_zoom" msgid="5171056101805125497">"Skalering af tekst"</string>
     <string name="pref_zoom_on_double_tap" msgid="902786475250741795">"Zoom ved dobbeltklik"</string>
     <string name="pref_force_userscalable" msgid="5641500562399892621">"Tving aktivering af zoom"</string>
-    <string name="pref_force_userscalable_summary" msgid="3613242300617172230">"Tilsidesæt et websteds anmodning om at kontrollere zoom-adfærd"</string>
+    <string name="pref_force_userscalable_summary" msgid="3613242300617172230">"Tilsidesæt et websites anmodning om at kontrollere zoom-adfærd"</string>
     <string name="pref_inverted_category" msgid="1280639705117152207">"Omvendt skærmgengivelse"</string>
     <string name="pref_inverted" msgid="7613556986776824112">"Omvendt gengivelse"</string>
     <string name="pref_inverted_summary" msgid="7357225897413923085">"Sort bliver hvidt og vice versa"</string>
@@ -244,8 +246,8 @@
     <string name="pref_content_load_page" msgid="2219810141690955452">"Åbn sider i oversigt"</string>
     <string name="pref_content_load_page_summary" msgid="9168803276420332955">"Vis oversigt over sider, som er åbnet for nylig"</string>
     <string name="pref_extras_title" msgid="7075456173747370647">"Avanceret"</string>
-    <string name="pref_extras_website_settings" msgid="67866640052455549">"Indstillinger for websteder"</string>
-    <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Avancerede indstillinger for individuelle websteder"</string>
+    <string name="pref_extras_website_settings" msgid="67866640052455549">"Indstillinger for websites"</string>
+    <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Avancerede indstillinger for individuelle websites"</string>
     <string name="pref_extras_reset_default_title" msgid="3579760449455761762">"Gendannelse af standardindstillinger"</string>
     <string name="pref_extras_reset_default" msgid="8904000515846202110">"Nulstil til standard"</string>
     <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Gendan standardindstillinger"</string>
@@ -281,22 +283,30 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Tillad, at browseren forudindlæser pålidelige søgeresultater i baggrunden"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Forudindlæsning af søgeresultater"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Forudindlæsning af websider"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Aldrig"</item>
+    <item msgid="1908465963242077428">"Kun på Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Altid"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Tillad, at browseren forudindlæser websider, der linkes til, i baggrunden"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Forudindlæsning af websider"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Forbindelsesproblem"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problem med fil"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
     <string name="browserFrameFormResubmitMessage" msgid="5244059279866705254">"Den side, du prøver at få vist, indeholder data, der allerede er indsendt (\"POSTDATA\"). Hvis du sender dataene igen, gentages alle handlinger, som formularen på siden udførte (som f.eks. en søgning eller et onlinekøb)."</string>
     <string name="loadSuspendedTitle" msgid="6453376579109644551">"Ingen forbindelse"</string>
     <string name="loadSuspended" msgid="3843343290039218668">"Browseren kan ikke indlæse denne side, fordi der ikke er nogen internetforbindelse."</string>
-    <string name="clear_history" msgid="5998307092715979619">"Ryd oversigt"</string>
+    <string name="clear_history" msgid="5998307092715979619">"Ryd historik"</string>
     <string name="browser_history" msgid="2979476257919939232">"Nyligt besøgte sider"</string>
     <string name="empty_history" msgid="7013369425484218985">"Ingen browserhistorik."</string>
     <string name="go_home" msgid="109129207276086793">"Startside"</string>
     <string name="add_new_bookmark" msgid="3158497555612337238">"Tilføj bogmærke"</string>
     <string name="add_bookmark_short" msgid="3783984330998103735">"Tilføj"</string>
-    <string name="search_hint" msgid="4647356319916631820">"Søg efter eller indtast en webadresse"</string>
+    <string name="search_hint" msgid="4647356319916631820">"Søg eller indtast en webadresse"</string>
     <string name="search_button_text" msgid="5235226933877634410">"Gå"</string>
-    <string name="search_settings_description" msgid="1422401062529014107">"Bogmærker og weboversigt"</string>
-    <string name="popup_window_attempt" msgid="31565781154067629">"Vil du tillade, at dette websted åbner et pop op-vindue?"</string>
+    <string name="search_settings_description" msgid="1422401062529014107">"Bogmærker og webhistorik"</string>
+    <string name="popup_window_attempt" msgid="31565781154067629">"Vil du tillade, at dette website åbner et pop op-vindue?"</string>
     <string name="allow" msgid="1157313689171991335">"Tillad"</string>
     <string name="block" msgid="9172175889884707800">"Bloker"</string>
     <string name="too_many_windows_dialog_title" msgid="5709782301477380438">"Grænsen for faner er nået"</string>
@@ -317,7 +327,7 @@
     <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Browserlageret er fuldt"</string>
     <string name="webstorage_outofspace_notification_text" msgid="47273584426988640">"Tryk for at frigøre plads."</string>
     <string name="webstorage_clear_data_title" msgid="689484577124333977">"Ryd lagrede data"</string>
-    <string name="webstorage_clear_data_dialog_message" msgid="6200681632891775881">"Vil du slette alle data, som dette websted har gemt?"</string>
+    <string name="webstorage_clear_data_dialog_message" msgid="6200681632891775881">"Vil du slette alle data, som dette website har gemt?"</string>
     <string name="webstorage_clear_data_dialog_ok_button" msgid="6682570951259237542">"OK"</string>
     <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Annuller"</string>
     <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"Mb lagret på din telefon"</string>
@@ -326,21 +336,22 @@
     <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Del placering"</string>
     <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Afvis"</string>
     <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Husk indstilling"</string>
-    <string name="geolocation_permissions_prompt_toast_allowed" msgid="7201417941112726112">"Dette websted kan få adgang til din placering. Du kan ændre dette på skærmen Indstillinger &gt; Avanceret &gt; Websted."</string>
-    <string name="geolocation_permissions_prompt_toast_disallowed" msgid="156443445797377409">"Dette websted kan ikke få adgang til din placering. Du kan ændre dette på skærmen Indstillinger &gt; Avanceret &gt; Websted."</string>
+    <string name="geolocation_permissions_prompt_toast_allowed" msgid="7201417941112726112">"Dette website kan få adgang til din placering. Du kan ændre dette på skærmen Indstillinger &gt; Avanceret &gt; Website."</string>
+    <string name="geolocation_permissions_prompt_toast_disallowed" msgid="156443445797377409">"Dette website kan ikke få adgang til din placering. Du kan ændre dette på skærmen Indstillinger &gt; Avanceret &gt; Website."</string>
     <string name="geolocation_settings_page_title" msgid="1745477985097536528">"Ryd placeringsadgang"</string>
-    <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Dette websted har i øjeblikket adgang til din placering"</string>
-    <string name="geolocation_settings_page_summary_not_allowed" msgid="7941769772784366199">"Dette websted har i øjeblikket ikke adgang til din placering"</string>
-    <string name="geolocation_settings_page_dialog_message" msgid="8772923416296868537">"Vil du rydde placeringsadgang for dette websted?"</string>
+    <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Dette website har i øjeblikket adgang til din placering"</string>
+    <string name="geolocation_settings_page_summary_not_allowed" msgid="7941769772784366199">"Dette website har i øjeblikket ikke adgang til din placering"</string>
+    <string name="geolocation_settings_page_dialog_message" msgid="8772923416296868537">"Vil du rydde placeringsadgang for dette website?"</string>
     <string name="geolocation_settings_page_dialog_ok_button" msgid="2113465477131017852">"OK"</string>
     <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Annuller"</string>
     <string name="website_settings_clear_all" msgid="8739804325997655980">"Ryd alle"</string>
-    <string name="website_settings_clear_all_dialog_message" msgid="1551164275687475061">"Vil du slette alle webstedsdata og placeringstilladelser?"</string>
+    <string name="website_settings_clear_all_dialog_message" msgid="1551164275687475061">"Vil du slette alle websitedata og placeringstilladelser?"</string>
     <string name="website_settings_clear_all_dialog_ok_button" msgid="7858504776529106243">"OK"</string>
     <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Annuller"</string>
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Angiver baggrund..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bogmærker"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Ingen bogmærker."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Andre bogmærker"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Vælg konto"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synkroniser med Google-konto"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 99f00fb..b63199e 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -36,12 +36,12 @@
     <string name="ok" msgid="1509280796718850364">"OK"</string>
     <string name="title_bar_loading" msgid="7438217780834640678">"Wird geladen..."</string>
     <string name="page_info" msgid="4048529256302257195">"Seiteninfo"</string>
-    <string name="page_info_view" msgid="5303490449842635158">"Seiteninfo anzeigen"</string>
+    <string name="page_info_view" msgid="5303490449842635158">"Seiteninfo ansehen"</string>
     <string name="page_info_address" msgid="2222306609532903254">"Adresse:"</string>
     <string name="ssl_warnings_header" msgid="79744901983636370">"Es ist ein Problem mit dem Sicherheitszertifikat für diese Website aufgetreten."</string>
     <string name="ssl_continue" msgid="8031515015829358457">"Fortfahren"</string>
     <string name="security_warning" msgid="6607795404322797541">"Sicherheitswarnung"</string>
-    <string name="view_certificate" msgid="1472768887529093862">"Zertifikat anzeigen"</string>
+    <string name="view_certificate" msgid="1472768887529093862">"Zertifikat ansehen"</string>
     <string name="ssl_go_back" msgid="4598951822061593819">"Zurück"</string>
     <string name="ssl_untrusted" msgid="7754507359360636447">"Dieses Zertifikat wurde nicht von einer vertrauenswürdigen Stelle ausgegeben."</string>
     <string name="ssl_mismatch" msgid="3809794439740523641">"Name der Website stimmt nicht mit dem Namen auf dem Zertifikat überein."</string>
@@ -70,7 +70,7 @@
     <string name="name" msgid="5462672162695365387">"Label"</string>
     <string name="http" msgid="2163722670597250102">"http://"</string>
     <string name="save_to_bookmarks" msgid="1679286010089780932">"Als Lesezeichen speichern"</string>
-    <string name="bookmark_this_page" msgid="7530739804320811054">"Diese Seite als Lesezeichen speichern"</string>
+    <string name="bookmark_this_page" msgid="7530739804320811054">"Seite als Lesezeichen speichern"</string>
     <string name="remove" msgid="7820112494467011374">"Entfernen"</string>
     <string name="edit_bookmark" msgid="5024089053490231905">"Lesezeichen bearbeiten"</string>
     <string name="create_shortcut_bookmark" msgid="1995095662095484289">"Verknüpfung auf dem Startbildschirm erstellen"</string>
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Seiten-URL kopieren"</string>
     <string name="share_page" msgid="593756995297268343">"Seitenlink teilen"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Für Offline-Lesen speichern"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Wird gespeichert…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Speichern für Offline-Lesen fehlgeschlagen"</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> Lesezeichen"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Leerer Ordner"</string>
@@ -113,7 +114,7 @@
     <string name="contextmenu_copy" msgid="398860586635404030">"Kopieren"</string>
     <string name="contextmenu_copylink" msgid="5153657160294534270">"Link-URL kopieren"</string>
     <string name="contextmenu_download_image" msgid="4243829645180686912">"Bild speichern"</string>
-    <string name="contextmenu_view_image" msgid="3870625602053600905">"Bild anzeigen"</string>
+    <string name="contextmenu_view_image" msgid="3870625602053600905">"Bild ansehen"</string>
     <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Als Hintergrund festlegen"</string>
     <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Wählen..."</string>
     <string name="contextmenu_add_contact" msgid="3183511922223645716">"Kontakt hinzufügen"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Lesezeichen"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Einstellungen"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Seiteninhalt"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Mehrere Tabs pro App zulassen"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Bilder laden"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Bilder auf Webseiten anzeigen"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Pop-ups blockieren"</string>
@@ -148,7 +150,7 @@
     <item msgid="6092441301001006473">"Meistbesuchte Websites"</item>
     <item msgid="6569304572171444894">"Andere"</item>
   </string-array>
-    <string name="pref_content_autofit" msgid="8260474534053660809">"Autom. Anpassung"</string>
+    <string name="pref_content_autofit" msgid="8260474534053660809">"Automatisch anpassen"</string>
     <string name="pref_content_autofit_summary" msgid="324810555822572112">"Webseiten an den Bildschirm anpassen"</string>
     <string name="pref_general_title" msgid="1946872771219249323">"Allgemein"</string>
     <string name="pref_general_sync_title" msgid="3138637035975860324">"Synchronisierung"</string>
@@ -156,7 +158,7 @@
     <string name="pref_autofill_enabled" msgid="1015751713312396713">"Automatisch ausfüllen"</string>
     <string name="pref_autofill_enabled_summary" msgid="7659954073892471496">"Webformulare mit einer einzigen Berührung ausfüllen"</string>
     <string name="pref_autofill_profile_editor" msgid="8934844472922113166">"AutoFill-Text"</string>
-    <string name="pref_autofill_profile_editor_summary" msgid="4864447251676856190">"AutoFill-Text für Webformulare einrichten"</string>
+    <string name="pref_autofill_profile_editor_summary" msgid="4864447251676856190">"AutoFill-Text für Webformulare festlegen"</string>
     <string name="pref_autologin_title" msgid="4421187193809267096">"Automatische Google-Anmeldung"</string>
     <string name="pref_autologin_progress" msgid="8333244467048833461">"Anmeldung in Google Sites mit <xliff:g id="ID_1">%s</xliff:g>..."</string>
     <string name="autologin_bar_text" msgid="3684581827167173371">"Anmelden als"</string>
@@ -181,11 +183,11 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"AutoFill-Text gespeichert"</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"AutoFill-Text gelöscht"</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Löschen"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Webformulare dieser Art können vom Browser automatisch ausgefüllt werden. Möchten Sie Formulare automatisch ausfüllen?"</string>
-    <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Den AutoFill-Text können Sie jederzeit im Browser unter &gt; \"Einstellungen\" &gt; \"Allgemein\" einrichten."</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Webformulare dieser Art können vom Browser automatisch ausgefüllt werden. Möchten Sie Formulare automatisch ausfüllen?"</string>
+    <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Den AutoFill-Text können Sie jederzeit im Browser unter &gt; \"Einstellungen\" &gt; \"Allgemein\" festlegen."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"AutoFill deaktivieren"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Datenschutz &amp; Sicherheit"</string>
-    <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Cache löschen"</string>
+    <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Cache leeren"</string>
     <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Inhalte und Datenbanken aus dem lokalen Cache löschen"</string>
     <string name="pref_privacy_clear_cache_dlg" msgid="4344512581716422465">"Inhalte und Datenbanken aus dem lokalen Cache löschen?"</string>
     <string name="pref_privacy_cookies_title" msgid="6763274282214830526">"Cookies"</string>
@@ -207,7 +209,7 @@
     <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Standortzugriff für Websites zulassen"</string>
     <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Standortzugriff löschen"</string>
     <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Standortzugriff für alle Websites löschen"</string>
-    <string name="pref_privacy_clear_geolocation_access_dlg" msgid="3190928760598034346">"Standortzugriff für Website löschen?"</string>
+    <string name="pref_privacy_clear_geolocation_access_dlg" msgid="3190928760598034346">"Standortzugriff für Websites löschen?"</string>
     <string name="pref_security_passwords_title" msgid="5734190542383756711">"Passwörter"</string>
     <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Passwörter merken"</string>
     <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Nutzernamen und Passwörter für Websites speichern"</string>
@@ -227,7 +229,7 @@
     <string name="pref_min_font_size" msgid="8811125835817449131">"Mindestschriftgröße"</string>
     <string name="pref_min_font_size_value" msgid="2924708480509060209">"<xliff:g id="FONT_SIZE">%d</xliff:g> pt"</string>
     <string name="pref_text_zoom" msgid="5171056101805125497">"Text-Skalierung"</string>
-    <string name="pref_zoom_on_double_tap" msgid="902786475250741795">"Zoomen mit zweimaligem Tippen"</string>
+    <string name="pref_zoom_on_double_tap" msgid="902786475250741795">"Zoomen mit 2-maligem Tippen"</string>
     <string name="pref_force_userscalable" msgid="5641500562399892621">"Zoom zwingend aktivieren"</string>
     <string name="pref_force_userscalable_summary" msgid="3613242300617172230">"Anfrage zur Steuerung des Zoomverhaltens überschreiben"</string>
     <string name="pref_inverted_category" msgid="1280639705117152207">"Negativkontrast"</string>
@@ -279,14 +281,22 @@
     <item msgid="1791664748778640002">"Nur bei WLAN"</item>
     <item msgid="3944061253437827617">"Immer"</item>
   </string-array>
-    <string name="pref_data_preload_summary" msgid="3809168910751382727">"Browser kann vertrauenswürdige Suchergebnisse vorab im Hintergrund laden"</string>
+    <string name="pref_data_preload_summary" msgid="3809168910751382727">"Vertrauenswürdige Suchergebnisse vorab im Hintergrund laden"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Suchergebnisse vorabladen"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Webseiten vorab laden"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nie"</item>
+    <item msgid="1908465963242077428">"Nur bei WLAN"</item>
+    <item msgid="7647277566998527142">"Immer"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Verlinkte Webseiten vorab im Hintergrund laden"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Webseiten vorab laden"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Verbindungsproblem"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Dateifehler"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
     <string name="browserFrameFormResubmitMessage" msgid="5244059279866705254">"Die Seite, die Sie anzeigen möchten, enthält Daten, die bereits gesendet wurden (\"POST-DATEN\"). Wenn Sie die Daten erneut senden, wird jede Aktion (z. B. eine Suche oder ein Online-Kauf) wiederholt, die das Formular auf der Seite ausgeführt hat."</string>
     <string name="loadSuspendedTitle" msgid="6453376579109644551">"Keine Verbindung"</string>
-    <string name="loadSuspended" msgid="3843343290039218668">"Der Browser kann diese Seite nicht laden, da keine Internetverbindung besteht."</string>
+    <string name="loadSuspended" msgid="3843343290039218668">"Seite kann nicht geladen werden, da keine Internetverbindung besteht."</string>
     <string name="clear_history" msgid="5998307092715979619">"Verlauf löschen"</string>
     <string name="browser_history" msgid="2979476257919939232">"Zuletzt besuchte Seiten"</string>
     <string name="empty_history" msgid="7013369425484218985">"Kein Browserverlauf"</string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Hintergrund wird festgelegt..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Lesezeichen"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Keine Lesezeichen"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Weitere Lesezeichen"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Konto auswählen"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Mit Google-Konto synchronisieren"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index f37b50a..4e671c4 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Αντιγραφή διεύθυνσης URL σελίδας"</string>
     <string name="share_page" msgid="593756995297268343">"Κοινή χρήση σελίδας"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Αποθήκευση για ανάγνωση εκτός σύνδεσης"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Αποθήκευση…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Δεν αποθηκεύτηκε για ανάγνωση εκτ. σύνδεσης"</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> σελιδοδείκτες"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Κενός φάκελος"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Σελιδοδείκτες"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Ρυθμίσεις"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Περιεχόμενο σελίδας"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Επιτρέπονται πολλές καρτέλες ανά εφαρμ."</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Φόρτωση εικόνων"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Προβολή εικόνων στις ιστοσελίδες"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Αποκλεισμός αναδ. παραθύρων"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Το κείμενο αυτόματης συμπλήρωσης αποθηκεύτηκε."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Το κείμενο αυτόματης συμπλήρωσης διαγράφηκε."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Διαγραφή"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Το πρόγραμμα περιήγησης μπορεί να συμπληρώσει αυτόματα φόρμες ιστού όπως αυτή. Θέλετε να ρυθμίσετε το κείμενο αυτόματης συμπλήρωσης;"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Το πρόγραμμα περιήγησης μπορεί να συμπληρώσει αυτόματα φόρμες ιστού όπως αυτή. Θέλετε να ορίσετε το κείμενο αυτόματης συμπλήρωσης;"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Μπορείτε πάντα να ρυθμίσετε το κείμενο αυτόματης συμπλήρωσης από το στοιχείο Πρόγραμμα περιήγησης &gt; Ρυθμίσεις &gt; Γενική οθόνη."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Απενεργοποιήστε τη λειτουργία αυτόματης συμπλήρωσης"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Απόρρητο και ασφάλεια"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Να επιτρέπεται η προφόρτωση αποτελεσμάτων αναζήτησης υψηλής αξιοπιστίας στο φόντο"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Προφόρτωση αποτελεσμάτων αναζήτησης"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Προφόρτωση ιστοσελίδας"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Ποτέ"</item>
+    <item msgid="1908465963242077428">"Μόνο σε Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Πάντα"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Να επιτρέπεται η προφόρτωση συνδ. ιστοσελίδων στο παρασκ. από το πρόγρ. περιήγ."</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Προφόρτωση ιστοσελίδας"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Πρόβλημα σύνδεσης"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Πρόβλημα αρχείου"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Ορισμός ταπετσαρίας..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Σελιδοδείκτες"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Δεν υπάρχουν σελιδοδείκτες"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Άλλοι σελιδοδείκτες"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Επιλογή λογαριασμού"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Συγχρον. με Λογαριασμό Google"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 656f565..b535a60 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Copy page URL"</string>
     <string name="share_page" msgid="593756995297268343">"Share page"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Save for offline reading"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Saving…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Couldn\'t save for offline reading."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> bookmarks"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Empty folder"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Bookmarks"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Settings"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Page content"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Allow multiple tabs per app"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Load images"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Display images on web pages"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Block pop-ups"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Auto-fill text saved."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Auto-fill text deleted."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Delete"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"The browser can automatically complete web forms like this one. Would you like to set up your auto-fill text?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"The browser can automatically complete web forms like this one. Do you want to set up your auto-fill text?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"You can always set up your auto-fill text from the Browser &gt; Settings &gt; General screen."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Disable auto-fill"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacy &amp; security"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Allow the browser to preload high-confidence search results in the background"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Search result preloading"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Webpage preloading"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Never"</item>
+    <item msgid="1908465963242077428">"Only on WiFi"</item>
+    <item msgid="7647277566998527142">"Always"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Allow browser to preload linked webpages in the background"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Webpage preloading"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Connection problem"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"File problem"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Setting wallpaper..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bookmarks"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"No bookmarks"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Other Bookmarks"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Choose account"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sync with Google account"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index beb0050..eb6170f 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Copiar la URL de la página"</string>
     <string name="share_page" msgid="593756995297268343">"Compartir página"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Guardar para leer sin conexión"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Guardando…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"La página no se guardó para leer sin conexión."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> Marcadores"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Vaciar carpeta"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Marcadores"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Config."</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Contenido de la página"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Abrir varias pestañas por aplicación"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Cargar imágenes"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Mostrar imágenes en páginas web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Bloquear ventanas emergentes"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Texto de autocompletado guardado"</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Texto autocompletado eliminado"</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Borrar"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"El navegador puede completar formularios web como este de forma automática. ¿Te gustaría configurar el completado automático de texto?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"El navegador puede completar formularios web como este automáticamente. ¿Deseas configurar tu texto para autocompletar?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Siempre puedes configurar el autocompletado de texto desde la pantalla Navegador &gt; Configuración &gt; General."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Inhabilitar Autocompletar"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacidad y seguridad"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Permitir al navegador precargar resultados de búsqueda confiables en el fondo"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Precarga de los resultados de búsqueda"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Carga previa de páginas web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nunca"</item>
+    <item msgid="1908465963242077428">"Solo en Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Siempre"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Permitir que el navegador precargue páginas web vinculadas en segundo plano"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Carga previa de páginas web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problema de conexión"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problema del archivo"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Configurando el fondo de pantalla..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Marcadores"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"No hay marcadores."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Otros marcadores"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Seleccionar la cuenta"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronización con cta de Google"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index fdc3872..9633cd2 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Copiar URL de página"</string>
     <string name="share_page" msgid="593756995297268343">"Compartir página"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Disponible sin conexión"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Guardando…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"No se ha podido guardar para leer sin conexión."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> marcadores"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Carpeta vacía"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Marcadores"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Ajustes"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Contenido de la página"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Permitir varias pestañas por aplicación"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Cargar imágenes"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Mostrar imágenes en las páginas web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Bloquear pop-ups"</string>
@@ -138,7 +140,7 @@
   </string-array>
     <string name="pref_content_open_in_background_summary" msgid="955411158407739504">"Abrir nuevas pestañas detrás de la actual"</string>
     <string name="pref_content_homepage" msgid="3324574611613105696">"Establecer página de inicio"</string>
-    <string name="pref_content_search_engine" msgid="1620101310821644144">"Establecer motor de búsqueda"</string>
+    <string name="pref_content_search_engine" msgid="1620101310821644144">"Motor de búsqueda"</string>
     <string name="pref_content_search_engine_summary" msgid="304003941861818133">"Elige un motor de búsqueda."</string>
     <string name="pref_set_homepage_to" msgid="7838684355145561242">"Establecer en:"</string>
   <string-array name="pref_homepage_choices">
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Se ha guardado el texto de la función Autocompletar."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Se ha eliminado el texto de la función Autocompletar."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Eliminar"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"El navegador puede completar automáticamente formularios web como el que aparece a continuación. ¿Quieres configurar la función Autocompletar?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"El navegador puede rellenar automáticamente formularios web como el que aparece a continuación. ¿Quieres configurar la función Autocompletar?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Siempre puedes configurar la opción Autocompletar desde la pantalla Navegador &gt; Ajustes &gt; Generales."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Inhabilitar autocompletar"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Seguridad y privacidad"</string>
@@ -214,7 +216,7 @@
     <string name="pref_security_save_form_data" msgid="1213669802810198893">"Recordar formularios"</string>
     <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Recordar datos introducidos en formularios"</string>
     <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Mostrar advertencias"</string>
-    <string name="pref_security_show_security_warning_summary" msgid="5260098316025397525">"Mostrar advertencia si se produce una incidencia relacionada con la seguridad del sitio"</string>
+    <string name="pref_security_show_security_warning_summary" msgid="5260098316025397525">"Mostrar advertencia si se produce un problema relacionado con la seguridad del sitio"</string>
     <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Aceptar cookies"</string>
     <string name="pref_security_accept_cookies_summary" msgid="1907951236154433751">"Permitir que los sitios guarden y consulten datos de cookies"</string>
   <string-array name="pref_text_size_choices">
@@ -237,7 +239,7 @@
     <string name="pref_default_zoom" msgid="8076142259097187395">"Zoom predeterminado"</string>
   <string-array name="pref_default_zoom_choices">
     <item msgid="549583171195154919">"Lejos"</item>
-    <item msgid="5619034257768161024">"Media distancia"</item>
+    <item msgid="5619034257768161024">"Normal"</item>
     <item msgid="3840999588443167001">"Cerca"</item>
   </string-array>
     <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Zoom predeterminado"</string>
@@ -246,8 +248,8 @@
     <string name="pref_extras_title" msgid="7075456173747370647">"Avanzados"</string>
     <string name="pref_extras_website_settings" msgid="67866640052455549">"Ajustes del sitio web"</string>
     <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Ajustes avanzados de sitios web individuales"</string>
-    <string name="pref_extras_reset_default_title" msgid="3579760449455761762">"Restablecer valores predeterminados"</string>
-    <string name="pref_extras_reset_default" msgid="8904000515846202110">"Restablecer valores predeterminados"</string>
+    <string name="pref_extras_reset_default_title" msgid="3579760449455761762">"Valores predeterminados"</string>
+    <string name="pref_extras_reset_default" msgid="8904000515846202110">"Restablecer valores"</string>
     <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Restaurar ajustes predeterminados"</string>
     <string name="pref_extras_reset_default_dlg" msgid="7922814420184322450">"¿Restablecer valores predeterminados?"</string>
     <string name="pref_development_title" msgid="3263854204533056480">"Depurar"</string>
@@ -281,8 +283,16 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Permitir que el navegador cargue resultados de búsqueda en segundo plano"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Carga previa de búsquedas"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Carga previa de páginas web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nunca"</item>
+    <item msgid="1908465963242077428">"Solo en Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Siempre"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Permitir que el navegador cargue páginas web vinculadas en segundo plano"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Carga previa de páginas web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Error de conexión"</string>
-    <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Incidencia relacionada con el archivo"</string>
+    <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problema relacionado con el archivo"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
     <string name="browserFrameFormResubmitMessage" msgid="5244059279866705254">"La página que intentas ver contiene datos que ya se han enviado (\"POSTDATA\"). Si vuelves a enviarlos, se repetirá cualquier acción que haya hecho el formulario en la página (por ejemplo, búsquedas o compras online)."</string>
     <string name="loadSuspendedTitle" msgid="6453376579109644551">"Sin conexión"</string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Estableciendo fondo de pantalla..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Marcadores"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"No hay marcadores."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Otros marcadores"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Seleccionar cuenta"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronizar con cuenta de Google"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index b258f81..20a83e4 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopeeri lehe URL"</string>
     <string name="share_page" msgid="593756995297268343">"Jaga lehte"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Salvesta offlainis lugemiseks"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Salvestamine ..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Võrguühenduseta lugemiseks salvestam. ebaõnnestus."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> järjehoidjat"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Tühi kaust"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Järjehoidjad"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Seaded"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Lehe sisu"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Luba mitu vahekaarti rakenduse kohta"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Laadi kujutisi"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Kuva kujutised veebilehtedel"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blokeeri hüpikaknad"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automaatse täitmise tekst on salvestatud."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automaatse täitmise tekst kustutatud."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Kustuta"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Brauser suudab automaatselt täita selliseid veebivorme nagu see. Kas soovite seadistada automaatse täitmise teksti?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Brauser suudab selliseid veebivorme automaatselt täita. Kas soovite seadistada teksti automaatse täitmise?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Automaatse täitmise teksti saate alati seadistada, tehes valikud Brauser &gt; Seaded &gt; Üldine kuva."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Keela automaatne täitmine"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privaatsus ja turvalisus"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Lubage brauseril väga usaldusväärseid otsingutulemusi taustal eellaadida"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Otsingutulemuse eellaadimine"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Veebilehe eellaadimine"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Mitte kunagi"</item>
+    <item msgid="1908465963242077428">"Ainult WiFi puhul"</item>
+    <item msgid="7647277566998527142">"Alati"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Lubage brauseril lingitud veebilehti taustal eellaadida"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Veebilehe eellaadimine"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Ühenduse probleem"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Faili probleem"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Taustapildi seadmine ..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Järjehoidjad"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Järjehoidjaid pole"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Muud järjehoidjad"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Konto valimine"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sünkroonige Google\'i kontoga"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index cc7872a..23ae650 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"کپی URL صفحه"</string>
     <string name="share_page" msgid="593756995297268343">"اشتراک گذاری صفحه"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"ذخیره برای مطالعه در حالت آفلاین"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"در حال ذخیره…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"برای خواندن آفلاین قابل ذخیره نیست."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> نشانک"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"پوشه خالی"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"نشانک ها"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"تنظیمات HTML"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"محتوای صفحه"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"چندین برگه در هر برنامه مجاز باشد"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"بارگیری تصاویر"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"نمایش تصاویر در صفحات وب"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"انسداد پنجره های بازشو"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"نوشتاری که بطور خودکار تکمیل شده ذخیره شد."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"تکمیل خودکار نوشتار حذف شد."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"حذف"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"مرورگر می‌تواند به طور خودکار فرم‌های وب مثل این را کامل کند. آیا می‌خواهید تکمیل خودکار نوشتار را تنظیم کنید؟"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"این مرورگر میتواند بصورت خودکار فرمهای وب را تکمیل کند، مانند این فرم. میخواهید ویژگی پر شدن خودکار متن را تنظیم کنید؟"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"شما همیشه می‌توانید تکمیل خودکار نوشتار خود را از مرورگر &amp;gt؛ تنظیمات &amp;gt؛ صفحه عمومی تنظیم کنید."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"غیرفعال کردن تکمیل خودکار"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"حریم خصوصی و امنیت"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"به مرورگر اجازه داده شود نتایج جستجوی با اطمینان بالا را از قبل در پس زمینه بارگیری کند"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"پیش بارگیری نتیجه جستجو"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"پیش بارگیری صفحه وب"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"هرگز"</item>
+    <item msgid="1908465963242077428">"فقط در Wi-Fi"</item>
+    <item msgid="7647277566998527142">"همیشه"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"اجازه دادن به مرورگر برای پیش بارگیری صفحات وب مرتبط در پس زمینه"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"پیش بارگیری صفحه وب"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"مشکل اتصال"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"مشکل فایل"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"تنظیم تصویر زمینه..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"نشانک ها"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"نشانکی موجود نیست."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"نشانک‌های دیگر"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"انتخاب حساب"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"همگام سازی با حساب Google"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 6b475f2..8e25edf 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopioi sivun URL-osoite"</string>
     <string name="share_page" msgid="593756995297268343">"Jaa sivu"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Tallenna offline-tilassa luettavaksi"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Tallennetaan..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Ei voitu tallentaa offline-käyttöä varten."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> kirjanmerkkiä"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Tyhjä kansio"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Kirjanmerkit"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Asetukset"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Sivun sisältö"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Salli sovelluksille useita välilehtiä"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Lataa kuvat"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Näytä verkkosivujen kuvat"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Estä ponnahdusikkunat"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automaattisen täytön teksti tallennettu."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automaattisen täytön teksti poistettu."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Poista"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Selain voi täyttää automaattisesti tällaiset verkkolomakkeet. Haluatko määrittää automaattisen täytön tekstin?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Selain voi täyttää automaattisesti tällaiset verkkolomakkeet. Haluatko määrittää automaattisen täytön tekstin?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Voit määrittää automaattisen täytön tekstin kohdassa Selain &gt; Asetukset &gt; Yleisasetukset."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Poista automaattinen täyttö käytöstä"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Tietosuoja ja turvallisuus"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Anna selaimen esiladata luotettavat hakutulokset taustalla"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Hakutulosten esilataus"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Verkkosivun esilataus"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Ei koskaan"</item>
+    <item msgid="1908465963242077428">"Vain wifi-yhteydellä"</item>
+    <item msgid="7647277566998527142">"Aina"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Salli selaimen esiladata linkitetyt verkkosivut taustalla"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Verkkosivun esilataus"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Yhteysongelma"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Tiedosto-ongelma"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Asetetaan taustakuvaa..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Kirjanmerkit"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Ei kirjanmerkkejä"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Muut kirjanmerkit"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Valitse tili"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synkronoi Google-tilin kanssa"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 2873ccb..ca6e6e5 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Copier l\'URL de la page"</string>
     <string name="share_page" msgid="593756995297268343">"Partager la page"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Enreg. pour lire hors connex."</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Enregistrement en cours…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Échec enregistrement pour lecture hors connexion."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> favori(s)"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Dossier vide"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Favoris"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Paramètres"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Contenu de la page"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Autoriser plusieurs onglets par appli"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Charger les images"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Afficher les images des pages Web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Bloquer les pop-up"</string>
@@ -168,9 +170,9 @@
     <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"Adresse e-mail :"</string>
     <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Nom de la société :"</string>
     <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"Ligne d\'adresse 1 :"</string>
-    <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Adresse postale, boîte postale, \"À l\'attention de\""</string>
+    <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Adresse postale, boîte postale, \"Aux soins de\""</string>
     <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Ligne d\'adresse 2 :"</string>
-    <string name="autofill_profile_editor_address_line_2_hint" msgid="8529642768127569254">"Résidence, bloc, bâtiment, appartement, étage, etc."</string>
+    <string name="autofill_profile_editor_address_line_2_hint" msgid="8529642768127569254">"Résidence, bâtiment, appartement, étage, etc."</string>
     <string name="autofill_profile_editor_city" msgid="7306716145784997135">"Ville :"</string>
     <string name="autofill_profile_editor_state" msgid="2150403366835080407">"État/Province/Région :"</string>
     <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Code postal :"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Texte de saisie automatique enregistré."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Texte de saisie automatique supprimé."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Supprimer"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Le navigateur peut remplir automatiquement les formulaires Web similaires à celui-ci. Voulez-vous créer un texte de saisie automatique ?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Le navigateur peut remplir automatiquement les formulaires Web similaires à celui-ci. Voulez-vous créer un texte de saisie automatique ?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Vous pourrez définir un texte de saisie automatique en accédant à Navigateur &gt; Paramètres &gt; Général."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Désactiver la saisie automatique"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Confidentialité et sécurité"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Autoriser le préchargement des résultats de recherche fiables en arrière-plan"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Préchargement des résultats de recherche"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Préchargement des pages Web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Jamais"</item>
+    <item msgid="1908465963242077428">"Wi-Fi uniquement"</item>
+    <item msgid="7647277566998527142">"Toujours"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Autoriser le navigateur à précharger en arrière-plan les pages Web associées"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Préchargement des pages Web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problème de connexion"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problème de fichier"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Définition du fond d\'écran…"</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Favoris"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Aucun favori"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Autres favoris"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Choisir un compte"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synchronisation avec un compte Google"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index def9ec7..bc1fe8e 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"पृष्ठ url की प्रतिलिपि बनाएं"</string>
     <string name="share_page" msgid="593756995297268343">"पृष्ठ शेयर करें"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"ऑफ़लाइन पढ़ने के लिए सहेजें"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"सहेजा जा रहा है…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"ऑफ़लाइन पढ़ने के लिए सहेजा नहीं जा सका."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> बुकमार्क"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"रिक्त फ़ोल्डर"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"बुकमार्क"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"सेटिंग"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"पृष्ठ सामग्री"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"हर एप्‍लि. हेतु एकाधिक टैब की अनुमति दें"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"छवियां लोड करें"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"वेब पृष्ठों पर छवियां दिखाएं"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"पॉप-अप अवरुद्ध करें"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"स्‍वत: भरण पाठ सहेजा गया."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"स्‍वत: भरण पाठ हटाया गया."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"हटाएं"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"इसी की तरह ब्राउज़र स्‍वचालित रूप से वेब फ़ॉर्म पूर्ण कर सकता है. क्‍या आप अपना स्‍वत: भरण पाठ सेट करना चाहते हैं?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"इसकी तरह ब्राउज़र स्‍वचालित रूप से वेब फ़ॉर्म पूर्ण कर सकता है. क्‍या आप अपना स्‍वत: भरण पाठ सेट करना चाहते हैं?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"आप कभी भी ब्राउज़र &gt; सेटिंग &gt; सामान्‍य स्‍क्रीन से अपना स्‍वत: भरण पाठ सेट कर सकते हैं."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"स्‍वत: भरण अक्षम करें"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"गोपनीयता और सुरक्षा"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"ब्राउज़र को पृष्ठभूमि में अधिक विश्‍वसनीय खोज परिणाम प्रीलोड करने दें"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"खोज परिणाम प्रीलोड हो रहा है"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"वेब पृष्ठ प्रीलोड करना"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"कभी नहीं"</item>
+    <item msgid="1908465963242077428">"केवल Wi-Fi पर"</item>
+    <item msgid="7647277566998527142">"हमेशा"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"ब्राउज़र को लिंक किए गए वेब पृष्ठों को पृष्ठभूमि में प्रीलोड करने दें"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"वेब पृष्ठ प्रीलोड करना"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"कनेक्शन समस्या"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"फ़ाइल की समस्‍या"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"वॉलपेपर सेट कर रहा है..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"बुकमार्क"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"कोई बुकमार्क नहीं."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"अन्य बुकमार्क"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"खाता चुनें"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Google खाते से सिंक करें"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 8270eca..12e1b27 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopiraj URL stranice"</string>
     <string name="share_page" msgid="593756995297268343">"Dijeli stranicu"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Spremi za izvanmrežno čitanje"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Spremanje..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Spremanje za izvanmrežno čitanje nije uspjelo."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Br. oznaka: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Prazna mapa"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Oznake"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Postavke"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Sadržaj web-stranice"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Dopusti više kartica po aplikaciji"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Učitaj slike"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Prikaži slike na web-stranicama"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blokiraj skočne prozore"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Tekst automatskog ispunjavanja spremljen."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Tekst automatskog ispunjavanja izbrisan."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Izbriši"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Preglednik može automatski ispuniti web-obrasce kao što je ovaj. Želite li postaviti svoj tekst za automatsko ispunjavanje?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Preglednik automatski može dovršiti web-obrasce kao što je ovaj jedan. Želite li postaviti automatsko ispunjavanje teksta?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Uvijek možete postaviti tekst za automatsko ispunjavanje sa zaslona Preglednik &gt; Postavke &gt; Općenito."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Onemogući automatsko popunjavanje"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privatnost i sigurnost"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Dopusti pregledniku prethodno učitavanje vrlo pouzdanih rezultata u pozadini"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Prethodno učitavanje rezultata pretrage"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Predučitavanje web-stranice"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nikad"</item>
+    <item msgid="1908465963242077428">"Samo na Wi-Fi mreži"</item>
+    <item msgid="7647277566998527142">"Uvijek"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Dopustite pregledniku predučitavanje povezanih web-stranica u pozadini"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Predučitavanje web-stranice"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problem s vezom"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problem s datotekom"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Postavljanje pozadinske slike..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Oznake"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Nema oznaka."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Druge oznake"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Odaberite račun"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sinkronizacija s Google Računom"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 8289439..e239e68 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Az oldal URL-jének másolása"</string>
     <string name="share_page" msgid="593756995297268343">"Oldal megosztása"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Mentés offline olvasáshoz"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Mentés..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Nem sikerült menteni offline olvasáshoz."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> könyvjelző"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Üres mappa"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Könyvjelzők"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Beállítások"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Oldaltartalom"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Több lap engedélyezése alkalmazásonként"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Képek betöltése"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Képek megjelenítése a weboldalakon"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Pop-upok letiltása"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automatikus kitöltés szövege elmentve."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automatikus kitöltés szövege törölve."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Törlés"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"A böngésző automatikusan kitölti az ehhez hasonló webes űrlapokat. Szeretné létrehozni az automatikus kitöltés szövegét?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"A böngésző automatikusan ki tudja tölteni az ilyen típusú internetes űrlapokat. Szeretné beállítani az automatikus kitöltés szövegét?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Bármikor beállíthatja az automatikus kitöltése szövegét a Böngésző &gt; Beállítások &gt; Általános képernyőn."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Automatikus kitöltés letiltása"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Adatvédelem és biztonság"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"A biztonságos keresési találatokat előre betöltheti a böngésző a háttérben"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Keresési találatok előtöltése"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Weboldal előtöltése"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Soha"</item>
+    <item msgid="1908465963242077428">"Csak Wi-Fin"</item>
+    <item msgid="7647277566998527142">"Mindig"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"A böngésző előtöltheti a linkelt weboldalakat a háttérben"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Weboldal előtöltése"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Csatlakozási probléma"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Probléma a fájllal"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Háttérkép beállítása..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Könyvjelzők"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Nincsenek könyvjelzők"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Egyéb könyvjelzők"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Fiók kiválasztása"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Szinkronizálás Google Fiókkal"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 54e770f..cd696ae 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -16,9 +16,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="application_name" msgid="1935869255545976415">"Peramban"</string>
-    <string name="choose_upload" msgid="3649366287575002063">"Pilih berkas untuk diunggah"</string>
-    <string name="uploads_disabled" msgid="463761197575372994">"Pengunggahan berkas dinonaktifkan."</string>
+    <string name="application_name" msgid="1935869255545976415">"Browser"</string>
+    <string name="choose_upload" msgid="3649366287575002063">"Pilih file untuk diunggah"</string>
+    <string name="uploads_disabled" msgid="463761197575372994">"Pengunggahan file dinonaktifkan."</string>
     <string name="new_tab" msgid="7971857320679510529">"Tab baru"</string>
     <string name="new_incognito_tab" msgid="3606197964239039478">"Tab penyamaran baru"</string>
     <string name="tab_bookmarks" msgid="2305793036003473653">"Bookmark"</string>
@@ -31,9 +31,9 @@
     <string name="username" msgid="5057566336518215922">"Nama"</string>
     <string name="password" msgid="1177138552305184404">"Sandi"</string>
     <string name="action" msgid="183105774472071343">"Masuk"</string>
-    <string name="bookmarks_search" msgid="5229596268214362873">"Peramban"</string>
+    <string name="bookmarks_search" msgid="5229596268214362873">"Browser"</string>
     <string name="cancel" msgid="3017274947407233702">"Batal"</string>
-    <string name="ok" msgid="1509280796718850364">"OK"</string>
+    <string name="ok" msgid="1509280796718850364">"Oke"</string>
     <string name="title_bar_loading" msgid="7438217780834640678">"Memuat…"</string>
     <string name="page_info" msgid="4048529256302257195">"Info laman"</string>
     <string name="page_info_view" msgid="5303490449842635158">"Lihat info laman"</string>
@@ -49,24 +49,24 @@
     <string name="ssl_not_yet_valid" msgid="8193083327719048247">"Sertifikat ini belum valid."</string>
     <string name="ssl_date_invalid" msgid="3705563379257285534">"Tanggal sertifikat ini tidak valid."</string>
     <string name="ssl_invalid" msgid="9041704741505449967">"Sertifikat ini tidak valid."</string>
-    <string name="ssl_unknown" msgid="5679243486524754571">"Galat sertifikat tak dikenal."</string>
+    <string name="ssl_unknown" msgid="5679243486524754571">"Kesalahan sertifikat tak dikenal."</string>
     <string name="stopping" msgid="4839698519340302982">"Menghentikan"</string>
     <string name="stop" msgid="5687251076030630074">"Berhenti"</string>
     <string name="reload" msgid="8585220783228408062">"Segarkan"</string>
     <string name="back" msgid="8414603107175713668">"Kembali"</string>
     <string name="forward" msgid="4288210890526641577">"Teruskan"</string>
-    <string name="save" msgid="5922311934992468496">"OK"</string>
+    <string name="save" msgid="5922311934992468496">"Oke"</string>
     <string name="do_not_save" msgid="6777633870113477714">"Batal"</string>
     <string name="location" msgid="3411848697912600125">"Alamat"</string>
     <string name="account" msgid="5179824606448077042">"Akun"</string>
     <string name="containing_folder" msgid="6771180232953030479">"Tambahkan ke"</string>
-    <string name="new_folder" msgid="7743540149088867917">"Map baru"</string>
-    <string name="edit_folder" msgid="621817453133656156">"Edit map"</string>
-    <string name="delete_folder" msgid="2046483129024501116">"Hapus map"</string>
-    <string name="no_subfolders" msgid="3303645239686962674">"Tanpa submap."</string>
+    <string name="new_folder" msgid="7743540149088867917">"Folder baru"</string>
+    <string name="edit_folder" msgid="621817453133656156">"Edit folder"</string>
+    <string name="delete_folder" msgid="2046483129024501116">"Hapus folder"</string>
+    <string name="no_subfolders" msgid="3303645239686962674">"Tanpa subfolder."</string>
     <string name="add_to_bookmarks_menu_option" msgid="4449323955122214389">"Bookmark"</string>
     <string name="add_to_homescreen_menu_option" msgid="1461447829242963790">"Layar utama"</string>
-    <string name="add_to_other_folder_menu_option" msgid="5947586525822134105">"Map lainnya"</string>
+    <string name="add_to_other_folder_menu_option" msgid="5947586525822134105">"Folder lainnya"</string>
     <string name="name" msgid="5462672162695365387">"Label"</string>
     <string name="http" msgid="2163722670597250102">"http://"</string>
     <string name="save_to_bookmarks" msgid="1679286010089780932">"Simpan ke bookmark"</string>
@@ -101,10 +101,11 @@
     <string name="menu_view_download" msgid="2124570321712995120">"Unduhan"</string>
     <string name="copy_page_url" msgid="1188679152608889555">"Salin URL laman"</string>
     <string name="share_page" msgid="593756995297268343">"Bagikan lama"</string>
-    <string name="menu_save_snapshot" msgid="6935080344031126139">"Simpan untuk dibaca secara luring"</string>
-    <string name="snapshot_failed" msgid="4584580873565876033">"Tidak dapat menyimpan untuk dibaca secara luring."</string>
+    <string name="menu_save_snapshot" msgid="6935080344031126139">"Simpan untuk dibaca secara offline"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Menyimpan..."</string>
+    <string name="snapshot_failed" msgid="4584580873565876033">"Tidak dapat menyimpan untuk dibaca secara offline."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> bookmark"</string>
-    <string name="contextheader_folder_empty" msgid="974171637803391651">"Map kosong"</string>
+    <string name="contextheader_folder_empty" msgid="974171637803391651">"Folder kosong"</string>
     <string name="contextmenu_openlink" msgid="7237961252214188935">"Buka"</string>
     <string name="contextmenu_openlink_newwindow" msgid="1205313604181761403">"Buka di tab baru"</string>
     <string name="contextmenu_openlink_newwindow_background" msgid="4690381019116746687">"Buka di tab latar belakang baru"</string>
@@ -116,7 +117,7 @@
     <string name="contextmenu_view_image" msgid="3870625602053600905">"Lihat gambar"</string>
     <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Setel sebagai wallpaper"</string>
     <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Panggil..."</string>
-    <string name="contextmenu_add_contact" msgid="3183511922223645716">"Tambahkan kenalan"</string>
+    <string name="contextmenu_add_contact" msgid="3183511922223645716">"Tambahkan kontak"</string>
     <string name="contextmenu_send_mail" msgid="1014513374828775660">"Kirim email"</string>
     <string name="contextmenu_map" msgid="7471390435434034912">"Peta"</string>
     <string name="choosertitle_sharevia" msgid="4600490613341909086">"Bagikan melalui"</string>
@@ -125,12 +126,13 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Bookmark"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Setelan"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Konten laman"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Izinkan beberapa tab per aplikasi"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Muat gambar"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Tampilkan gambar pada laman web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Cekal jendela munculan"</string>
     <string name="pref_content_javascript" msgid="4570972030299516843">"Aktifkan JavaScript"</string>
     <string name="pref_content_open_in_background" msgid="824123779725118663">"Buka di latar belakang"</string>
-    <string name="pref_content_plugins" msgid="7231944644794301582">"Aktifkan pengaya"</string>
+    <string name="pref_content_plugins" msgid="7231944644794301582">"Aktifkan plugin"</string>
   <string-array name="pref_content_plugins_choices">
     <item msgid="6745108155096660725">"Selalu hidup"</item>
     <item msgid="2484126708670016519">"Sesuai permintaan"</item>
@@ -144,7 +146,7 @@
   <string-array name="pref_homepage_choices">
     <item msgid="844041670142910837">"Laman ini"</item>
     <item msgid="4430498748295169195">"Laman kosong"</item>
-    <item msgid="5747608191946904074">"Laman bawaan"</item>
+    <item msgid="5747608191946904074">"Laman default"</item>
     <item msgid="6092441301001006473">"Situs yang paling sering dikunjungi"</item>
     <item msgid="6569304572171444894">"Lainnya"</item>
   </string-array>
@@ -181,20 +183,20 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Teks isi-otomatis disimpan."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Teks isi-otomatis dihapus."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Hapus"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Peramban dapat melengkapi formulir web seperti ini secara otomatis. Apakah Anda ingin menyiapkan teks isi-otomatis?"</string>
-    <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Anda selalu dapat menyiapkan teks isi-otomatis dari layar Peramban &gt; Setelan &gt; Umum."</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Browser dapat melengkapi formulir web seperti ini secara otomatis. Apakah Anda ingin menyiapkan teks isi-otomatis?"</string>
+    <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Anda selalu dapat menyiapkan teks isi-otomatis dari layar Browser &gt; Setelan &gt; Umum."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Nonaktifkan isi-otomatis"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privasi &amp; keamanan"</string>
-    <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Hapus tembolok"</string>
-    <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Hapus konten dan basis data yang disimpan dalam tembolok secara lokal"</string>
-    <string name="pref_privacy_clear_cache_dlg" msgid="4344512581716422465">"Hapus basis data dan konten dalam tembolok lokal?"</string>
+    <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Hapus cache"</string>
+    <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Hapus konten dan basis data yang disimpan dalam cache secara lokal"</string>
+    <string name="pref_privacy_clear_cache_dlg" msgid="4344512581716422465">"Hapus basis data dan konten dalam cache lokal?"</string>
     <string name="pref_privacy_cookies_title" msgid="6763274282214830526">"Kuki"</string>
-    <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Hapus semua data kuki"</string>
-    <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Menghapus semua kuki peramban"</string>
-    <string name="pref_privacy_clear_cookies_dlg" msgid="1493252163164621278">"Hapus semua kuki?"</string>
+    <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Hapus semua data cookie"</string>
+    <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Menghapus semua cookie browser"</string>
+    <string name="pref_privacy_clear_cookies_dlg" msgid="1493252163164621278">"Hapus semua cookie?"</string>
     <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Hapus riwayat"</string>
-    <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Hapus riwayat navigasi peramban"</string>
-    <string name="pref_privacy_clear_history_dlg" msgid="6934317391642846227">"Hapus riwayat navigasi peramban?"</string>
+    <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Hapus riwayat navigasi browser"</string>
+    <string name="pref_privacy_clear_history_dlg" msgid="6934317391642846227">"Hapus riwayat navigasi browser?"</string>
     <string name="pref_privacy_formdata_title" msgid="6549813837982050424">"Data formulir"</string>
     <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Hapus data formulir"</string>
     <string name="pref_privacy_clear_form_data_summary" msgid="7702091143640546200">"Hapus semua data formulir tersimpan"</string>
@@ -215,8 +217,8 @@
     <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Ingat data yang saya ketik untuk digunakan lagi nanti"</string>
     <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Tampilkan peringatan keamanan"</string>
     <string name="pref_security_show_security_warning_summary" msgid="5260098316025397525">"Tampilkan peringatan jika ada masalah dengan keamanan situs"</string>
-    <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Terima kuki"</string>
-    <string name="pref_security_accept_cookies_summary" msgid="1907951236154433751">"Izinkan situs menyimpan dan membaca data kuki"</string>
+    <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Terima cookie"</string>
+    <string name="pref_security_accept_cookies_summary" msgid="1907951236154433751">"Izinkan situs menyimpan dan membaca data cookie"</string>
   <string-array name="pref_text_size_choices">
     <item msgid="4952686548944739548">"Kecil"</item>
     <item msgid="1950030433642671460">"Kecil"</item>
@@ -224,7 +226,7 @@
     <item msgid="5043128215356351184">"Besar"</item>
     <item msgid="7201512237890458902">"Sangat besar"</item>
   </string-array>
-    <string name="pref_min_font_size" msgid="8811125835817449131">"Ukuran fon minimal"</string>
+    <string name="pref_min_font_size" msgid="8811125835817449131">"Ukuran font minimal"</string>
     <string name="pref_min_font_size_value" msgid="2924708480509060209">"<xliff:g id="FONT_SIZE">%d</xliff:g> pn"</string>
     <string name="pref_text_zoom" msgid="5171056101805125497">"Penskalaan teks"</string>
     <string name="pref_zoom_on_double_tap" msgid="902786475250741795">"Zoom dengan mengetuk dua kali"</string>
@@ -234,22 +236,22 @@
     <string name="pref_inverted" msgid="7613556986776824112">"Penampilan terinversi"</string>
     <string name="pref_inverted_summary" msgid="7357225897413923085">"Hitam menjadi putih dan sebaliknya"</string>
     <string name="pref_inverted_contrast" msgid="8527441236225288169">"Kontras"</string>
-    <string name="pref_default_zoom" msgid="8076142259097187395">"Zoom bawaan"</string>
+    <string name="pref_default_zoom" msgid="8076142259097187395">"Zoom default"</string>
   <string-array name="pref_default_zoom_choices">
     <item msgid="549583171195154919">"Jauh"</item>
     <item msgid="5619034257768161024">"Sedang"</item>
     <item msgid="3840999588443167001">"Tutup"</item>
   </string-array>
-    <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Zoom bawaan"</string>
+    <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Zoom default"</string>
     <string name="pref_content_load_page" msgid="2219810141690955452">"Buka laman di ikhtisar"</string>
     <string name="pref_content_load_page_summary" msgid="9168803276420332955">"Menampilkan ikhtisar laman yang baru dibuka"</string>
     <string name="pref_extras_title" msgid="7075456173747370647">"Lanjutan"</string>
     <string name="pref_extras_website_settings" msgid="67866640052455549">"Setelan situs web"</string>
     <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Setelan lanjutan untuk masing-masing situs web"</string>
-    <string name="pref_extras_reset_default_title" msgid="3579760449455761762">"Setel ulang bawaan"</string>
-    <string name="pref_extras_reset_default" msgid="8904000515846202110">"Setel ulang ke bawaan"</string>
-    <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Pulihkan setelan bawaan"</string>
-    <string name="pref_extras_reset_default_dlg" msgid="7922814420184322450">"Kembalikan setelan ke nilai bawaan?"</string>
+    <string name="pref_extras_reset_default_title" msgid="3579760449455761762">"Setel ulang default"</string>
+    <string name="pref_extras_reset_default" msgid="8904000515846202110">"Setel ulang ke default"</string>
+    <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Pulihkan setelan default"</string>
+    <string name="pref_extras_reset_default_dlg" msgid="7922814420184322450">"Kembalikan setelan ke nilai default?"</string>
     <string name="pref_development_title" msgid="3263854204533056480">"Debug"</string>
     <string name="pref_default_text_encoding" msgid="5742965543955558478">"Penyandiaksaraan teks"</string>
   <string-array name="pref_default_text_encoding_choices">
@@ -267,29 +269,37 @@
     <string name="pref_font_size_category" msgid="6683754355084218254">"Ukuran teks"</string>
     <string name="pref_lab_title" msgid="5571091610359629423">"Labs"</string>
     <string name="pref_lab_quick_controls" msgid="3267606522082281367">"Kontrol cepat"</string>
-    <string name="pref_lab_quick_controls_summary" msgid="3149664132600968775">"Geser ibu jari dari ujung kiri atau kanan untuk membuka kontrol cepat dan menyembunyikan apl dan bilah URL"</string>
+    <string name="pref_lab_quick_controls_summary" msgid="3149664132600968775">"Geser jempol dari ujung kiri atau kanan untuk membuka kontrol cepat dan menyembunyikan aplikasi dan bilah URL"</string>
     <string name="pref_use_instant_search" msgid="1119176077760723740">"Google Sekejap"</string>
     <string name="pref_use_instant_search_summary" msgid="839320474961917522">"Gunakan Google Sekejap di Google Penelusuran agar hasilnya tampil selagi mengetik (ini dapat menambah pemakaian data)."</string>
     <string name="pref_lab_fullscreen" msgid="8173609016657987973">"Layar penuh"</string>
     <string name="pref_lab_fullscreen_summary" msgid="7694738112219376740">"Gunakan mode layar lebar untuk menyembunyikan bilah status"</string>
-    <string name="pref_data_title" msgid="7255058703417796578">"Pengelolaan lebar pita"</string>
+    <string name="pref_data_title" msgid="7255058703417796578">"Pengelolaan bandwidth"</string>
     <string name="pref_data_preload_title" msgid="4479320472980292873">"Pramuat hasil penelusuran"</string>
   <string-array name="pref_data_preload_choices">
     <item msgid="5180466923190095508">"Tidak Pernah"</item>
     <item msgid="1791664748778640002">"Hanya pada Wi-Fi"</item>
     <item msgid="3944061253437827617">"Selalu"</item>
   </string-array>
-    <string name="pref_data_preload_summary" msgid="3809168910751382727">"Mengizinkan peramban mem-pramuat hasil penelusuran pasti di latar belakang"</string>
+    <string name="pref_data_preload_summary" msgid="3809168910751382727">"Mengizinkan browser mem-pramuat hasil penelusuran pasti di latar belakang"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Pramuatan hasil penelusuran"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Pramuat laman web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Tidak pernah"</item>
+    <item msgid="1908465963242077428">"Hanya pada Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Selalu"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Izinkan browser untuk pramuat laman web yang ditautkan di latar belakang"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Pramuat laman web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Masalah sambungan"</string>
-    <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Masalah berkas"</string>
+    <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Masalah file"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
-    <string name="browserFrameFormResubmitMessage" msgid="5244059279866705254">"Laman yang Anda coba lihat berisi data yang telah dikirimkan (\"POSTDATA\"). Jika Anda mengirimkan ulang data, tindakan apa pun berupa pengisian formulir pada laman (seperti penelusuran atau pembelian daring) akan diulangi."</string>
+    <string name="browserFrameFormResubmitMessage" msgid="5244059279866705254">"Laman yang Anda coba lihat berisi data yang telah dikirimkan (\"POSTDATA\"). Jika Anda mengirimkan ulang data, tindakan apa pun berupa pengisian formulir pada laman (seperti penelusuran atau pembelian online) akan diulangi."</string>
     <string name="loadSuspendedTitle" msgid="6453376579109644551">"Tidak ada sambungan"</string>
-    <string name="loadSuspended" msgid="3843343290039218668">"Peramban tidak dapat memuat laman ini karena tidak ada sambungan internet."</string>
+    <string name="loadSuspended" msgid="3843343290039218668">"Browser tidak dapat memuat laman ini karena tidak ada sambungan internet."</string>
     <string name="clear_history" msgid="5998307092715979619">"Hapus riwayat"</string>
     <string name="browser_history" msgid="2979476257919939232">"Laman yang baru dikunjungi"</string>
-    <string name="empty_history" msgid="7013369425484218985">"Tidak ada riwayat peramban."</string>
+    <string name="empty_history" msgid="7013369425484218985">"Tidak ada riwayat browser."</string>
     <string name="go_home" msgid="109129207276086793">"Beranda"</string>
     <string name="add_new_bookmark" msgid="3158497555612337238">"Tambahkan bookmark"</string>
     <string name="add_bookmark_short" msgid="3783984330998103735">"Tambahkan"</string>
@@ -314,11 +324,11 @@
     <string name="cannot_download" msgid="8150552478556798780">"Hanya dapat mengunduh URL \"http\" atau \"https\"."</string>
     <string name="download_pending" msgid="2599683668575349559">"Memulai unduhan..."</string>
     <string name="search_the_web" msgid="6046130189241962337">"Telusuri web"</string>
-    <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Penyimpanan peramban penuh"</string>
+    <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Penyimpanan browser penuh"</string>
     <string name="webstorage_outofspace_notification_text" msgid="47273584426988640">"Sentuh untuk mengosongkan ruang."</string>
     <string name="webstorage_clear_data_title" msgid="689484577124333977">"Hapus data tersimpan"</string>
     <string name="webstorage_clear_data_dialog_message" msgid="6200681632891775881">"Hapus semua data yang disimpan situs web ini?"</string>
-    <string name="webstorage_clear_data_dialog_ok_button" msgid="6682570951259237542">"OK"</string>
+    <string name="webstorage_clear_data_dialog_ok_button" msgid="6682570951259237542">"Oke"</string>
     <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Batal"</string>
     <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB yang disimpan pada ponsel Anda"</string>
     <string name="loading_video" msgid="7886324933131962321">"Memuat video..."</string>
@@ -332,15 +342,16 @@
     <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Saat ini situs ini dapat mengakses lokasi Anda"</string>
     <string name="geolocation_settings_page_summary_not_allowed" msgid="7941769772784366199">"Saat ini situs ini tidak dapat mengakses lokasi Anda"</string>
     <string name="geolocation_settings_page_dialog_message" msgid="8772923416296868537">"Hapus akses lokasi untuk situs web ini?"</string>
-    <string name="geolocation_settings_page_dialog_ok_button" msgid="2113465477131017852">"OK"</string>
+    <string name="geolocation_settings_page_dialog_ok_button" msgid="2113465477131017852">"Oke"</string>
     <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Batal"</string>
     <string name="website_settings_clear_all" msgid="8739804325997655980">"Hapus semua"</string>
     <string name="website_settings_clear_all_dialog_message" msgid="1551164275687475061">"Hapus semua data situs web dan izin lokasi?"</string>
-    <string name="website_settings_clear_all_dialog_ok_button" msgid="7858504776529106243">"OK"</string>
+    <string name="website_settings_clear_all_dialog_ok_button" msgid="7858504776529106243">"Oke"</string>
     <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Batal"</string>
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Menyetel wallpaper..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bookmark"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Tidak ada bookmark."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Bookmark Lainnya"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Pilih akun"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sinkronkan dengan akun Google"</string>
@@ -365,7 +376,7 @@
     <string name="permission_preload_label" msgid="4856971662337877316">"Lakukan pramuat hasil"</string>
     <string name="empty_snapshots_folder" msgid="7675378008107026013">"Tidak ada laman tersimpan."</string>
     <string name="remove_snapshot" msgid="1624447424544976849">"Hapus laman tersimpan"</string>
-    <string name="snapshot_go_live" msgid="1209542802541168497">"Buka laman daring"</string>
+    <string name="snapshot_go_live" msgid="1209542802541168497">"Buka laman online"</string>
     <string name="accessibility_button_back" msgid="6194680634245279407">"Kembali"</string>
     <string name="accessibility_button_forward" msgid="1236827218480658168">"Maju"</string>
     <string name="accessibility_button_refresh" msgid="1023441396241841313">"Menyegarkan laman"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 3abe99a..74980d2 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Copia URL della pagina"</string>
     <string name="share_page" msgid="593756995297268343">"Condividi pagina"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Salva per lettura offline"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Salvataggio…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Salvataggio per lettura offline non riuscito."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> segnalibri"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Cartella vuota"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Segnalibri"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Impostazioni"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Contenuti della pagina"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Consenti più schede per applicazione"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Carica immagini"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Visualizza immagini in pagine web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blocca popup"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Testo per compilazione automatica salvato."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Testo per compilazione automatica eliminato."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Elimina"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Il browser può completare automaticamente i moduli web come questo. Vuoi impostare il testo per la compilazione automatica?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Il browser può completare automaticamente i moduli web come questo. Vuoi impostare il testo per la compilazione automatica?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Puoi sempre impostare il testo per la compilazione automatica dalla schermata Browser &gt; Impostazioni &gt; Generali."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Disattiva compilazione automatica"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacy e sicurezza"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Consenti al browser di precaricare i risultati di ricerca affidabili in background"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Precaricamento risultati di ricerca"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Precaricamento pagina web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Mai"</item>
+    <item msgid="1908465963242077428">"Solo su Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Sempre"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Consenti al browser di precaricare in background le pagine web con link"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Precaricamento pagina web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problema di connessione"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problema di file"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Impostazione sfondo..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Segnalibri"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Nessun segnalibro."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Altri Preferiti"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Scegli account"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronizza con l\'account Google"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 8ef7c98..ebb048a 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -20,7 +20,7 @@
     <string name="choose_upload" msgid="3649366287575002063">"בחר קובץ להעלאה"</string>
     <string name="uploads_disabled" msgid="463761197575372994">"העלאות הקובץ הושבתו."</string>
     <string name="new_tab" msgid="7971857320679510529">"כרטיסייה חדשה"</string>
-    <string name="new_incognito_tab" msgid="3606197964239039478">"כרטיסייה חדשה של גלישה בסתר"</string>
+    <string name="new_incognito_tab" msgid="3606197964239039478">"כרטיסיית גלישה בסתר חדשה"</string>
     <string name="tab_bookmarks" msgid="2305793036003473653">"סימניות"</string>
     <string name="tab_most_visited" msgid="1077402532455000703">"אתרים שבהם אתה מבקר הכי הרבה"</string>
     <string name="tab_history" msgid="1979267558744613746">"היסטוריה"</string>
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"העתק כתובת אתר של דף"</string>
     <string name="share_page" msgid="593756995297268343">"שתף דף"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"שמור לקריאה במצב לא מקוון"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"שומר…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"השמירה לקריאה במצב לא מקוון לא הצליחה."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> סימניות"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"תיקיה ריקה"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"סימניות"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"הגדרות"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"תוכן דף"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"אפשר ריבוי לשוניות לכל יישום"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"טען תמונות"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"הצג תמונות בדפי אינטרנט"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"חסום חלונות קופצים"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"מילוי אוטומטי של טקסט נשמר."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"מילוי אוטומטי של טקסט נמחק."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"מחק"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"הדפדפן יכול למלא באופן אוטומטי טופסי אינטרנט כמו זה. האם תרצה להגדיר מילוי אוטומטי של טקסט?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"הדפדפן יכול לבצע השלמה אוטומטית של טופסי אינטרנט כמו טופס זה. האם ברצונך להגדיר טקסט למילוי אוטומטי?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"תוכל תמיד להגדיר את המילוי האוטומטי של הטקסט דרך המסך \'דפדפן\' &gt; \'הגדרות\' &gt; \'כללי\'."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"השבת את \'מילוי אוטומטי\'"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"פרטיות ואבטחה"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"אפשר לדפדפן לטעון מראש תוצאות חיפוש בעלות אמינות גבוהה ברקע"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"טעינה מוקדמת של תוצאות חיפוש"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"טעינה מוקדמת של דף אינטרנט"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"לעולם לא"</item>
+    <item msgid="1908465963242077428">"רק ב-Wi-Fi"</item>
+    <item msgid="7647277566998527142">"תמיד"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"אפשר לדפדפן לבצע ברקע טעינה מוקדמת של דפי אינטרנט מקושרים"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"טעינה מוקדמת של דף אינטרנט"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"בעיה בחיבור"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"בעיית קובץ"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"מגדיר טפט..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"סימניות"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ללא סימניות."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"סימניות אחרות"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"בחר חשבון"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"סינכרון עם חשבון Google"</string>
@@ -376,7 +387,7 @@
     <string name="accessibility_button_bookmarks" msgid="7435055677299151649">"סימניות"</string>
     <string name="accessibility_button_closetab" msgid="6954807842756927737">"סגור כרטיסייה"</string>
     <string name="accessibility_button_newtab" msgid="4116986240706315748">"פתח כרטיסייה חדשה"</string>
-    <string name="accessibility_button_newincognitotab" msgid="5254901889040012964">"פתח כרטיסייה חדשה של גלישה בסתר"</string>
+    <string name="accessibility_button_newincognitotab" msgid="5254901889040012964">"פתח כרטיסיית גלישה בסתר חדשה"</string>
     <string name="accessibility_button_clear" msgid="6943152307986161598">"נקה תוכן"</string>
     <string name="accessibility_button_uaswitch" msgid="6286804719724282339">"החלף סוכן משתמש"</string>
     <string name="accessibility_button_go" msgid="1182818872083055958">"בצע"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 111784d..cd96f3d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"ページのURLをコピー"</string>
     <string name="share_page" msgid="593756995297268343">"ページを共有"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"オフラインで読めるよう保存"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"保存中…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"オフラインでの閲覧用に保存できませんでした。"</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g>件のブックマーク"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"空のフォルダ"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"ブックマーク"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"設定"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"ページコンテンツ"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"1つのアプリに複数のタブを許可"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"画像の読み込み"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"ウェブページに画像を表示する"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"ポップアップをブロック"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"自動入力テキストを保存しました。"</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"自動入力テキストを削除しました。"</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"削除"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"このようにウェブフォームのデータを自動的に入力できます。自動入力テキストを設定しますか?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"このようにウェブフォームのデータを自動的に入力できます。自動入力テキストを設定しますか?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"自動入力テキストは[ブラウザ] &gt; [設定] &gt; [全般]でいつでも設定できます。"</string>
     <string name="disable_autofill" msgid="8305901059849400354">"自動入力を無効にする"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"プライバシーとセキュリティ"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"ブラウザが信頼度の高い検索結果をバックグラウンドでプリロードできるようにする"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"検索結果のプリロード"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"ウェブページのプリロード"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"行わない"</item>
+    <item msgid="1908465963242077428">"Wi-Fi接続時のみ"</item>
+    <item msgid="7647277566998527142">"常時"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"ブラウザがリンク先のウェブページをバックグラウンドでプリロードできるようにする"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"ウェブページのプリロード"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"接続エラー"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"ファイルの問題"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"壁紙を設定しています..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"ブックマーク"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ブックマークはありません。"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"その他のブックマーク"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"アカウントの選択"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Googleアカウントと同期"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 3d4ab49..02b67e4 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"페이지 URL 복사"</string>
     <string name="share_page" msgid="593756995297268343">"페이지 공유"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"오프라인 보기로 저장"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"저장 중..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"오프라인 읽기용으로 저장하지 못했습니다."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"북마크 <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>개"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"빈 폴더"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"북마크"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"설정"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"페이지 콘텐츠"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"앱당 여러 탭 허용"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"이미지 로드"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"웹페이지에 이미지 표시"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"팝업 차단"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"자동 입력 텍스트를 저장했습니다."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"자동 입력 텍스트가 삭제되었습니다."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"삭제"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"브라우저에서 이 양식과 같은 웹 양식을 자동으로 완성할 수 있습니다. 자동 입력 텍스트를 설정하시겠습니까?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"브라우저에서 이 양식과 같은 웹 양식을 자동으로 완성할 수 있습니다. 자동 입력 텍스트를 설정하시겠습니까?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"브라우저 &gt; 설정 &gt; 일반 화면에서 언제든지 자동 입력 텍스트를 설정할 수 있습니다."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"자동 입력 사용중지"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"개인정보 보호 및 보안"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"브라우저가 신뢰도 높은 검색결과를 백그라운드에서 미리 로드하도록 허용"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"검색결과 미리 로드"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"웹페이지 미리 로드"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"안함"</item>
+    <item msgid="1908465963242077428">"Wi-Fi 연결 시"</item>
+    <item msgid="7647277566998527142">"항상"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"브라우저가 링크된 웹페이지를 백그라운드에서 미리 로드하도록 허용"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"웹페이지 미리 로드"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"연결 문제"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"파일 문제"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"배경화면을 설정하는 중..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"북마크"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"북마크가 없습니다."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"기타 북마크"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"계정 선택"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Google 계정과 동기화"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index f488f5d..992794e 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopijuoti puslapio URL"</string>
     <string name="share_page" msgid="593756995297268343">"Bendrinti puslapį"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Išsaugoti, kad būtų galima skaityti neprisijungus"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Išsaugoma..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Nepavyko išsaugoti, kad skaitytumėte neprisij."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Žymių: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Tuščias aplankas"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Žymės"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Nustatymai"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Puslapio turinys"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Leisti kelis skirtukus programoje"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Įkelti vaizdus"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Pateikti vaizdus tinklalapiuose"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blokuoti iššokanč. langus"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automatinio pildymo tekstas išsaugotas."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automatinis teksto pildymas ištrintas."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Ištrinti"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Naršyklė gali automatiškai užpildyti tokias žiniatinklio formas kaip ši. Ar norėtumėte nustatyti automatinį teksto pildymą?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Naršyklė gali automatiškai užpildyti tokias formas kaip ši. Ar norite nustatyti automatinį teksto pildymą?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Automatinį teksto pildymą galite bet kada nustatyti ekrane „Naršyklė“ &gt; „Nustatymai“ &gt; „Bendra“."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Neleisti automatinio pildymo"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privatumas ir sauga"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Leisti naršyklei fone iš anksto įkelti itin patikimus paieškos rezultatus"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Iš anksto įkeliamas paieškos rezultatas"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Tinklalapio išankstinis įkėlimas"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Niekada"</item>
+    <item msgid="1908465963242077428">"Tik naudoj. „Wi–Fi“"</item>
+    <item msgid="7647277566998527142">"Visada"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Leisti naršyklei iš anksto įkelti susietus tinklalapius fone"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Tinklalapio išankstinis įkėlimas"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Ryšio problema"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Failo problema"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Nustatomas darbalaukio fonas..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Žymės"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Žymių nėra."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Kitos žymės"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Pasirinkite paskyrą"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sinchron. su „Google“ paskyra"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 1a7a3c5..2caabf2 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopēt lapas URL"</string>
     <string name="share_page" msgid="593756995297268343">"Kopīgot lapu"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Saglabāt, lai lasītu bezsaistē"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Notiek saglabāšana…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Nevarēja saglabāt lasīšanai bezsaistē."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> grāmatzīmes"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Tukša mape"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Grāmatzīmes"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Iestatījumi"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Lapas saturs"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Atļaut vairākas cilnes vienai lietotnei"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Ielādēt attēlus"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Rādīt attēlus tīmekļa lapās"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Bloķēt uznirstošos vienumus"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automātiskās aizpildes teksts saglabāts."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automātiskās aizpildes teksts ir izdzēsts."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Dzēst"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Pārlūkprogramma var automātiski aizpildīt šādas tīmekļa veidlapas. Vai vēlaties iestatīt automātiskās aizpildes tekstu?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Pārlūkprogrammā var tikt automātiski aizpildītas šādas tīmekļa veidlapas. Vai vēlaties iestatīt automātiskās aizpildes tekstu?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Jebkurā laikā varat iestatīt automātiskās aizpildes tekstu, atverot šādus ekrānus:  Pārlūkprogramma &gt; Iestatījumi &gt; Vispārīgi."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Atspējot automātisko aizpildi"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Konfidencialitāte un drošība"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Atļaut pārlūkprogrammai fonā veikt ticamu meklēšanas rezultātu pirmsielādi"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Meklēšanas rezultātu pirmsielāde"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Tīmekļa lapas pirmsielāde"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nekad"</item>
+    <item msgid="1908465963242077428">"Tikai Wi-Fi tīklā"</item>
+    <item msgid="7647277566998527142">"Vienmēr"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Ļaut pārlūkprogrammai fonā veikt saistīto tīmekļa lapu pirmsielādi"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Tīmekļa lapas pirmsielāde"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problēma saistībā ar savienojumu"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problēma ar failu"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Notiek fona tapetes iestatīšana..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Grāmatzīmes"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Nav grāmatzīmju."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Citas grāmatzīmes"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Konta izvēle"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sinhronizācija ar Google kontu"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 38e5921..4ee0a0f 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Salin URL halaman"</string>
     <string name="share_page" msgid="593756995297268343">"Kongsi halaman"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Simpan untuk pembacaan di luar talian"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Menyimpan..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Tidak dapat disimpan untuk pembacaan di luar talian."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> penanda halaman"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Folder kosong"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Penanda halaman"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Tetapan"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Kandungan halaman"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Benarkan tab berbilang untuk setiap apl"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Muatkan imej"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Paparkan imej di halaman web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Sekat pop timbul"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Teks auto isi disimpan."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Teks auto-isi dipadamkan."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Padam"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Penyemak imbas boleh melengkapkan borang web seperti ini secara automatik. Adakah anda ingin menyediakan teks auto-isi anda?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Penyemak imbas boleh melengkapkan borang web seperti ini secara automatik. Adakah anda ingin menyediakan teks auto-isi anda?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Anda boleh menyediakan teks auto-isi anda daripada skrin Penyemak Imbas &gt; Tetapan &gt; Umum."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Lumpuhkan auto isi"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privasi &amp; keselamatan"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Benarkan penyemak imbas untuk mempramuat hasil carian berkeyakinan tinggi di latar belakang"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Hasil carian sedang dipramuat"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Pramuat halaman web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Jangan sekali-kali"</item>
+    <item msgid="1908465963242077428">"Hanya di Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Sentiasa"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Benarkan penyemak imbas mempramuat halaman web dikaitkan di latar belakang"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Pramuat halaman web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Masalah sambungan"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Masalah fail"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Menetapkan kertas dinding…"</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Penanda halaman"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Tiada penanda halaman."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Penanda Halaman Lain"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Pilih akaun"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Segerakkan dengan akaun Google"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index eb412e9..13ad331 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopier nettadresse"</string>
     <string name="share_page" msgid="593756995297268343">"Del side"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Lagre for frakoblet lesing"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Lagrer …"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Kunne ikke lagre for frakoblet lesing."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> bokmerker"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Tøm mappe"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Bokmerker"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Innstillinger"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Sideinnhold"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Tillat flere faner per app"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Last bilder"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Vis bilder på nettsteder"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blokker forgrunnsvinduer"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Tekst for automatisk utfylling lagret."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Tekst for automatisk utfylling er slettet."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Slett"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Nettleseren kan automatisk fullføre nettskjemaer som dette. Vil du konfigurere tekst for automatisk utfylling?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Nettleseren kan automatisk fullføre nettskjemaer som dette. Vil du konfigurere tekst for automatisk utfylling?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Du kan konfigurere tekst for automatisk utfylling senere, fra skjermen Nettleser &gt; Innstillinger &gt; Generelt."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Deaktiver automatisk utfylling"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Personvern og sikkerhet"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"La nettleseren forhåndsinnlaste sannsynlige søkeresultater i bakgrunnen"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Forhåndsinnlasting av søkeresultat"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Forhåndsinnlasting av nettsider"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Aldri"</item>
+    <item msgid="1908465963242077428">"Bare med Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Alltid"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"La nettleseren forhåndsinnlaste koblede nettsider i bakgrunnen"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Forhåndsinnlasting av nettsider"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Tilkoblingsproblem"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Filproblem"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Angir bakgrunn …"</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bokmerker"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Ingen bokmerker."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Andre bokmerker"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Velg konto"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synkroniser med Google-konto"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index b06152f..6c74a4b 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Pagina-URL kopiëren"</string>
     <string name="share_page" msgid="593756995297268343">"Pagina delen"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Opslaan voor offline lezen"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Opslaan…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Kan pagina niet opslaan voor offline lezen."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> bladwijzers"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Lege map"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Bladwijzers"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Instellingen"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Pagina-inhoud"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Meerdere tabbladen per app toestaan"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Afbeeldingen laden"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Afbeeldingen op webpagina\'s weergeven"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Pop-ups blokkeren"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Tekst voor automatisch aanvullen opgeslagen."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Tekst voor automatisch aanvullen verwijderd."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Verwijderen"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"De browser kan webformulieren zoals deze automatisch invullen. Wilt u uw instellingen voor het automatisch aanvullen van tekst opgeven?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"De browser kan webformulieren zoals deze automatisch invullen. Wilt u het automatisch aanvullen van tekst instellen?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"U kunt de tekst voor automatisch aanvullen altijd instellen via \'Browser\' &gt; \'Instellingen\' &gt; \'Algemeen\'."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Automatisch aanvullen uitschakelen"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacy en beveiliging"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Browser toestaan resultaten met hoog betrouwbaarheidsniveau vooraf te laden"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Zoekresultaten vooraf laden"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Webpagina vooraf laden"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nooit"</item>
+    <item msgid="1908465963242077428">"Alleen via wifi"</item>
+    <item msgid="7647277566998527142">"Altijd"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Toestaan dat de browser gekoppelde webpagina\'s vooraf laadt op de achtergrond"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Webpagina vooraf laden"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Verbindingsprobleem"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Bestandsprobleem"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Achtergrond instellen..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bladwijzers"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Geen bladwijzers."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Andere bladwijzers"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"J1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Account selecteren"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synchroniseren met Google-account"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index b99a181..532e361 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopiuj URL strony"</string>
     <string name="share_page" msgid="593756995297268343">"Udostępnij stronę"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Zapisz do czytania offline"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Zapisywanie…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Nie można zapisać do czytania w trybie offline."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Zakładki: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Pusty folder"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Zakładki"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Ustawienia"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Treść strony"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Zezwalaj na wiele kart na aplikację"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Wczytuj obrazy"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Wyświetlaj obrazy na stronach internetowych"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blokuj wyskakujące okna"</string>
@@ -136,7 +138,7 @@
     <item msgid="2484126708670016519">"Na żądanie"</item>
     <item msgid="8547442717307793863">"Wyłączona"</item>
   </string-array>
-    <string name="pref_content_open_in_background_summary" msgid="955411158407739504">"Otwieraj nowe karty za bieżącą."</string>
+    <string name="pref_content_open_in_background_summary" msgid="955411158407739504">"Otwieraj nowe karty za bieżącą"</string>
     <string name="pref_content_homepage" msgid="3324574611613105696">"Ustaw stronę główną"</string>
     <string name="pref_content_search_engine" msgid="1620101310821644144">"Ustaw wyszukiwarkę"</string>
     <string name="pref_content_search_engine_summary" msgid="304003941861818133">"Wybierz wyszukiwarkę."</string>
@@ -149,7 +151,7 @@
     <item msgid="6569304572171444894">"Inna"</item>
   </string-array>
     <string name="pref_content_autofit" msgid="8260474534053660809">"Autodopasowanie stron"</string>
-    <string name="pref_content_autofit_summary" msgid="324810555822572112">"Formatuj strony internetowe, aby dopasować je do ekranu."</string>
+    <string name="pref_content_autofit_summary" msgid="324810555822572112">"Formatuj strony internetowe, aby dopasować je do ekranu"</string>
     <string name="pref_general_title" msgid="1946872771219249323">"Ogólne"</string>
     <string name="pref_general_sync_title" msgid="3138637035975860324">"Synchronizacja"</string>
     <string name="pref_general_autofill_title" msgid="547881256865816858">"Autouzupełnianie"</string>
@@ -171,8 +173,8 @@
     <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"Adres, skrzynka pocztowa, adres korespondencyjny"</string>
     <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"Adres, wiersz 2:"</string>
     <string name="autofill_profile_editor_address_line_2_hint" msgid="8529642768127569254">"Mieszkanie, apartament, wydział, budynek, piętro itp."</string>
-    <string name="autofill_profile_editor_city" msgid="7306716145784997135">"Miasto/miejscowość:"</string>
-    <string name="autofill_profile_editor_state" msgid="2150403366835080407">"Województwo/region:"</string>
+    <string name="autofill_profile_editor_city" msgid="7306716145784997135">"Miejscowość:"</string>
+    <string name="autofill_profile_editor_state" msgid="2150403366835080407">"Województwo / region:"</string>
     <string name="autofill_profile_editor_zip_code" msgid="283668573295656671">"Kod pocztowy:"</string>
     <string name="autofill_profile_editor_country" msgid="7234470301239156656">"Kraj:"</string>
     <string name="autofill_profile_editor_phone_number" msgid="4938852821413729276">"Telefon:"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Autouzupełniany tekst został zapisany."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Autouzupełniany tekst został usunięty."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Usuń"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Przeglądarka może automatycznie wypełniać takie formularze internetowe. Chcesz skonfigurować autouzupełniany tekst?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Przeglądarka może automatycznie wypełniać takie formularze internetowe. Chcesz skonfigurować autouzupełnianie?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Zawsze możesz skonfigurować autouzupełniany tekst na ekranie Przeglądarka &gt; Ustawienia &gt; Ogólne."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Wyłącz autouzupełnianie"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Prywatność i bezpieczeństwo"</string>
@@ -242,7 +244,7 @@
   </string-array>
     <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Powiększenie domyślne"</string>
     <string name="pref_content_load_page" msgid="2219810141690955452">"Podgląd otwartej strony"</string>
-    <string name="pref_content_load_page_summary" msgid="9168803276420332955">"Pokaż widok ogólny nowo otwartych stron."</string>
+    <string name="pref_content_load_page_summary" msgid="9168803276420332955">"Pokaż widok ogólny nowo otwartych stron"</string>
     <string name="pref_extras_title" msgid="7075456173747370647">"Zaawansowane"</string>
     <string name="pref_extras_website_settings" msgid="67866640052455549">"Ustawienia witryn"</string>
     <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Ustawienia zaawansowane dla poszczególnych witryn"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Zezwalaj przeglądarce na wstępne wczytywanie wyników wyszukiwania w tle"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Wstępne wczytywanie wyników"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Wstępne wczytywanie stron"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nigdy"</item>
+    <item msgid="1908465963242077428">"Tylko przez Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Zawsze"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Zezwalaj przeglądarce na wstępne wczytywanie podlinkowanych stron internetowych w tle"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Wstępne wczytywanie stron"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problem z połączeniem"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problem z plikiem"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Ustawianie tapety…"</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Zakładki"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Brak zakładek"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Inne zakładki"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Wybierz konto"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synchronizuj z kontem Google"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index fd1bc6e..f48ac21 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Copiar URL da página"</string>
     <string name="share_page" msgid="593756995297268343">"Partilhar página"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Guardar para leitura off-line"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"A guardar..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Não foi possível guardar para leitura off-line."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> marcadores"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Pasta vazia"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Marcadores"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Definições"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Conteúdo da página"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Permitir vários separadores por aplic."</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Carregar imagens"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Apresentar imagens em páginas Web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Bloquear pop-ups"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Texto de preenchimento automático guardado."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Texto de preenchimento automático eliminado."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Eliminar"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"O navegador pode preencher automaticamente formulários Web como este. Pretende configurar o texto de preenchimento automático?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"O navegador pode preencher automaticamente formulários Web como este. Pretende configurar o texto de preenchimento automático?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Pode sempre configurar o texto de preenchimento automático no ecrã Navegador &gt; Definições &gt; Geral."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Desativar preenchimento automático"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacidade e segurança"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Permitir ao navegador pré-carreg. em 2º plano result. de pesq. de alta confiança"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Pré-carreg. dos resultados da pesquisa"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Pré-carregamento de páginas Web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nunca"</item>
+    <item msgid="1908465963242077428">"Apenas em Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Sempre"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Permitir que o navegador carregue prev. páginas Web associadas em segundo plano"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Pré-carregamento de páginas Web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problema de ligação"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problema no ficheiro"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"A definir imagem de fundo..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Marcadores"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Sem marcadores."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Outros Marcadores"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Escolher conta"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronizar com conta Google"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index f144851..c748d6c 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Copiar URL da página"</string>
     <string name="share_page" msgid="593756995297268343">"Compartilhar página"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Salvar para leitura off-line"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Salvando…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Não foi possível salvar para leitura off-line."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> favoritos"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Pasta vazia"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Favoritos"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Configurações"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Conteúdo da página"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Permitir várias guias por aplicativo"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Carregar imagens"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Exibir imagens nas páginas da web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Bloquear pop-ups"</string>
@@ -146,7 +148,7 @@
     <item msgid="4430498748295169195">"Página em branco"</item>
     <item msgid="5747608191946904074">"Página padrão"</item>
     <item msgid="6092441301001006473">"Sites mais visitados"</item>
-    <item msgid="6569304572171444894">"Outro"</item>
+    <item msgid="6569304572171444894">"Outra"</item>
   </string-array>
     <string name="pref_content_autofit" msgid="8260474534053660809">"Ajustar automaticamente"</string>
     <string name="pref_content_autofit_summary" msgid="324810555822572112">"Formatar páginas da web para se ajustarem à tela"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Texto de preenchimento automático salvo."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Texto de preenchimento automático excluído."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Excluir"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"O navegador pode preencher automaticamente formulários da web como este. Deseja configurar o preenchimento automático de texto?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"O navegador pode preencher automaticamente formulários da web como este. Deseja configurar o preenchimento automático de texto?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"É possível configurar o preenchimento automático de texto na tela Navegador &gt; Configurações &gt; Geral."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Desativar o preenchimento automático"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacidade e segurança"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Permitir ao naveg. pré-carr. result. de busca de alta confiança em segundo plano"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Pré-carregando resultados de pesquisa"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Pré-carregamento de página da web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nunca"</item>
+    <item msgid="1908465963242077428">"Apenas com Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Sempre"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Permitir que o navegador pré-carregue páginas relacionadas em segundo plano"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Pré-carregamento de página da web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problema na conexão"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problema no arquivo"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Definindo papel de parede..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Favoritos"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Não há favoritos."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Outros favoritos"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Escolher conta"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronizar com Conta do Google"</string>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index c70c6cd..2625581 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -139,6 +139,8 @@
     <string name="share_page" msgid="593756995297268343">"Barattar la pagina"</string>
     <!-- no translation found for menu_save_snapshot (6935080344031126139) -->
     <skip />
+    <!-- no translation found for saving_snapshot (1693789062351182809) -->
+    <skip />
     <!-- no translation found for snapshot_failed (4584580873565876033) -->
     <skip />
     <!-- no translation found for contextheader_folder_bookmarkcount (353987136645619089) -->
@@ -168,6 +170,8 @@
     <string name="menu_preferences" msgid="6709237687234102240">"Parameters"</string>
     <!-- no translation found for pref_content_title (3834107397725342174) -->
     <skip />
+    <!-- no translation found for pref_allow_apptabs (1325989799080202871) -->
+    <skip />
     <string name="pref_content_load_images" msgid="2125616852957377561">"Chargiar ils maletgs"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Mussar ils maletgs da las paginas web"</string>
     <!-- no translation found for pref_content_block_popups (4158524847764470895) -->
@@ -260,7 +264,7 @@
     <skip />
     <!-- no translation found for autofill_profile_editor_delete_profile (3098369314558164153) -->
     <skip />
-    <!-- no translation found for autofill_setup_dialog_message (1096164985825394616) -->
+    <!-- no translation found for autofill_setup_dialog_message (7123905786076456503) -->
     <skip />
     <!-- no translation found for autofill_setup_dialog_negative_toast (3288881675232206984) -->
     <skip />
@@ -402,6 +406,15 @@
     <skip />
     <!-- no translation found for pref_data_preload_dialogtitle (8421297746110796536) -->
     <skip />
+    <!-- no translation found for pref_link_prefetch_title (4123685219009241072) -->
+    <skip />
+    <!-- no translation found for pref_link_prefetch_choices:0 (4889781230398008031) -->
+    <!-- no translation found for pref_link_prefetch_choices:1 (1908465963242077428) -->
+    <!-- no translation found for pref_link_prefetch_choices:2 (7647277566998527142) -->
+    <!-- no translation found for pref_link_prefetch_summary (6558181497993206817) -->
+    <skip />
+    <!-- no translation found for pref_link_prefetch_dialogtitle (3804646141622839765) -->
+    <skip />
     <!-- no translation found for browserFrameNetworkErrorLabel (8102515020625680714) -->
     <skip />
     <!-- no translation found for browserFrameFileErrorLabel (4703792279852977350) -->
@@ -493,6 +506,8 @@
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Segnapaginas"</string>
     <!-- no translation found for empty_bookmarks_folder (6239830231917618556) -->
     <skip />
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <!-- no translation found for account_chooser_dialog_title (3314204833188808194) -->
     <!-- no translation found for account_chooser_dialog_title (4833571985009544332) -->
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 32bca42..c84920b 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Copiaţi adresa URL a paginii"</string>
     <string name="share_page" msgid="593756995297268343">"Distribuiţi pagina"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Salvaţi pentru lectură offline"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Se salvează..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Nu s-a putut salva pentru citire offline."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> (de) marcaje"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Dosar gol"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Marcaje"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Setări"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Conţinutul paginii"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Permiteţi mai multe file per aplicaţie"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Încărcaţi imagini"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Afişaţi imagini din paginile web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blocaţi ferestre de tip pop-up"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Textul pentru completare automată a fost salvat."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Textul pentru completarea automată a fost şters."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Ştergeţi"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Browserul poate completa automat formulare web ca acesta. Doriţi să configuraţi textul pentru completarea automată?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Browserul poate completa automat formulare web ca acesta. Doriţi să configuraţi textul pentru completarea automată?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Puteţi configura oricând textul dvs. pentru completarea automată din ecranul Browser &gt; Setări &gt; General."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Dezactivaţi completarea automată"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Confidenţialitate şi securitate"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Permiteţi browserului să preîncarce în fundal rez. căut. cu încredere ridicată"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Se preîncarcă rezultatele căutării"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Preîncărcare pagină web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Niciodată"</item>
+    <item msgid="1908465963242077428">"Numai pe Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Întotdeauna"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Permiteţi browserului să preîncarce pagini web conectate în fundal"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Preîncărcare pagină web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problemă de conexiune"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problemă cu fişierul"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Se setează imaginea de fundal..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Marcaje"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Nu există marcaje."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Alte marcaje"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Alegeţi un cont"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sincronizaţi cu un Cont Google"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 850e13e..0b3ef6e 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Скопировать URL страницы"</string>
     <string name="share_page" msgid="593756995297268343">"Отправить страницу"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Сохранить страницу"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Сохранение…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Не удалось сохранить страницу."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Закладок: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Папка пуста"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Закладки"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Настройки"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Содержание страницы"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Разрешить открывать несколько вкладок"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Загружать графику"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Показывать изображения на веб-страницах"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Блокир. всплыв. окна"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Текст автозаполнения сохранен."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Текст автозаполнения удален."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Удалить"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Браузер может автоматически заполнять такие веб-формы. Включить автозаполнение?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Браузер может автоматически заполнять такие веб-формы. Включить автозаполнение?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Автозаполнение можно настроить в общих настройках браузера."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Отключить автозаполнение"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Личные данные"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Разрешить браузеру предварительно загружать результаты поиска в фоновом режиме"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Загрузка результатов поиска"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Предзагрузка веб-страниц"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Никогда"</item>
+    <item msgid="1908465963242077428">"Только через Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Всегда"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Предварительно загружать веб-страницы в фоновом режиме"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Предзагрузка веб-страниц"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Ошибка подключения"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Проблема с файлом"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -293,7 +303,7 @@
     <string name="go_home" msgid="109129207276086793">"Домашняя страница"</string>
     <string name="add_new_bookmark" msgid="3158497555612337238">"Добавить закладку"</string>
     <string name="add_bookmark_short" msgid="3783984330998103735">"Добавить"</string>
-    <string name="search_hint" msgid="4647356319916631820">"Условия поиска или URL"</string>
+    <string name="search_hint" msgid="4647356319916631820">"Введите запрос или URL"</string>
     <string name="search_button_text" msgid="5235226933877634410">"Поиск"</string>
     <string name="search_settings_description" msgid="1422401062529014107">"Закладки и история поиска"</string>
     <string name="popup_window_attempt" msgid="31565781154067629">"Открыть всплывающее окно с этого сайта?"</string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Установка обоев..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Закладки"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Нет закладок"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Другие закладки"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Выберите аккаунт"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Синхронизация с аккаунтом Google"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index b100d14..b63ef48 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopírovať adresu URL stránky"</string>
     <string name="share_page" msgid="593756995297268343">"Zdieľať stránku"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Uložiť na čítanie offline"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Prebieha ukladanie..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Nepodarilo sa uložiť na čítanie v režime offline."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Počet záložiek: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Prázdny priečinok"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Záložky"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Nastavenia"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Obsah stránky"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Povoliť viac kariet na aplikáciu"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Načítať obrázky"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Zobrazovať obrázky na webových stránkach"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blokovať kontextové okná"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Automaticky dopĺňaný text bol uložený."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Automaticky dopĺňaný text bol odstránený."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Odstrániť"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Podobné webové formuláre môže prehliadač vypĺňať automaticky. Chcete nastaviť automatické dopĺňanie textu?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Podobné webové formuláre môže prehliadač vypĺňať automaticky. Chcete nastaviť automatické dopĺňanie textu?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Automatické dopĺňanie textu môžete v prehliadači kedykoľvek nastaviť v časti Nastavenia &gt; Hlavná obrazovka."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Zakázať automatické dopĺňanie"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Ochrana osobných údajov a zabezpečenie"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Umožniť prehliadaču predbežne na pozadí načítať relevantné výsledky vyhľadávania"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Predbežné načít. výsledkov vyhľadávania"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Predbežné načítanie webovej stránky"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nikdy"</item>
+    <item msgid="1908465963242077428">"Len v sieti Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Vždy"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Povoliť prehliadaču predbežne načítať prepojené webové stránky na pozadí"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Predbežné načítanie webovej stránky"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problém s pripojením"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problém so súborom"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Prebieha nastavenie tapety..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Záložky"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Žiadne záložky."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Iné záložky"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Vyberte účet"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synchronizovať s účtom Google"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index c512488..bcb535f 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopiraj URL strani"</string>
     <string name="share_page" msgid="593756995297268343">"Stran deli z drugimi"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Shrani za branje brez povezave"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Shranjevanje ..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Ni bilo mogoče shraniti za branje brez povezave."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Število zaznamkov: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Prazna mapa"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Zaznamki"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Nastavitve"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Vsebina strani"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Dovoli več zavihkov na aplikacijo"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Naloži slike"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Prikaži slike na spletnih straneh"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blokiraj pojavna okna"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Besedilo za samodejno izpolnjevanje je bilo shranjeno."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Besedilo za samodejno izpolnjevanje je bilo izbrisano."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Izbriši"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Brskalnik lahko samodejno izpolni spletne obrazce, kot je ta. Ali želite nastaviti besedilo za samodejno izpolnjevanje?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Brskalnik lahko samodejno izpolni spletne obrazce, kot je ta. Ali želite nastaviti besedilo za samodejno izpolnjevanje?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Besedilo za samodejno izpolnjevanje lahko vedno nastavite na zaslonu Brskalnik &gt; Nastavitve &gt; Splošno."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Onemogoči samodejno izpolnjevanje"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Zasebnost in varnost"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Brskalnik lahko rezultate z veliko zanesljivostjo vnaprej nalaga v ozadju"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Vnaprejšnje nalaganje rezultatov iskanja"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Vnaprejšnje nalaganje spletnih strani"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Nikoli"</item>
+    <item msgid="1908465963242077428">"Samo v omrežju Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Vedno"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Dovoli brskalniku vnaprejšnje nalaganje povezanih spletnih strani v ozadju"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Vnaprejšnje nalaganje spletnih strani"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Težava s povezavo"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Težava z datoteko"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Nastavljanje slike za ozadje ..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Zaznamki"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Ni zaznamkov."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Drugi zaznamki"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Izberite račun"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sinhroniziraj z Google Računom"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 5bc8433..2933c21 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Копирај URL адресу странице"</string>
     <string name="share_page" msgid="593756995297268343">"Дели страницу"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Сачувај за читање ван мреже"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Чување…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Није било могуће сачувати за читање ван мреже."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> обележивача"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Празан директоријум"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Обележивачи"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Подешавања"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Садржај странице"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Дозволи више картица по апликацији"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Учитај слике"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Прикажи слике на веб страницама"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Блокирај искачуће прозоре"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Текст за аутоматско попуњавање је сачуван."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Текст за аутоматско попуњавање је избрисан."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Избриши"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Прегледач може аутоматски да попуњава веб обрасце попут овог. Желите ли да подесите текст за аутоматско попуњавање?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Прегледач може аутоматски да попуњава веб обрасце попут овог. Желите ли да подесите текст за аутоматско попуњавање?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Увек можете да подесите текст за аутоматско попуњавање на екрану Прегледач &gt; Подешавања &gt; Опште."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Онемогући аутоматско попуњавање"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Приватност и безбедност"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Дозволите да прегледач у позадини унапред учита јако поуздане резултате претраге"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Учитавање резултата претраге унапред"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Учитавање веб странице унапред"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Никада"</item>
+    <item msgid="1908465963242077428">"Само преко Wi-Fi-ја"</item>
+    <item msgid="7647277566998527142">"Увек"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Дозволи да прегледач у позадини унапред учитава повезане веб странице"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Учитавање веб странице унапред"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Проблем са везом"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Проблем са датотеком"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Подешавање позадине..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Обележивачи"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Нема обележивача."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Други обележивачи"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Избор налога"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Синхронизуј са Google налогом"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 48874a0..fc4b51b 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopiera sidans webbadress"</string>
     <string name="share_page" msgid="593756995297268343">"Dela sida"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Spara för läsning offline"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Sidan sparas …"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Det gick inte att spara för läsning offline."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> bokmärken"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Tom mapp"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Bokmärken"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Inställningar"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Sidinnehåll"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Tillåt flera flikar per app"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Överför bilder"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Visa bilder på webbsidor"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Blockera popupfönster"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Text för autofyll har sparats."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Text för autofyll har tagits bort."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Ta bort"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Den här typen av webbformulär kan fyllas i automatiskt. Vill du ange en text för autofyll?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Den här typen av webbformulär kan fyllas i automatiskt. Vill du ange en text för autofyll?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Du kan alltid ange texten för autofyll på skärmen Webbläsare &gt; Inställningar &gt; Allmänt."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Inaktivera Autofyll"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Sekretess och säkerhet"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Låt webbläsaren läsa in säkra sökresultat i förväg i bakgrunden"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Läser in sökresultat i förväg"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Läser in webbsida i förväg"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Aldrig"</item>
+    <item msgid="1908465963242077428">"Endast på Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Alltid"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Låt webbläsaren läsa in länkade webbsidor i bakgrunden i förväg"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Läser in webbsida i förväg"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Anslutningsproblem"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Filproblem"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Bakgrund ställs in ..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Bokmärken"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Inga bokmärken."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Övriga bokmärken"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Välj konto"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Synkronisera med Google-konto"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 4883c84..7892959 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Nakili URL ya ukurasa"</string>
     <string name="share_page" msgid="593756995297268343">"Shiriki ukurasa"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Hifadhi kwa usomaji wa nje ya mtandao"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Inahifadhi…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Haikuweza kuhifadhi usomaji mkondoni."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Alamisho <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Folda iko tupu"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Alamisho"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Mipangilio"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Maudhui ya ukurasa"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Ruhusu vihupo vingi kwa programu moja"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Pakia picha"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Onyesha picha kwenye kurasa za wavuti"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Zuia madirisha ibukizi"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Maandishi kujaza-oto yamehifadhiwa."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Maandishi ya oto-kujaza imefutwa."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Futa"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Kivinjari inaweza kukamilisha kiotomatiki fomu za wavuti kama hii. Je ungependa kusanidi maandishi ya kujaza-oto?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Kivinjari kinaweza kukamilisha kiotomati fomu za wavuti kama hii. Je, unataka kusanidi maandishi yako ya jaza-oto?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Wakati wowote unaweza kusanidi oto-kujaza maandishi kutoka kwa Broswer &gt; Settings &gt; Skrini ya kawaida."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Zima uwezo wa kujaza kiotomatiki"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Faragha na Usalama"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Ruhusu kivinjari kipakie matokeo ya utafutaji wa ubora wa juu katika usuli"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Matokea ya utafiti yanaandaliwa"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Upakiaji mapema wa ukurasa wavuti"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Kamwe"</item>
+    <item msgid="1908465963242077428">"Kwenye Wi-Fi tu"</item>
+    <item msgid="7647277566998527142">"Daima"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Ruhusu kivinjari kupakia mapema ukurasa wavuti uliounganishwa katika usuli"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Upakiaji mapema wa ukurasa wavuti"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Tatizo la muunganisho"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Tatizo la picha"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Inaweka karatasi ya ukuta..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Alamisho"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Hakuna alamisho"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Alamisho Zingine"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Chagua akaunti"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Sawazisha kwa akaunti ya Google"</string>
diff --git a/res/values-sw600dp-port/bools.xml b/res/values-sw600dp-port/bools.xml
new file mode 100644
index 0000000..245b2a0
--- /dev/null
+++ b/res/values-sw600dp-port/bools.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2012 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.
+-->
+<resources
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- hide the title bar -->
+    <bool name="hide_title">false</bool>
+</resources>
diff --git a/res/values-sw600dp/dimensions.xml b/res/values-sw600dp/dimensions.xml
index ed75f60..68235c9 100644
--- a/res/values-sw600dp/dimensions.xml
+++ b/res/values-sw600dp/dimensions.xml
@@ -17,16 +17,16 @@
     <dimen name="widgetColumnWidth">130dip</dimen>
     <dimen name="favicon_padded_size">28dip</dimen>
     <dimen name="add_bookmark_width">500dip</dimen>
-    <!-- For the most visited page -->
-    <dimen name="mv_max_width">1010dp</dimen>
-    <dimen name="mv_item_width">231dp</dimen>
-    <dimen name="mv_item_width_portrait">213dp</dimen>
-    <dimen name="mv_border_width">3dp</dimen>
+    <!-- For the most visited page (we use px as these are adjusted by the browser) -->
+    <dimen name="mv_max_width">1010px</dimen>
+    <dimen name="mv_item_width">231px</dimen>
+    <dimen name="mv_item_width_portrait">213px</dimen>
+    <dimen name="mv_border_width">3px</dimen>
     <!-- For the combined Bookmarks History view -->
     <dimen name="combo_paddingTop">50dip</dimen>
     <dimen name="combo_horizontalSpacing">8dip</dimen>
-    <dimen name="qc_radius_start">50dip</dimen>
-    <dimen name="qc_radius_increment">70dip</dimen>
+    <dimen name="qc_radius_start">75dip</dimen>
+    <dimen name="qc_radius_increment">90dip</dimen>
     <dimen name="qc_slop">15dip</dimen>
     <dimen name="qc_touch_offset">15dip</dimen>
     <dimen name="qc_tab_title_height">30dip</dimen>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index c5a08f9..c0fabd5 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"คัดลอก URL ของหน้าเว็บ"</string>
     <string name="share_page" msgid="593756995297268343">"แบ่งปันหน้าเว็บ"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"บันทึกไว้อ่านออฟไลน์"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"กำลังบันทึก…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"ไม่สามารถบันทึกไว้อ่านแบบออฟไลน์ได้"</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"บุ๊กมาร์ก <xliff:g id="BOOKMARK_COUNT">%d</xliff:g> รายการ"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"โฟลเดอร์ว่าง"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"บุ๊กมาร์ก"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"การตั้งค่า"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"เนื้อหาของหน้าเว็บ"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"อนุญาตให้ใช้หลายแท็บต่อแอปพลิเคชัน"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"โหลดภาพ"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"แสดงรูปภาพบนหน้าเว็บ"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"ปิดกั้นป๊อปอัป"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"บันทึกการป้อนข้อความอัตโนมัติแล้ว"</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"ลบการป้อนข้อความอัตโนมัติแล้ว"</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"ลบ"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"เบราว์เซอร์สามารถกรอกเว็บฟอร์มโดยอัตโนมัติได้เหมือนกับฟอร์มนี้ คุณต้องการตั้งค่าการป้อนข้อความอัตโนมัติหรือไม่"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"เบราว์เซอร์สามารถกรอกเว็บฟอร์มโดยอัตโนมัติได้เหมือนกับฟอร์มนี้ คุณต้องการตั้งค่าการป้อนข้อความอัตโนมัติหรือไม่"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"คุณสามารถตั้งค่าการป้อนข้อความอัตโนมัติจากหน้าจอเบราว์เซอร์ &gt; การตั้งค่า &gt; ทั่วไป ได้เสมอ"</string>
     <string name="disable_autofill" msgid="8305901059849400354">"ปิดใช้งานการป้อนอัตโนมัติ"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"ข้อมูลส่วนบุคคลและความปลอดภัย"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"อนุญาตให้เบราว์เซอร์โหลดผลการค้นหาที่เชื่อถือได้สูงก่อนล่วงหน้าในเบื้องหลัง"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"การโหลดผลการค้นหาล่วงหน้า"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"การโหลดหน้าเว็บล่วงหน้า"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"ไม่มี"</item>
+    <item msgid="1908465963242077428">"WiFi เท่านั้น"</item>
+    <item msgid="7647277566998527142">"ทุกครั้ง"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"อนุญาตให้เบราว์เซอร์โหลดหน้าเว็บที่ลิงก์กันล่วงหน้าในพื้นหลัง"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"การโหลดหน้าเว็บล่วงหน้า"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"ปัญหาการเชื่อมต่อ"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"ปัญหาเกี่ยวกับไฟล์"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"กำลังตั้งค่าวอลเปเปอร์..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"บุ๊กมาร์ก"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ไม่มีบุ๊กมาร์ก"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"บุ๊กมาร์กอื่นๆ"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"เลือกบัญชี"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"ซิงค์กับบัญชี Google"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index dfbf947..02e97c1 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopyahin ang URL ng pahina"</string>
     <string name="share_page" msgid="593756995297268343">"Ibahagi ang pahina"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"I-save para sa offline na pagbabasa"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Sine-save..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Hindi ma-save para sa offline na pagbabasa."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> (na) bookmark"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Walang lamang folder"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Mga Bookmark"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Mga Setting"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Nilalaman ng pahina"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Payagan ang maraming tab bawat app"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"I-load ang mga larawan"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Ipakita ang mga larawan sa mga web page"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"I-block ang mga pop-up"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Na-save ang auto-fill text."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Tinanggal ang auto-fill text."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Tanggalin"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Maaaring awtomatikong kumpletuhin ng browser ang mga web form tulad nito. Gusto mo bang i-set up ang iyong auto-fill text?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Awtomatikong makapagkukumpleto ang browser ng mga form sa web tulad nito. Nais mo bang i-set up ang iyong auto-fill na teksto?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Maaari mong i-set up ang iyong auto-fill text anumang oras mula sa Browser &gt; Mga Setting &gt; Pangkalahatang screen."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Huwag paganahin ang auto-fill"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Privacy at seguridad"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Payagan ang browser na mag-preload ng may mataas na kumpiyansyang mga resulta ng paghahanap sa background"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Paunang pagload sa resulta ng paghahanap"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Paunang naglo-load ang web page"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Hindi kailanman"</item>
+    <item msgid="1908465963242077428">"Sa Wi-Fi lamang"</item>
+    <item msgid="7647277566998527142">"Palagi"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Payagan ang browser na paunang i-load ang mga na-link na web page sa background"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Paunang naglo-load ang web page"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Problema sa koneksyon"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Problema sa file"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Itinatakda ang wallpaper…"</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Mga Bookmark"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Walang mga bookmark."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Iba Pang Mga Bookmark"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Pumili ng account"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Mag-sync sa Google account"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index ed27976..9c7451b 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Sayfa URL\'sini kopyala"</string>
     <string name="share_page" msgid="593756995297268343">"Sayfayı paylaş"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Çevrimdışı okuma için kaydet"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Kaydediliyor…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Çevrimdışı okuma için kaydedilemedi."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> yer işareti"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Boş klasör"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Favoriler"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Ayarlar"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Sayfa içeriği"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Uygulama başına birden çok sekmeye izin ver"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Görselleri yükle"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Web sayfalarındaki görselleri görüntüle"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Pop-up\'ları engelle"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Otomatik doldurma metni kaydedildi."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Otomatik doldurma metni silindi."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Sil"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Tarayıcı, bunun gibi web formlarını otomatik olarak doldurabilir. Otomatik doldurma metninizi ayarlamak ister misiniz?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Tarayıcı, bunun gibi web formlarını otomatik olarak doldurabilir. Otomatik doldurma metninizi ayarlamak ister misiniz?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Otomatik doldurma metninizi istediğiniz zaman Tarayıcı &gt; Ayarlar &gt; Genel ekranından ayarlayabilirsiniz."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Otomatik doldurmayı devre dışı bırak"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Gizlilik ve güvenlik"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Tarayıcının yüksek güvenli arama sonuçlarını arka planda önyüklemesine izin ver"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Arama sonucunu önyükleme"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Web sayfasını önceden yükle"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Hiçbir zaman"</item>
+    <item msgid="1908465963242077428">"Yalnızca Kablosuzda"</item>
+    <item msgid="7647277566998527142">"Her zaman"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Tarayıcının, bağlantılı sayfaları arka planda önceden yüklemesine izin ver"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Web sayfasını önceden yükle"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Bağlantı sorunu"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Dosya sorunu"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Duvar kağıdı ayarlanıyor..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Yer işaretleri"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Yer işareti yok."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Diğer Yer İşaretleri"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Hesap seçin"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Google hesabı ile senkronize et"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index d064872..3e41c8e 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Копіювати URL-адресу сторінки"</string>
     <string name="share_page" msgid="593756995297268343">"Надісл. стор."</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Зберегти для читання в режимі офлайн"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Збереження…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Не вдалося зберегти для читання в режимі офлайн."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Закладок: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Порожня папка"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Закладки"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Налаштув-ня"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Вміст сторінки"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Дозволяти кілька вкладок на програму"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Завантаж. зобр."</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Відобр. зображ. на веб-стор."</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Блокувати спливаючі вікна"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Текст автозаповнення збережено."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Текст автозаповнення видалено."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Видалити"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Веб-переглядач може автоматично заповнювати подібні веб-форми. Налаштувати текст автозаповнення?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Веб-переглядач може автоматично заповнювати подібні веб-форми. Налаштувати текст автозаповнення?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Ви завжди можете налаштувати текст автозаповнення на екрані Веб-переглядач &gt; Налаштування &gt; Загальні."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Вимкнути автозаповнення"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Конфіденційність і безпека"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Дозволити веб-перегл. попередньо завантаж. достовірні рез-ти пошуку у фонов.реж."</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Попереднє завантаж. результатів пошуку"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Попереднє завантаження веб-сторінок"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Ніколи"</item>
+    <item msgid="1908465963242077428">"Лише у Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Завжди"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Дозволити веб-перегл. попередньо завантаж. пов’язані веб-сторінки у фонов. реж."</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Попереднє завантаження веб-сторінок"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Проблема з’єднання"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Проблема з файлом"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Встановлення фонового малюнка…"</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Закладки"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Закладок немає."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Інші закладки"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Виберіть обліковий запис"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Синхроніз. з обл. записом Google"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index f49ed21..32e232d 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Sao chép url của trang"</string>
     <string name="share_page" msgid="593756995297268343">"Chia sẻ trang"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Lưu để đọc ngoại tuyến"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Đang lưu…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Không thể lưu để đọc ngoại tuyến."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> dấu trang"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Thư mục trống"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Dấu trang"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Cài đặt"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Nội dung trang"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Cho phép nhiều tab mỗi ứng dụng"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Tải hình ảnh"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Hiển thị hình ảnh trên trang web"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Chặn cửa sổ bật lên"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Đã lưu văn bản tự động điền."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Đã xóa văn bản tự động điền."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Xóa"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Trình duyệt có thể tự động hoàn tất các biểu mẫu web giống như biểu mẫu này. Bạn có muốn thiết lập văn bản tự động điền của mình không?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Trình duyệt có thể tự động hoàn tất các biểu mẫu web giống như biểu mẫu này. Bạn có muốn thiết lập văn bản tự động điền của mình không?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Bạn luôn có thể thiết lập văn bản tự động điền của mình từ màn hình Trình duyệt &gt; Cài đặt &gt; Chung."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Tắt tính năng tự động điền"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Riêng tư &amp; bảo mật"</string>
@@ -263,7 +265,7 @@
     <item msgid="2193955365569270096">"Tiếng Hàn (EUC-KR)"</item>
   </string-array>
     <string name="pref_default_text_encoding_dialogtitle" msgid="5508255018084978547">"Mã hóa văn bản"</string>
-    <string name="pref_accessibility_title" msgid="5127836981587423215">"Khả năng truy cập"</string>
+    <string name="pref_accessibility_title" msgid="5127836981587423215">"Hỗ trợ truy cập"</string>
     <string name="pref_font_size_category" msgid="6683754355084218254">"Kích thước văn bản"</string>
     <string name="pref_lab_title" msgid="5571091610359629423">"Lab"</string>
     <string name="pref_lab_quick_controls" msgid="3267606522082281367">"Các điều khiển nhanh"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Cho phép trình duyệt tải trước các kết quả tìm kiếm có độ tin cậy cao trong nền"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Tải trước kết quả tìm kiếm"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Tải trước trang web"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Không bao giờ"</item>
+    <item msgid="1908465963242077428">"Chỉ trên Wi-Fi"</item>
+    <item msgid="7647277566998527142">"Luôn bật"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Cho phép trình duyệt tải trước các trang web liên kết trong nền"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Tải trước trang web"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Sự cố kết nối"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Sự cố tệp"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Đang đặt hình nền..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Dấu trang"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Không có dấu trang nào."</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Dấu trang khác"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Chọn tài khoản"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Đồng bộ hóa với tài khoản Google"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index ba3a71d..b774521 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"复制网页网址"</string>
     <string name="share_page" msgid="593756995297268343">"分享网页"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"保存以供离线阅读"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"正在保存..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"无法保存以供离线阅读。"</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> 个书签"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"空文件夹"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"书签"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"设置"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"网页内容"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"允许一个应用使用多个标签页"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"载入图片"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"显示网页上的图片"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"阻止弹出式窗口"</string>
@@ -168,7 +170,7 @@
     <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"电子邮件地址:"</string>
     <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"公司名称:"</string>
     <string name="autofill_profile_editor_address_line_1" msgid="836433242509243081">"地址行 1:"</string>
-    <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"街道地址、邮政信箱、转交"</string>
+    <string name="autofill_profile_editor_address_line_1_hint" msgid="5965659598509327172">"街道地址、邮政信箱、转交人"</string>
     <string name="autofill_profile_editor_address_line_2" msgid="8194745202893822479">"地址行 2:"</string>
     <string name="autofill_profile_editor_address_line_2_hint" msgid="8529642768127569254">"公寓、套房、单元、楼栋、楼层等等。"</string>
     <string name="autofill_profile_editor_city" msgid="7306716145784997135">"城市/乡镇:"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"自动填充文本已保存。"</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"自动填充文本已删除。"</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"删除"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"浏览器可以自动填写与此类似的网络表单。您要设置自动填充文本吗?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"浏览器可以自动填写与此类似的网络表单。要设置自动填充文字吗?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"您可以随时通过“浏览器”&gt;“设置”&gt;“常规”屏幕设置自动填充文本。"</string>
     <string name="disable_autofill" msgid="8305901059849400354">"停用自动填充"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"隐私和安全"</string>
@@ -267,7 +269,7 @@
     <string name="pref_font_size_category" msgid="6683754355084218254">"文字大小"</string>
     <string name="pref_lab_title" msgid="5571091610359629423">"实验室"</string>
     <string name="pref_lab_quick_controls" msgid="3267606522082281367">"快速控制"</string>
-    <string name="pref_lab_quick_controls_summary" msgid="3149664132600968775">"从左侧或右侧边缘滑动拇指可打开快速控件并隐藏应用程序和网址栏"</string>
+    <string name="pref_lab_quick_controls_summary" msgid="3149664132600968775">"从左侧或右侧边缘滑动拇指可打开快速控件并隐藏应用和网址栏"</string>
     <string name="pref_use_instant_search" msgid="1119176077760723740">"Google 即搜即得"</string>
     <string name="pref_use_instant_search_summary" msgid="839320474961917522">"借助 Google 即搜即得,您可以在使用 Google 搜索时一边键入内容一边查看结果(此功能可能会增加数据使用量)。"</string>
     <string name="pref_lab_fullscreen" msgid="8173609016657987973">"全屏"</string>
@@ -275,12 +277,20 @@
     <string name="pref_data_title" msgid="7255058703417796578">"带宽管理"</string>
     <string name="pref_data_preload_title" msgid="4479320472980292873">"搜索结果预加载"</string>
   <string-array name="pref_data_preload_choices">
-    <item msgid="5180466923190095508">"从不"</item>
+    <item msgid="5180466923190095508">"永不"</item>
     <item msgid="1791664748778640002">"仅限 Wi-Fi"</item>
     <item msgid="3944061253437827617">"始终"</item>
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"允许浏览器在后台预加载相关度高的搜索结果"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"搜索结果预加载"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"网页预加载"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"永不"</item>
+    <item msgid="1908465963242077428">"仅限 Wi-Fi"</item>
+    <item msgid="7647277566998527142">"始终"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"允许浏览器在后台预加载链接的网页"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"网页预加载"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"连接问题"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"文件问题"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -312,7 +322,7 @@
     <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="8412543086906716875">"USB 存储设备正忙。要允许下载,请在通知中触摸“关闭 USB 存储设备”。"</string>
     <string name="download_sdcard_busy_dlg_msg" product="default" msgid="2629425950473358591">"SD 卡正忙。要允许下载,请在通知中触摸“关闭 USB 存储设备”。"</string>
     <string name="cannot_download" msgid="8150552478556798780">"只能从“http”或“https”网址下载。"</string>
-    <string name="download_pending" msgid="2599683668575349559">"正在准备下载..."</string>
+    <string name="download_pending" msgid="2599683668575349559">"开始下载..."</string>
     <string name="search_the_web" msgid="6046130189241962337">"搜索网页"</string>
     <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"浏览器存储空间已满"</string>
     <string name="webstorage_outofspace_notification_text" msgid="47273584426988640">"触摸可释放空间。"</string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"正在设置壁纸..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"书签"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"没有书签。"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"其他书签"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"选择帐户"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"与 Google 帐户同步"</string>
@@ -350,8 +361,8 @@
     <string name="import_bookmarks_dialog_confirm_delete" msgid="2204771572755630570">"要删除此设备上的当前书签,并开始与 <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g> 同步书签吗?"</string>
     <string name="import_bookmarks_dialog_confirm_add" msgid="8942794112340838111">"要添加此设备上的当前书签,并开始与 <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g> 同步书签吗?"</string>
     <string name="import_bookmarks_dialog_remove" msgid="5984607822851800902">"删除书签"</string>
-    <string name="import_bookmarks_wizard_next" msgid="7578143961884352676">"下一页"</string>
-    <string name="import_bookmarks_wizard_previous" msgid="8551440353688257031">"上一页"</string>
+    <string name="import_bookmarks_wizard_next" msgid="7578143961884352676">"下一步"</string>
+    <string name="import_bookmarks_wizard_previous" msgid="8551440353688257031">"上一步"</string>
     <string name="import_bookmarks_wizard_cancel" msgid="4936061122806506634">"取消"</string>
     <string name="import_bookmarks_wizard_done" msgid="1446247092194489191">"完成"</string>
     <string name="import_bookmarks_dialog_add" msgid="1743359725294101189">"将书签添加到 Google 帐户中"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 02eefbb..39c49b2 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"複製網頁網址"</string>
     <string name="share_page" msgid="593756995297268343">"分享網頁"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"儲存頁面以供離線閱讀"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"儲存中…"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"無法儲存網頁以供離線閱讀。"</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> 個書籤"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"空資料夾"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"書籤"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"設定"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"網頁內容"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"允許單一應用程式開啟多個分頁"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"載入圖片"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"顯示網頁上的圖片"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"封鎖彈出式視窗"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"已儲存自動填入文字。"</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"已刪除自動填入文字。"</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"刪除"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"瀏覽器可以自動完成這類網路表單,您要設定自動填入文字嗎?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"瀏覽器可以自動輸入這類網路表單,您要設定自動填入文字嗎?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"您隨時可以前往 [瀏覽器] &gt; [設定] &gt; [一般] 畫面設定自動填入文字。"</string>
     <string name="disable_autofill" msgid="8305901059849400354">"停用自動填入功能"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"隱私權與安全性"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"允許瀏覽器在背景預先載入可信度高的搜尋結果"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"預先載入搜尋結果"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"網頁預先載入"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"一律不預先載入"</item>
+    <item msgid="1908465963242077428">"僅限 Wi-Fi 連線時載入"</item>
+    <item msgid="7647277566998527142">"一律預先載入"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"允許瀏覽器在背景預先載入已連結的網頁"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"網頁預先載入"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"發生連線問題"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"檔案發生問題"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"正在設定桌布..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"書籤"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"沒有書籤。"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"其他書籤"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"選擇帳戶"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"與 Google 帳戶保持同步"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index a625e0b..1006e94 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -102,6 +102,7 @@
     <string name="copy_page_url" msgid="1188679152608889555">"Kopisha i-url yekhasi"</string>
     <string name="share_page" msgid="593756995297268343">"Yabelana ngekhasi"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Gcina ukufunda ungaxhumekile kwi-inthanethi"</string>
+    <string name="saving_snapshot" msgid="1693789062351182809">"Iyalondoloza..."</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Angikwazanga ukulondolozela ukufunda ngaphandle kwe-inthanethi."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> amabhukimakhi"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Ifolda engenalutho"</string>
@@ -125,6 +126,7 @@
     <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Amabhukimakhi"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Izilungiselelo"</string>
     <string name="pref_content_title" msgid="3834107397725342174">"Okuqukethwe ekhasini"</string>
+    <string name="pref_allow_apptabs" msgid="1325989799080202871">"Vumela amathebhu amaningi ngohlelo lokusebenza ngalunye"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Hlohla izithombe"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Bonisa izithombe emakhasini lewebhu"</string>
     <string name="pref_content_block_popups" msgid="4158524847764470895">"Vimba ama-pop-ups"</string>
@@ -181,7 +183,7 @@
     <string name="autofill_profile_successful_save" msgid="5691459703493331983">"Ukuzifakekela kombhalo kulondoloziwe."</string>
     <string name="autofill_profile_successful_delete" msgid="1790262652460723127">"Ukuzifakekela kwamagama kususiwe."</string>
     <string name="autofill_profile_editor_delete_profile" msgid="3098369314558164153">"Susa"</string>
-    <string name="autofill_setup_dialog_message" msgid="1096164985825394616">"Isiphequluli singazigcwalisela amafomu ewebhu afana nalawa. Ungathanda ukulungisa uhlelo lokuzigcwalisela umbhalo?"</string>
+    <string name="autofill_setup_dialog_message" msgid="7123905786076456503">"Isiphequluli singaqedela amafomu ewebhu afana laleli. Ufuna ukusetha umbhalo wakho wokuqedela ngokuzenzakalela?"</string>
     <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"Ungakwazi njalo ukuthi usethe ukuzifakekela kombhalo usuka Esipheqululini &gt; Izisetho &gt; Iskrini esijwayelekile."</string>
     <string name="disable_autofill" msgid="8305901059849400354">"Khubaza ukufaka-okuzenzakalelayo"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Ubumfihlo nokuvikela"</string>
@@ -281,6 +283,14 @@
   </string-array>
     <string name="pref_data_preload_summary" msgid="3809168910751382727">"Vumela isiphequluli silayishe ngaphambilini imiphumelo ethenjwayo ngaphezulu yosesho esizindeni"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Isalayisha imiphumela yokusesha"</string>
+    <string name="pref_link_prefetch_title" msgid="4123685219009241072">"Ukulayisha kuqala kwekhasi lewebhu"</string>
+  <string-array name="pref_link_prefetch_choices">
+    <item msgid="4889781230398008031">"Akusoze"</item>
+    <item msgid="1908465963242077428">"Kwi-Wi-Fi kuphela"</item>
+    <item msgid="7647277566998527142">"Njalo"</item>
+  </string-array>
+    <string name="pref_link_prefetch_summary" msgid="6558181497993206817">"Vumela isiphequluli ukulayisha kuqala amakhasi ewebhu axhunyanisiwe ngasemuva"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Ukulayisha kuqala kwekhasi lewebhu"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="8102515020625680714">"Inkinga yoxhumano"</string>
     <string name="browserFrameFileErrorLabel" msgid="4703792279852977350">"Inkinga yefayela"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +351,7 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Isetha iphephadonga..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Amabhukimakhi"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Awekho amabhukimakhi"</string>
+    <string name="other_bookmarks" msgid="8021889794475657319">"Amanye amabhukhimakhi"</string>
     <string name="rlz_access_point" msgid="7165847807377650632">"Y1"</string>
     <string name="account_chooser_dialog_title" msgid="3314204833188808194">"Khetha i-akhawunti"</string>
     <string name="import_bookmarks_dialog_title" msgid="3325557652271172128">"Vumelanisa nge-akhawunti ye-Google"</string>
diff --git a/res/values/all_search_engines.xml b/res/values/all_search_engines.xml
index 58992a4..bbba0ee 100644
--- a/res/values/all_search_engines.xml
+++ b/res/values/all_search_engines.xml
@@ -207,10 +207,10 @@
   <string-array name="google" translatable="false">
     <item>Google</item>
     <item>google.com</item>
-    <item>http://www.google.com/favicon.ico</item>
-    <item>http://www.google.com/search?hl={language}&amp;ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}</item>
+    <item>https://www.google.com/favicon.ico</item>
+    <item>https://www.google.com/search?ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}</item>
     <item>UTF-8</item>
-    <item>http://www.google.com/complete/search?hl={language}&amp;client=android&amp;q={searchTerms}</item>
+    <item>https://www.google.com/complete/search?client=android&amp;q={searchTerms}</item>
   </string-array>
   <string-array name="bing_en_NZ" translatable="false">
     <item>Bing</item>
@@ -442,7 +442,7 @@
     <item>http://1.im.cz/szn/img/favicon.ico</item>
     <item>http://search.seznam.cz/?q={searchTerms}</item>
     <item>UTF-8</item>
-    <item>http:///suggest.fulltext.seznam.cz/?dict=fulltext_ff&amp;phrase={searchTerms}&amp;encoding={inputEncoding}&amp;response_encoding=utf-8</item>
+    <item>http://suggest.fulltext.seznam.cz/?dict=fulltext_ff&amp;phrase={searchTerms}&amp;encoding={inputEncoding}&amp;response_encoding=utf-8</item>
   </string-array>
   <string-array name="centrum_cz" translatable="false">
     <item>Centrum.cz</item>
diff --git a/res/values/bools.xml b/res/values/bools.xml
index 2cd26a8..3c20f9a 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -13,6 +13,8 @@
 <resources
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <bool name="isTablet">false</bool>
+    <!--  hide the title bar -->
+    <bool name="hide_title">true</bool>
     <bool name="hide_nav_buttons">true</bool>
     <!-- Browser menu toggles -->
     <bool name="menu_show_navigation">true</bool>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 78f4883..ffee48b 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -33,7 +33,8 @@
     <color name="tabFocusHighlight">#FF99CC00</color>
     <color name="qcMenuBackground">#C0000000</color>
     <color name="qc_normal">#E02A96BC</color>
-    <color name="qc_selected">#F01A5B73</color>
+    <color name="qc_selected">#E0FF8800</color>
+    <color name="qc_sub">#F01A5B73</color>
     <color name="qc_tab_nr">#F033B5E5</color>
     <color name="tabViewTitleBackground">#D0000000</color>
     <color name="navtab_bg">#80606060</color>
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
index d6ae6ba..5e3ec8b 100644
--- a/res/values/dimensions.xml
+++ b/res/values/dimensions.xml
@@ -27,8 +27,8 @@
     <dimen name="widgetItemMinHeight">48dip</dimen>
     <dimen name="favicon_size">16dip</dimen>
     <dimen name="favicon_padded_size">20dip</dimen>
-    <dimen name="qc_radius_start">60dip</dimen>
-    <dimen name="qc_radius_increment">70dip</dimen>
+    <dimen name="qc_radius_start">65dip</dimen>
+    <dimen name="qc_radius_increment">80dip</dimen>
     <dimen name="qc_slop">10dip</dimen>
     <dimen name="qc_touch_offset">15dip</dimen>
     <dimen name="qc_tab_title_height">24dip</dimen>
diff --git a/res/values/ids.xml b/res/values/ids.xml
index f342d4c..211b02f 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -20,4 +20,6 @@
     <item type="id" name="child_position" />
     <item type="id" name="child_id" />
     <item type="id" name="tab_view" />
+    <item type="id" name="position" />
+    <item type="id" name="load_object" />
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d1c97f5..ff396ce 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -217,6 +217,8 @@
     <string name="share_page">Share page</string>
     <!-- Menu item for saving a page for offline reading. This is a view-only snapshot of the page. [CHAR LIMIT=50] -->
     <string name="menu_save_snapshot">Save for offline reading</string>
+    <!-- Dialog message that is shown while saving a page for offline reading. [CHAR LIMIT=50] -->
+    <string name="saving_snapshot">Saving\u2026</string>
     <!-- Toast informing the user that saving the page for offline reading has failed. [CHAR LIMIT=50] -->
     <string name="snapshot_failed">Couldn\'t save for offline reading.</string>
     <!-- The number of bookmarks in a folder [CHAR LIMT=50] -->
@@ -284,6 +286,8 @@
     <string name="menu_preferences">Settings</string>
     <!-- Settings screen, section title -->
     <string name="pref_content_title">Page content</string>
+    <!-- Settings label [CHAR LIMIT=45]-->
+    <string name="pref_allow_apptabs">Allow multiple tabs per app</string>
     <!-- Settings label -->
     <string name="pref_content_load_images">Load images</string>
     <!-- Settings label -->
@@ -410,7 +414,7 @@
     <string name="autofill_profile_editor_delete_profile">Delete</string>
 
     <!-- Text on a dialog shown to the user when they are prompted to set up the autofill feature [CHAR-LIMIT=NONE] -->
-    <string name="autofill_setup_dialog_message">The browser can automatically complete web forms like this one. Would you like to set up your auto-fill text?</string>
+    <string name="autofill_setup_dialog_message">The browser can automatically complete web forms like this one. Do you want to set up your auto-fill text?</string>
     <!-- Toast message displayed when the user decides to not set up autofill at this time. We want to remind them that they can configure
          it through the Browser Settings menu. [CHAR-LIMIT=NONE] -->
     <string name="autofill_setup_dialog_negative_toast">You can always set up your auto-fill text from the Browser &gt; Settings &gt; General screen.</string>
@@ -666,6 +670,28 @@
     <string name="pref_data_preload_summary">Allow browser to preload high confidence search results in the background</string>
     <!-- Title of dialog for search preloading [CHAR LIMIT=40] -->
     <string name="pref_data_preload_dialogtitle">Search result preloading</string>
+    <!-- Title for link prefetching [CHAR LIMIT=40] -->
+    <string name="pref_link_prefetch_title">Web page preloading</string>
+    <!-- Link prefetching options [CHAR LIMIT=20] -->
+    <string-array name="pref_link_prefetch_choices">
+        <item>Never</item>
+        <item>Only on Wi-Fi</item>
+        <item>Always</item>
+    </string-array>
+    <!-- Do not translate -->
+    <string name="pref_link_prefetch_value_never" translatable="false">NEVER</string>
+    <string name="pref_link_prefetch_value_wifi_only" translatable="false">WIFI_ONLY</string>
+    <string name="pref_link_prefetch_value_always" translatable="false">ALWAYS</string>
+    <string name="pref_link_prefetch_default_value" translatable="false">@string/pref_link_prefetch_value_wifi_only</string>
+    <string-array name="pref_link_prefetch_values" translatable="false">
+        <item><xliff:g>@string/pref_link_prefetch_value_never</xliff:g></item>
+        <item><xliff:g>@string/pref_link_prefetch_value_wifi_only</xliff:g></item>
+        <item><xliff:g>@string/pref_link_prefetch_value_always</xliff:g></item>
+    </string-array>
+    <!-- Summary for link prefetching [CHAR LIMIT=80] -->
+    <string name="pref_link_prefetch_summary">Allow browser to preload linked web pages in the background</string>
+    <!-- Title of dialog for link prefetching [CHAR LIMIT=40] -->
+    <string name="pref_link_prefetch_dialogtitle">Web page preloading</string>
     <!-- Title for a dialog displayed when the browser has a data connectivity
             problem -->
     <string name="browserFrameNetworkErrorLabel">Connection problem</string>
@@ -764,17 +790,10 @@
 
     <!-- Do not translate.  Testing only -->
     <string name="dump_nav" translatable="false">Dump navigation cache</string>
-    <!-- Do not translate.  Testing only -->
-    <string name="dump_counters" translatable="false">Dump V8 counters</string>
 
-    <!-- The default homepage. If it starts with "http://www.google" and the
-            user signs up the device with a Google sites account, the site's
-            domain will be appended. -->
+    <!-- The default homepage. -->
     <string name="homepage_base" translatable="false">
-        http://www.google.com/webhp?client={CID}&amp;source=android-home</string>
-    <!-- The default url for the instant_base_page. -->
-    <string name="instant_base" translatable="false">
-        http://www.google.com/webhp?client={CID}&amp;source=android-instant&amp;ion=1</string>
+        https://www.google.com/webhp?client={CID}&amp;source=android-home</string>
 
     <!-- Bookmarks -->
     <string-array name="bookmarks" translatable="false">
@@ -870,6 +889,9 @@
          This is centered in the middle of the screen [CHAR LIMIT=NONE] -->
     <string name="empty_bookmarks_folder">No bookmarks.</string>
 
+    <!-- The folder name for the special "Other Bookmarks" folder created by Chrome [CHAR LIMIT=24] -->
+    <string name="other_bookmarks">Other Bookmarks</string>
+
     <!-- Access point for RLZ tracking. -->
     <string name="rlz_access_point">Y1</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 361702e..17c5eb2 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -80,4 +80,17 @@
         <item name="android:textColor">?android:attr/textColorSecondary</item>
         <item name="android:textStyle">normal</item>
     </style>
+
+    <style name="AutofillProfileTextView">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:gravity">center_vertical</item>
+        <item name="android:layout_margin">2dip</item>
+        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+    </style>
+    <style name="AutofillProfileEditText" parent="@style/AutofillProfileTextView">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:imeOptions">flagNoExtractUi|actionNext</item>
+        <item name="android:singleLine">true</item>
+    </style>
 </resources>
diff --git a/res/xml-sw600dp/advanced_preferences.xml b/res/xml-sw600dp/advanced_preferences.xml
new file mode 100644
index 0000000..73f145b
--- /dev/null
+++ b/res/xml-sw600dp/advanced_preferences.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<PreferenceScreen
+        xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- Entries and values in this list are set dynamically. -->
+    <com.android.browser.search.SearchEnginePreference
+            android:key="search_engine"
+            android:title="@string/pref_content_search_engine"
+            android:defaultValue="google"
+            android:summary="@string/pref_content_search_engine_summary"
+            android:dialogTitle="@string/pref_content_search_engine" />
+
+    <CheckBoxPreference
+            android:key="open_in_background"
+            android:defaultValue="false"
+            android:title="@string/pref_content_open_in_background"
+            android:summary="@string/pref_content_open_in_background_summary" />
+
+    <CheckBoxPreference
+            android:key="enable_javascript"
+            android:defaultValue="true"
+            android:title="@string/pref_content_javascript" />
+
+    <ListPreference
+            android:key="plugin_state"
+            android:title="@string/pref_content_plugins"
+            android:defaultValue="ON"
+            android:entries="@array/pref_content_plugins_choices"
+            android:entryValues="@array/pref_content_plugins_values"
+            android:dialogTitle="@string/pref_content_plugins" />
+
+    <PreferenceScreen
+            android:key="website_settings"
+            android:title="@string/pref_extras_website_settings"
+            android:summary="@string/pref_extras_website_settings_summary" />
+
+    <PreferenceCategory android:title="@string/pref_content_title">
+
+        <ListPreference
+                android:key="default_zoom"
+                android:title="@string/pref_default_zoom"
+                android:defaultValue="MEDIUM"
+                android:entries="@array/pref_default_zoom_choices"
+                android:entryValues="@array/pref_default_zoom_values"
+                android:dialogTitle="@string/pref_default_zoom_dialogtitle" />
+
+        <CheckBoxPreference
+                android:key="load_page"
+                android:defaultValue="true"
+                android:title="@string/pref_content_load_page"
+                android:summary="@string/pref_content_load_page_summary" />
+
+        <CheckBoxPreference
+                android:key="autofit_pages"
+                android:defaultValue="true"
+                android:title="@string/pref_content_autofit"
+                android:summary="@string/pref_content_autofit_summary" />
+
+        <CheckBoxPreference
+                android:key="block_popup_windows"
+                android:defaultValue="true"
+                android:title="@string/pref_content_block_popups" />
+
+        <ListPreference
+                android:key="default_text_encoding"
+                android:title="@string/pref_default_text_encoding"
+                android:defaultValue="@string/pref_default_text_encoding_default"
+                android:entries="@array/pref_default_text_encoding_choices"
+                android:entryValues="@array/pref_default_text_encoding_values"
+                android:dialogTitle="@string/pref_default_text_encoding_dialogtitle" />
+
+    </PreferenceCategory>
+
+    <PreferenceCategory android:title="@string/pref_extras_reset_default_title">
+        <com.android.browser.BrowserYesNoPreference
+                android:key="reset_default_preferences"
+                android:title="@string/pref_extras_reset_default"
+                android:summary="@string/pref_extras_reset_default_summary"
+                android:dialogMessage="@string/pref_extras_reset_default_dlg"
+                android:dialogIcon="@android:drawable/ic_dialog_alert" />
+    </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/res/xml/advanced_preferences.xml b/res/xml/advanced_preferences.xml
index 4c5ecdf..e292b7d 100644
--- a/res/xml/advanced_preferences.xml
+++ b/res/xml/advanced_preferences.xml
@@ -36,6 +36,11 @@
             android:defaultValue="true"
             android:title="@string/pref_content_javascript" />
 
+    <CheckBoxPreference
+            android:key="allow_apptabs"
+            android:defaultValue="false"
+            android:title="@string/pref_allow_apptabs" />
+
     <ListPreference
             android:key="plugin_state"
             android:title="@string/pref_content_plugins"
@@ -91,7 +96,7 @@
                 android:key="reset_default_preferences"
                 android:title="@string/pref_extras_reset_default"
                 android:summary="@string/pref_extras_reset_default_summary"
-                android:dialogMessage="@string/pref_extras_reset_default_dlg" 
+                android:dialogMessage="@string/pref_extras_reset_default_dlg"
                 android:dialogIcon="@android:drawable/ic_dialog_alert" />
     </PreferenceCategory>
 
diff --git a/res/xml/bandwidth_preferences.xml b/res/xml/bandwidth_preferences.xml
index bb1688e..9946b48 100644
--- a/res/xml/bandwidth_preferences.xml
+++ b/res/xml/bandwidth_preferences.xml
@@ -24,6 +24,14 @@
         android:entryValues="@array/pref_data_preload_values"
         android:dialogTitle="@string/pref_data_preload_dialogtitle" />
 
+    <ListPreference
+        android:key="link_prefetch_when"
+        android:title="@string/pref_link_prefetch_title"
+        android:summary="@string/pref_link_prefetch_summary"
+        android:entries="@array/pref_link_prefetch_choices"
+        android:entryValues="@array/pref_link_prefetch_values"
+        android:dialogTitle="@string/pref_link_prefetch_dialogtitle" />
+
     <CheckBoxPreference
         android:key="load_images"
         android:defaultValue="true"
diff --git a/res/xml/searchable.xml b/res/xml/searchable.xml
index bb578c6..3397a40 100644
--- a/res/xml/searchable.xml
+++ b/res/xml/searchable.xml
@@ -26,7 +26,6 @@
     android:voiceSearchMode="showVoiceSearchButton|launchWebSearch"
     android:inputType="textUri"
     android:imeOptions="actionGo"
-    
     android:searchSuggestAuthority="browser"
     android:searchSuggestSelection="url LIKE ?"
     android:searchSuggestIntentAction="android.intent.action.VIEW"
diff --git a/src/com/android/browser/ActivityController.java b/src/com/android/browser/ActivityController.java
new file mode 100644
index 0000000..ac248b8
--- /dev/null
+++ b/src/com/android/browser/ActivityController.java
@@ -0,0 +1,74 @@
+package com.android.browser;
+
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.view.ActionMode;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+
+
+public interface ActivityController {
+
+    void start(Intent intent);
+
+    void onSaveInstanceState(Bundle outState);
+
+    void handleNewIntent(Intent intent);
+
+    void onResume();
+
+    boolean onMenuOpened(int featureId, Menu menu);
+
+    void onOptionsMenuClosed(Menu menu);
+
+    void onContextMenuClosed(Menu menu);
+
+    void onPause();
+
+    void onDestroy();
+
+    void onConfgurationChanged(Configuration newConfig);
+
+    void onLowMemory();
+
+    boolean onCreateOptionsMenu(Menu menu);
+
+    boolean onPrepareOptionsMenu(Menu menu);
+
+    boolean onOptionsItemSelected(MenuItem item);
+
+    void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo);
+
+    boolean onContextItemSelected(MenuItem item);
+
+    boolean onKeyDown(int keyCode, KeyEvent event);
+
+    boolean onKeyLongPress(int keyCode, KeyEvent event);
+
+    boolean onKeyUp(int keyCode, KeyEvent event);
+
+    void onActionModeStarted(ActionMode mode);
+
+    void onActionModeFinished(ActionMode mode);
+
+    void onActivityResult(int requestCode, int resultCode, Intent intent);
+
+    boolean onSearchRequested();
+
+    boolean dispatchKeyEvent(KeyEvent event);
+
+    boolean dispatchKeyShortcutEvent(KeyEvent event);
+
+    boolean dispatchTouchEvent(MotionEvent ev);
+
+    boolean dispatchTrackballEvent(MotionEvent ev);
+
+    boolean dispatchGenericMotionEvent(MotionEvent ev);
+
+}
diff --git a/src/com/android/browser/AutoFillProfileDatabase.java b/src/com/android/browser/AutoFillProfileDatabase.java
index 3345e92..9666926 100644
--- a/src/com/android/browser/AutoFillProfileDatabase.java
+++ b/src/com/android/browser/AutoFillProfileDatabase.java
@@ -22,7 +22,7 @@
 import android.database.sqlite.SQLiteOpenHelper;
 import android.provider.BaseColumns;
 import android.util.Log;
-import android.webkit.WebSettings.AutoFillProfile;
+import android.webkit.WebSettingsClassic.AutoFillProfile;
 
 public class AutoFillProfileDatabase {
 
diff --git a/src/com/android/browser/AutoFillSettingsFragment.java b/src/com/android/browser/AutoFillSettingsFragment.java
index 04f45b5..68b325e 100644
--- a/src/com/android/browser/AutoFillSettingsFragment.java
+++ b/src/com/android/browser/AutoFillSettingsFragment.java
@@ -32,7 +32,7 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.inputmethod.InputMethodManager;
-import android.webkit.WebSettings.AutoFillProfile;
+import android.webkit.WebSettingsClassic.AutoFillProfile;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;
@@ -52,7 +52,9 @@
     private EditText mCountryEdit;
     private EditText mPhoneEdit;
 
-    private Button mSaveButton;
+    private MenuItem mSaveMenuItem;
+
+    private boolean mInitialised;
 
     // Used to display toast after DB interactions complete.
     private Handler mHandler;
@@ -87,7 +89,7 @@
                 mPhoneEdit.setError(null);
             }
 
-            updateButtonState();
+            updateSaveMenuItemState();
         }
 
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -99,7 +101,7 @@
 
     private class FieldChangedListener implements TextWatcher {
         public void afterTextChanged(Editable s) {
-            updateButtonState();
+            updateSaveMenuItemState();
         }
 
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -147,11 +149,14 @@
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         inflater.inflate(R.menu.autofill_profile_editor, menu);
+        mSaveMenuItem = menu.findItem(R.id.autofill_profile_editor_save_profile_menu_id);
+        updateSaveMenuItemState();
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        if (item.getItemId() == R.id.autofill_profile_editor_delete_profile_menu_id) {
+        switch (item.getItemId()) {
+        case R.id.autofill_profile_editor_delete_profile_menu_id:
             // Clear the UI.
             mFullNameEdit.setText("");
             mEmailEdit.setText("");
@@ -168,10 +173,30 @@
             // trigger the current profile to get deleted from the DB.
             mSettings.setAutoFillProfile(null,
                     mHandler.obtainMessage(PROFILE_DELETED_MSG));
-            updateButtonState();
+            updateSaveMenuItemState();
             return true;
+
+        case R.id.autofill_profile_editor_save_profile_menu_id:
+            AutoFillProfile newProfile = new AutoFillProfile(
+                    mUniqueId,
+                    mFullNameEdit.getText().toString(),
+                    mEmailEdit.getText().toString(),
+                    mCompanyEdit.getText().toString(),
+                    mAddressLine1Edit.getText().toString(),
+                    mAddressLine2Edit.getText().toString(),
+                    mCityEdit.getText().toString(),
+                    mStateEdit.getText().toString(),
+                    mZipEdit.getText().toString(),
+                    mCountryEdit.getText().toString(),
+                    mPhoneEdit.getText().toString());
+
+            mSettings.setAutoFillProfile(newProfile,
+                    mHandler.obtainMessage(PROFILE_SAVED_MSG));
+            return true;
+
+        default:
+            return false;
         }
-        return false;
     }
 
     @Override
@@ -203,27 +228,6 @@
         mCountryEdit.addTextChangedListener(mFieldChangedListener);
         mPhoneEdit.addTextChangedListener(new PhoneNumberValidator());
 
-        mSaveButton = (Button)v.findViewById(R.id.autofill_profile_editor_save_button);
-        mSaveButton.setOnClickListener(new OnClickListener() {
-            public void onClick(View button) {
-                AutoFillProfile newProfile = new AutoFillProfile(
-                        mUniqueId,
-                        mFullNameEdit.getText().toString(),
-                        mEmailEdit.getText().toString(),
-                        mCompanyEdit.getText().toString(),
-                        mAddressLine1Edit.getText().toString(),
-                        mAddressLine2Edit.getText().toString(),
-                        mCityEdit.getText().toString(),
-                        mStateEdit.getText().toString(),
-                        mZipEdit.getText().toString(),
-                        mCountryEdit.getText().toString(),
-                        mPhoneEdit.getText().toString());
-
-                mSettings.setAutoFillProfile(newProfile,
-                        mHandler.obtainMessage(PROFILE_SAVED_MSG));
-            }
-        });
-
         // Populate the text boxes with any pre existing AutoFill data.
         AutoFillProfile activeProfile = mSettings.getAutoFillProfile();
         if (activeProfile != null) {
@@ -239,14 +243,25 @@
             mPhoneEdit.setText(activeProfile.getPhoneNumber());
         }
 
-        updateButtonState();
+        mInitialised = true;
+
+        updateSaveMenuItemState();
 
         return v;
     }
 
-    public void updateButtonState() {
+    private void updateSaveMenuItemState() {
+        if (mSaveMenuItem == null) {
+            return;
+        }
 
-        boolean valid = (mFullNameEdit.getText().toString().length() > 0 ||
+        if (!mInitialised) {
+            mSaveMenuItem.setEnabled(false);
+            return;
+        }
+
+        boolean currentState = mSaveMenuItem.isEnabled();
+        boolean newState = (mFullNameEdit.getText().toString().length() > 0 ||
             mEmailEdit.getText().toString().length() > 0 ||
             mCompanyEdit.getText().toString().length() > 0 ||
             mAddressLine1Edit.getText().toString().length() > 0 ||
@@ -257,9 +272,9 @@
             mCountryEdit.getText().toString().length() > 0) &&
             mPhoneEdit.getError() == null;
 
-        // Only enable the save buttons if we have at least one field completed
-        // and the phone number (if present is valid).
-        mSaveButton.setEnabled(valid);
+        if (currentState != newState) {
+            mSaveMenuItem.setEnabled(newState);
+        }
     }
 
     private void closeEditor() {
diff --git a/src/com/android/browser/AutofillHandler.java b/src/com/android/browser/AutofillHandler.java
index c4b14d7..5b0320d 100644
--- a/src/com/android/browser/AutofillHandler.java
+++ b/src/com/android/browser/AutofillHandler.java
@@ -21,10 +21,13 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.database.Cursor;
+import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Message;
 import android.preference.PreferenceManager;
-import android.webkit.WebSettings.AutoFillProfile;
+import android.provider.ContactsContract;
+import android.util.Log;
+import android.webkit.WebSettingsClassic.AutoFillProfile;
 
 import java.util.concurrent.CountDownLatch;
 
@@ -41,6 +44,8 @@
     private CountDownLatch mLoaded = new CountDownLatch(1);
     private Context mContext;
 
+    private static final String LOGTAG = "AutofillHandler";
+
     public AutofillHandler(Context context) {
         mContext = context.getApplicationContext();
     }
@@ -60,18 +65,24 @@
          new LoadFromDb().start();
     }
 
-    public void waitForLoad() {
+    private void waitForLoad() {
         try {
             mLoaded.await();
-        } catch (InterruptedException e) {}
+        } catch (InterruptedException e) {
+            Log.w(LOGTAG, "Caught exception while waiting for AutofillProfile to load.");
+        }
     }
 
     private class LoadFromDb extends Thread {
 
         @Override
         public void run() {
-            SharedPreferences p =
-                    PreferenceManager.getDefaultSharedPreferences(mContext);
+            // Note the lack of synchronization over mAutoFillActiveProfileId and
+            // mAutoFillProfile here. This is because we control all other access
+            // to these members through the public functions of this class, and they
+            // all wait for this thread via the mLoaded CountDownLatch.
+
+            SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(mContext);
 
             // Read the last active AutoFill profile id.
             mAutoFillActiveProfileId = p.getInt(
@@ -80,7 +91,9 @@
 
             // Load the autofill profile data from the database. We use a database separate
             // to the browser preference DB to make it easier to support multiple profiles
-            // and switching between them.
+            // and switching between them. Note that this may block startup if this DB lookup
+            // is extremely slow. We do this to ensure that if there's a profile set, the
+            // user never sees the "setup Autofill" option.
             AutoFillProfileDatabase autoFillDb = AutoFillProfileDatabase.getInstance(mContext);
             Cursor c = autoFillDb.getProfile(mAutoFillActiveProfileId);
 
@@ -114,11 +127,76 @@
             c.close();
             autoFillDb.close();
 
+            // At this point we've loaded the profile if there was one, so let any thread
+            // waiting on initialization continue.
             mLoaded.countDown();
+
+            // Synchronization note: strictly speaking, it's possible that mAutoFillProfile
+            // may get a value after we check below, but that's OK. This check is only an
+            // optimisation, and we do a proper synchronized check further down when it comes
+            // to actually setting the inferred profile.
+            if (mAutoFillProfile == null) {
+                // We did not load a profile from disk. Try to infer one from the user's
+                // "me" contact.
+                final Uri profileUri = Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
+                        ContactsContract.Contacts.Data.CONTENT_DIRECTORY);
+                String name = getContactField(profileUri,
+                        ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
+                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
+                // Only attempt to read other data and set a profile if we could successfully
+                // get a name.
+                if (name != null) {
+                    String email = getContactField(profileUri,
+                            ContactsContract.CommonDataKinds.Email.ADDRESS,
+                            ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
+                    String phone = getContactField(profileUri,
+                            ContactsContract.CommonDataKinds.Phone.NUMBER,
+                            ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
+                    String company = getContactField(profileUri,
+                            ContactsContract.CommonDataKinds.Organization.COMPANY,
+                            ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);
+
+                    // Can't easily get structured postal address information (even using
+                    // CommonDataKinds.StructuredPostal) so omit prepopulating that for now.
+                    // When querying structured postal data, it often all comes back as a string
+                    // inside the "street" field.
+
+                    synchronized(AutofillHandler.this) {
+                        // Only use this profile if one hasn't been set inbetween the
+                        // inital import and this thread getting to this point.
+                        if (mAutoFillProfile == null) {
+                            setAutoFillProfile(new AutoFillProfile(1, name, email, company,
+                                    null, null, null, null, null, null, phone), null);
+                        }
+                    }
+                }
+            }
+        }
+
+        private String getContactField(Uri uri, String field, String itemType) {
+            String result = null;
+
+            Cursor c = mContext.getContentResolver().query(uri, new String[] { field },
+                    ContactsContract.Data.MIMETYPE + "=?", new String[] { itemType }, null);
+
+            if (c == null) {
+                return null;
+            }
+
+            try {
+                // Just use the first returned value if we get more than one.
+                if (c.moveToFirst()) {
+                    result = c.getString(0);
+                }
+            } finally {
+                c.close();
+            }
+            return result;
         }
     }
 
-    public void setAutoFillProfile(AutoFillProfile profile, Message msg) {
+    public synchronized void setAutoFillProfile(AutoFillProfile profile, Message msg) {
+        waitForLoad();
         int profileId = NO_AUTOFILL_PROFILE_SET;
         if (profile != null) {
             profileId = profile.getUniqueId();
@@ -137,11 +215,12 @@
         setActiveAutoFillProfileId(profileId);
     }
 
-    public AutoFillProfile getAutoFillProfile() {
+    public synchronized AutoFillProfile getAutoFillProfile() {
+        waitForLoad();
         return mAutoFillProfile;
     }
 
-    private void setActiveAutoFillProfileId(int activeProfileId) {
+    private synchronized void setActiveAutoFillProfileId(int activeProfileId) {
         mAutoFillActiveProfileId = activeProfileId;
         Editor ed = PreferenceManager.
             getDefaultSharedPreferences(mContext).edit();
@@ -178,9 +257,11 @@
         @Override
         protected Void doInBackground(AutoFillProfile... values) {
             mAutoFillProfileDb = AutoFillProfileDatabase.getInstance(mContext);
-            assert mAutoFillActiveProfileId != NO_AUTOFILL_PROFILE_SET;
-            AutoFillProfile newProfile = values[0];
-            mAutoFillProfileDb.addOrUpdateProfile(mAutoFillActiveProfileId, newProfile);
+            synchronized (AutofillHandler.this) {
+                assert mAutoFillActiveProfileId != NO_AUTOFILL_PROFILE_SET;
+                AutoFillProfile newProfile = values[0];
+                mAutoFillProfileDb.addOrUpdateProfile(mAutoFillActiveProfileId, newProfile);
+            }
             return null;
         }
     }
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 69063eb..c749465 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -32,7 +32,6 @@
 import android.os.Handler;
 import android.os.Message;
 import android.text.TextUtils;
-import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -47,6 +46,7 @@
 import android.view.inputmethod.InputMethodManager;
 import android.webkit.WebChromeClient;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 import android.widget.FrameLayout;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
@@ -91,6 +91,7 @@
     protected FrameLayout mContentView;
     protected FrameLayout mCustomViewContainer;
     protected FrameLayout mFullscreenContainer;
+    private FrameLayout mFixedTitlebarContainer;
 
     private View mCustomView;
     private WebChromeClient.CustomViewCallback mCustomViewCallback;
@@ -111,6 +112,8 @@
     protected boolean mUseQuickControls;
     protected TitleBar mTitleBar;
     private NavigationBarBase mNavigationBar;
+    protected PieControl mPieControl;
+    private boolean mBlockFocusAnimations;
 
     public BaseUi(Activity browser, UiController controller) {
         mActivity = browser;
@@ -125,6 +128,8 @@
                 .getDecorView().findViewById(android.R.id.content);
         LayoutInflater.from(mActivity)
                 .inflate(R.layout.custom_screen, frameLayout);
+        mFixedTitlebarContainer = (FrameLayout) frameLayout.findViewById(
+                R.id.fixed_titlebar_container);
         mContentView = (FrameLayout) frameLayout.findViewById(
                 R.id.main_content);
         mCustomViewContainer = (FrameLayout) frameLayout.findViewById(
@@ -195,6 +200,21 @@
         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) {
@@ -208,6 +228,14 @@
     }
 
     @Override
+    public void onProgressChanged(Tab tab) {
+        int progress = tab.getLoadProgress();
+        if (tab.inForeground()) {
+            mTitleBar.setProgress(progress);
+        }
+    }
+
+    @Override
     public void bookmarkedStatusHasChanged(Tab tab) {
         if (tab.inForeground()) {
             boolean isBookmark = tab.isBookmarkedSite();
@@ -236,6 +264,9 @@
 
     @Override
     public void setActiveTab(final Tab tab) {
+        if (tab == null) return;
+        // block unnecessary focus change animations during tab switch
+        mBlockFocusAnimations = true;
         mHandler.removeMessages(MSG_HIDE_TITLEBAR);
         if ((tab != mActiveTab) && (mActiveTab != null)) {
             removeTabFromContentView(mActiveTab);
@@ -245,19 +276,28 @@
             }
         }
         mActiveTab = tab;
-        WebView web = mActiveTab.getWebView();
+        BrowserWebView web = (BrowserWebView) mActiveTab.getWebView();
         updateUrlBarAutoShowManagerTarget();
         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();
+            }
+        }
+        mTitleBar.bringToFront();
+        tab.getTopWindow().requestFocus();
         setShouldShowErrorConsole(tab, mUiController.shouldShowErrorConsole());
         onTabDataChanged(tab);
         onProgressChanged(tab);
         mNavigationBar.setIncognitoMode(tab.isPrivateBrowsingEnabled());
         updateAutoLogin(tab, false);
-        if (web != null && web.getVisibleTitleHeight()
-                != mTitleBar.getEmbeddedHeight()
-                && !mUseQuickControls) {
-            showTitleBarForDuration();
-        }
+        mBlockFocusAnimations = false;
     }
 
     protected void updateUrlBarAutoShowManagerTarget() {
@@ -308,26 +348,16 @@
         ViewGroup parent = (ViewGroup) mainView.getParent();
         if (parent != wrapper) {
             if (parent != null) {
-                Log.w(LOGTAG, "mMainView already has a parent in"
-                        + " attachTabToContentView!");
                 parent.removeView(mainView);
             }
             wrapper.addView(mainView);
-        } else {
-            Log.w(LOGTAG, "mMainView is already attached to wrapper in"
-                    + " attachTabToContentView!");
         }
         parent = (ViewGroup) container.getParent();
         if (parent != mContentView) {
             if (parent != null) {
-                Log.w(LOGTAG, "mContainer already has a parent in"
-                        + " attachTabToContentView!");
                 parent.removeView(container);
             }
             mContentView.addView(container, COVER_SCREEN_PARAMS);
-        } else {
-            Log.w(LOGTAG, "mContainer is already attached to content in"
-                    + " attachTabToContentView!");
         }
         mUiController.attachSubWindow(tab);
     }
@@ -343,7 +373,6 @@
         // Remove the container from the content and then remove the
         // WebView from the container. This will trigger a focus change
         // needed by WebView.
-        mainView.setEmbeddedTitleBar(null);
         FrameLayout wrapper =
                 (FrameLayout) container.findViewById(R.id.webview_wrapper);
         wrapper.removeView(mainView);
@@ -394,7 +423,8 @@
         final WebView cancelSubView = subView;
         cancel.setOnClickListener(new OnClickListener() {
             public void onClick(View v) {
-                cancelSubView.getWebChromeClient().onCloseWindow(cancelSubView);
+                WebViewClassic.fromWebView(cancelSubView).getWebChromeClient().onCloseWindow(
+                        cancelSubView);
             }
         });
         tab.setSubWebView(subView);
@@ -429,13 +459,13 @@
         }
     }
 
-    public void editUrl(boolean clearInput) {
+    public void editUrl(boolean clearInput, boolean forceIME) {
         if (mUiController.isInCustomActionMode()) {
             mUiController.endActionMode();
         }
         showTitleBar();
         if ((getActiveTab() != null) && !getActiveTab().isSnapshot()) {
-            mNavigationBar.startEditingUrl(clearInput);
+            mNavigationBar.startEditingUrl(clearInput, forceIME);
         }
     }
 
@@ -468,30 +498,14 @@
         return mTitleBar.isEditingUrl();
     }
 
+    public void stopEditingUrl() {
+        mTitleBar.getNavigationBar().stopEditingUrl();
+    }
+
     public TitleBar getTitleBar() {
         return mTitleBar;
     }
 
-    protected void setTitleGravity(int gravity) {
-        WebView web = getWebView();
-        if (web != null) {
-            web.setTitleBarGravity(gravity);
-        }
-    }
-
-    @Override
-    public void showVoiceTitleBar(String title, List<String> results) {
-        mNavigationBar.setInVoiceMode(true, results);
-        mNavigationBar.setDisplayTitle(title);
-    }
-
-    @Override
-    public void revertVoiceTitleBar(Tab tab) {
-        mNavigationBar.setInVoiceMode(false, null);
-        String url = tab.getUrl();
-        mNavigationBar.setDisplayTitle(url);
-    }
-
     @Override
     public void showComboView(ComboViews startingView, Bundle extras) {
         Intent intent = new Intent(mActivity, ComboViewActivity.class);
@@ -520,12 +534,14 @@
         decor.addView(mFullscreenContainer, COVER_SCREEN_PARAMS);
         mCustomView = view;
         setFullscreen(true);
+        ((BrowserWebView) getWebView()).setVisibility(View.INVISIBLE);
         mCustomViewCallback = callback;
         mActivity.setRequestedOrientation(requestedOrientation);
     }
 
     @Override
     public void onHideCustomView() {
+        ((BrowserWebView) getWebView()).setVisibility(View.VISIBLE);
         if (mCustomView == null)
             return;
         setFullscreen(false);
@@ -605,7 +621,6 @@
         if (TextUtils.isEmpty(title)) {
             title = url;
         }
-        if (tab.isInVoiceSearchMode()) return;
         if (tab.inForeground()) {
             mNavigationBar.setDisplayTitle(url);
         }
@@ -836,4 +851,28 @@
         }
 
     }
+
+    public void addFixedTitleBar(View view) {
+        mFixedTitlebarContainer.addView(view);
+    }
+
+    public void setContentViewMarginTop(int margin) {
+        LinearLayout.LayoutParams params =
+                (LinearLayout.LayoutParams) mContentView.getLayoutParams();
+        if (params.topMargin != margin) {
+            params.topMargin = margin;
+            mContentView.setLayoutParams(params);
+        }
+    }
+
+    @Override
+    public boolean blockFocusAnimations() {
+        return mBlockFocusAnimations;
+    }
+
+    @Override
+    public void onVoiceResult(String result) {
+        mNavigationBar.onVoiceResult(result);
+    }
+
 }
diff --git a/src/com/android/browser/BookmarkDragHandler.java b/src/com/android/browser/BookmarkDragHandler.java
deleted file mode 100644
index fc0752f..0000000
--- a/src/com/android/browser/BookmarkDragHandler.java
+++ /dev/null
@@ -1,177 +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.ClipData;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.BrowserContract;
-import android.view.ActionMode;
-import android.view.ActionMode.Callback;
-import android.view.DragEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnDragListener;
-import android.view.ViewGroup;
-
-public class BookmarkDragHandler implements Callback {
-
-    public static interface BookmarkDragController {
-        boolean startDrag(Cursor item);
-
-        ViewGroup getActionModeView(ActionMode mode, BookmarkDragState state);
-        void actionItemClicked(View v, BookmarkDragState state);
-    }
-
-    public static interface BookmarkDragAdapter {
-        void setBookmarkDragHandler(BookmarkDragHandler handler);
-        Cursor getItemForView(View v);
-    }
-
-    public static class BookmarkDragState {
-        public long id;
-        public long parent;
-        public Object extraState;
-    }
-
-    static final String BOOKMARK_DRAG_LABEL = "com.android.browser.BOOKMARK_LABEL";
-
-    private Activity mActivity;
-    private BookmarkDragController mDragController;
-    private BookmarkDragAdapter mDragAdapter;
-    private ActionMode mActionMode;
-    private BookmarkDragState mDragState;
-
-    public BookmarkDragHandler(Activity activity, BookmarkDragController controller,
-            BookmarkDragAdapter adapter) {
-        mActivity = activity;
-        mDragController = controller;
-        mDragAdapter = adapter;
-        mDragAdapter.setBookmarkDragHandler(this);
-    }
-
-    public boolean startDrag(View view, Cursor item, long id, Object extraState) {
-        if (!mDragController.startDrag(item)) {
-            return false;
-        }
-        Uri uri = ContentUris.withAppendedId(
-                BrowserContract.Bookmarks.CONTENT_URI, id);
-        ClipData data = ClipData.newRawUri(BOOKMARK_DRAG_LABEL, uri);
-        BookmarkDragState state = new BookmarkDragState();
-        state.id = id;
-        state.parent = item.getLong(BookmarksLoader.COLUMN_INDEX_PARENT);
-        state.extraState = extraState;
-        mDragState = state;
-        view.startDrag(data, new View.DragShadowBuilder(view), state, 0);
-        mActionMode = view.startActionMode(this);
-        return true;
-    }
-
-    public void registerBookmarkDragHandler(View view) {
-        view.setOnDragListener(mBookmarkDragListener);
-    }
-
-    private OnDragListener mBookmarkDragListener = new OnDragListener() {
-
-        @Override
-        public boolean onDrag(View v, DragEvent event) {
-            Cursor c = mDragAdapter.getItemForView(v);
-            BookmarkDragState state = (BookmarkDragState) event.getLocalState();
-            switch (event.getAction()) {
-            case DragEvent.ACTION_DRAG_STARTED:
-                return true;
-            case DragEvent.ACTION_DROP:
-                long id = c.getLong(BookmarksLoader.COLUMN_INDEX_ID);
-                if (id == state.id) {
-                    // We dropped onto ourselves, show the context menu
-                    v.showContextMenu();
-                    return false;
-                }
-                long parent = c.getLong(BookmarksLoader.COLUMN_INDEX_PARENT);
-                if (isFolder(c)) {
-                    parent = c.getLong(BookmarksLoader.COLUMN_INDEX_ID);
-                }
-                if (parent != state.parent) {
-                    ContentResolver cr = mActivity.getContentResolver();
-                    ContentValues values = new ContentValues();
-                    values.put(BrowserContract.Bookmarks.PARENT, parent);
-                    Uri uri = event.getClipData().getItemAt(0).getUri();
-                    cr.update(uri, values, null, null);
-                }
-                break;
-            }
-            return false;
-        }
-    };
-
-    private OnDragListener mActionModeDragListener = new OnDragListener() {
-
-        @Override
-        public boolean onDrag(View v, DragEvent event) {
-            BookmarkDragState state = (BookmarkDragState) event.getLocalState();
-            switch (event.getAction()) {
-            case DragEvent.ACTION_DRAG_STARTED:
-                return true;
-            case DragEvent.ACTION_DROP:
-                mDragController.actionItemClicked(v, state);
-                // fall through
-            case DragEvent.ACTION_DRAG_ENDED:
-                if (mActionMode != null) {
-                    mActionMode.finish();
-                    mActionMode = null;
-                }
-                return true;
-            }
-            return false;
-        }
-    };
-
-    static boolean isFolder(Cursor c) {
-        return c.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
-    }
-
-    @Override
-    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-        ViewGroup view = mDragController.getActionModeView(mode, mDragState);
-        int count = view.getChildCount();
-        for (int i = 0; i < count; i++) {
-            view.getChildAt(i).setOnDragListener(mActionModeDragListener);
-        }
-        mode.setCustomView(view);
-        return true;
-    }
-
-    @Override
-    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-        return true;
-    }
-
-    @Override
-    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-        return false;
-    }
-
-    @Override
-    public void onDestroyActionMode(ActionMode mode) {
-    }
-
-}
diff --git a/src/com/android/browser/BookmarksLoader.java b/src/com/android/browser/BookmarksLoader.java
index bc06497..8601c98 100644
--- a/src/com/android/browser/BookmarksLoader.java
+++ b/src/com/android/browser/BookmarksLoader.java
@@ -20,7 +20,6 @@
 import android.content.CursorLoader;
 import android.net.Uri;
 import android.provider.BrowserContract.Bookmarks;
-import android.provider.BrowserContract.ChromeSyncColumns;
 
 public class BookmarksLoader extends CursorLoader {
     public static final String ARG_ACCOUNT_TYPE = "acct_type";
@@ -34,7 +33,7 @@
     public static final int COLUMN_INDEX_TOUCH_ICON = 5;
     public static final int COLUMN_INDEX_IS_FOLDER = 6;
     public static final int COLUMN_INDEX_PARENT = 8;
-    public static final int COLUMN_INDEX_SERVER_UNIQUE = 9;
+    public static final int COLUMN_INDEX_TYPE = 9;
 
     public static final String[] PROJECTION = new String[] {
         Bookmarks._ID, // 0
@@ -46,7 +45,7 @@
         Bookmarks.IS_FOLDER, // 6
         Bookmarks.POSITION, // 7
         Bookmarks.PARENT, // 8
-        ChromeSyncColumns.SERVER_UNIQUE, // 9
+        Bookmarks.TYPE, // 9
     };
 
     String mAccountType;
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 23aeed5..8511778 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -17,10 +17,12 @@
 package com.android.browser;
 
 import android.app.Activity;
+import android.app.KeyguardManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.os.Bundle;
+import android.os.PowerManager;
 import android.util.Log;
 import android.view.ActionMode;
 import android.view.ContextMenu;
@@ -32,6 +34,7 @@
 import android.view.View;
 import android.view.Window;
 
+import com.android.browser.stub.NullController;
 import com.google.common.annotations.VisibleForTesting;
 
 public class BrowserActivity extends Activity {
@@ -45,8 +48,7 @@
 
     private final static boolean LOGV_ENABLED = Browser.LOGV_ENABLED;
 
-    private Controller mController;
-    private UI mUi;
+    private ActivityController mController = NullController.INSTANCE;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -56,40 +58,48 @@
         }
         super.onCreate(icicle);
 
+        if (shouldIgnoreIntents()) {
+            finish();
+            return;
+        }
+
         // If this was a web search request, pass it on to the default web
         // search provider and finish this activity.
         if (IntentHandler.handleWebSearchIntent(this, null, getIntent())) {
             finish();
             return;
         }
-        mController = new Controller(this, icicle == null);
-        boolean xlarge = isTablet(this);
-        if (xlarge) {
-            mUi = new XLargeUi(this, mController);
-        } else {
-            mUi = new PhoneUi(this, mController);
-        }
-        mController.setUi(mUi);
+        mController = createController();
 
-        Bundle state = getIntent().getBundleExtra(EXTRA_STATE);
-        if (state != null && icicle == null) {
-            icicle = state;
-        }
-
-        mController.start(icicle, getIntent());
+        Intent intent = (icicle == null) ? getIntent() : null;
+        mController.start(intent);
     }
 
     public static boolean isTablet(Context context) {
         return context.getResources().getBoolean(R.bool.isTablet);
     }
 
+    private Controller createController() {
+        Controller controller = new Controller(this);
+        boolean xlarge = isTablet(this);
+        UI ui = null;
+        if (xlarge) {
+            ui = new XLargeUi(this, controller);
+        } else {
+            ui = new PhoneUi(this, controller);
+        }
+        controller.setUi(ui);
+        return controller;
+    }
+
     @VisibleForTesting
     Controller getController() {
-        return mController;
+        return (Controller) mController;
     }
 
     @Override
     protected void onNewIntent(Intent intent) {
+        if (shouldIgnoreIntents()) return;
         if (ACTION_RESTART.equals(intent.getAction())) {
             Bundle outState = new Bundle();
             mController.onSaveInstanceState(outState);
@@ -103,15 +113,32 @@
         mController.handleNewIntent(intent);
     }
 
+    private KeyguardManager mKeyguardManager;
+    private PowerManager mPowerManager;
+    private boolean shouldIgnoreIntents() {
+        // Only process intents if the screen is on and the device is unlocked
+        // aka, if we will be user-visible
+        if (mKeyguardManager == null) {
+            mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
+        }
+        if (mPowerManager == null) {
+            mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+        }
+        boolean ignore = !mPowerManager.isScreenOn();
+        ignore |= mKeyguardManager.inKeyguardRestrictedInputMode();
+        if (LOGV_ENABLED) {
+            Log.v(LOGTAG, "ignore intents: " + ignore);
+        }
+        return ignore;
+    }
+
     @Override
     protected void onResume() {
         super.onResume();
         if (LOGV_ENABLED) {
             Log.v(LOGTAG, "BrowserActivity.onResume: this=" + this);
         }
-        if (mController != null) {
-            mController.onResume();
-        }
+        mController.onResume();
     }
 
     @Override
@@ -148,9 +175,7 @@
 
     @Override
     protected void onPause() {
-        if (mController != null) {
-            mController.onPause();
-        }
+        mController.onPause();
         super.onPause();
     }
 
@@ -160,11 +185,8 @@
             Log.v(LOGTAG, "BrowserActivity.onDestroy: this=" + this);
         }
         super.onDestroy();
-        if (mController != null) {
-            mController.onDestroy();
-        }
-        mUi = null;
-        mController = null;
+        mController.onDestroy();
+        mController = NullController.INSTANCE;
     }
 
     @Override
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 2fd880c..5747112 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -19,40 +19,63 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
+import android.provider.BrowserContract.Bookmarks;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.CursorAdapter;
 import android.widget.ImageView;
 import android.widget.ImageView.ScaleType;
 import android.widget.TextView;
 
-public class BrowserBookmarksAdapter extends CursorAdapter {
+import com.android.browser.util.ThreadedCursorAdapter;
+import com.android.browser.view.BookmarkContainer;
+
+public class BrowserBookmarksAdapter extends
+        ThreadedCursorAdapter<BrowserBookmarksAdapterItem> {
+
     LayoutInflater mInflater;
-    int mCurrentView;
+    Context mContext;
 
     /**
      *  Create a new BrowserBookmarksAdapter.
      */
-    public BrowserBookmarksAdapter(Context context, int defaultView) {
+    public BrowserBookmarksAdapter(Context context) {
         // Make sure to tell the CursorAdapter to avoid the observer and auto-requery
         // since the Loader will do that for us.
-        super(context, null, 0);
+        super(context, null);
         mInflater = LayoutInflater.from(context);
-        selectView(defaultView);
+        mContext = context;
     }
 
     @Override
-    public void bindView(View view, Context context, Cursor cursor) {
-        if (mCurrentView == BrowserBookmarksPage.VIEW_LIST) {
-            bindListView(view, context, cursor);
-        } else {
-            bindGridView(view, context, cursor);
-        }
+    protected long getItemId(Cursor c) {
+        return c.getLong(BookmarksLoader.COLUMN_INDEX_ID);
     }
 
-    void bindGridView(View view, Context context, Cursor cursor) {
+    @Override
+    public View newView(Context context, ViewGroup parent) {
+        return mInflater.inflate(R.layout.bookmark_thumbnail, parent, false);
+    }
+
+    @Override
+    public void bindView(View view, BrowserBookmarksAdapterItem object) {
+        BookmarkContainer container = (BookmarkContainer) view;
+        container.setIgnoreRequestLayout(true);
+        bindGridView(view, mContext, object);
+        container.setIgnoreRequestLayout(false);
+    }
+
+    CharSequence getTitle(Cursor cursor) {
+        int type = cursor.getInt(BookmarksLoader.COLUMN_INDEX_TYPE);
+        switch (type) {
+        case Bookmarks.BOOKMARK_TYPE_OTHER_FOLDER:
+            return mContext.getText(R.string.other_bookmarks);
+        }
+        return cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
+    }
+
+    void bindGridView(View view, Context context, BrowserBookmarksAdapterItem item) {
         // We need to set this to handle rotation and other configuration change
         // events. If the padding didn't change, this is a no op.
         int padding = context.getResources()
@@ -62,77 +85,46 @@
         ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
         TextView tv = (TextView) view.findViewById(R.id.label);
 
-        tv.setText(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
-        if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0) {
+        tv.setText(item.title);
+        if (item.is_folder) {
             // folder
             thumb.setImageResource(R.drawable.thumb_bookmark_widget_folder_holo);
             thumb.setScaleType(ScaleType.FIT_END);
-            thumb.setBackgroundDrawable(null);
+            thumb.setBackground(null);
         } else {
-            byte[] thumbData = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_THUMBNAIL);
-            Bitmap thumbBitmap = null;
-            if (thumbData != null) {
-                thumbBitmap = BitmapFactory.decodeByteArray(thumbData, 0, thumbData.length);
-            }
-
             thumb.setScaleType(ScaleType.CENTER_CROP);
-            if (thumbBitmap == null) {
+            if (item.thumbnail == null || !item.has_thumbnail) {
                 thumb.setImageResource(R.drawable.browser_thumbnail);
             } else {
-                thumb.setImageBitmap(thumbBitmap);
+                thumb.setImageDrawable(item.thumbnail);
             }
             thumb.setBackgroundResource(R.drawable.border_thumb_bookmarks_widget_holo);
         }
     }
 
-    void bindListView(View view, Context context, Cursor cursor) {
-        ImageView favicon = (ImageView) view.findViewById(R.id.favicon);
-        TextView tv = (TextView) view.findViewById(R.id.label);
-
-        tv.setText(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
-        if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0) {
-            // folder
-            favicon.setImageResource(R.drawable.ic_folder_holo_dark);
-            favicon.setBackgroundDrawable(null);
-        } else {
-            byte[] faviconData = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
-            Bitmap faviconBitmap = null;
-            if (faviconData != null) {
-                faviconBitmap = BitmapFactory.decodeByteArray(faviconData, 0, faviconData.length);
-            }
-
-            if (faviconBitmap == null) {
-                favicon.setImageResource(R.drawable.app_web_browser_sm);
-            } else {
-                favicon.setImageBitmap(faviconBitmap);
-            }
-            favicon.setBackgroundResource(R.drawable.bookmark_list_favicon_bg);
+    @Override
+    public BrowserBookmarksAdapterItem getRowObject(Cursor c,
+            BrowserBookmarksAdapterItem item) {
+        if (item == null) {
+            item = new BrowserBookmarksAdapterItem();
         }
+        Bitmap thumbnail = item.thumbnail != null ? item.thumbnail.getBitmap() : null;
+        thumbnail = BrowserBookmarksPage.getBitmap(c,
+                BookmarksLoader.COLUMN_INDEX_THUMBNAIL, thumbnail);
+        item.has_thumbnail = thumbnail != null;
+        if (thumbnail != null
+                && (item.thumbnail == null || item.thumbnail.getBitmap() != thumbnail)) {
+            item.thumbnail = new BitmapDrawable(mContext.getResources(), thumbnail);
+        }
+        item.is_folder = c.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
+        item.title = getTitle(c);
+        item.url = c.getString(BookmarksLoader.COLUMN_INDEX_URL);
+        return item;
     }
 
     @Override
-    public View newView(Context context, Cursor cursor, ViewGroup parent) {
-        if (mCurrentView == BrowserBookmarksPage.VIEW_LIST) {
-            return mInflater.inflate(R.layout.bookmark_list, parent, false);
-        } else {
-            return mInflater.inflate(R.layout.bookmark_thumbnail, parent, false);
-        }
-    }
-
-    public void selectView(int view) {
-        if (view != BrowserBookmarksPage.VIEW_LIST
-                && view != BrowserBookmarksPage.VIEW_THUMBNAILS) {
-            throw new IllegalArgumentException("Unknown view specified: " + view);
-        }
-        mCurrentView = view;
-    }
-
-    public int getViewMode() {
-        return mCurrentView;
-    }
-
-    @Override
-    public Cursor getItem(int position) {
-        return (Cursor) super.getItem(position);
+    public BrowserBookmarksAdapterItem getLoadingObject() {
+        BrowserBookmarksAdapterItem item = new BrowserBookmarksAdapterItem();
+        return item;
     }
 }
diff --git a/src/com/android/browser/BrowserBookmarksAdapterItem.java b/src/com/android/browser/BrowserBookmarksAdapterItem.java
new file mode 100644
index 0000000..6b99578
--- /dev/null
+++ b/src/com/android/browser/BrowserBookmarksAdapterItem.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2012 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.graphics.drawable.BitmapDrawable;
+
+public class BrowserBookmarksAdapterItem {
+    public String url;
+    public CharSequence title;
+    public BitmapDrawable thumbnail;
+    public boolean has_thumbnail;
+    public boolean is_folder;
+}
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index da60fda..b11162c 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -32,13 +32,12 @@
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.BitmapFactory.Options;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.BrowserContract;
 import android.provider.BrowserContract.Accounts;
-import android.provider.BrowserContract.ChromeSyncColumns;
-import android.view.ActionMode;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.LayoutInflater;
@@ -48,12 +47,8 @@
 import android.view.ViewGroup;
 import android.widget.ExpandableListView;
 import android.widget.ExpandableListView.OnChildClickListener;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
 import android.widget.Toast;
 
-import com.android.browser.BookmarkDragHandler.BookmarkDragController;
-import com.android.browser.BookmarkDragHandler.BookmarkDragState;
 import com.android.browser.provider.BrowserProvider2;
 import com.android.browser.view.BookmarkExpandableView;
 import com.android.browser.view.BookmarkExpandableView.BookmarkContextMenuInfo;
@@ -93,9 +88,6 @@
     static final String ACCOUNT_TYPE = "account_type";
     static final String ACCOUNT_NAME = "account_name";
 
-    public static final int VIEW_THUMBNAILS = 1;
-    public static final int VIEW_LIST = 2;
-
     BookmarksPageCallbacks mCallbacks;
     View mRoot;
     BookmarkExpandableView mGrid;
@@ -104,7 +96,6 @@
     View mEmptyView;
     View mHeader;
     HashMap<Integer, BrowserBookmarksAdapter> mBookmarkAdapters = new HashMap<Integer, BrowserBookmarksAdapter>();
-    BookmarkDragHandler mDragHandler;
     JSONObject mState;
 
     @Override
@@ -134,7 +125,7 @@
                 args.putString(ACCOUNT_NAME, accountName);
                 args.putString(ACCOUNT_TYPE, accountType);
                 BrowserBookmarksAdapter adapter = new BrowserBookmarksAdapter(
-                        getActivity(), VIEW_THUMBNAILS);
+                        getActivity());
                 mBookmarkAdapters.put(id, adapter);
                 boolean expand = true;
                 try {
@@ -161,6 +152,10 @@
 
     @Override
     public void onLoaderReset(Loader<Cursor> loader) {
+        if (loader.getId() >= LOADER_BOOKMARKS) {
+            BrowserBookmarksAdapter adapter = mBookmarkAdapters.get(loader.getId());
+            adapter.changeCursor(null);
+        }
     }
 
     @Override
@@ -236,11 +231,30 @@
     }
 
     static Bitmap getBitmap(Cursor cursor, int columnIndex) {
+        return getBitmap(cursor, columnIndex, null);
+    }
+
+    static ThreadLocal<Options> sOptions = new ThreadLocal<Options>() {
+        @Override
+        protected Options initialValue() {
+            return new Options();
+        };
+    };
+    static Bitmap getBitmap(Cursor cursor, int columnIndex, Bitmap inBitmap) {
         byte[] data = cursor.getBlob(columnIndex);
         if (data == null) {
             return null;
         }
-        return BitmapFactory.decodeByteArray(data, 0, data.length);
+        Options opts = sOptions.get();
+        opts.inBitmap = inBitmap;
+        opts.inSampleSize = 1;
+        opts.inScaled = false;
+        try {
+            return BitmapFactory.decodeByteArray(data, 0, data.length, opts);
+        } catch (IllegalArgumentException ex) {
+            // Failed to re-use bitmap, create a new one
+            return BitmapFactory.decodeByteArray(data, 0, data.length);
+        }
     }
 
     private MenuItem.OnMenuItemClickListener mContextItemClickListener =
@@ -285,8 +299,9 @@
     }
 
     boolean canEdit(Cursor c) {
-        String unique = c.getString(BookmarksLoader.COLUMN_INDEX_SERVER_UNIQUE);
-        return !ChromeSyncColumns.FOLDER_NAME_OTHER_BOOKMARKS.equals(unique);
+        int type = c.getInt(BookmarksLoader.COLUMN_INDEX_TYPE);
+        return type == BrowserContract.Bookmarks.BOOKMARK_TYPE_BOOKMARK
+                || type == BrowserContract.Bookmarks.BOOKMARK_TYPE_FOLDER;
     }
 
     private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
@@ -380,8 +395,6 @@
         mGrid.setColumnWidthFromLayout(R.layout.bookmark_thumbnail);
         mGrid.setBreadcrumbController(this);
         setEnableContextMenu(mEnableContextMenu);
-        mDragHandler = new BookmarkDragHandler(getActivity(), mDragController,
-                mGrid.getDragAdapter());
 
         // Start the loaders
         LoaderManager lm = getLoaderManager();
@@ -598,45 +611,6 @@
         }
     }
 
-    private BookmarkDragController mDragController = new BookmarkDragController() {
-
-        @Override
-        public boolean startDrag(Cursor item) {
-            return canEdit(item);
-        }
-
-        @Override
-        public ViewGroup getActionModeView(ActionMode mode,
-                BookmarkDragState state) {
-            LayoutInflater inflater = LayoutInflater.from(getActivity());
-            LinearLayout view = (LinearLayout) inflater.inflate(
-                    R.layout.bookmarks_drag_actionmode, null);
-            view.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
-            ExtraDragState extraState = (ExtraDragState) state.extraState;
-            BrowserBookmarksAdapter adapter = getChildAdapter(extraState.groupPosition);
-            Cursor c = adapter.getItem(extraState.childPosition);
-            boolean isFolder = c.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
-            if (isFolder) {
-                view.findViewById(R.id.open_context_menu_id).setVisibility(View.GONE);
-                ImageView iv = (ImageView) view.findViewById(
-                        R.id.new_window_context_menu_id);
-                iv.setImageResource(R.drawable.ic_windows_holo_dark);
-            }
-            return view;
-        }
-
-        @Override
-        public void actionItemClicked(View v, BookmarkDragState state) {
-            if (v.getId() == R.id.info) {
-                mGrid.showContextMenuForState(state);
-            } else {
-                ExtraDragState extraState = (ExtraDragState) state.extraState;
-                handleContextItem(v.getId(), extraState.groupPosition,
-                        extraState.childPosition);
-            }
-        }
-    };
-
     private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
         Context mContext;
         BookmarkItem mHeader;
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 2369554..8dfd4d7 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -22,6 +22,8 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
 import android.os.Build;
 import android.os.Message;
 import android.preference.PreferenceManager;
@@ -32,11 +34,12 @@
 import android.webkit.GeolocationPermissions;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
-import android.webkit.WebSettings.AutoFillProfile;
 import android.webkit.WebSettings.LayoutAlgorithm;
 import android.webkit.WebSettings.PluginState;
 import android.webkit.WebSettings.TextSize;
 import android.webkit.WebSettings.ZoomDensity;
+import android.webkit.WebSettingsClassic;
+import android.webkit.WebSettingsClassic.AutoFillProfile;
 import android.webkit.WebStorage;
 import android.webkit.WebView;
 import android.webkit.WebViewDatabase;
@@ -114,6 +117,9 @@
     private boolean mNeedsSharedSync = true;
     private float mFontSizeMult = 1.0f;
 
+    // Current state of network-dependent settings
+    private boolean mLinkPrefetchAllowed = true;
+
     // Cached values
     private int mPageCacheCapacity = 1;
     private String mAppCachePath;
@@ -149,16 +155,28 @@
     }
 
     public void startManagingSettings(WebSettings settings) {
+        WebSettingsClassic settingsClassic = (WebSettingsClassic) settings;
         if (mNeedsSharedSync) {
             syncSharedSettings();
         }
         synchronized (mManagedSettings) {
-            syncStaticSettings(settings);
-            syncSetting(settings);
+            syncStaticSettings(settingsClassic);
+            syncSetting(settingsClassic);
             mManagedSettings.add(new WeakReference<WebSettings>(settings));
         }
     }
 
+    public void stopManagingSettings(WebSettings settings) {
+        Iterator<WeakReference<WebSettings>> iter = mManagedSettings.iterator();
+        while (iter.hasNext()) {
+            WeakReference<WebSettings> ref = iter.next();
+            if (ref.get() == settings) {
+                iter.remove();
+                return;
+            }
+        }
+    }
+
     private Runnable mSetup = new Runnable() {
 
         @Override
@@ -174,8 +192,6 @@
             mWebStorageSizeManager = new WebStorageSizeManager(mContext,
                     new WebStorageSizeManager.StatFsDiskInfo(getAppCachePath()),
                     new WebStorageSizeManager.WebKitAppCacheInfo(getAppCachePath()));
-            // Workaround b/5253777
-            CookieManager.getInstance().acceptCookie();
             // Workaround b/5254577
             mPrefs.registerOnSharedPreferenceChangeListener(BrowserSettings.this);
             if (Build.VERSION.CODENAME.equals("REL")) {
@@ -235,7 +251,7 @@
     /**
      * Syncs all the settings that have a Preference UI
      */
-    private void syncSetting(WebSettings settings) {
+    private void syncSetting(WebSettingsClassic settings) {
         settings.setGeolocationEnabled(enableGeolocation());
         settings.setJavaScriptEnabled(enableJavascript());
         settings.setLightTouchEnabled(enableLightTouch());
@@ -279,13 +295,15 @@
             settings.setProperty(WebViewProperties.gfxEnableCpuUploadPath,
                     enableCpuUploadPath() ? "true" : "false");
         }
+
+        settings.setLinkPrefetchEnabled(mLinkPrefetchAllowed);
     }
 
     /**
      * Syncs all the settings that have no UI
      * These cannot change, so we only need to set them once per WebSettings
      */
-    private void syncStaticSettings(WebSettings settings) {
+    private void syncStaticSettings(WebSettingsClassic settings) {
         settings.setDefaultFontSize(16);
         settings.setDefaultFixedFontSize(13);
         settings.setPageCacheCapacity(getPageCacheCapacity());
@@ -318,6 +336,9 @@
         settings.setAppCachePath(getAppCachePath());
         settings.setDatabasePath(mContext.getDir("databases", 0).getPath());
         settings.setGeolocationDatabasePath(mContext.getDir("geolocation", 0).getPath());
+        // origin policy for file access
+        settings.setAllowUniversalAccessFromFileURLs(false);
+        settings.setAllowFileAccessFromFileURLs(false);
     }
 
     private void syncSharedSettings() {
@@ -334,7 +355,7 @@
             Iterator<WeakReference<WebSettings>> iter = mManagedSettings.iterator();
             while (iter.hasNext()) {
                 WeakReference<WebSettings> ref = iter.next();
-                WebSettings settings = ref.get();
+                WebSettingsClassic settings = (WebSettingsClassic)ref.get();
                 if (settings == null) {
                     iter.remove();
                     continue;
@@ -350,8 +371,7 @@
         syncManagedSettings();
         if (PREF_SEARCH_ENGINE.equals(key)) {
             updateSearchEngine(false);
-        }
-        if (PREF_FULLSCREEN.equals(key)) {
+        } else if (PREF_FULLSCREEN.equals(key)) {
             if (mController.getUi() != null) {
                 mController.getUi().setFullscreen(useFullscreen());
             }
@@ -359,6 +379,8 @@
             if (mController.getUi() != null) {
                 mController.getUi().setUseQuickControls(sharedPreferences.getBoolean(key, false));
             }
+        } else if (PREF_LINK_PREFETCH.equals(key)) {
+            updateConnectionType();
         }
     }
 
@@ -407,17 +429,6 @@
         String searchEngineName = getSearchEngineName();
         if (force || mSearchEngine == null ||
                 !mSearchEngine.getName().equals(searchEngineName)) {
-            if (mSearchEngine != null) {
-                if (mSearchEngine.supportsVoiceSearch()) {
-                     // One or more tabs could have been in voice search mode.
-                     // Clear it, since the new SearchEngine may not support
-                     // it, or may handle it differently.
-                     for (int i = 0; i < mController.getTabControl().getTabCount(); i++) {
-                         mController.getTabControl().getTab(i).revertVoiceSearchMode();
-                     }
-                 }
-                mSearchEngine.close();
-             }
             mSearchEngine = SearchEngines.get(mContext, searchEngineName);
          }
     }
@@ -499,12 +510,10 @@
     }
 
     public AutoFillProfile getAutoFillProfile() {
-        mAutofillHandler.waitForLoad();
         return mAutofillHandler.getAutoFillProfile();
     }
 
     public void setAutoFillProfile(AutoFillProfile profile, Message msg) {
-        mAutofillHandler.waitForLoad();
         mAutofillHandler.setAutoFillProfile(profile, msg);
         // Auto-fill will reuse the same profile ID when making edits to the profile,
         // so we need to force a settings sync (otherwise the SharedPreferences
@@ -565,6 +574,37 @@
         return mPrefs;
     }
 
+    // update connectivity-dependent options
+    public void updateConnectionType() {
+        ConnectivityManager cm = (ConnectivityManager)
+            mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+        String linkPrefetchPreference = getLinkPrefetchEnabled();
+        boolean linkPrefetchAllowed = linkPrefetchPreference.
+            equals(getLinkPrefetchAlwaysPreferenceString(mContext));
+        NetworkInfo ni = cm.getActiveNetworkInfo();
+        if (ni != null) {
+            switch (ni.getType()) {
+                case ConnectivityManager.TYPE_WIFI:
+                case ConnectivityManager.TYPE_ETHERNET:
+                case ConnectivityManager.TYPE_BLUETOOTH:
+                    linkPrefetchAllowed |= linkPrefetchPreference.
+                        equals(getLinkPrefetchOnWifiOnlyPreferenceString(mContext));
+                    break;
+                case ConnectivityManager.TYPE_MOBILE:
+                case ConnectivityManager.TYPE_MOBILE_DUN:
+                case ConnectivityManager.TYPE_MOBILE_MMS:
+                case ConnectivityManager.TYPE_MOBILE_SUPL:
+                case ConnectivityManager.TYPE_WIMAX:
+                default:
+                    break;
+            }
+        }
+        if (mLinkPrefetchAllowed != linkPrefetchAllowed) {
+            mLinkPrefetchAllowed = linkPrefetchAllowed;
+            syncManagedSettings();
+        }
+    }
+
     // -----------------------------
     // getter/setters for accessibility_preferences.xml
     // -----------------------------
@@ -612,6 +652,10 @@
         return mPrefs.getString(PREF_SEARCH_ENGINE, SearchEngine.GOOGLE);
     }
 
+    public boolean allowAppTabs() {
+        return mPrefs.getBoolean(PREF_ALLOW_APP_TABS, false);
+    }
+
     public boolean openInBackground() {
         return mPrefs.getBoolean(PREF_OPEN_IN_BACKGROUND, false);
     }
@@ -847,4 +891,71 @@
         return mPrefs.getString(PREF_DATA_PRELOAD, getDefaultPreloadSetting());
     }
 
+    public static String getLinkPrefetchOnWifiOnlyPreferenceString(Context context) {
+        return context.getResources().getString(R.string.pref_link_prefetch_value_wifi_only);
+    }
+
+    public static String getLinkPrefetchAlwaysPreferenceString(Context context) {
+        return context.getResources().getString(R.string.pref_link_prefetch_value_always);
+    }
+
+    private static final String DEFAULT_LINK_PREFETCH_SECURE_SETTING_KEY =
+            "browser_default_link_prefetch_setting";
+
+    public String getDefaultLinkPrefetchSetting() {
+        String preload = Settings.Secure.getString(mContext.getContentResolver(),
+            DEFAULT_LINK_PREFETCH_SECURE_SETTING_KEY);
+        if (preload == null) {
+            preload = mContext.getResources().getString(R.string.pref_link_prefetch_default_value);
+        }
+        return preload;
+    }
+
+    public String getLinkPrefetchEnabled() {
+        return mPrefs.getString(PREF_LINK_PREFETCH, getDefaultLinkPrefetchSetting());
+    }
+
+    // -----------------------------
+    // getter/setters for browser recovery
+    // -----------------------------
+    /**
+     * The last time browser was started.
+     * @return The last browser start time as System.currentTimeMillis. This
+     * can be 0 if this is the first time or the last tab was closed.
+     */
+    public long getLastRecovered() {
+        return mPrefs.getLong(KEY_LAST_RECOVERED, 0);
+    }
+
+    /**
+     * Sets the last browser start time.
+     * @param time The last time as System.currentTimeMillis that the browser
+     * was started. This should be set to 0 if the last tab is closed.
+     */
+    public void setLastRecovered(long time) {
+        mPrefs.edit()
+            .putLong(KEY_LAST_RECOVERED, time)
+            .apply();
+    }
+
+    /**
+     * Used to determine whether or not the previous browser run crashed. Once
+     * the previous state has been determined, the value will be set to false
+     * until a pause is received.
+     * @return true if the last browser run was paused or false if it crashed.
+     */
+    public boolean wasLastRunPaused() {
+        return mPrefs.getBoolean(KEY_LAST_RUN_PAUSED, false);
+    }
+
+    /**
+     * Sets whether or not the last run was a pause or crash.
+     * @param isPaused Set to true When a pause is received or false after
+     * resuming.
+     */
+    public void setLastRunPaused(boolean isPaused) {
+        mPrefs.edit()
+            .putBoolean(KEY_LAST_RUN_PAUSED, isPaused)
+            .apply();
+    }
 }
diff --git a/src/com/android/browser/BrowserSnapshotPage.java b/src/com/android/browser/BrowserSnapshotPage.java
index be4f9af..b0d8205 100644
--- a/src/com/android/browser/BrowserSnapshotPage.java
+++ b/src/com/android/browser/BrowserSnapshotPage.java
@@ -61,7 +61,7 @@
     private static final String[] PROJECTION = new String[] {
         Snapshots._ID,
         Snapshots.TITLE,
-        "length(" + Snapshots.VIEWSTATE + ")",
+        Snapshots.VIEWSTATE_SIZE,
         Snapshots.THUMBNAIL,
         Snapshots.FAVICON,
         Snapshots.URL,
@@ -69,7 +69,7 @@
     };
     private static final int SNAPSHOT_ID = 0;
     private static final int SNAPSHOT_TITLE = 1;
-    private static final int SNAPSHOT_VIEWSTATE_LENGTH = 2;
+    private static final int SNAPSHOT_VIEWSTATE_SIZE = 2;
     private static final int SNAPSHOT_THUMBNAIL = 3;
     private static final int SNAPSHOT_FAVICON = 4;
     private static final int SNAPSHOT_URL = 5;
@@ -281,7 +281,7 @@
             title.setText(cursor.getString(SNAPSHOT_TITLE));
             TextView size = (TextView) view.findViewById(R.id.size);
             if (size != null) {
-                int stateLen = cursor.getInt(SNAPSHOT_VIEWSTATE_LENGTH);
+                int stateLen = cursor.getInt(SNAPSHOT_VIEWSTATE_SIZE);
                 size.setText(String.format("%.2fMB", stateLen / 1024f / 1024f));
             }
             long timestamp = cursor.getLong(SNAPSHOT_DATE_CREATED);
diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java
index b763cf1..12d511f 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -21,13 +21,14 @@
 import android.util.AttributeSet;
 import android.view.View;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 
 import java.util.Map;
 
 /**
  * Manage WebView scroll events
  */
-public class BrowserWebView extends WebView {
+public class BrowserWebView extends WebView implements WebViewClassic.TitleBarDelegate {
 
     public interface OnScrollChangedListener {
         void onScrollChanged(int l, int t, int oldl, int oldt);
@@ -73,19 +74,19 @@
         super(context);
     }
 
+    public void setTitleBar(TitleBar title) {
+        mTitleBar = title;
+    }
+
+    // From TitleBarDelegate
     @Override
-    protected int getTitleHeight() {
+    public int getTitleHeight() {
         return (mTitleBar != null) ? mTitleBar.getEmbeddedHeight() : 0;
     }
 
-    void hideEmbeddedTitleBar() {
-        scrollBy(0, getVisibleTitleHeight());
-    }
-
+    // From TitleBarDelegate
     @Override
-    public void setEmbeddedTitleBar(final View title) {
-        super.setEmbeddedTitleBar(title);
-        mTitleBar = (TitleBar) title;
+    public void onSetEmbeddedTitleBar(final View title) {
     }
 
     public boolean hasTitleBar() {
@@ -112,6 +113,9 @@
     @Override
     protected void onScrollChanged(int l, int t, int oldl, int oldt) {
         super.onScrollChanged(l, t, oldl, oldt);
+        if (mTitleBar != null) {
+            mTitleBar.onScrollChanged();
+        }
         if (mOnScrollChangedListener != null) {
             mOnScrollChangedListener.onScrollChanged(l, t, oldl, oldt);
         }
@@ -126,4 +130,10 @@
         return false;
     }
 
+    @Override
+    public void destroy() {
+        BrowserSettings.getInstance().stopManagingSettings(getSettings());
+        super.destroy();
+    }
+
 }
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index a53e344..ebfd56f 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -17,15 +17,16 @@
 package com.android.browser;
 
 import android.app.Activity;
+import android.app.Dialog;
 import android.app.DownloadManager;
-import android.app.SearchManager;
+import android.app.ProgressDialog;
 import android.content.ClipboardManager;
-import android.content.ContentProvider;
-import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnCancelListener;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -76,15 +77,13 @@
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 import android.widget.Toast;
 
 import com.android.browser.IntentHandler.UrlData;
 import com.android.browser.UI.ComboViews;
-import com.android.browser.provider.BrowserProvider;
 import com.android.browser.provider.BrowserProvider2.Thumbnails;
 import com.android.browser.provider.SnapshotProvider.Snapshots;
-import com.android.browser.search.SearchEngine;
-import com.android.common.Search;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -104,7 +103,7 @@
  * Controller for browser
  */
 public class Controller
-        implements WebViewController, UiController {
+        implements WebViewController, UiController, ActivityController {
 
     private static final String LOGTAG = "Controller";
     private static final String SEND_APP_ID_EXTRA =
@@ -131,6 +130,7 @@
     final static int PREFERENCES_PAGE = 3;
     final static int FILE_SELECTED = 4;
     final static int AUTOFILL_SETUP = 5;
+    final static int VOICE_RESULT = 6;
 
     private final static int WAKELOCK_TIMEOUT = 5 * 60 * 1000; // 5 minutes
 
@@ -218,15 +218,15 @@
 
     private boolean mBlockEvents;
 
-    public Controller(Activity browser, boolean preloadCrashState) {
+    private String mVoiceResult;
+
+    public Controller(Activity browser) {
         mActivity = browser;
         mSettings = BrowserSettings.getInstance();
         mTabControl = new TabControl(this);
         mSettings.setController(this);
         mCrashRecoveryHandler = CrashRecoveryHandler.initialize(this);
-        if (preloadCrashState) {
-            mCrashRecoveryHandler.preloadCrashState();
-        }
+        mCrashRecoveryHandler.preloadCrashState();
         mFactory = new BrowserWebViewFactory(browser);
 
         mUrlHandler = new UrlHandler(this);
@@ -256,16 +256,14 @@
         openIconDatabase();
     }
 
-    void start(final Bundle icicle, final Intent intent) {
-        boolean noCrashRecovery = intent.getBooleanExtra(NO_CRASH_RECOVERY, false);
-        if (icicle != null || noCrashRecovery) {
-            doStart(icicle, intent, false);
-        } else {
-            mCrashRecoveryHandler.startRecovery(intent);
-        }
+    @Override
+    public void start(final Intent intent) {
+        WebViewClassic.setShouldMonitorWebCoreThread();
+        // mCrashRecoverHandler has any previously saved state.
+        mCrashRecoveryHandler.startRecovery(intent);
     }
 
-    void doStart(final Bundle icicle, final Intent intent, final boolean fromCrash) {
+    void doStart(final Bundle icicle, final Intent intent) {
         // Unless the last browser usage was within 24 hours, destroy any
         // remaining incognito tabs.
 
@@ -293,36 +291,42 @@
         GoogleAccountLogin.startLoginIfNeeded(mActivity,
                 new Runnable() {
                     @Override public void run() {
-                        onPreloginFinished(icicle, intent, currentTabId, restoreIncognitoTabs,
-                                fromCrash);
+                        onPreloginFinished(icicle, intent, currentTabId,
+                                restoreIncognitoTabs);
                     }
                 });
     }
 
     private void onPreloginFinished(Bundle icicle, Intent intent, long currentTabId,
-            boolean restoreIncognitoTabs, boolean fromCrash) {
+            boolean restoreIncognitoTabs) {
         if (currentTabId == -1) {
             BackgroundHandler.execute(new PruneThumbnails(mActivity, null));
-            final Bundle extra = intent.getExtras();
-            // Create an initial tab.
-            // If the intent is ACTION_VIEW and data is not null, the Browser is
-            // invoked to view the content by another application. In this case,
-            // the tab will be close when exit.
-            UrlData urlData = IntentHandler.getUrlDataFromIntent(intent);
-            Tab t = null;
-            if (urlData.isEmpty()) {
-                t = openTabToHomePage();
+            if (intent == null) {
+                // This won't happen under common scenarios. The icicle is
+                // not null, but there aren't any tabs to restore.
+                openTabToHomePage();
             } else {
-                t = openTab(urlData);
-            }
-            if (t != null) {
-                t.setAppId(intent.getStringExtra(Browser.EXTRA_APPLICATION_ID));
-            }
-            WebView webView = t.getWebView();
-            if (extra != null) {
-                int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0);
-                if (scale > 0 && scale <= 1000) {
-                    webView.setInitialScale(scale);
+                final Bundle extra = intent.getExtras();
+                // Create an initial tab.
+                // If the intent is ACTION_VIEW and data is not null, the Browser is
+                // invoked to view the content by another application. In this case,
+                // the tab will be close when exit.
+                UrlData urlData = IntentHandler.getUrlDataFromIntent(intent);
+                Tab t = null;
+                if (urlData.isEmpty()) {
+                    t = openTabToHomePage();
+                } else {
+                    t = openTab(urlData);
+                }
+                if (t != null) {
+                    t.setAppId(intent.getStringExtra(Browser.EXTRA_APPLICATION_ID));
+                }
+                WebView webView = t.getWebView();
+                if (extra != null) {
+                    int scale = extra.getInt(Browser.INITIAL_ZOOM_LEVEL, 0);
+                    if (scale > 0 && scale <= 1000) {
+                        webView.setInitialScale(scale);
+                    }
                 }
             }
             mUi.updateTabs(mTabControl.getTabs());
@@ -342,18 +346,19 @@
             // TabControl.restoreState() will create a new tab even if
             // restoring the state fails.
             setActiveTab(mTabControl.getCurrentTab());
-            // Handle the intent if needed. If icicle != null, we are restoring
-            // and the intent will be stale - ignore it.
-            if (icicle == null || fromCrash) {
+            // Intent is non-null when framework thinks the browser should be
+            // launching with a new intent (icicle is null).
+            if (intent != null) {
                 mIntentHandler.onNewIntent(intent);
             }
         }
         // Read JavaScript flags if it exists.
         String jsFlags = getSettings().getJsEngineFlags();
         if (jsFlags.trim().length() != 0) {
-            getCurrentWebView().setJsFlags(jsFlags);
+            WebViewClassic.fromWebView(getCurrentWebView()).setJsFlags(jsFlags);
         }
-        if (BrowserActivity.ACTION_SHOW_BOOKMARKS.equals(intent.getAction())) {
+        if (intent != null
+                && BrowserActivity.ACTION_SHOW_BOOKMARKS.equals(intent.getAction())) {
             bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         }
     }
@@ -424,7 +429,8 @@
         mUi = ui;
     }
 
-    BrowserSettings getSettings() {
+    @Override
+    public BrowserSettings getSettings() {
         return mSettings;
     }
 
@@ -600,8 +606,11 @@
 
     // lifecycle
 
-    protected void onConfgurationChanged(Configuration config) {
+    @Override
+    public void onConfgurationChanged(Configuration config) {
         mConfigChanged = true;
+        // update the menu in case of a locale change
+        mActivity.invalidateOptionsMenu();
         if (mPageDialogsHandler != null) {
             mPageDialogsHandler.onConfigurationChanged(config);
         }
@@ -616,7 +625,8 @@
         mIntentHandler.onNewIntent(intent);
     }
 
-    protected void onPause() {
+    @Override
+    public void onPause() {
         if (mUi.isCustomViewShowing()) {
             hideCustomView();
         }
@@ -650,26 +660,38 @@
         }
     }
 
-    void onSaveInstanceState(Bundle outState) {
-        // the default implementation requires each view to have an id. As the
-        // browser handles the state itself and it doesn't use id for the views,
-        // don't call the default implementation. Otherwise it will trigger the
-        // warning like this, "couldn't save which view has focus because the
-        // focused view XXX has no id".
-
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
         // Save all the tabs
-        mTabControl.saveState(outState);
-        if (!outState.isEmpty()) {
-            // Save time so that we know how old incognito tabs (if any) are.
-            outState.putSerializable("lastActiveDate", Calendar.getInstance());
-        }
+        Bundle saveState = createSaveState();
+
+        // crash recovery manages all save & restore state
+        mCrashRecoveryHandler.writeState(saveState);
+        mSettings.setLastRunPaused(true);
     }
 
-    void onResume() {
+    /**
+     * Save the current state to outState. Does not write the state to
+     * disk.
+     * @return Bundle containing the current state of all tabs.
+     */
+    /* package */ Bundle createSaveState() {
+        Bundle saveState = new Bundle();
+        mTabControl.saveState(saveState);
+        if (!saveState.isEmpty()) {
+            // Save time so that we know how old incognito tabs (if any) are.
+            saveState.putSerializable("lastActiveDate", Calendar.getInstance());
+        }
+        return saveState;
+    }
+
+    @Override
+    public void onResume() {
         if (!mActivityPaused) {
             Log.e(LOGTAG, "BrowserActivity is already resumed.");
             return;
         }
+        mSettings.setLastRunPaused(false);
         mActivityPaused = false;
         Tab current = mTabControl.getCurrentTab();
         if (current != null) {
@@ -682,6 +704,10 @@
         mNetworkHandler.onResume();
         WebView.enablePlatformNotifications();
         NfcHandler.register(mActivity, this);
+        if (mVoiceResult != null) {
+            mUi.onVoiceResult(mVoiceResult);
+            mVoiceResult = null;
+        }
     }
 
     private void releaseWakeLock() {
@@ -720,7 +746,8 @@
         return false;
     }
 
-    void onDestroy() {
+    @Override
+    public void onDestroy() {
         if (mUploadHandler != null && !mUploadHandler.handled()) {
             mUploadHandler.onResult(Activity.RESULT_CANCELED, null);
             mUploadHandler = null;
@@ -746,7 +773,8 @@
         return mActivityPaused;
     }
 
-    protected void onLowMemory() {
+    @Override
+    public void onLowMemory() {
         mTabControl.freeMemory();
     }
 
@@ -774,8 +802,10 @@
         mLoadStopped = true;
         Tab tab = mTabControl.getCurrentTab();
         WebView w = getCurrentTopWebView();
-        w.stopLoading();
-        mUi.onPageStopped(tab);
+        if (w != null) {
+            w.stopLoading();
+            mUi.onPageStopped(tab);
+        }
     }
 
     boolean didUserStopLoading() {
@@ -828,22 +858,8 @@
 
     @Override
     public void onPageFinished(Tab tab) {
+        mCrashRecoveryHandler.backupState();
         mUi.onTabDataChanged(tab);
-        if (!tab.isPrivateBrowsingEnabled()
-                && !TextUtils.isEmpty(tab.getUrl())
-                && !tab.isSnapshot()) {
-            // Only update the bookmark screenshot if the user did not
-            // cancel the load early and there is not already
-            // a pending update for the tab.
-            if (tab.inForeground() && !didUserStopLoading()
-                    || !tab.inForeground()) {
-                if (!mHandler.hasMessages(UPDATE_BOOKMARK_THUMBNAIL, tab)) {
-                    mHandler.sendMessageDelayed(mHandler.obtainMessage(
-                            UPDATE_BOOKMARK_THUMBNAIL, 0, 0, tab),
-                            500);
-                }
-            }
-        }
         // pause the WebView timer and release the wake lock if it is finished
         // while BrowserActivity is in pause state.
         if (mActivityPaused && pauseWebViewTimers(tab)) {
@@ -860,7 +876,6 @@
 
     @Override
     public void onProgressChanged(Tab tab) {
-        mCrashRecoveryHandler.backupState();
         int newProgress = tab.getLoadProgress();
 
         if (newProgress == 100) {
@@ -875,6 +890,22 @@
             if (tab.inPageLoad()) {
                 updateInLoadMenuItems(mCachedMenu, tab);
             }
+            if (!tab.isPrivateBrowsingEnabled()
+                    && !TextUtils.isEmpty(tab.getUrl())
+                    && !tab.isSnapshot()) {
+                // Only update the bookmark screenshot if the user did not
+                // cancel the load early and there is not already
+                // a pending update for the tab.
+                if (tab.shouldUpdateThumbnail() &&
+                        (tab.inForeground() && !didUserStopLoading()
+                        || !tab.inForeground())) {
+                    if (!mHandler.hasMessages(UPDATE_BOOKMARK_THUMBNAIL, tab)) {
+                        mHandler.sendMessageDelayed(mHandler.obtainMessage(
+                                UPDATE_BOOKMARK_THUMBNAIL, 0, 0, tab),
+                                500);
+                    }
+                }
+            }
         } else {
             if (!tab.inPageLoad()) {
                 // onPageFinished may have already been called but a subframe is
@@ -929,14 +960,15 @@
     }
 
     @Override
-    public void onUnhandledKeyEvent(KeyEvent event) {
+    public boolean onUnhandledKeyEvent(KeyEvent event) {
         if (!isActivityPaused()) {
             if (event.getAction() == KeyEvent.ACTION_DOWN) {
-                mActivity.onKeyDown(event.getKeyCode(), event);
+                return mActivity.onKeyDown(event.getKeyCode(), event);
             } else {
-                mActivity.onKeyUp(event.getKeyCode(), event);
+                return mActivity.onKeyUp(event.getKeyCode(), event);
             }
         }
+        return false;
     }
 
     @Override
@@ -1080,36 +1112,13 @@
     }
 
     // callback from phone title bar
+    @Override
     public void editUrl() {
         if (mOptionsMenuOpen) mActivity.closeOptionsMenu();
-        mUi.editUrl(false);
-    }
-
-    public void startVoiceSearch() {
-        Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
-        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
-                RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
-        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
-                mActivity.getComponentName().flattenToString());
-        intent.putExtra(SEND_APP_ID_EXTRA, false);
-        intent.putExtra(RecognizerIntent.EXTRA_WEB_SEARCH_ONLY, true);
-        mActivity.startActivity(intent);
+        mUi.editUrl(false, true);
     }
 
     @Override
-    public void activateVoiceSearchMode(String title, List<String> results) {
-        mUi.showVoiceTitleBar(title, results);
-    }
-
-    public void revertVoiceSearchMode(Tab tab) {
-        mUi.revertVoiceTitleBar(tab);
-    }
-
-    public boolean supportsVoiceSearch() {
-        SearchEngine searchEngine = getSettings().getSearchEngine();
-        return (searchEngine != null && searchEngine.supportsVoiceSearch());
-    }
-
     public void showCustomView(Tab tab, View view, int requestedOrientation,
             WebChromeClient.CustomViewCallback callback) {
         if (tab.inForeground()) {
@@ -1137,7 +1146,8 @@
         }
     }
 
-    protected void onActivityResult(int requestCode, int resultCode,
+    @Override
+    public void onActivityResult(int requestCode, int resultCode,
             Intent intent) {
         if (getCurrentTopWebView() == null) return;
         switch (requestCode) {
@@ -1188,6 +1198,15 @@
                     }
                 }
                 break;
+            case VOICE_RESULT:
+                if (resultCode == Activity.RESULT_OK && intent != null) {
+                    ArrayList<String> results = intent.getStringArrayListExtra(
+                            RecognizerIntent.EXTRA_RESULTS);
+                    if (results.size() >= 1) {
+                        mVoiceResult = results.get(0);
+                    }
+                }
+                break;
             default:
                 break;
         }
@@ -1240,7 +1259,8 @@
     // menu handling and state
     // TODO: maybe put into separate handler
 
-    protected boolean onCreateOptionsMenu(Menu menu) {
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
         if (mMenuState == EMPTY_MENU) {
             return false;
         }
@@ -1249,7 +1269,8 @@
         return true;
     }
 
-    protected void onCreateContextMenu(ContextMenu menu, View v,
+    @Override
+    public void onCreateContextMenu(ContextMenu menu, View v,
             ContextMenuInfo menuInfo) {
         if (v instanceof TitleBar) {
             return;
@@ -1282,6 +1303,7 @@
 
         // Show the correct menu group
         final String extra = result.getExtra();
+        if (extra == null) return;
         menu.setGroupVisible(R.id.PHONE_MENU,
                 type == WebView.HitTestResult.PHONE_TYPE);
         menu.setGroupVisible(R.id.EMAIL_MENU,
@@ -1388,8 +1410,20 @@
                 }
                 // otherwise fall through to handle image part
             case WebView.HitTestResult.IMAGE_TYPE:
+                MenuItem shareItem = menu.findItem(R.id.share_link_context_menu_id);
+                shareItem.setVisible(type == WebView.HitTestResult.IMAGE_TYPE);
                 if (type == WebView.HitTestResult.IMAGE_TYPE) {
                     menu.setHeaderTitle(extra);
+                    shareItem.setOnMenuItemClickListener(
+                            new MenuItem.OnMenuItemClickListener() {
+                                @Override
+                                public boolean onMenuItemClick(MenuItem item) {
+                                    sharePage(mActivity, null, extra, null,
+                                    null);
+                                    return true;
+                                }
+                            }
+                        );
                 }
                 menu.findItem(R.id.view_image_context_menu_id)
                         .setOnMenuItemClickListener(new OnMenuItemClickListener() {
@@ -1434,7 +1468,8 @@
         }
     }
 
-    boolean onPrepareOptionsMenu(Menu menu) {
+    @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
         updateInLoadMenuItems(menu, getCurrentTab());
         // hold on to the menu reference here; it is used by the page callbacks
         // to update the menu based on loading state
@@ -1509,9 +1544,6 @@
         nav.setEnabled(isNavDump);
 
         boolean showDebugSettings = mSettings.isDebugEnabled();
-        final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id);
-        counter.setVisible(showDebugSettings);
-        counter.setEnabled(showDebugSettings);
         final MenuItem uaSwitcher = menu.findItem(R.id.ua_desktop_menu_id);
         uaSwitcher.setChecked(isDesktopUa);
         menu.setGroupVisible(R.id.LIVE_MENU, isLive);
@@ -1521,6 +1553,7 @@
         mUi.updateMenuState(tab, menu);
     }
 
+    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (null == getCurrentTopWebView()) {
             return false;
@@ -1567,10 +1600,7 @@
                 break;
 
             case R.id.add_bookmark_menu_id:
-                Intent bookmarkIntent = createBookmarkCurrentPageIntent(false);
-                if (bookmarkIntent != null) {
-                    mActivity.startActivity(bookmarkIntent);
-                }
+                bookmarkCurrentPage();
                 break;
 
             case R.id.stop_reload_menu_id:
@@ -1604,50 +1634,17 @@
                 break;
 
             case R.id.preferences_menu_id:
-                Intent intent = new Intent(mActivity, BrowserPreferencesPage.class);
-                intent.putExtra(BrowserPreferencesPage.CURRENT_PAGE,
-                        getCurrentTopWebView().getUrl());
-                mActivity.startActivityForResult(intent, PREFERENCES_PAGE);
+                openPreferences();
                 break;
 
             case R.id.find_menu_id:
-                getCurrentTopWebView().showFindDialog(null, true);
+                findOnPage();
                 break;
 
             case R.id.save_snapshot_menu_id:
                 final Tab source = getTabControl().getCurrentTab();
                 if (source == null) break;
-                final ContentResolver cr = mActivity.getContentResolver();
-                final ContentValues values = source.createSnapshotValues();
-                if (values != null) {
-                    new AsyncTask<Tab, Void, Long>() {
-
-                        @Override
-                        protected Long doInBackground(Tab... params) {
-                            Uri result = cr.insert(Snapshots.CONTENT_URI, values);
-                            if (result == null) {
-                                return null;
-                            }
-                            long id = ContentUris.parseId(result);
-                            return id;
-                        }
-
-                        @Override
-                        protected void onPostExecute(Long id) {
-                            if (id == null) {
-                                Toast.makeText(mActivity, R.string.snapshot_failed,
-                                        Toast.LENGTH_SHORT).show();
-                                return;
-                            }
-                            Bundle b = new Bundle();
-                            b.putLong(BrowserSnapshotPage.EXTRA_ANIMATE_ID, id);
-                            mUi.showComboView(ComboViews.Snapshots, b);
-                        };
-                    }.execute(source);
-                } else {
-                    Toast.makeText(mActivity, R.string.snapshot_failed,
-                            Toast.LENGTH_SHORT).show();
-                }
+                new SaveSnapshotTask(source).execute();
                 break;
 
             case R.id.page_info_menu_id:
@@ -1670,10 +1667,6 @@
                 getCurrentTopWebView().debugDump();
                 break;
 
-            case R.id.dump_counters_menu_id:
-                getCurrentTopWebView().dumpV8Counters();
-                break;
-
             case R.id.zoom_in_menu_id:
                 getCurrentTopWebView().zoomIn();
                 break;
@@ -1687,9 +1680,7 @@
                 break;
 
             case R.id.ua_desktop_menu_id:
-                WebView web = getCurrentWebView();
-                mSettings.toggleDesktopUseragent(web);
-                web.loadUrl(web.getOriginalUrl());
+                toggleUserAgent();
                 break;
 
             case R.id.window_one_menu_id:
@@ -1721,6 +1712,97 @@
         return true;
     }
 
+    private class SaveSnapshotTask extends AsyncTask<Void, Void, Long>
+            implements OnCancelListener {
+
+        private Tab mTab;
+        private Dialog mProgressDialog;
+        private ContentValues mValues;
+
+        private SaveSnapshotTask(Tab tab) {
+            mTab = tab;
+        }
+
+        @Override
+        protected void onPreExecute() {
+            CharSequence message = mActivity.getText(R.string.saving_snapshot);
+            mProgressDialog = ProgressDialog.show(mActivity, null, message,
+                    true, true, this);
+            mValues = mTab.createSnapshotValues();
+        }
+
+        @Override
+        protected Long doInBackground(Void... params) {
+            if (!mTab.saveViewState(mValues)) {
+                return null;
+            }
+            if (isCancelled()) {
+                String path = mValues.getAsString(Snapshots.VIEWSTATE_PATH);
+                File file = mActivity.getFileStreamPath(path);
+                if (!file.delete()) {
+                    file.deleteOnExit();
+                }
+                return null;
+            }
+            final ContentResolver cr = mActivity.getContentResolver();
+            Uri result = cr.insert(Snapshots.CONTENT_URI, mValues);
+            if (result == null) {
+                return null;
+            }
+            long id = ContentUris.parseId(result);
+            return id;
+        }
+
+        @Override
+        protected void onPostExecute(Long id) {
+            if (isCancelled()) {
+                return;
+            }
+            mProgressDialog.dismiss();
+            if (id == null) {
+                Toast.makeText(mActivity, R.string.snapshot_failed,
+                        Toast.LENGTH_SHORT).show();
+                return;
+            }
+            Bundle b = new Bundle();
+            b.putLong(BrowserSnapshotPage.EXTRA_ANIMATE_ID, id);
+            mUi.showComboView(ComboViews.Snapshots, b);
+        }
+
+        @Override
+        public void onCancel(DialogInterface dialog) {
+            cancel(true);
+        }
+    }
+
+    @Override
+    public void toggleUserAgent() {
+        WebView web = getCurrentWebView();
+        mSettings.toggleDesktopUseragent(web);
+        web.loadUrl(web.getOriginalUrl());
+    }
+
+    @Override
+    public void findOnPage() {
+        getCurrentTopWebView().showFindDialog(null, true);
+    }
+
+    @Override
+    public void openPreferences() {
+        Intent intent = new Intent(mActivity, BrowserPreferencesPage.class);
+        intent.putExtra(BrowserPreferencesPage.CURRENT_PAGE,
+                getCurrentTopWebView().getUrl());
+        mActivity.startActivityForResult(intent, PREFERENCES_PAGE);
+    }
+
+    @Override
+    public void bookmarkCurrentPage() {
+        Intent bookmarkIntent = createBookmarkCurrentPageIntent(false);
+        if (bookmarkIntent != null) {
+            mActivity.startActivity(bookmarkIntent);
+        }
+    }
+
     private void goLive() {
         Tab t = getCurrentTab();
         t.loadUrl(t.getUrl(), null);
@@ -1731,6 +1813,7 @@
         mPageDialogsHandler.showPageInfo(mTabControl.getCurrentTab(), false, null);
     }
 
+    @Override
     public boolean onContextItemSelected(MenuItem item) {
         // Let the History and Bookmark fragments handle menus they created.
         if (item.getGroupId() == R.id.CONTEXT_MENU) {
@@ -1778,6 +1861,7 @@
         mActivity.openOptionsMenu();
     }
 
+    @Override
     public boolean onMenuOpened(int featureId, Menu menu) {
         if (mOptionsMenuOpen) {
             if (mConfigChanged) {
@@ -1806,11 +1890,13 @@
         return true;
     }
 
+    @Override
     public void onOptionsMenuClosed(Menu menu) {
         mOptionsMenuOpen = false;
         mUi.onOptionsMenuClosed(isInLoad());
     }
 
+    @Override
     public void onContextMenuClosed(Menu menu) {
         mUi.onContextMenuClosed(menu, isInLoad());
     }
@@ -1846,7 +1932,8 @@
 
     // action mode
 
-    void onActionModeStarted(ActionMode mode) {
+    @Override
+    public void onActionModeStarted(ActionMode mode) {
         mUi.onActionModeStarted(mode);
         mActionMode = mode;
     }
@@ -1873,6 +1960,7 @@
      * Called by find and select when they are finished.  Replace title bars
      * as necessary.
      */
+    @Override
     public void onActionModeFinished(ActionMode mode) {
         if (!isInCustomActionMode()) return;
         mUi.onActionModeFinished(isInLoad());
@@ -1927,9 +2015,10 @@
     }
 
     // file chooser
-    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
+    @Override
+    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
         mUploadHandler = new UploadHandler(this);
-        mUploadHandler.openFileChooser(uploadMsg, acceptType);
+        mUploadHandler.openFileChooser(uploadMsg, acceptType, capture);
     }
 
     // thumbnails
@@ -2010,7 +2099,6 @@
         }
         final String url = tab.getUrl();
         final String originalUrl = view.getOriginalUrl();
-
         if (TextUtils.isEmpty(url)) {
             return;
         }
@@ -2062,6 +2150,7 @@
     private class Copy implements OnMenuItemClickListener {
         private CharSequence mText;
 
+        @Override
         public boolean onMenuItemClick(MenuItem item) {
             copy(mText);
             return true;
@@ -2079,6 +2168,7 @@
         private static final String FALLBACK_EXTENSION = "dat";
         private static final String IMAGE_BASE_FORMAT = "yyyy-MM-dd-HH-mm-ss-";
 
+        @Override
         public boolean onMenuItemClick(MenuItem item) {
             if (DataUri.isDataUri(mText)) {
                 saveDataUri();
@@ -2111,7 +2201,7 @@
                  manager.addCompletedDownload(target.getName(),
                         mActivity.getTitle().toString(), false,
                         uri.getMimeType(), target.getAbsolutePath(),
-                        (long)uri.getData().length, false);
+                        uri.getData().length, true);
             } catch (IOException e) {
                 Log.e(LOGTAG, "Could not save data URL");
             } finally {
@@ -2147,8 +2237,9 @@
     }
 
     private static class SelectText implements OnMenuItemClickListener {
-        private WebView mWebView;
+        private WebViewClassic mWebView;
 
+        @Override
         public boolean onMenuItemClick(MenuItem item) {
             if (mWebView != null) {
                 return mWebView.selectText();
@@ -2157,7 +2248,7 @@
         }
 
         public SelectText(WebView webView) {
-            mWebView = webView;
+            mWebView = WebViewClassic.fromWebView(webView);
         }
 
     }
@@ -2222,6 +2313,7 @@
 
     // Remove the sub window if it exists. Also called by TabControl when the
     // user clicks the 'X' to dismiss a sub window.
+    @Override
     public void dismissSubWindow(Tab tab) {
         removeSubWindow(tab);
         // dismiss the subwindow. This will destroy the WebView.
@@ -2444,7 +2536,8 @@
         // In case the user enters nothing.
         if (url != null && url.length() != 0 && tab != null && view != null) {
             url = UrlUtils.smartUrlFilter(url);
-            if (!view.getWebViewClient().shouldOverrideUrlLoading(view, url)) {
+            if (!WebViewClassic.fromWebView(view).getWebViewClient().
+                    shouldOverrideUrlLoading(view, url)) {
                 loadUrl(tab, url);
             }
         }
@@ -2478,9 +2571,7 @@
      */
     protected void loadUrlDataIn(Tab t, UrlData data) {
         if (data != null) {
-            if (data.mVoiceIntent != null) {
-                t.activateVoiceSearchMode(data.mVoiceIntent);
-            } else if (data.isPreloaded()) {
+            if (data.isPreloaded()) {
                 // this isn't called for preloaded tabs
             } else {
                 loadUrl(t, data.mUrl, data.mHeaders);
@@ -2538,53 +2629,15 @@
     }
 
     /**
-     * Feed the previously stored results strings to the BrowserProvider so that
-     * the SearchDialog will show them instead of the standard searches.
-     * @param result String to show on the editable line of the SearchDialog.
-     */
-    @Override
-    public void showVoiceSearchResults(String result) {
-        ContentProviderClient client = mActivity.getContentResolver()
-                .acquireContentProviderClient(Browser.BOOKMARKS_URI);
-        ContentProvider prov = client.getLocalContentProvider();
-        BrowserProvider bp = (BrowserProvider) prov;
-        bp.setQueryResults(mTabControl.getCurrentTab().getVoiceSearchResults());
-        client.release();
-
-        Bundle bundle = createGoogleSearchSourceBundle(
-                GOOGLE_SEARCH_SOURCE_SEARCHKEY);
-        bundle.putBoolean(SearchManager.CONTEXT_IS_VOICE, true);
-        startSearch(result, false, bundle, false);
-    }
-
-    private void startSearch(String initialQuery, boolean selectInitialQuery,
-            Bundle appSearchData, boolean globalSearch) {
-        if (appSearchData == null) {
-            appSearchData = createGoogleSearchSourceBundle(
-                    GOOGLE_SEARCH_SOURCE_TYPE);
-        }
-
-        SearchEngine searchEngine = mSettings.getSearchEngine();
-        if (searchEngine != null && !searchEngine.supportsVoiceSearch()) {
-            appSearchData.putBoolean(SearchManager.DISABLE_VOICE_SEARCH, true);
-        }
-        mActivity.startSearch(initialQuery, selectInitialQuery, appSearchData,
-                globalSearch);
-    }
-
-    private Bundle createGoogleSearchSourceBundle(String source) {
-        Bundle bundle = new Bundle();
-        bundle.putString(Search.SOURCE, source);
-        return bundle;
-    }
-
-    /**
      * helper method for key handler
      * returns the current tab if it can't advance
      */
     private Tab getNextTab() {
-        return mTabControl.getTab(Math.min(mTabControl.getTabCount() - 1,
-                mTabControl.getCurrentPosition() + 1));
+        int pos = mTabControl.getCurrentPosition() + 1;
+        if (pos >= mTabControl.getTabCount()) {
+            pos = 0;
+        }
+        return mTabControl.getTab(pos);
     }
 
     /**
@@ -2592,8 +2645,17 @@
      * returns the current tab if it can't advance
      */
     private Tab getPrevTab() {
-        return  mTabControl.getTab(Math.max(0,
-                mTabControl.getCurrentPosition() - 1));
+        int pos  = mTabControl.getCurrentPosition() - 1;
+        if ( pos < 0) {
+            pos = mTabControl.getTabCount() - 1;
+        }
+        return  mTabControl.getTab(pos);
+    }
+
+    boolean isMenuOrCtrlKey(int keyCode) {
+        return (KeyEvent.KEYCODE_MENU == keyCode)
+                || (KeyEvent.KEYCODE_CTRL_LEFT == keyCode)
+                || (KeyEvent.KEYCODE_CTRL_RIGHT == keyCode);
     }
 
     /**
@@ -2603,14 +2665,12 @@
      * @param event
      * @return true if handled, false to pass to super
      */
-    boolean onKeyDown(int keyCode, KeyEvent event) {
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
         boolean noModifiers = event.hasNoModifiers();
         // Even if MENU is already held down, we need to call to super to open
         // the IME on long press.
-        if (!noModifiers
-                && ((KeyEvent.KEYCODE_MENU == keyCode)
-                        || (KeyEvent.KEYCODE_CTRL_LEFT == keyCode)
-                        || (KeyEvent.KEYCODE_CTRL_RIGHT == keyCode))) {
+        if (!noModifiers && isMenuOrCtrlKey(keyCode)) {
             mMenuIsDown = true;
             return false;
         }
@@ -2667,14 +2727,14 @@
                 break;
             case KeyEvent.KEYCODE_A:
                 if (ctrl) {
-                    webView.selectAll();
+                    WebViewClassic.fromWebView(webView).selectAll();
                     return true;
                 }
                 break;
 //          case KeyEvent.KEYCODE_B:    // menu
             case KeyEvent.KEYCODE_C:
                 if (ctrl) {
-                    webView.copySelection();
+                    WebViewClassic.fromWebView(webView).copySelection();
                     return true;
                 }
                 break;
@@ -2717,7 +2777,8 @@
          return mUi.dispatchKey(keyCode, event);
     }
 
-    boolean onKeyLongPress(int keyCode, KeyEvent event) {
+    @Override
+    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
         switch(keyCode) {
         case KeyEvent.KEYCODE_BACK:
             if (mUi.isWebShowing()) {
@@ -2729,10 +2790,12 @@
         return false;
     }
 
-    boolean onKeyUp(int keyCode, KeyEvent event) {
-        if (KeyEvent.KEYCODE_MENU == keyCode) {
+    @Override
+    public boolean onKeyUp(int keyCode, KeyEvent event) {
+        if (isMenuOrCtrlKey(keyCode)) {
             mMenuIsDown = false;
-            if (event.isTracking() && !event.isCanceled()) {
+            if (KeyEvent.KEYCODE_MENU == keyCode
+                    && event.isTracking() && !event.isCanceled()) {
                 return onMenuKey();
             }
         }
@@ -2752,6 +2815,7 @@
         return mMenuIsDown;
     }
 
+    @Override
     public void setupAutoFill(Message message) {
         // Open the settings activity at the AutoFill profile fragment so that
         // the user can create a new profile. When they return, we will dispatch
@@ -2763,8 +2827,9 @@
         mActivity.startActivityForResult(intent, AUTOFILL_SETUP);
     }
 
+    @Override
     public boolean onSearchRequested() {
-        mUi.editUrl(false);
+        mUi.editUrl(false, true);
         return true;
     }
 
@@ -2774,26 +2839,48 @@
     }
 
     @Override
+    public boolean supportsVoice() {
+        PackageManager pm = mActivity.getPackageManager();
+        List activities = pm.queryIntentActivities(new Intent(
+                RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
+        return activities.size() != 0;
+    }
+
+    @Override
+    public void startVoiceRecognizer() {
+        Intent voice = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
+        voice.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
+                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
+        voice.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
+        mActivity.startActivityForResult(voice, VOICE_RESULT);
+    }
+
+    @Override
     public void setBlockEvents(boolean block) {
         mBlockEvents = block;
     }
 
+    @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
         return mBlockEvents;
     }
 
+    @Override
     public boolean dispatchKeyShortcutEvent(KeyEvent event) {
         return mBlockEvents;
     }
 
+    @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         return mBlockEvents;
     }
 
+    @Override
     public boolean dispatchTrackballEvent(MotionEvent ev) {
         return mBlockEvents;
     }
 
+    @Override
     public boolean dispatchGenericMotionEvent(MotionEvent ev) {
         return mBlockEvents;
     }
diff --git a/src/com/android/browser/CrashRecoveryHandler.java b/src/com/android/browser/CrashRecoveryHandler.java
index 3202016..822e82a 100644
--- a/src/com/android/browser/CrashRecoveryHandler.java
+++ b/src/com/android/browser/CrashRecoveryHandler.java
@@ -37,8 +37,6 @@
     private static final boolean LOGV_ENABLED = Browser.LOGV_ENABLED;
     private static final String LOGTAG = "BrowserCrashRecovery";
     private static final String STATE_FILE = "browser_state.parcel";
-    private static final String RECOVERY_PREFERENCES = "browser_recovery_prefs";
-    private static final String KEY_LAST_RECOVERED = "last_recovered";
     private static final int BUFFER_SIZE = 4096;
     private static final long BACKUP_DELAY = 500; // 500ms between writes
     /* This is the duration for which we will prompt to restore
@@ -85,31 +83,8 @@
             public void handleMessage(Message msg) {
                 switch (msg.what) {
                 case MSG_WRITE_STATE:
-                    if (LOGV_ENABLED) {
-                        Log.v(LOGTAG, "Saving crash recovery state");
-                    }
-                    Parcel p = Parcel.obtain();
-                    try {
-                        Bundle state = (Bundle) msg.obj;
-                        state.writeToParcel(p, 0);
-                        File stateJournal = new File(mContext.getCacheDir(),
-                                STATE_FILE + ".journal");
-                        FileOutputStream fout = new FileOutputStream(stateJournal);
-                        fout.write(p.marshall());
-                        fout.close();
-                        File stateFile = new File(mContext.getCacheDir(),
-                                STATE_FILE);
-                        if (!stateJournal.renameTo(stateFile)) {
-                            // Failed to rename, try deleting the existing
-                            // file and try again
-                            stateFile.delete();
-                            stateJournal.renameTo(stateFile);
-                        }
-                    } catch (Throwable e) {
-                        Log.i(LOGTAG, "Failed to save persistent state", e);
-                    } finally {
-                        p.recycle();
-                    }
+                    Bundle saveState = (Bundle) msg.obj;
+                    writeState(saveState);
                     break;
                 case MSG_CLEAR_STATE:
                     if (LOGV_ENABLED) {
@@ -142,8 +117,7 @@
         @Override
         public void run() {
             try {
-                final Bundle state = new Bundle();
-                mController.onSaveInstanceState(state);
+                final Bundle state = mController.createSaveState();
                 Message.obtain(mBackgroundHandler, MSG_WRITE_STATE, state)
                         .sendToTarget();
                 // Remove any queued up saves
@@ -162,28 +136,24 @@
     }
 
     private boolean shouldRestore() {
-        SharedPreferences prefs = mContext.getSharedPreferences(
-                RECOVERY_PREFERENCES, Context.MODE_PRIVATE);
-        long lastRecovered = prefs.getLong(KEY_LAST_RECOVERED, 0);
+        BrowserSettings browserSettings = BrowserSettings.getInstance();
+        long lastRecovered = browserSettings.getLastRecovered();
         long timeSinceLastRecover = System.currentTimeMillis() - lastRecovered;
-        if (timeSinceLastRecover > PROMPT_INTERVAL) {
-            return true;
-        }
-        return false;
+        return (timeSinceLastRecover > PROMPT_INTERVAL)
+                || browserSettings.wasLastRunPaused();
     }
 
     private void updateLastRecovered(long time) {
-        SharedPreferences prefs = mContext.getSharedPreferences(
-                RECOVERY_PREFERENCES, Context.MODE_PRIVATE);
-        prefs.edit()
-            .putLong(KEY_LAST_RECOVERED, time)
-            .apply();
+        BrowserSettings browserSettings = BrowserSettings.getInstance();
+        browserSettings.setLastRecovered(time);
     }
 
-    private Bundle loadCrashState() {
+    synchronized private Bundle loadCrashState() {
         if (!shouldRestore()) {
             return null;
         }
+        BrowserSettings browserSettings = BrowserSettings.getInstance();
+        browserSettings.setLastRunPaused(false);
         Bundle state = null;
         Parcel parcel = Parcel.obtain();
         FileInputStream fin = null;
@@ -231,7 +201,7 @@
         }
         updateLastRecovered(mRecoveryState != null
                 ? System.currentTimeMillis() : 0);
-        mController.doStart(mRecoveryState, intent, true);
+        mController.doStart(mRecoveryState, intent);
         mRecoveryState = null;
     }
 
@@ -245,4 +215,35 @@
         mBackgroundHandler.sendEmptyMessage(MSG_PRELOAD_STATE);
     }
 
-}
+    /**
+     * Writes the crash recovery state to a file synchronously.
+     * Errors are swallowed, but logged.
+     * @param state The state to write out
+     */
+    synchronized void writeState(Bundle state) {
+        if (LOGV_ENABLED) {
+            Log.v(LOGTAG, "Saving crash recovery state");
+        }
+        Parcel p = Parcel.obtain();
+        try {
+            state.writeToParcel(p, 0);
+            File stateJournal = new File(mContext.getCacheDir(),
+                    STATE_FILE + ".journal");
+            FileOutputStream fout = new FileOutputStream(stateJournal);
+            fout.write(p.marshall());
+            fout.close();
+            File stateFile = new File(mContext.getCacheDir(),
+                    STATE_FILE);
+            if (!stateJournal.renameTo(stateFile)) {
+                // Failed to rename, try deleting the existing
+                // file and try again
+                stateFile.delete();
+                stateJournal.renameTo(stateFile);
+            }
+        } catch (Throwable e) {
+            Log.i(LOGTAG, "Failed to save persistent state", e);
+        } finally {
+            p.recycle();
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index e5ddb47..e22c5dc 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -28,14 +28,12 @@
 import android.os.Bundle;
 import android.provider.Browser;
 import android.provider.MediaStore;
-import android.speech.RecognizerResultsIntent;
 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;
 
 import java.util.HashMap;
 import java.util.Iterator;
@@ -93,37 +91,11 @@
         // In case the SearchDialog is open.
         ((SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE))
                 .stopSearch();
-        boolean activateVoiceSearch = RecognizerResultsIntent
-                .ACTION_VOICE_SEARCH_RESULTS.equals(action);
         if (Intent.ACTION_VIEW.equals(action)
                 || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)
                 || Intent.ACTION_SEARCH.equals(action)
                 || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
-                || Intent.ACTION_WEB_SEARCH.equals(action)
-                || activateVoiceSearch) {
-            if (current.isInVoiceSearchMode()) {
-                String title = current.getVoiceDisplayTitle();
-                if (title != null && title.equals(intent.getStringExtra(
-                        SearchManager.QUERY))) {
-                    // The user submitted the same search as the last voice
-                    // search, so do nothing.
-                    return;
-                }
-                if (Intent.ACTION_SEARCH.equals(action)
-                        && current.voiceSearchSourceIsGoogle()) {
-                    Intent logIntent = new Intent(
-                            LoggingEvents.ACTION_LOG_EVENT);
-                    logIntent.putExtra(LoggingEvents.EXTRA_EVENT,
-                            LoggingEvents.VoiceSearch.QUERY_UPDATED);
-                    logIntent.putExtra(
-                            LoggingEvents.VoiceSearch.EXTRA_QUERY_UPDATED_VALUE,
-                            intent.getDataString());
-                    mActivity.sendBroadcast(logIntent);
-                    // Note, onPageStarted will revert the voice title bar
-                    // When http://b/issue?id=2379215 is fixed, we should update
-                    // the title bar here.
-                }
-            }
+                || Intent.ACTION_WEB_SEARCH.equals(action)) {
             // If this was a search request (e.g. search query directly typed into the address bar),
             // pass it on to the default web search provider.
             if (handleWebSearchIntent(mActivity, mController, intent)) {
@@ -143,11 +115,9 @@
             /*
              * TODO: Don't allow javascript URIs
              * 0) If this is a javascript: URI, *always* open a new tab
-             * 1) If this is a voice search, re-use tab for appId
-             *    If there is no appId, use current tab
-             * 2) If the URL is already opened, switch to that tab
-             * 3-phone) Reuse tab with same appId
-             * 3-tablet) Open new tab
+             * 1) If the URL is already opened, switch to that tab
+             * 2-phone) Reuse tab with same appId
+             * 2-tablet) Open new tab
              */
             final String appId = intent
                     .getStringExtra(Browser.EXTRA_APPLICATION_ID);
@@ -157,12 +127,20 @@
                 mController.openTab(urlData);
                 return;
             }
-            if ((Intent.ACTION_VIEW.equals(action)
-                    // If a voice search has no appId, it means that it came
-                    // from the browser.  In that case, reuse the current tab.
-                    || (activateVoiceSearch && appId != null))
-                    && !mActivity.getPackageName().equals(appId)) {
-                if (activateVoiceSearch || !BrowserActivity.isTablet(mActivity)) {
+            if (Intent.ACTION_VIEW.equals(action)
+                    && (appId != null)
+                    && appId.startsWith(mActivity.getPackageName())) {
+                Tab appTab = mTabControl.getTabFromAppId(appId);
+                if ((appTab != null) && (appTab == mController.getCurrentTab())) {
+                    mController.switchToTab(appTab);
+                    mController.loadUrlDataIn(appTab, urlData);
+                    return;
+                }
+            }
+            if (Intent.ACTION_VIEW.equals(action)
+                     && !mActivity.getPackageName().equals(appId)) {
+                if (!BrowserActivity.isTablet(mActivity)
+                        && !mSettings.allowAppTabs()) {
                     Tab appTab = mTabControl.getTabFromAppId(appId);
                     if (appTab != null) {
                         mController.reuseTab(appTab, urlData);
@@ -197,15 +175,15 @@
                 if (!urlData.isEmpty()
                         && urlData.mUrl.startsWith("about:debug")) {
                     if ("about:debug.dom".equals(urlData.mUrl)) {
-                        current.getWebView().dumpDomTree(false);
+                        current.getWebViewClassic().dumpDomTree(false);
                     } else if ("about:debug.dom.file".equals(urlData.mUrl)) {
-                        current.getWebView().dumpDomTree(true);
+                        current.getWebViewClassic().dumpDomTree(true);
                     } else if ("about:debug.render".equals(urlData.mUrl)) {
-                        current.getWebView().dumpRenderTree(false);
+                        current.getWebViewClassic().dumpRenderTree(false);
                     } else if ("about:debug.render.file".equals(urlData.mUrl)) {
-                        current.getWebView().dumpRenderTree(true);
+                        current.getWebViewClassic().dumpRenderTree(true);
                     } else if ("about:debug.display".equals(urlData.mUrl)) {
-                        current.getWebView().dumpDisplayTree();
+                        current.getWebViewClassic().dumpDisplayTree();
                     } else if ("about:debug.nav".equals(urlData.mUrl)) {
                         current.getWebView().debugDump();
                     } else {
@@ -291,10 +269,6 @@
 
         String url = null;
         final String action = intent.getAction();
-        if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS.equals(
-                action)) {
-            return false;
-        }
         if (Intent.ACTION_VIEW.equals(action)) {
             Uri data = intent.getData();
             if (data != null) url = data.toString();
@@ -359,14 +333,12 @@
     static class UrlData {
         final String mUrl;
         final Map<String, String> mHeaders;
-        final Intent mVoiceIntent;
         final PreloadedTabControl mPreloadedTab;
         final String mSearchBoxQueryToSubmit;
 
         UrlData(String url) {
             this.mUrl = url;
             this.mHeaders = null;
-            this.mVoiceIntent = null;
             this.mPreloadedTab = null;
             this.mSearchBoxQueryToSubmit = null;
         }
@@ -379,18 +351,12 @@
                 PreloadedTabControl preloaded, String searchBoxQueryToSubmit) {
             this.mUrl = url;
             this.mHeaders = headers;
-            if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS
-                    .equals(intent.getAction())) {
-                this.mVoiceIntent = intent;
-            } else {
-                this.mVoiceIntent = null;
-            }
             this.mPreloadedTab = preloaded;
             this.mSearchBoxQueryToSubmit = searchBoxQueryToSubmit;
         }
 
         boolean isEmpty() {
-            return mVoiceIntent == null && (mUrl == null || mUrl.length() == 0);
+            return (mUrl == null || mUrl.length() == 0);
         }
 
         boolean isPreloaded() {
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index 8314f73..1d2114e 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -242,7 +242,7 @@
                         switchToTab(tab);
                         mUi.getTitleBar().setSkipTitleBarAnimations(true);
                         close(position, false);
-                        mUi.editUrl(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 128304c..7f100ff 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -21,7 +21,6 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.speech.RecognizerResultsIntent;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.util.AttributeSet;
@@ -35,8 +34,6 @@
 
 import com.android.browser.UrlInputView.UrlInputListener;
 
-import java.util.List;
-
 public class NavigationBarBase extends LinearLayout implements
         OnClickListener, UrlInputListener, OnFocusChangeListener,
         TextWatcher {
@@ -45,7 +42,6 @@
     protected TitleBar mTitleBar;
     protected UiController mUiController;
     protected UrlInputView mUrlInput;
-    protected boolean mInVoiceMode = false;
 
     private ImageView mFavicon;
     private ImageView mLockIcon;
@@ -108,10 +104,6 @@
         }
         if (hasFocus) {
             mBaseUi.showTitleBar();
-            mUrlInput.forceIme();
-            if (mInVoiceMode) {
-                mUrlInput.forceFilter();
-            }
         } else if (!mUrlInput.needsUpdate()) {
             mUrlInput.dismissDropDown();
             mUrlInput.hideIME();
@@ -129,29 +121,25 @@
     protected void setFocusState(boolean focus) {
     }
 
-    protected void setSearchMode(boolean voiceSearchEnabled) {}
-
     public boolean isEditingUrl() {
         return mUrlInput.hasFocus();
     }
 
     void stopEditingUrl() {
-        mUrlInput.clearFocus();
+        WebView currentTopWebView = mUiController.getCurrentTopWebView();
+        if (currentTopWebView != null) {
+            currentTopWebView.requestFocus();
+        }
     }
 
     void setDisplayTitle(String title) {
         if (!isEditingUrl()) {
-            mUrlInput.setText(title, false);
+            if (!title.equals(mUrlInput.getText().toString())) {
+                mUrlInput.setText(title, false);
+            }
         }
     }
 
-    // voicesearch
-
-    public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
-        mInVoiceMode = voicemode;
-        mUrlInput.setVoiceResults(voiceResults);
-    }
-
     void setIncognitoMode(boolean incognito) {
         mUrlInput.setIncognitoMode(incognito);
     }
@@ -168,10 +156,7 @@
      */
     @Override
     public void onAction(String text, String extra, String source) {
-        WebView currentTopWebView = mUiController.getCurrentTopWebView();
-        if (currentTopWebView != null) {
-            currentTopWebView.requestFocus();
-        }
+        stopEditingUrl();
         if (UrlInputView.TYPED.equals(source)) {
             String url = UrlUtils.smartUrlFilter(text, false);
             Tab t = mBaseUi.getActiveTab();
@@ -184,13 +169,7 @@
             }
         }
         Intent i = new Intent();
-        String action = null;
-        if (UrlInputView.VOICE.equals(source)) {
-            action = RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS;
-            source = null;
-        } else {
-            action = Intent.ACTION_SEARCH;
-        }
+        String action = Intent.ACTION_SEARCH;
         i.setAction(action);
         i.putExtra(SearchManager.QUERY, text);
         if (extra != null) {
@@ -212,7 +191,7 @@
         post(new Runnable() {
             public void run() {
                 clearFocus();
-                if ((currentTab != null) && !mInVoiceMode) {
+                if (currentTab != null) {
                     setDisplayTitle(currentTab.getUrl());
                 }
             }
@@ -238,7 +217,7 @@
     public boolean dispatchKeyEventPreIme(KeyEvent evt) {
         if (evt.getKeyCode() == KeyEvent.KEYCODE_BACK) {
             // catch back key in order to do slightly more cleanup than usual
-            mUrlInput.clearFocus();
+            stopEditingUrl();
             return true;
         }
         return super.dispatchKeyEventPreIme(evt);
@@ -248,7 +227,7 @@
      * called from the Ui when the user wants to edit
      * @param clearInput clear the input field
      */
-    void startEditingUrl(boolean clearInput) {
+    void startEditingUrl(boolean clearInput, boolean forceIME) {
         // editing takes preference of progress
         setVisibility(View.VISIBLE);
         if (mTitleBar.useQuickControls()) {
@@ -259,8 +238,9 @@
         }
         if (clearInput) {
             mUrlInput.setText("");
-        } else if (mInVoiceMode) {
-            mUrlInput.showDropDown();
+        }
+        if (forceIME) {
+            mUrlInput.showIME();
         }
     }
 
@@ -277,17 +257,18 @@
     public void onTabDataChanged(Tab tab) {
     }
 
+    public void onVoiceResult(String s) {
+        startEditingUrl(true, true);
+        onCopySuggestion(s);
+    }
+
     @Override
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
 
     @Override
-    public void onTextChanged(CharSequence s, int start, int before, int count) {
-        if (mUrlInput.hasFocus()) {
-            // clear voice mode when user types
-            setInVoiceMode(false, null);
-        }
-    }
+    public void onTextChanged(CharSequence s, int start, int before, int count) { }
 
     @Override
     public void afterTextChanged(Editable s) { }
+
 }
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index 60b228d..c3930d3 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -36,9 +36,9 @@
         StateListener, OnMenuItemClickListener, OnDismissListener {
 
     private ImageView mStopButton;
-    private ImageView mVoiceButton;
     private ImageView mMagnify;
     private ImageView mClearButton;
+    private ImageView mVoiceButton;
     private Drawable mStopDrawable;
     private Drawable mRefreshDrawable;
     private String mStopDescription;
@@ -70,10 +70,10 @@
         super.onFinishInflate();
         mStopButton = (ImageView) findViewById(R.id.stop);
         mStopButton.setOnClickListener(this);
-        mVoiceButton = (ImageView) findViewById(R.id.voice);
-        mVoiceButton.setOnClickListener(this);
         mClearButton = (ImageView) findViewById(R.id.clear);
         mClearButton.setOnClickListener(this);
+        mVoiceButton = (ImageView) findViewById(R.id.voice);
+        mVoiceButton.setOnClickListener(this);
         mMagnify = (ImageView) findViewById(R.id.magnify);
         mTabSwitcher = findViewById(R.id.tab_switcher);
         mTabSwitcher.setOnClickListener(this);
@@ -96,14 +96,6 @@
     }
 
     @Override
-    protected void setSearchMode(boolean voiceSearchEnabled) {
-        boolean showvoicebutton = voiceSearchEnabled &&
-                mUiController.supportsVoiceSearch();
-        mVoiceButton.setVisibility(showvoicebutton ? View.VISIBLE :
-                View.GONE);
-    }
-
-    @Override
     public void onProgressStarted() {
         super.onProgressStarted();
         if (mStopButton.getDrawable() != mStopDrawable) {
@@ -157,8 +149,6 @@
                     web.reload();
                 }
             }
-        } else if (v == mVoiceButton) {
-            mUiController.startVoiceSearch();
         } else if (v == mTabSwitcher) {
             ((PhoneUi) mBaseUi).toggleNavScreen();
         } else if (mMore == v) {
@@ -167,6 +157,8 @@
             mUrlInput.setText("");
         } else if (mComboIcon == v) {
             mUiController.showPageInfo();
+        } else if (mVoiceButton == v) {
+            mUiController.startVoiceRecognizer();
         } else {
             super.onClick(v);
         }
@@ -228,8 +220,8 @@
             mComboIcon.setVisibility(View.VISIBLE);
             mStopButton.setVisibility(View.GONE);
             mClearButton.setVisibility(View.GONE);
+            mVoiceButton.setVisibility(View.GONE);
             mMagnify.setVisibility(View.GONE);
-            setSearchMode(mInVoiceMode);
             mTabSwitcher.setVisibility(View.VISIBLE);
             mTitleContainer.setBackgroundDrawable(null);
             mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
@@ -238,8 +230,8 @@
             mComboIcon.setVisibility(View.GONE);
             mStopButton.setVisibility(View.VISIBLE);
             mClearButton.setVisibility(View.GONE);
+            mVoiceButton.setVisibility(View.VISIBLE);
             mMagnify.setVisibility(View.GONE);
-            setSearchMode(true);
             mTabSwitcher.setVisibility(View.GONE);
             mMore.setVisibility(View.GONE);
             mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
@@ -248,8 +240,8 @@
             mComboIcon.setVisibility(View.GONE);
             mStopButton.setVisibility(View.GONE);
             mClearButton.setVisibility(View.VISIBLE);
+            mVoiceButton.setVisibility(View.GONE);
             mMagnify.setVisibility(View.VISIBLE);
-            setSearchMode(false);
             mTabSwitcher.setVisibility(View.GONE);
             mMore.setVisibility(View.GONE);
             mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index 04f372a..79c8de6 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -32,10 +32,9 @@
 import android.widget.ImageView;
 
 import com.android.browser.UI.ComboViews;
+import com.android.browser.UrlInputView.StateListener;
 
-import java.util.List;
-
-public class NavigationBarTablet extends NavigationBarBase {
+public class NavigationBarTablet extends NavigationBarBase implements StateListener {
 
     private Drawable mStopDrawable;
     private Drawable mReloadDrawable;
@@ -48,11 +47,10 @@
     private ImageView mStar;
     private ImageView mUrlIcon;
     private ImageView mSearchButton;
-    private View mGoButton;
     private ImageView mStopButton;
     private View mAllButton;
     private View mClearButton;
-    private ImageView mVoiceSearch;
+    private View mVoiceButton;
     private View mNavButtons;
     private Drawable mFocusDrawable;
     private Drawable mUnfocusDrawable;
@@ -100,9 +98,8 @@
         mStar = (ImageView) findViewById(R.id.star);
         mStopButton = (ImageView) findViewById(R.id.stop);
         mSearchButton = (ImageView) findViewById(R.id.search);
-        mGoButton = findViewById(R.id.go);
         mClearButton = findViewById(R.id.clear);
-        mVoiceSearch = (ImageView) findViewById(R.id.voicesearch);
+        mVoiceButton = findViewById(R.id.voice);
         mUrlContainer = findViewById(R.id.urlbar_focused);
         mBackButton.setOnClickListener(this);
         mForwardButton.setOnClickListener(this);
@@ -110,10 +107,10 @@
         mAllButton.setOnClickListener(this);
         mStopButton.setOnClickListener(this);
         mSearchButton.setOnClickListener(this);
-        mGoButton.setOnClickListener(this);
         mClearButton.setOnClickListener(this);
-        mVoiceSearch.setOnClickListener(this);
+        mVoiceButton.setOnClickListener(this);
         mUrlInput.setContainer(mUrlContainer);
+        mUrlInput.setStateListener(this);
     }
 
     public void onConfigurationChanged(Configuration config) {
@@ -165,9 +162,9 @@
 
     @Override
     public void onClick(View v) {
-        if (mBackButton == v) {
+        if ((mBackButton == v) && (mUiController.getCurrentTab() != null)) {
             mUiController.getCurrentTab().goBack();
-        } else if (mForwardButton == v) {
+        } else if ((mForwardButton == v)  && (mUiController.getCurrentTab() != null)) {
             mUiController.getCurrentTab().goForward();
         } else if (mStar == v) {
             Intent intent = mUiController.createBookmarkCurrentPageIntent(true);
@@ -177,18 +174,13 @@
         } else if (mAllButton == v) {
             mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         } else if (mSearchButton == v) {
-            mBaseUi.editUrl(true);
+            mBaseUi.editUrl(true, true);
         } else if (mStopButton == v) {
             stopOrRefresh();
-        } else if (mGoButton == v) {
-            if (!TextUtils.isEmpty(mUrlInput.getText())) {
-                onAction(mUrlInput.getText().toString(), null,
-                        UrlInputView.TYPED);
-            }
         } else if (mClearButton == v) {
             clearOrClose();
-        } else if (mVoiceSearch == v) {
-            mUiController.startVoiceSearch();
+        } else if (mVoiceButton == v) {
+            mUiController.startVoiceRecognizer();
         } else {
             super.onClick(v);
         }
@@ -214,14 +206,10 @@
         if (mUrlInput.hasFocus()) {
             mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
         } else {
-            if (mInVoiceMode) {
-                mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
-            } else {
-                if (mFaviconDrawable == null) {
-                    mFaviconDrawable = mBaseUi.getFaviconDrawable(null);
-                }
-                mUrlIcon.setImageDrawable(mFaviconDrawable);
+            if (mFaviconDrawable == null) {
+                mFaviconDrawable = mBaseUi.getFaviconDrawable(null);
             }
+            mUrlIcon.setImageDrawable(mFaviconDrawable);
         }
     }
 
@@ -234,17 +222,12 @@
             }
             mSearchButton.setVisibility(View.GONE);
             mStar.setVisibility(View.GONE);
-            mClearButton.setVisibility(View.VISIBLE);
             mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
-            updateSearchMode(false);
         } else {
             if (mHideNavButtons) {
                 showNavButtons();
             }
-            mGoButton.setVisibility(View.GONE);
-            mVoiceSearch.setVisibility(View.GONE);
             showHideStar(mUiController.getCurrentTab());
-            mClearButton.setVisibility(View.GONE);
             if (mTitleBar.useQuickControls()) {
                 mSearchButton.setVisibility(View.GONE);
             } else {
@@ -261,7 +244,9 @@
         if (mTitleBar.isInLoad()) {
             mUiController.stopLoading();
         } else {
-            mUiController.getCurrentTopWebView().reload();
+            if (mUiController.getCurrentTopWebView() != null) {
+                mUiController.getCurrentTopWebView().reload();
+            }
         }
     }
 
@@ -277,56 +262,50 @@
         mStopButton.setContentDescription(mRefreshDescription);
     }
 
-    protected void updateSearchMode(boolean userEdited) {
-        setSearchMode(!userEdited || TextUtils.isEmpty(mUrlInput.getText()));
-    }
-
-    @Override
-    protected void setSearchMode(boolean voiceSearchEnabled) {
-        boolean showvoicebutton = voiceSearchEnabled &&
-                mUiController.supportsVoiceSearch();
-        mVoiceSearch.setVisibility(showvoicebutton ? View.VISIBLE :
-                View.GONE);
-        mGoButton.setVisibility(voiceSearchEnabled ? View.GONE :
-                View.VISIBLE);
-    }
-
-    @Override
-    public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
-        super.setInVoiceMode(voicemode, voiceResults);
-        if (voicemode) {
-            mUrlIcon.setImageDrawable(mSearchButton.getDrawable());
-        }
-    }
+    private AnimatorSet mAnimation;
 
     private void hideNavButtons() {
+        if (mBaseUi.blockFocusAnimations()) {
+            mNavButtons.setVisibility(View.GONE);
+            return;
+        }
         int awidth = mNavButtons.getMeasuredWidth();
         Animator anim1 = ObjectAnimator.ofFloat(mNavButtons, View.TRANSLATION_X, 0, - awidth);
         Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", mUrlContainer.getLeft(),
                 mUrlContainer.getPaddingLeft());
         Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA, 1f, 0f);
-        AnimatorSet combo = new AnimatorSet();
-        combo.playTogether(anim1, anim2, anim3);
-        combo.addListener(new AnimatorListenerAdapter() {
+        mAnimation = new AnimatorSet();
+        mAnimation.playTogether(anim1, anim2, anim3);
+        mAnimation.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
                 mNavButtons.setVisibility(View.GONE);
+                mAnimation = null;
             }
         });
-        combo.setDuration(150);
-        combo.start();
+        mAnimation.setDuration(150);
+        mAnimation.start();
     }
 
     private void showNavButtons() {
-        int awidth = mNavButtons.getMeasuredWidth();
-        Animator anim1 = ObjectAnimator.ofFloat(mNavButtons, View.TRANSLATION_X, -awidth, 0);
-        Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", 0, awidth);
-        Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA, 0f, 1f);
-        AnimatorSet combo = new AnimatorSet();
-        combo.playTogether(anim1, anim2, anim3);
+        if (mAnimation != null) {
+            mAnimation.cancel();
+        }
         mNavButtons.setVisibility(View.VISIBLE);
-        combo.setDuration(150);
-        combo.start();
+        mNavButtons.setTranslationX(0);
+        if (!mBaseUi.blockFocusAnimations()) {
+            int awidth = mNavButtons.getMeasuredWidth();
+            Animator anim1 = ObjectAnimator.ofFloat(mNavButtons,
+                    View.TRANSLATION_X, -awidth, 0);
+            Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", 0,
+                    awidth);
+            Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA,
+                    0f, 1f);
+            AnimatorSet combo = new AnimatorSet();
+            combo.playTogether(anim1, anim2, anim3);
+            combo.setDuration(150);
+            combo.start();
+        }
     }
 
     private void showHideStar(Tab tab) {
@@ -341,4 +320,23 @@
         }
     }
 
+    @Override
+    public void onStateChanged(int state) {
+        switch(state) {
+        case STATE_NORMAL:
+            mClearButton.setVisibility(View.GONE);
+            mVoiceButton.setVisibility(View.GONE);
+
+            break;
+        case STATE_HIGHLIGHTED:
+            mClearButton.setVisibility(View.GONE);
+            mVoiceButton.setVisibility(View.VISIBLE);
+            break;
+        case STATE_EDITED:
+            mClearButton.setVisibility(View.VISIBLE);
+            mVoiceButton.setVisibility(View.GONE);
+            break;
+        }
+    }
+
 }
diff --git a/src/com/android/browser/NetworkStateHandler.java b/src/com/android/browser/NetworkStateHandler.java
index 2fbd035..4480664 100644
--- a/src/com/android/browser/NetworkStateHandler.java
+++ b/src/com/android/browser/NetworkStateHandler.java
@@ -24,6 +24,9 @@
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
+
+import com.android.browser.BrowserSettings;
 
 /**
  * Handle network state changes
@@ -67,6 +70,7 @@
                     String subtypeName = info.getSubtypeName();
                     sendNetworkType(typeName.toLowerCase(),
                             (subtypeName != null ? subtypeName.toLowerCase() : ""));
+                    BrowserSettings.getInstance().updateConnectionType();
 
                     boolean noConnection = intent.getBooleanExtra(
                             ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
@@ -86,6 +90,7 @@
     void onResume() {
         mActivity.registerReceiver(mNetworkStateIntentReceiver,
                 mNetworkStateChangedFilter);
+        BrowserSettings.getInstance().updateConnectionType();
     }
 
     /**
@@ -110,8 +115,7 @@
     private void sendNetworkType(String type, String subtype) {
         WebView w = mController.getCurrentWebView();
         if (w != null) {
-            w.setNetworkType(type, subtype);
+            WebViewClassic.fromWebView(w).setNetworkType(type, subtype);
         }
     }
-
 }
diff --git a/src/com/android/browser/NfcHandler.java b/src/com/android/browser/NfcHandler.java
index 1b34df2..0dd8576 100644
--- a/src/com/android/browser/NfcHandler.java
+++ b/src/com/android/browser/NfcHandler.java
@@ -23,6 +23,7 @@
 import android.nfc.NfcEvent;
 import android.os.Handler;
 import android.os.Message;
+import android.util.Log;
 
 import java.util.concurrent.CountDownLatch;
 
@@ -32,6 +33,7 @@
   * Incognito tabs will not be shared over NFC.
   */
 public class NfcHandler implements NfcAdapter.CreateNdefMessageCallback {
+    static final String TAG = "BrowserNfcHandler";
     static final int GET_PRIVATE_BROWSING_STATE_MSG = 100;
 
     final Controller mController;
@@ -94,9 +96,12 @@
 
         String currentUrl = mCurrentTab.getUrl();
         if (currentUrl != null) {
-            NdefRecord record = NdefRecord.createUri(currentUrl);
-            NdefMessage msg = new NdefMessage(new NdefRecord[] { record });
-            return msg;
+            try {
+                return new NdefMessage(NdefRecord.createUri(currentUrl));
+            } catch (IllegalArgumentException e) {
+                Log.e(TAG, "IllegalArgumentException creating URI NdefRecord", e);
+                return null;
+            }
         } else {
             return null;
         }
diff --git a/src/com/android/browser/PageDialogsHandler.java b/src/com/android/browser/PageDialogsHandler.java
index 013eaf1..3ed1004 100644
--- a/src/com/android/browser/PageDialogsHandler.java
+++ b/src/com/android/browser/PageDialogsHandler.java
@@ -27,6 +27,7 @@
 import android.webkit.HttpAuthHandler;
 import android.webkit.SslErrorHandler;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -136,6 +137,7 @@
     void showPageInfo(final Tab tab,
             final boolean fromShowSSLCertificateOnError,
             final String urlCertificateOnError) {
+        if (tab == null) return;
         final LayoutInflater factory = LayoutInflater.from(mContext);
 
         final View pageInfoView = factory.inflate(R.layout.page_info, null);
@@ -296,8 +298,8 @@
                                 mSSLCertificateOnErrorHandler = null;
                                 mSSLCertificateOnErrorError = null;
 
-                                view.getWebViewClient().onReceivedSslError(
-                                                view, handler, error);
+                                WebViewClassic.fromWebView(view).getWebViewClient().
+                                        onReceivedSslError(view, handler, error);
                             }
                         })
                  .setNeutralButton(R.string.page_info_view,
@@ -324,8 +326,8 @@
                                 mSSLCertificateOnErrorHandler = null;
                                 mSSLCertificateOnErrorError = null;
 
-                                view.getWebViewClient().onReceivedSslError(
-                                                view, handler, error);
+                                WebViewClassic.fromWebView(view).getWebViewClient().
+                                        onReceivedSslError(view, handler, error);
                             }
                         })
                 .show();
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 9104095..e3c22bd 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -29,16 +29,13 @@
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.ActionMode;
-import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
 import android.webkit.WebView;
-import android.widget.FrameLayout;
 import android.widget.ImageView;
 
 import com.android.browser.UrlInputView.StateListener;
@@ -51,14 +48,11 @@
     private static final String LOGTAG = "PhoneUi";
     private static final int MSG_INIT_NAVSCREEN = 100;
 
-    private PieControlPhone mPieControl;
     private NavScreen mNavScreen;
     private AnimScreen mAnimScreen;
     private NavigationBarPhone mNavigationBar;
     private int mActionBarHeight;
 
-    boolean mExtendedMenuOpen;
-    boolean mOptionsMenuOpen;
     boolean mAnimating;
 
     /**
@@ -82,11 +76,11 @@
     }
 
     @Override
-    public void editUrl(boolean clearInput) {
+    public void editUrl(boolean clearInput, boolean forceIME) {
         if (mUseQuickControls) {
             mTitleBar.setShowProgressOnly(false);
         }
-        super.editUrl(clearInput);
+        super.editUrl(clearInput, forceIME);
     }
 
     @Override
@@ -109,26 +103,7 @@
 
     @Override
     public void onProgressChanged(Tab tab) {
-        if (tab.inForeground()) {
-            int progress = tab.getLoadProgress();
-            mTitleBar.setProgress(progress);
-            if (progress == 100) {
-                if (!mOptionsMenuOpen || !mExtendedMenuOpen) {
-                    suggestHideTitleBar();
-                    if (mUseQuickControls) {
-                        mTitleBar.setShowProgressOnly(false);
-                    }
-                }
-            } else {
-                if (!mOptionsMenuOpen || mExtendedMenuOpen) {
-                    if (mUseQuickControls && !mTitleBar.isEditingUrl()) {
-                        mTitleBar.setShowProgressOnly(true);
-                        setTitleGravity(Gravity.TOP);
-                    }
-                    showTitleBar();
-                }
-            }
-        }
+        super.onProgressChanged(tab);
         if (mNavScreen == null && getTitleBar().getHeight() > 0) {
             mHandler.sendEmptyMessage(MSG_INIT_NAVSCREEN);
         }
@@ -166,21 +141,14 @@
         // Request focus on the top window.
         if (mUseQuickControls) {
             mPieControl.forceToTop(mContentView);
+            view.setTitleBar(null);
+            mTitleBar.setShowProgressOnly(true);
         } else {
-            // check if title bar is already attached by animation
-            if (mTitleBar.getParent() == null) {
-                view.setEmbeddedTitleBar(mTitleBar);
-            }
-        }
-        if (tab.isInVoiceSearchMode()) {
-            showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
-        } else {
-            revertVoiceTitleBar(tab);
+            view.setTitleBar(mTitleBar);
         }
         // update nav bar state
         mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
         updateLockIconToLatest(tab);
-        tab.getTopWindow().requestFocus();
         mTitleBar.setSkipTitleBarAnimations(false);
     }
 
@@ -275,46 +243,6 @@
     }
 
     @Override
-    protected void setTitleGravity(int gravity) {
-        if (mUseQuickControls) {
-            FrameLayout.LayoutParams lp =
-                    (FrameLayout.LayoutParams) mTitleBar.getLayoutParams();
-            lp.gravity = gravity;
-            mTitleBar.setLayoutParams(lp);
-        } else {
-            super.setTitleGravity(gravity);
-        }
-    }
-
-    @Override
-    public void setUseQuickControls(boolean useQuickControls) {
-        mUseQuickControls = useQuickControls;
-        mTitleBar.setUseQuickControls(mUseQuickControls);
-        if (useQuickControls) {
-            mPieControl = new PieControlPhone(mActivity, mUiController, this);
-            mPieControl.attachToContainer(mContentView);
-            WebView web = getWebView();
-            if (web != null) {
-                web.setEmbeddedTitleBar(null);
-            }
-        } else {
-            if (mPieControl != null) {
-                mPieControl.removeFromContainer(mContentView);
-            }
-            WebView web = getWebView();
-            if (web != null) {
-                // make sure we can re-parent titlebar
-                if ((mTitleBar != null) && (mTitleBar.getParent() != null)) {
-                    ((ViewGroup) mTitleBar.getParent()).removeView(mTitleBar);
-                }
-                web.setEmbeddedTitleBar(mTitleBar);
-            }
-            setTitleGravity(Gravity.NO_GRAVITY);
-        }
-        updateUrlBarAutoShowManagerTarget();
-    }
-
-    @Override
     public boolean isWebShowing() {
         return super.isWebShowing() && !showingNavScreen();
     }
@@ -436,13 +364,15 @@
             mAnimScreen = new AnimScreen(mActivity);
         }
         mAnimScreen.set(tab.getScreenshot());
-        mCustomViewContainer.addView(mAnimScreen.mMain, COVER_SCREEN_PARAMS);
+        if (mAnimScreen.mMain.getParent() == null) {
+            mCustomViewContainer.addView(mAnimScreen.mMain, COVER_SCREEN_PARAMS);
+        }
         mAnimScreen.mMain.layout(0, 0, mContentView.getWidth(),
                 mContentView.getHeight());
         mNavScreen.mScroller.finishScroller();
         ImageView target = tabview.mImage;
         int toLeft = 0;
-        int toTop = getTitleBar().getHeight();
+        int toTop = (tab.getWebView() != null) ? tab.getWebView().getVisibleTitleHeight() : 0;
         int toRight = mContentView.getWidth();
         int width = target.getDrawable().getIntrinsicWidth();
         int height = target.getDrawable().getIntrinsicHeight();
diff --git a/src/com/android/browser/PieControl.java b/src/com/android/browser/PieControl.java
new file mode 100644
index 0000000..a33f8c6
--- /dev/null
+++ b/src/com/android/browser/PieControl.java
@@ -0,0 +1,345 @@
+/*
+ * 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 android.webkit.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.UI.ComboViews;
+import com.android.browser.view.PieItem;
+import com.android.browser.view.PieMenu;
+import com.android.browser.view.PieMenu.PieView.OnLayoutListener;
+import com.android.browser.view.PieStackView;
+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/PieControlBase.java b/src/com/android/browser/PieControlBase.java
deleted file mode 100644
index 830afea..0000000
--- a/src/com/android/browser/PieControlBase.java
+++ /dev/null
@@ -1,187 +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 android.widget.BaseAdapter;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.TextView;
-
-import com.android.browser.view.PieItem;
-import com.android.browser.view.PieMenu;
-import com.android.browser.view.PieStackView.OnCurrentListener;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * base controller for Quick Controls pie menu
- */
-public abstract class PieControlBase implements PieMenu.PieController {
-
-    protected Activity mActivity;
-    protected UiController mUiController;
-    protected PieMenu mPie;
-    protected int mItemSize;
-    protected TextView mTabsCount;
-
-    public PieControlBase(Activity activity, UiController controller) {
-        mActivity = activity;
-        mUiController = controller;
-        mItemSize = (int) activity.getResources().getDimension(R.dimen.qc_item_size);
-    }
-
-    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 abstract void populateMenu();
-
-    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));
-        return true;
-    }
-
-    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 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/PieControlPhone.java b/src/com/android/browser/PieControlPhone.java
deleted file mode 100644
index 2b6a3c5..0000000
--- a/src/com/android/browser/PieControlPhone.java
+++ /dev/null
@@ -1,123 +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.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.PopupMenu;
-import android.widget.PopupMenu.OnMenuItemClickListener;
-
-import com.android.browser.UI.ComboViews;
-import com.android.browser.view.PieItem;
-import com.android.browser.view.PieMenu.PieView.OnLayoutListener;
-import com.android.browser.view.PieStackView;
-
-import java.util.List;
-
-/**
- * controller for Quick Controls pie menu
- */
-public class PieControlPhone extends PieControlBase implements OnClickListener,
-        OnMenuItemClickListener {
-
-    private PhoneUi mUi;
-    private PieItem mUrl;
-    private PieItem mShowTabs;
-    private PieItem mOptions;
-    private PieItem mNewTab;
-    private PieItem mBookmarks;
-    private TabAdapter mTabAdapter;
-    private PopupMenu mPopup;
-
-    public PieControlPhone(Activity activity, UiController controller, PhoneUi ui) {
-        super(activity, controller);
-        mUi = ui;
-    }
-
-    protected void populateMenu() {
-        mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
-        View tabs = makeTabsView();
-        mShowTabs = new PieItem(tabs, 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);
-        mOptions = makeItem(com.android.internal.R.drawable.ic_menu_moreoverflow_normal_holo_dark,
-                1);
-
-        // level 1
-        mNewTab = makeItem(R.drawable.ic_new_window_holo_dark, 1);
-        mBookmarks = makeItem(R.drawable.ic_bookmarks_holo_dark, 1);
-        mPie.addItem(mNewTab);
-        mPie.addItem(mShowTabs);
-        mPie.addItem(mUrl);
-        mPie.addItem(mBookmarks);
-        mPie.addItem(mOptions);
-        setClickListener(this, mUrl, mShowTabs, mOptions, mNewTab, mBookmarks);
-        mPopup = new PopupMenu(mActivity, mUi.getTitleBar());
-        Menu menu = mPopup.getMenu();
-        mPopup.getMenuInflater().inflate(R.menu.browser, menu);
-        mPopup.setOnMenuItemClickListener(this);
-    }
-
-    protected void showMenu() {
-        mUiController.updateMenuState(mUiController.getCurrentTab(), mPopup.getMenu());
-        mPopup.show();
-    }
-
-    @Override
-    public boolean onMenuItemClick(MenuItem item) {
-        return mUiController.onOptionsItemSelected(item);
-    }
-
-
-    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());
-
-    }
-
-    @Override
-    public void onClick(View v) {
-        if (mUrl.getView() == v) {
-            mUi.editUrl(false);
-        } else if (mShowTabs.getView() == v) {
-            mUi.showNavScreen();
-        } else if (mOptions.getView() == v) {
-            showMenu();
-        } else if (mNewTab.getView() == v) {
-            mUiController.openTabToHomePage();
-            mUi.editUrl(false);
-        } else if (mBookmarks.getView() == v) {
-            mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
-        }
-    }
-
-}
diff --git a/src/com/android/browser/PieControlXLarge.java b/src/com/android/browser/PieControlXLarge.java
deleted file mode 100644
index fcc8840..0000000
--- a/src/com/android/browser/PieControlXLarge.java
+++ /dev/null
@@ -1,223 +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;
-
-import android.app.Activity;
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.webkit.WebView;
-import android.widget.BaseAdapter;
-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;
-import com.android.browser.view.PieStackView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * controller for Quick Controls pie menu
- */
-public class PieControlXLarge extends PieControlBase implements OnClickListener {
-
-    private BaseUi mUi;
-    private PieItem mBack;
-    private PieItem mForward;
-    private PieItem mRefresh;
-    private PieItem mUrl;
-    private PieItem mOptions;
-    private PieItem mBookmarks;
-    private PieItem mNewTab;
-    private PieItem mClose;
-    private MenuAdapter mMenuAdapter;
-    private PieItem mShowTabs;
-    private TabAdapter mTabAdapter;
-
-    public PieControlXLarge(Activity activity, UiController controller, BaseUi ui) {
-        super(activity, controller);
-        mUiController = controller;
-        mUi = ui;
-    }
-
-    @Override
-    protected void attachToContainer(FrameLayout container) {
-        super.attachToContainer(container);
-        mPie.setUseBackground(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);
-        mRefresh = makeItem(R.drawable.ic_refresh_holo_dark, 2);
-        mForward = makeItem(R.drawable.ic_forward_holo_dark, 2);
-        mNewTab = makeItem(R.drawable.ic_new_window_holo_dark, 2);
-        mClose = makeItem(R.drawable.ic_close_window_holo_dark, 2);
-        View tabs = makeTabsView();
-        mShowTabs = new PieItem(tabs, 2);
-        mOptions = makeItem(com.android.internal.R.drawable.ic_menu_moreoverflow_normal_holo_dark,
-                                        2);
-        mMenuAdapter = new MenuAdapter(mActivity, mUiController);
-        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);
-        PieListView menuview = new PieListView(mActivity);
-        menuview.setLayoutListener(new OnLayoutListener() {
-            @Override
-            public void onLayout(int ax, int ay, boolean left) {
-                buildMenu();
-            }
-        });
-
-        mOptions.setPieView(menuview);
-        menuview.setAdapter(mMenuAdapter);
-        setClickListener(this, mBack, mRefresh, mForward, mUrl, mBookmarks, mNewTab,
-                mClose);
-        // level 1
-        mPie.addItem(mBack);
-        mPie.addItem(mUrl);
-        mPie.addItem(mBookmarks);
-        // level 2
-        mPie.addItem(mForward);
-        mPie.addItem(mRefresh);
-        mPie.addItem(mOptions);
-        mPie.addItem(mShowTabs);
-        mPie.addItem(mNewTab);
-        mPie.addItem(mClose);
-    }
-
-    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());
-    }
-
-    private void buildMenu() {
-        Menu menu = mUi.getMenu();
-        menu.setGroupVisible(R.id.NAV_MENU, false);
-        mMenuAdapter.setMenu(menu);
-    }
-
-    @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);
-        } else if (mBookmarks.getView() == v) {
-            mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
-        } else if (mNewTab.getView() == v) {
-            mUiController.openTabToHomePage();
-            mUi.editUrl(false);
-        } else if (mClose.getView() == v) {
-            mUiController.closeCurrentTab();
-        }
-    }
-
-    private static class MenuAdapter extends BaseAdapter
-            implements OnClickListener {
-
-        List<MenuItem> mItems;
-        UiController mUiController;
-        LayoutInflater mInflater;
-
-        public MenuAdapter(Context ctx, UiController ctl) {
-            mUiController = ctl;
-            mInflater = LayoutInflater.from(ctx);
-            mItems = new ArrayList<MenuItem>();
-        }
-
-        public void setMenu(Menu menu) {
-            mItems.clear();
-            for (int i = 0; i < menu.size(); i++) {
-                MenuItem item = menu.getItem(i);
-                if (item.isEnabled() && item.isVisible()) {
-                    mItems.add(item);
-                }
-            }
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public int getCount() {
-            return mItems.size();
-        }
-
-        @Override
-        public MenuItem getItem(int position) {
-            return mItems.get(position);
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public void onClick(View v) {
-            if (v.getTag() != null) {
-                mUiController.onOptionsItemSelected((MenuItem) v.getTag());
-            }
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            final MenuItem item = mItems.get(position);
-            View view = mInflater.inflate(
-                    R.layout.qc_menu_item, null);
-            TextView label =
-                    (TextView) view.findViewById(R.id.title);
-            label.setText(item.getTitle());
-            label.setTag(item);
-            label.setOnClickListener(this);
-            label.setLayoutParams(new LayoutParams(240, 32));
-            return label;
-        }
-
-    }
-
-}
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index ecab008..1828032 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -46,6 +46,7 @@
     static final String PREF_RESET_DEFAULT_PREFERENCES = "reset_default_preferences";
     static final String PREF_SEARCH_ENGINE = "search_engine";
     static final String PREF_WEBSITE_SETTINGS = "website_settings";
+    static final String PREF_ALLOW_APP_TABS = "allow_apptabs";
 
     // ----------------------
     // Keys for debug_preferences.xml
@@ -102,6 +103,20 @@
     // Keys for bandwidth_preferences.xml
     // ----------------------
     static final String PREF_DATA_PRELOAD = "preload_when";
+    static final String PREF_LINK_PREFETCH = "link_prefetch_when";
     static final String PREF_LOAD_IMAGES = "load_images";
 
+    // ----------------------
+    // Keys for browser recovery
+    // ----------------------
+    /**
+     * The last time recovery was started as System.currentTimeMillis.
+     * 0 if not set.
+     */
+    static final String KEY_LAST_RECOVERED = "last_recovered";
+
+    /**
+     * Key for whether or not the last run was paused.
+     */
+    static final String KEY_LAST_RUN_PAUSED = "last_paused";
 }
diff --git a/src/com/android/browser/PreloadController.java b/src/com/android/browser/PreloadController.java
index 5de5be0..a7feaee 100644
--- a/src/com/android/browser/PreloadController.java
+++ b/src/com/android/browser/PreloadController.java
@@ -31,8 +31,6 @@
 import android.webkit.WebChromeClient.CustomViewCallback;
 import android.webkit.WebView;
 
-import java.util.List;
-
 public class PreloadController implements WebViewController {
 
     private static final boolean LOGD_ENABLED = false;
@@ -130,8 +128,9 @@
     }
 
     @Override
-    public void onUnhandledKeyEvent(KeyEvent event) {
+    public boolean onUnhandledKeyEvent(KeyEvent event) {
         if (LOGD_ENABLED) Log.d(LOGTAG, "onUnhandledKeyEvent()");
+        return false;
     }
 
     @Override
@@ -193,16 +192,6 @@
     }
 
     @Override
-    public void activateVoiceSearchMode(String title, List<String> results) {
-        if (LOGD_ENABLED) Log.d(LOGTAG, "activateVoiceSearchMode()");
-    }
-
-    @Override
-    public void revertVoiceSearchMode(Tab tab) {
-        if (LOGD_ENABLED) Log.d(LOGTAG, "revertVoiceSearchMode()");
-    }
-
-    @Override
     public boolean shouldShowErrorConsole() {
         if (LOGD_ENABLED) Log.d(LOGTAG, "shouldShowErrorConsole()");
         return false;
@@ -214,7 +203,7 @@
     }
 
     @Override
-    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
+    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
         if (LOGD_ENABLED) Log.d(LOGTAG, "openFileChooser()");
     }
 
diff --git a/src/com/android/browser/PreloadedTabControl.java b/src/com/android/browser/PreloadedTabControl.java
index 4ffe6b4..0b2956f 100644
--- a/src/com/android/browser/PreloadedTabControl.java
+++ b/src/com/android/browser/PreloadedTabControl.java
@@ -62,12 +62,12 @@
     }
 
     public void setQuery(String query) {
-        maybeSetQuery(query, mTab.getWebView().getSearchBox());
+        maybeSetQuery(query, mTab.getWebViewClassic().getSearchBox());
     }
 
     public boolean searchBoxSubmit(final String query,
             final String fallbackUrl, final Map<String, String> fallbackHeaders) {
-        final SearchBox sb = mTab.getWebView().getSearchBox();
+        final SearchBox sb = mTab.getWebViewClassic().getSearchBox();
         if (sb == null) {
             // no searchbox, cannot submit. Fallback to regular tab creation
             if (LOGD_ENABLED) Log.d(LOGTAG, "No searchbox, cannot submit query");
@@ -106,7 +106,7 @@
     }
 
     public void searchBoxCancel() {
-        SearchBox sb = mTab.getWebView().getSearchBox();
+        SearchBox sb = mTab.getWebViewClassic().getSearchBox();
         if (sb != null) {
             mLastQuery = null;
             sb.oncancel(new SearchBox.SearchBoxListener(){
diff --git a/src/com/android/browser/SnapshotByteArrayOutputStream.java b/src/com/android/browser/SnapshotByteArrayOutputStream.java
deleted file mode 100644
index 127eee8..0000000
--- a/src/com/android/browser/SnapshotByteArrayOutputStream.java
+++ /dev/null
@@ -1,59 +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 java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-public class SnapshotByteArrayOutputStream extends OutputStream {
-
-    // Maximum size, this needs to be small enough such that an entire row
-    // can fit in CursorWindow's 2MB limit
-    private static final int MAX_SIZE = 1700000;
-    private ByteArrayOutputStream mStream;
-
-    public SnapshotByteArrayOutputStream() {
-        mStream = new ByteArrayOutputStream(MAX_SIZE);
-    }
-
-    @Override
-    public synchronized void write(int oneByte) throws IOException {
-        checkError(1);
-        mStream.write(oneByte);
-    }
-
-    @Override
-    public void write(byte[] buffer, int offset, int count) throws IOException {
-        checkError(count);
-        mStream.write(buffer, offset, count);
-    }
-
-    private void checkError(int expandBy) throws IOException {
-        if ((size() + expandBy) > MAX_SIZE) {
-            throw new IOException("Exceeded max size!");
-        }
-    }
-
-    public int size() {
-        return mStream.size();
-    }
-
-    public byte[] toByteArray() {
-        return mStream.toByteArray();
-    }
-
-}
diff --git a/src/com/android/browser/SnapshotTab.java b/src/com/android/browser/SnapshotTab.java
index d9c71f0..e14f095 100644
--- a/src/com/android/browser/SnapshotTab.java
+++ b/src/com/android/browser/SnapshotTab.java
@@ -18,17 +18,22 @@
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
+import android.content.Context;
 import android.database.Cursor;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.util.Log;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 
 import com.android.browser.provider.SnapshotProvider.Snapshots;
 
 import java.io.ByteArrayInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
 import java.util.Map;
 import java.util.zip.GZIPInputStream;
 
@@ -74,7 +79,7 @@
 
     void loadData() {
         if (mLoadTask == null) {
-            mLoadTask = new LoadData(this, mContext.getContentResolver());
+            mLoadTask = new LoadData(this, mContext);
             mLoadTask.execute();
         }
     }
@@ -121,7 +126,7 @@
     public void loadUrl(String url, Map<String, String> headers) {
         if (!mIsLive) {
             mIsLive = true;
-            getWebView().clearViewState();
+            getWebViewClassic().clearViewState();
         }
         super.loadUrl(url, headers);
     }
@@ -151,20 +156,31 @@
 
         static final String[] PROJECTION = new String[] {
             Snapshots._ID, // 0
-            Snapshots.TITLE, // 1
-            Snapshots.URL, // 2
+            Snapshots.URL, // 1
+            Snapshots.TITLE, // 2
             Snapshots.FAVICON, // 3
             Snapshots.VIEWSTATE, // 4
             Snapshots.BACKGROUND, // 5
             Snapshots.DATE_CREATED, // 6
+            Snapshots.VIEWSTATE_PATH, // 7
         };
+        static final int SNAPSHOT_ID = 0;
+        static final int SNAPSHOT_URL = 1;
+        static final int SNAPSHOT_TITLE = 2;
+        static final int SNAPSHOT_FAVICON = 3;
+        static final int SNAPSHOT_VIEWSTATE = 4;
+        static final int SNAPSHOT_BACKGROUND = 5;
+        static final int SNAPSHOT_DATE_CREATED = 6;
+        static final int SNAPSHOT_VIEWSTATE_PATH = 7;
 
         private SnapshotTab mTab;
         private ContentResolver mContentResolver;
+        private Context mContext;
 
-        public LoadData(SnapshotTab t, ContentResolver cr) {
+        public LoadData(SnapshotTab t, Context context) {
             mTab = t;
-            mContentResolver = cr;
+            mContentResolver = context.getContentResolver();
+            mContext = context;
         }
 
         @Override
@@ -174,26 +190,35 @@
             return mContentResolver.query(uri, PROJECTION, null, null, null);
         }
 
+        private InputStream getInputStream(Cursor c) throws FileNotFoundException {
+            String path = c.getString(SNAPSHOT_VIEWSTATE_PATH);
+            if (!TextUtils.isEmpty(path)) {
+                return mContext.openFileInput(path);
+            }
+            byte[] data = c.getBlob(SNAPSHOT_VIEWSTATE);
+            ByteArrayInputStream bis = new ByteArrayInputStream(data);
+            return bis;
+        }
+
         @Override
         protected void onPostExecute(Cursor result) {
             try {
                 if (result.moveToFirst()) {
-                    mTab.mCurrentState.mTitle = result.getString(1);
-                    mTab.mCurrentState.mUrl = result.getString(2);
-                    byte[] favicon = result.getBlob(3);
+                    mTab.mCurrentState.mTitle = result.getString(SNAPSHOT_TITLE);
+                    mTab.mCurrentState.mUrl = result.getString(SNAPSHOT_URL);
+                    byte[] favicon = result.getBlob(SNAPSHOT_FAVICON);
                     if (favicon != null) {
                         mTab.mCurrentState.mFavicon = BitmapFactory
                                 .decodeByteArray(favicon, 0, favicon.length);
                     }
-                    WebView web = mTab.getWebView();
+                    WebViewClassic web = mTab.getWebViewClassic();
                     if (web != null) {
-                        byte[] data = result.getBlob(4);
-                        ByteArrayInputStream bis = new ByteArrayInputStream(data);
-                        GZIPInputStream stream = new GZIPInputStream(bis);
+                        InputStream ins = getInputStream(result);
+                        GZIPInputStream stream = new GZIPInputStream(ins);
                         web.loadViewState(stream);
                     }
-                    mTab.mBackgroundColor = result.getInt(5);
-                    mTab.mDateCreated = result.getLong(6);
+                    mTab.mBackgroundColor = result.getInt(SNAPSHOT_BACKGROUND);
+                    mTab.mDateCreated = result.getLong(SNAPSHOT_DATE_CREATED);
                     mTab.mWebViewController.onPageFinished(mTab);
                 }
             } catch (Exception e) {
diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index 7400b5d..9f66e3c 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -16,10 +16,6 @@
 
 package com.android.browser;
 
-import com.android.browser.provider.BrowserProvider2;
-import com.android.browser.provider.BrowserProvider2.OmniboxSuggestions;
-import com.android.browser.search.SearchEngine;
-
 import android.app.SearchManager;
 import android.content.Context;
 import android.database.Cursor;
@@ -38,6 +34,9 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.android.browser.provider.BrowserProvider2.OmniboxSuggestions;
+import com.android.browser.search.SearchEngine;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -52,7 +51,6 @@
     public static final int TYPE_SUGGEST_URL = 2;
     public static final int TYPE_SEARCH = 3;
     public static final int TYPE_SUGGEST = 4;
-    public static final int TYPE_VOICE_SEARCH = 5;
 
     private static final String[] COMBINED_PROJECTION = {
             OmniboxSuggestions._ID,
@@ -74,7 +72,6 @@
     final int mLinesPortrait;
     final int mLinesLandscape;
     final Object mResultsLock = new Object();
-    List<String> mVoiceResults;
     boolean mIncognitoMode;
     BrowserSettings mSettings;
 
@@ -99,11 +96,6 @@
         addSource(new CombinedCursor());
     }
 
-    void setVoiceResults(List<String> voiceResults) {
-        mVoiceResults = voiceResults;
-        notifyDataSetChanged();
-    }
-
     public void setLandscapeMode(boolean mode) {
         mLandscapeMode = mode;
         notifyDataSetChanged();
@@ -135,20 +127,11 @@
 
     @Override
     public int getCount() {
-        if (mVoiceResults != null) {
-            return mVoiceResults.size();
-        }
         return (mMixedResults == null) ? 0 : mMixedResults.getLineCount();
     }
 
     @Override
     public SuggestItem getItem(int position) {
-        if (mVoiceResults != null) {
-            SuggestItem item = new SuggestItem(mVoiceResults.get(position),
-                    null, TYPE_VOICE_SEARCH);
-            item.extra = Integer.toString(position);
-            return item;
-        }
         if (mMixedResults == null) {
             return null;
         }
@@ -192,7 +175,6 @@
         switch (item.type) {
             case TYPE_SUGGEST:
             case TYPE_SEARCH:
-            case TYPE_VOICE_SEARCH:
                 id = R.drawable.ic_search_category_suggest;
                 break;
             case TYPE_BOOKMARK:
@@ -211,8 +193,7 @@
             ic1.setImageDrawable(mContext.getResources().getDrawable(id));
         }
         ic2.setVisibility(((TYPE_SUGGEST == item.type)
-                || (TYPE_SEARCH == item.type)
-                || (TYPE_VOICE_SEARCH == item.type))
+                || (TYPE_SEARCH == item.type))
                 ? View.VISIBLE : View.GONE);
         div.setVisibility(ic2.getVisibility());
         ic2.setOnClickListener(this);
@@ -292,30 +273,25 @@
         @Override
         protected FilterResults performFiltering(CharSequence constraint) {
             FilterResults res = new FilterResults();
-            if (mVoiceResults == null) {
-                if (TextUtils.isEmpty(constraint) && !shouldProcessEmptyQuery()) {
-                    res.count = 0;
-                    res.values = null;
-                    return res;
-                }
-                startSuggestionsAsync(constraint);
-                List<SuggestItem> filterResults = new ArrayList<SuggestItem>();
-                if (constraint != null) {
-                    for (CursorSource sc : mSources) {
-                        sc.runQuery(constraint);
-                    }
-                    mixResults(filterResults);
-                }
-                synchronized (mResultsLock) {
-                    mFilterResults = filterResults;
-                }
-                SuggestionResults mixed = buildSuggestionResults();
-                res.count = mixed.getLineCount();
-                res.values = mixed;
-            } else {
-                res.count = mVoiceResults.size();
-                res.values = mVoiceResults;
+            if (TextUtils.isEmpty(constraint) && !shouldProcessEmptyQuery()) {
+                res.count = 0;
+                res.values = null;
+                return res;
             }
+            startSuggestionsAsync(constraint);
+            List<SuggestItem> filterResults = new ArrayList<SuggestItem>();
+            if (constraint != null) {
+                for (CursorSource sc : mSources) {
+                    sc.runQuery(constraint);
+                }
+                mixResults(filterResults);
+            }
+            synchronized (mResultsLock) {
+                mFilterResults = filterResults;
+            }
+            SuggestionResults mixed = buildSuggestionResults();
+            res.count = mixed.getLineCount();
+            res.values = mixed;
             return res;
         }
 
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 0abc86b..28734bd 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -18,13 +18,11 @@
 
 import android.app.Activity;
 import android.app.AlertDialog;
-import android.app.SearchManager;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnCancelListener;
-import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.CompressFormat;
 import android.graphics.BitmapFactory;
@@ -42,7 +40,6 @@
 import android.os.SystemClock;
 import android.security.KeyChain;
 import android.security.KeyChainAliasCallback;
-import android.speech.RecognizerResultsIntent;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -65,6 +62,7 @@
 import android.webkit.WebStorage;
 import android.webkit.WebView;
 import android.webkit.WebView.PictureListener;
+import android.webkit.WebViewClassic;
 import android.webkit.WebViewClient;
 import android.widget.CheckBox;
 import android.widget.Toast;
@@ -72,15 +70,15 @@
 import com.android.browser.TabControl.OnThumbnailUpdatedListener;
 import com.android.browser.homepages.HomeProvider;
 import com.android.browser.provider.SnapshotProvider.Snapshots;
-import com.android.common.speech.LoggingEvents;
 
 import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.UUID;
 import java.util.Vector;
 import java.util.regex.Pattern;
 import java.util.zip.GZIPOutputStream;
@@ -187,6 +185,7 @@
     private int mCaptureHeight;
     private Bitmap mCapture;
     private Handler mHandler;
+    private boolean mUpdateThumbnail;
 
     /**
      * See {@link #clearBackStackWhenItemAdded(String)}.
@@ -251,234 +250,6 @@
     static final String USERAGENT = "useragent";
     static final String CLOSEFLAG = "closeOnBack";
 
-    // -------------------------------------------------------------------------
-
-    /**
-     * Private information regarding the latest voice search.  If the Tab is not
-     * in voice search mode, this will be null.
-     */
-    private VoiceSearchData mVoiceSearchData;
-    /**
-     * Remove voice search mode from this tab.
-     */
-    public void revertVoiceSearchMode() {
-        if (mVoiceSearchData != null) {
-            mVoiceSearchData = null;
-            if (mInForeground) {
-                mWebViewController.revertVoiceSearchMode(this);
-            }
-        }
-    }
-
-    /**
-     * Return whether the tab is in voice search mode.
-     */
-    public boolean isInVoiceSearchMode() {
-        return mVoiceSearchData != null;
-    }
-    /**
-     * Return true if the Tab is in voice search mode and the voice search
-     * Intent came with a String identifying that Google provided the Intent.
-     */
-    public boolean voiceSearchSourceIsGoogle() {
-        return mVoiceSearchData != null && mVoiceSearchData.mSourceIsGoogle;
-    }
-    /**
-     * Get the title to display for the current voice search page.  If the Tab
-     * is not in voice search mode, return null.
-     */
-    public String getVoiceDisplayTitle() {
-        if (mVoiceSearchData == null) return null;
-        return mVoiceSearchData.mLastVoiceSearchTitle;
-    }
-    /**
-     * Get the latest array of voice search results, to be passed to the
-     * BrowserProvider.  If the Tab is not in voice search mode, return null.
-     */
-    public ArrayList<String> getVoiceSearchResults() {
-        if (mVoiceSearchData == null) return null;
-        return mVoiceSearchData.mVoiceSearchResults;
-    }
-    /**
-     * Activate voice search mode.
-     * @param intent Intent which has the results to use, or an index into the
-     *      results when reusing the old results.
-     */
-    /* package */ void activateVoiceSearchMode(Intent intent) {
-        int index = 0;
-        ArrayList<String> results = intent.getStringArrayListExtra(
-                    RecognizerResultsIntent.EXTRA_VOICE_SEARCH_RESULT_STRINGS);
-        if (results != null) {
-            ArrayList<String> urls = intent.getStringArrayListExtra(
-                        RecognizerResultsIntent.EXTRA_VOICE_SEARCH_RESULT_URLS);
-            ArrayList<String> htmls = intent.getStringArrayListExtra(
-                        RecognizerResultsIntent.EXTRA_VOICE_SEARCH_RESULT_HTML);
-            ArrayList<String> baseUrls = intent.getStringArrayListExtra(
-                        RecognizerResultsIntent
-                        .EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS);
-            // This tab is now entering voice search mode for the first time, or
-            // a new voice search was done.
-            int size = results.size();
-            if (urls == null || size != urls.size()) {
-                throw new AssertionError("improper extras passed in Intent");
-            }
-            if (htmls == null || htmls.size() != size || baseUrls == null ||
-                    (baseUrls.size() != size && baseUrls.size() != 1)) {
-                // If either of these arrays are empty/incorrectly sized, ignore
-                // them.
-                htmls = null;
-                baseUrls = null;
-            }
-            mVoiceSearchData = new VoiceSearchData(results, urls, htmls,
-                    baseUrls);
-            mVoiceSearchData.mHeaders = intent.getParcelableArrayListExtra(
-                    RecognizerResultsIntent
-                    .EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS);
-            mVoiceSearchData.mSourceIsGoogle = intent.getBooleanExtra(
-                    VoiceSearchData.SOURCE_IS_GOOGLE, false);
-            mVoiceSearchData.mVoiceSearchIntent = new Intent(intent);
-        }
-        String extraData = intent.getStringExtra(
-                SearchManager.EXTRA_DATA_KEY);
-        if (extraData != null) {
-            index = Integer.parseInt(extraData);
-            if (index >= mVoiceSearchData.mVoiceSearchResults.size()) {
-                throw new AssertionError("index must be less than "
-                        + "size of mVoiceSearchResults");
-            }
-            if (mVoiceSearchData.mSourceIsGoogle) {
-                Intent logIntent = new Intent(
-                        LoggingEvents.ACTION_LOG_EVENT);
-                logIntent.putExtra(LoggingEvents.EXTRA_EVENT,
-                        LoggingEvents.VoiceSearch.N_BEST_CHOOSE);
-                logIntent.putExtra(
-                        LoggingEvents.VoiceSearch.EXTRA_N_BEST_CHOOSE_INDEX,
-                        index);
-                mContext.sendBroadcast(logIntent);
-            }
-            if (mVoiceSearchData.mVoiceSearchIntent != null) {
-                // Copy the Intent, so that each history item will have its own
-                // Intent, with different (or none) extra data.
-                Intent latest = new Intent(mVoiceSearchData.mVoiceSearchIntent);
-                latest.putExtra(SearchManager.EXTRA_DATA_KEY, extraData);
-                mVoiceSearchData.mVoiceSearchIntent = latest;
-            }
-        }
-        mVoiceSearchData.mLastVoiceSearchTitle
-                = mVoiceSearchData.mVoiceSearchResults.get(index);
-        if (mInForeground) {
-            mWebViewController.activateVoiceSearchMode(
-                    mVoiceSearchData.mLastVoiceSearchTitle,
-                    mVoiceSearchData.mVoiceSearchResults);
-        }
-        if (mVoiceSearchData.mVoiceSearchHtmls != null) {
-            // When index was found it was already ensured that it was valid
-            String uriString = mVoiceSearchData.mVoiceSearchHtmls.get(index);
-            if (uriString != null) {
-                Uri dataUri = Uri.parse(uriString);
-                if (RecognizerResultsIntent.URI_SCHEME_INLINE.equals(
-                        dataUri.getScheme())) {
-                    // If there is only one base URL, use it.  If there are
-                    // more, there will be one for each index, so use the base
-                    // URL corresponding to the index.
-                    String baseUrl = mVoiceSearchData.mVoiceSearchBaseUrls.get(
-                            mVoiceSearchData.mVoiceSearchBaseUrls.size() > 1 ?
-                            index : 0);
-                    mVoiceSearchData.mLastVoiceSearchUrl = baseUrl;
-                    mMainView.loadDataWithBaseURL(baseUrl,
-                            uriString.substring(RecognizerResultsIntent
-                            .URI_SCHEME_INLINE.length() + 1), "text/html",
-                            "utf-8", baseUrl);
-                    return;
-                }
-            }
-        }
-        mVoiceSearchData.mLastVoiceSearchUrl
-                = mVoiceSearchData.mVoiceSearchUrls.get(index);
-        if (null == mVoiceSearchData.mLastVoiceSearchUrl) {
-            mVoiceSearchData.mLastVoiceSearchUrl = UrlUtils.smartUrlFilter(
-                    mVoiceSearchData.mLastVoiceSearchTitle);
-        }
-        Map<String, String> headers = null;
-        if (mVoiceSearchData.mHeaders != null) {
-            int bundleIndex = mVoiceSearchData.mHeaders.size() == 1 ? 0
-                    : index;
-            Bundle bundle = mVoiceSearchData.mHeaders.get(bundleIndex);
-            if (bundle != null && !bundle.isEmpty()) {
-                Iterator<String> iter = bundle.keySet().iterator();
-                headers = new HashMap<String, String>();
-                while (iter.hasNext()) {
-                    String key = iter.next();
-                    headers.put(key, bundle.getString(key));
-                }
-            }
-        }
-        mMainView.loadUrl(mVoiceSearchData.mLastVoiceSearchUrl, headers);
-    }
-    /* package */ static class VoiceSearchData {
-        public VoiceSearchData(ArrayList<String> results,
-                ArrayList<String> urls, ArrayList<String> htmls,
-                ArrayList<String> baseUrls) {
-            mVoiceSearchResults = results;
-            mVoiceSearchUrls = urls;
-            mVoiceSearchHtmls = htmls;
-            mVoiceSearchBaseUrls = baseUrls;
-        }
-        /*
-         * ArrayList of suggestions to be displayed when opening the
-         * SearchManager
-         */
-        public ArrayList<String> mVoiceSearchResults;
-        /*
-         * ArrayList of urls, associated with the suggestions in
-         * mVoiceSearchResults.
-         */
-        public ArrayList<String> mVoiceSearchUrls;
-        /*
-         * ArrayList holding content to load for each item in
-         * mVoiceSearchResults.
-         */
-        public ArrayList<String> mVoiceSearchHtmls;
-        /*
-         * ArrayList holding base urls for the items in mVoiceSearchResults.
-         * If non null, this will either have the same size as
-         * mVoiceSearchResults or have a size of 1, in which case all will use
-         * the same base url
-         */
-        public ArrayList<String> mVoiceSearchBaseUrls;
-        /*
-         * The last url provided by voice search.  Used for comparison to see if
-         * we are going to a page by some method besides voice search.
-         */
-        public String mLastVoiceSearchUrl;
-        /**
-         * The last title used for voice search.  Needed to update the title bar
-         * when switching tabs.
-         */
-        public String mLastVoiceSearchTitle;
-        /**
-         * Whether the Intent which turned on voice search mode contained the
-         * String signifying that Google was the source.
-         */
-        public boolean mSourceIsGoogle;
-        /**
-         * List of headers to be passed into the WebView containing location
-         * information
-         */
-        public ArrayList<Bundle> mHeaders;
-        /**
-         * The Intent used to invoke voice search.  Placed on the
-         * WebHistoryItem so that when coming back to a previous voice search
-         * page we can again activate voice search.
-         */
-        public Intent mVoiceSearchIntent;
-        /**
-         * String used to identify Google as the source of voice search.
-         */
-        public static String SOURCE_IS_GOOGLE
-                = "android.speech.extras.SOURCE_IS_GOOGLE";
-    }
-
     // Container class for the next error dialog that needs to be displayed
     private class ErrorDialog {
         public final int mTitle;
@@ -564,20 +335,11 @@
         @Override
         public void onPageStarted(WebView view, String url, Bitmap favicon) {
             mInPageLoad = true;
+            mUpdateThumbnail = true;
             mPageLoadProgress = INITIAL_PROGRESS;
             mCurrentState = new PageState(mContext,
                     view.isPrivateBrowsingEnabled(), url, favicon);
             mLoadStartTime = SystemClock.uptimeMillis();
-            if (mVoiceSearchData != null
-                    && providersDiffer(url, mVoiceSearchData.mLastVoiceSearchUrl)) {
-                if (mVoiceSearchData.mSourceIsGoogle) {
-                    Intent i = new Intent(LoggingEvents.ACTION_LOG_EVENT);
-                    i.putExtra(LoggingEvents.EXTRA_FLUSH, true);
-                    mContext.sendBroadcast(i);
-                }
-                revertVoiceSearchMode();
-            }
-
 
             // If we start a touch icon load and then load a new page, we don't
             // want to cancel the current touch icon loader. But, we do want to
@@ -610,11 +372,6 @@
 
         @Override
         public void onPageFinished(WebView view, String url) {
-            if (!mInPageLoad) {
-                // In page navigation links (www.something.com#footer) will
-                // trigger an onPageFinished which we don't care about.
-                return;
-            }
             if (!isPrivateBrowsingEnabled()) {
                 LogTag.logPageFinishedLoading(
                         url, SystemClock.uptimeMillis() - mLoadStartTime);
@@ -626,18 +383,6 @@
         // return true if want to hijack the url to let another app to handle it
         @Override
         public boolean shouldOverrideUrlLoading(WebView view, String url) {
-            if (voiceSearchSourceIsGoogle()) {
-                // This method is called when the user clicks on a link.
-                // VoiceSearchMode is turned off when the user leaves the
-                // Google results page, so at this point the user must be on
-                // that page.  If the user clicked a link on that page, assume
-                // that the voice search was effective, and broadcast an Intent
-                // so a receiver can take note of that fact.
-                Intent logIntent = new Intent(LoggingEvents.ACTION_LOG_EVENT);
-                logIntent.putExtra(LoggingEvents.EXTRA_EVENT,
-                        LoggingEvents.VoiceSearch.RESULT_CLICKED);
-                mContext.sendBroadcast(logIntent);
-            }
             if (mInForeground) {
                 return mWebViewController.shouldOverrideUrlLoading(Tab.this,
                         view, url);
@@ -896,7 +641,9 @@
             if (!mInForeground) {
                 return;
             }
-            mWebViewController.onUnhandledKeyEvent(event);
+            if (!mWebViewController.onUnhandledKeyEvent(event)) {
+                super.onUnhandledKeyEvent(view, event);
+            }
         }
 
         @Override
@@ -1047,6 +794,9 @@
                 mInPageLoad = false;
             }
             mWebViewController.onProgressChanged(Tab.this);
+            if (mUpdateThumbnail && newProgress == 100) {
+                mUpdateThumbnail = false;
+            }
         }
 
         @Override
@@ -1238,9 +988,9 @@
         }
 
         @Override
-        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
+        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
             if (mInForeground) {
-                mWebViewController.openFileChooser(uploadMsg, acceptType);
+                mWebViewController.openFileChooser(uploadMsg, acceptType, capture);
             } else {
                 uploadMsg.onReceiveValue(null);
             }
@@ -1418,9 +1168,6 @@
         mWebBackForwardListClient = new WebBackForwardListClient() {
             @Override
             public void onNewHistoryItem(WebHistoryItem item) {
-                if (isInVoiceSearchMode()) {
-                    item.setCustomData(mVoiceSearchData.mVoiceSearchIntent);
-                }
                 if (mClearHistoryUrlPattern != null) {
                     boolean match =
                         mClearHistoryUrlPattern.matcher(item.getOriginalUrl()).matches();
@@ -1437,13 +1184,6 @@
                     mClearHistoryUrlPattern = null;
                 }
             }
-            @Override
-            public void onIndexChanged(WebHistoryItem item, int index) {
-                Object data = item.getCustomData();
-                if (data != null && data instanceof Intent) {
-                    activateVoiceSearchMode((Intent) data);
-                }
-            }
         };
 
         mCaptureWidth = mContext.getResources().getDimensionPixelSize(
@@ -1468,6 +1208,10 @@
         };
     }
 
+    public boolean shouldUpdateThumbnail() {
+        return mUpdateThumbnail;
+    }
+
     /**
      * This is used to get a new ID when the tab has been preloaded, before it is displayed and
      * added to TabControl. Preloaded tabs can be created before restoreInstanceState, leading
@@ -1506,11 +1250,15 @@
         return mId;
     }
 
+    void setWebView(WebView w) {
+        setWebView(w, true);
+    }
+
     /**
      * Sets the WebView for this tab, correctly removing the old WebView from
      * the container view.
      */
-    void setWebView(WebView w) {
+    void setWebView(WebView w, boolean restore) {
         if (mMainView == w) {
             return;
         }
@@ -1542,12 +1290,13 @@
             // does a redirect after a period of time. The user could have
             // switched to another tab while waiting for the download to start.
             mMainView.setDownloadListener(mDownloadListener);
-            mMainView.setWebBackForwardListClient(mWebBackForwardListClient);
+            getWebViewClassic().setWebBackForwardListClient(mWebBackForwardListClient);
             TabControl tc = mWebViewController.getTabControl();
             if (tc != null && tc.getOnThumbnailUpdatedListener() != null) {
                 mMainView.setPictureListener(this);
             }
-            if (mSavedState != null) {
+            if (restore && (mSavedState != null)) {
+                restoreUserAgent();
                 WebBackForwardList restoredState
                         = mMainView.restoreState(mSavedState);
                 if (restoredState == null || restoredState.getSize() == 0) {
@@ -1565,8 +1314,6 @@
     void destroy() {
         if (mMainView != null) {
             dismissSubWindow();
-            // Make sure the embedded title bar isn't still attached
-            mMainView.setEmbeddedTitleBar(null);
             // save the WebView to call destroy() after detach it from the tab
             WebView webView = mMainView;
             setWebView(null);
@@ -1779,6 +1526,15 @@
         return mMainView;
     }
 
+    /**
+     * Return the underlying WebViewClassic implementation. As with getWebView,
+     * this maybe null for background tabs.
+     * @return The main WebView of this tab.
+     */
+    WebViewClassic getWebViewClassic() {
+        return WebViewClassic.fromWebView(mMainView);
+    }
+
     void setViewContainer(View container) {
         mContainer = container;
     }
@@ -1944,12 +1700,6 @@
         return mInPageLoad;
     }
 
-    // force mInLoad to be false. This should only be called before closing the
-    // tab to ensure BrowserActivity's pauseWebViewTimers() is called correctly.
-    void clearInPageLoad() {
-        mInPageLoad = false;
-    }
-
     /**
      * @return The Bundle with the tab's state if it can be saved, otherwise null
      */
@@ -2001,10 +1751,7 @@
         mId = b.getLong(ID);
         mAppId = b.getString(APPID);
         mCloseOnBack = b.getBoolean(CLOSEFLAG);
-        if (b.getBoolean(USERAGENT)
-                != mSettings.hasDesktopUseragent(getWebView())) {
-            mSettings.toggleDesktopUseragent(getWebView());
-        }
+        restoreUserAgent();
         String url = b.getString(CURRURL);
         String title = b.getString(CURRTITLE);
         boolean incognito = b.getBoolean(INCOGNITO);
@@ -2017,6 +1764,16 @@
         }
     }
 
+    private void restoreUserAgent() {
+        if (mMainView == null || mSavedState == null) {
+            return;
+        }
+        if (mSavedState.getBoolean(USERAGENT)
+                != mSettings.hasDesktopUseragent(mMainView)) {
+            mSettings.toggleDesktopUseragent(mMainView);
+        }
+    }
+
     public void updateBookmarkedStatus() {
         mDataController.queryBookmarkStatus(getUrl(), mIsBookmarkCallback);
     }
@@ -2042,26 +1799,29 @@
         return false;
     }
 
-    public ContentValues createSnapshotValues() {
-        if (mMainView == null) return null;
-        SnapshotByteArrayOutputStream bos = new SnapshotByteArrayOutputStream();
-        try {
-            GZIPOutputStream stream = new GZIPOutputStream(bos);
-            if (!mMainView.saveViewState(stream)) {
-                return null;
+    private static class SaveCallback implements ValueCallback<Boolean> {
+        boolean mResult;
+
+        @Override
+        public void onReceiveValue(Boolean value) {
+            mResult = value;
+            synchronized (this) {
+                notifyAll();
             }
-            stream.flush();
-            stream.close();
-        } catch (Exception e) {
-            Log.w(LOGTAG, "Failed to save view state", e);
-            return null;
         }
-        byte[] data = bos.toByteArray();
+
+    }
+
+    /**
+     * Must be called on the UI thread
+     */
+    public ContentValues createSnapshotValues() {
+        WebViewClassic web = getWebViewClassic();
+        if (web == null) return null;
         ContentValues values = new ContentValues();
         values.put(Snapshots.TITLE, mCurrentState.mTitle);
         values.put(Snapshots.URL, mCurrentState.mUrl);
-        values.put(Snapshots.VIEWSTATE, data);
-        values.put(Snapshots.BACKGROUND, mMainView.getPageBackgroundColor());
+        values.put(Snapshots.BACKGROUND, web.getPageBackgroundColor());
         values.put(Snapshots.DATE_CREATED, System.currentTimeMillis());
         values.put(Snapshots.FAVICON, compressBitmap(getFavicon()));
         Bitmap screenshot = Controller.createScreenshot(mMainView,
@@ -2071,6 +1831,50 @@
         return values;
     }
 
+    /**
+     * Probably want to call this on a background thread
+     */
+    public boolean saveViewState(ContentValues values) {
+        WebViewClassic web = getWebViewClassic();
+        if (web == null) return false;
+        String path = UUID.randomUUID().toString();
+        SaveCallback callback = new SaveCallback();
+        OutputStream outs = null;
+        try {
+            outs = mContext.openFileOutput(path, Context.MODE_PRIVATE);
+            GZIPOutputStream stream = new GZIPOutputStream(outs);
+            synchronized (callback) {
+                web.saveViewState(stream, callback);
+                callback.wait();
+            }
+            stream.flush();
+            stream.close();
+        } catch (Exception e) {
+            Log.w(LOGTAG, "Failed to save view state", e);
+            if (outs != null) {
+                try {
+                    outs.close();
+                } catch (IOException ignore) {}
+            }
+            File file = mContext.getFileStreamPath(path);
+            if (file.exists() && !file.delete()) {
+                file.deleteOnExit();
+            }
+            return false;
+        }
+        File savedFile = mContext.getFileStreamPath(path);
+        if (!callback.mResult) {
+            if (!savedFile.delete()) {
+                savedFile.deleteOnExit();
+            }
+            return false;
+        }
+        long size = savedFile.length();
+        values.put(Snapshots.VIEWSTATE_PATH, path);
+        values.put(Snapshots.VIEWSTATE_SIZE, size);
+        return true;
+    }
+
     public byte[] compressBitmap(Bitmap bitmap) {
         if (bitmap == null) {
             return null;
@@ -2130,7 +1934,6 @@
 
     @Override
     public void onNewPicture(WebView view, Picture picture) {
-        //update screenshot
         postCapture();
     }
 
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index d549ac3..cf82e01 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -31,10 +31,7 @@
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.Shader;
-import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.graphics.drawable.PaintDrawable;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -200,7 +197,7 @@
                     mUi.hideTitleBar();
                 } else {
                     mUi.stopWebViewScrolling();
-                    mUi.editUrl(false);
+                    mUi.editUrl(false, false);
                 }
             } else if (mUi.isTitleBarShowing() && !isLoading()) {
                 mUi.stopEditingUrl();
@@ -253,7 +250,6 @@
         ImageView mLock;
         ImageView mClose;
         boolean mSelected;
-        boolean mInLoad;
         Path mPath;
         Path mFocusPath;
         int[] mWindowPos;
@@ -281,7 +277,6 @@
             mIncognito = mTabContent.findViewById(R.id.incognito);
             mSnapshot = mTabContent.findViewById(R.id.snapshot);
             mSelected = false;
-            mInLoad = false;
             // update the status
             updateFromTab();
         }
@@ -299,7 +294,6 @@
                 displayTitle = mTab.getUrl();
             }
             setDisplayTitle(displayTitle);
-            setProgress(mTab.getLoadProgress());
             if (mTab.getFavicon() != null) {
                 setFavicon(mUi.getFaviconDrawable(mTab.getFavicon()));
             }
@@ -352,16 +346,6 @@
             }
         }
 
-        void setProgress(int newProgress) {
-            if (newProgress >= PROGRESS_MAX) {
-                mInLoad = false;
-            } else {
-                if (!mInLoad && getWindowToken() != null) {
-                    mInLoad = true;
-                }
-            }
-        }
-
         private void closeTab() {
             if (mTab == mTabControl.getCurrentTab()) {
                 mUiController.closeCurrentTab();
@@ -503,10 +487,6 @@
 
     public void onSetActiveTab(Tab tab) {
         mTabs.setSelectedTab(mTabControl.getTabPosition(tab));
-        TabView tv = mTabMap.get(tab);
-        if (tv != null) {
-            tv.setProgress(tv.mTab.getLoadProgress());
-        }
     }
 
     public void onFavicon(Tab tab, Bitmap favicon) {
@@ -521,13 +501,6 @@
         animateTabIn(tab, tv);
     }
 
-    public void onProgress(Tab tab, int progress) {
-        TabView tv = mTabMap.get(tab);
-        if (tv != null) {
-            tv.setProgress(progress);
-        }
-    }
-
     public void onRemoveTab(Tab tab) {
         TabView tv = mTabMap.get(tab);
         if (tv != null) {
@@ -550,9 +523,9 @@
     }
 
     private boolean isLoading() {
-        TabView tv = mTabMap.get(mTabControl.getCurrentTab());
-        if (tv != null) {
-            return tv.mInLoad;
+        Tab tab = mTabControl.getCurrentTab();
+        if (tab != null) {
+            return tab.inPageLoad();
         } else {
             return false;
         }
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 0668b74..993cd11 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -613,7 +613,7 @@
         }
         // Create a new WebView. If this tab is the current tab, we need to put
         // back all the clients so force it to be the current tab.
-        t.setWebView(createNewWebView());
+        t.setWebView(createNewWebView(), false);
         if (getCurrentTab() == t) {
             setCurrentTab(t, true);
         }
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
index 8fa4d43..f5be5d3 100644
--- a/src/com/android/browser/TitleBar.java
+++ b/src/com/android/browser/TitleBar.java
@@ -20,8 +20,8 @@
 import android.animation.Animator.AnimatorListener;
 import android.animation.ObjectAnimator;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -31,7 +31,6 @@
 import android.view.animation.AnimationUtils;
 import android.view.animation.DecelerateInterpolator;
 import android.webkit.WebView;
-import android.widget.AbsoluteLayout;
 import android.widget.FrameLayout;
 import android.widget.RelativeLayout;
 
@@ -46,7 +45,7 @@
 
     private UiController mUiController;
     private BaseUi mBaseUi;
-    private FrameLayout mParent;
+    private FrameLayout mContentView;
     private PageProgressView mProgress;
 
     private AutologinBar mAutoLogin;
@@ -59,14 +58,16 @@
     private boolean mInLoad;
     private boolean mSkipTitleBarAnimations;
     private Animator mTitleBarAnimator;
+    private boolean mIsFixedTitleBar;
 
     public TitleBar(Context context, UiController controller, BaseUi ui,
-            FrameLayout parent) {
+            FrameLayout contentView) {
         super(context, null);
         mUiController = controller;
         mBaseUi = ui;
-        mParent = parent;
+        mContentView = contentView;
         initLayout(context);
+        setFixedTitleBar();
     }
 
     private void initLayout(Context context) {
@@ -97,6 +98,44 @@
         mSnapshotBar.setTitleBar(this);
     }
 
+    @Override
+    protected void onConfigurationChanged(Configuration config) {
+        super.onConfigurationChanged(config);
+        setFixedTitleBar();
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        if (mIsFixedTitleBar) {
+            int margin = getMeasuredHeight() - calculateEmbeddedHeight();
+            mBaseUi.setContentViewMarginTop(-margin);
+        } else {
+            mBaseUi.setContentViewMarginTop(0);
+        }
+    }
+
+    private void setFixedTitleBar() {
+        boolean isFixed = !mUseQuickControls
+                && !mContext.getResources().getBoolean(R.bool.hide_title);
+        // If getParent() returns null, we are initializing
+        ViewGroup parent = (ViewGroup)getParent();
+        if (mIsFixedTitleBar == isFixed && parent != null) return;
+        mIsFixedTitleBar = isFixed;
+        setSkipTitleBarAnimations(true);
+        show();
+        setSkipTitleBarAnimations(false);
+        if (parent != null) {
+            parent.removeView(this);
+        }
+        if (mIsFixedTitleBar) {
+            mBaseUi.addFixedTitleBar(this);
+        } else {
+            mContentView.addView(this, makeLayoutParams());
+            mBaseUi.setContentViewMarginTop(0);
+        }
+    }
+
     public BaseUi getUi() {
         return mBaseUi;
     }
@@ -107,7 +146,12 @@
 
     public void setUseQuickControls(boolean use) {
         mUseQuickControls = use;
-        setLayoutParams(makeLayoutParams());
+        setFixedTitleBar();
+        if (use) {
+            this.setVisibility(View.GONE);
+        } else {
+            this.setVisibility(View.VISIBLE);
+        }
     }
 
     void setShowProgressOnly(boolean progress) {
@@ -131,31 +175,30 @@
     }
 
     void show() {
-        if (mUseQuickControls) {
-            mParent.addView(this);
+        cancelTitleBarAnimation(false);
+        if (mUseQuickControls || mSkipTitleBarAnimations) {
+            this.setVisibility(View.VISIBLE);
+            this.setTranslationY(0);
         } else {
-            if (!mSkipTitleBarAnimations) {
-                cancelTitleBarAnimation(false);
-                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();
+            int visibleHeight = getVisibleTitleHeight();
+            float startPos = (-getEmbeddedHeight() + visibleHeight);
+            if (getTranslationY() != 0) {
+                startPos = Math.max(startPos, getTranslationY());
             }
-            mBaseUi.setTitleGravity(Gravity.TOP);
+            mTitleBarAnimator = ObjectAnimator.ofFloat(this,
+                    "translationY",
+                    startPos, 0);
+            setupTitleBarAnimator(mTitleBarAnimator);
+            mTitleBarAnimator.start();
         }
         mShowing = true;
     }
 
     void hide() {
         if (mUseQuickControls) {
-            mParent.removeView(this);
+            this.setVisibility(View.GONE);
         } else {
+            if (mIsFixedTitleBar) return;
             if (!mSkipTitleBarAnimations) {
                 cancelTitleBarAnimation(false);
                 int visibleHeight = getVisibleTitleHeight();
@@ -166,7 +209,7 @@
                 setupTitleBarAnimator(mTitleBarAnimator);
                 mTitleBarAnimator.start();
             } else {
-                mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
+                onScrollChanged();
             }
         }
         mShowing = false;
@@ -188,10 +231,8 @@
 
     private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() {
 
-        boolean mWasCanceled;
         @Override
         public void onAnimationStart(Animator animation) {
-            mWasCanceled = false;
         }
 
         @Override
@@ -200,15 +241,12 @@
 
         @Override
         public void onAnimationEnd(Animator animation) {
-            if (!mWasCanceled) {
-                setTranslationY(0);
-            }
-            mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
+            // update position
+            onScrollChanged();
         }
 
         @Override
         public void onAnimationCancel(Animator animation) {
-            mWasCanceled = true;
         }
     };
 
@@ -229,9 +267,10 @@
             mNavBar.onProgressStopped();
             // check if needs to be hidden
             if (!isEditingUrl() && !wantsToBeVisible()) {
-                hide();
                 if (mUseQuickControls) {
-                    setShowProgressOnly(false);
+                    hide();
+                } else {
+                    mBaseUi.showTitleBarForDuration();
                 }
             }
         } else {
@@ -242,16 +281,21 @@
             }
             mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS
                     / PROGRESS_MAX);
+            if (mUseQuickControls && !isEditingUrl()) {
+                setShowProgressOnly(true);
+            }
             if (!mShowing) {
-                if (mUseQuickControls && !isEditingUrl()) {
-                    setShowProgressOnly(true);
-                }
                 show();
             }
         }
     }
 
     public int getEmbeddedHeight() {
+        if (mUseQuickControls || mIsFixedTitleBar) return 0;
+        return calculateEmbeddedHeight();
+    }
+
+    private int calculateEmbeddedHeight() {
         int height = mNavBar.getHeight();
         if (mAutoLogin != null && mAutoLogin.getVisibility() == View.VISIBLE) {
             height += mAutoLogin.getHeight();
@@ -355,20 +399,16 @@
     }
 
     private ViewGroup.LayoutParams makeLayoutParams() {
-        if (mUseQuickControls) {
-            return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
-                    LayoutParams.WRAP_CONTENT);
-        } else {
-            return new AbsoluteLayout.LayoutParams(
-                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
-                    0, 0);
-        }
+        return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
+                LayoutParams.WRAP_CONTENT);
     }
 
     @Override
     public View focusSearch(View focused, int dir) {
-        if (FOCUS_DOWN == dir && hasFocus()) {
-            return getCurrentWebView();
+        WebView web = getCurrentWebView();
+        if (FOCUS_DOWN == dir && hasFocus() && web != null
+                && web.hasFocusable() && web.getParent() != null) {
+            return web;
         }
         return super.focusSearch(focused, dir);
     }
@@ -390,4 +430,10 @@
         }
     }
 
+    public void onScrollChanged() {
+        if (!mShowing && !mIsFixedTitleBar) {
+            setTranslationY(getVisibleTitleHeight() - getEmbeddedHeight());
+        }
+    }
+
 }
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
index 2bd3754..677c3d3 100644
--- a/src/com/android/browser/UI.java
+++ b/src/com/android/browser/UI.java
@@ -93,10 +93,6 @@
 
     public boolean isCustomViewShowing();
 
-    public void showVoiceTitleBar(String title, List<String> results);
-
-    public void revertVoiceTitleBar(Tab tab);
-
     public boolean onPrepareOptionsMenu(Menu menu);
 
     public void updateMenuState(Tab tab, Menu menu);
@@ -134,7 +130,7 @@
 
     void showMaxTabsWarning();
 
-    void editUrl(boolean clearInput);
+    void editUrl(boolean clearInput, boolean forceIME);
 
     boolean isEditingUrl();
 
@@ -150,4 +146,7 @@
 
     public boolean shouldCaptureThumbnails();
 
+    boolean blockFocusAnimations();
+
+    void onVoiceResult(String result);
 }
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
index b97ae10..683e473 100644
--- a/src/com/android/browser/UiController.java
+++ b/src/com/android/browser/UiController.java
@@ -67,11 +67,7 @@
 
     void bookmarksOrHistoryPicker(ComboViews startView);
 
-    void startVoiceSearch();
-
-    boolean supportsVoiceSearch();
-
-    void showVoiceSearchResults(String title);
+    void bookmarkCurrentPage();
 
     void editUrl();
 
@@ -105,4 +101,16 @@
 
     void showPageInfo();
 
+    void openPreferences();
+
+    void findOnPage();
+
+    void toggleUserAgent();
+
+    BrowserSettings getSettings();
+
+    boolean supportsVoice();
+
+    void startVoiceRecognizer();
+
 }
diff --git a/src/com/android/browser/UploadHandler.java b/src/com/android/browser/UploadHandler.java
index 5947e4a..a9560bb 100644
--- a/src/com/android/browser/UploadHandler.java
+++ b/src/com/android/browser/UploadHandler.java
@@ -90,7 +90,7 @@
         mCaughtActivityNotFoundException = false;
     }
 
-    void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
+    void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
 
         final String imageMimeType = "image/*";
         final String videoMimeType = "video/*";
@@ -102,8 +102,8 @@
         final String mediaSourceValueMicrophone = "microphone";
 
         // According to the spec, media source can be 'filesystem' or 'camera' or 'camcorder'
-        // or 'microphone'.
-        String mediaSource = "";
+        // or 'microphone' and the default value should be 'filesystem'.
+        String mediaSource = mediaSourceValueFileSystem;
 
         if (mUploadMessage != null) {
             // Already a file picker operation in progress.
@@ -116,12 +116,22 @@
         String params[] = acceptType.split(";");
         String mimeType = params[0];
 
-        for (String p : params) {
-            String[] keyValue = p.split("=");
-            if (keyValue.length == 2) {
-                // Process key=value parameters.
-                if (mediaSourceKey.equals(keyValue[0])) {
-                    mediaSource = keyValue[1];
+        if (capture.length() > 0) {
+            mediaSource = capture;
+        }
+
+        if (capture.equals(mediaSourceValueFileSystem)) {
+            // To maintain backwards compatibility with the previous implementation
+            // of the media capture API, if the value of the 'capture' attribute is
+            // "filesystem", we should examine the accept-type for a MIME type that
+            // may specify a different capture value.
+            for (String p : params) {
+                String[] keyValue = p.split("=");
+                if (keyValue.length == 2) {
+                    // Process key=value parameters.
+                    if (mediaSourceKey.equals(keyValue[0])) {
+                        mediaSource = keyValue[1];
+                    }
                 }
             }
         }
@@ -135,14 +145,10 @@
                 // camera directly.
                 startActivity(createCameraIntent());
                 return;
-            } else if (mediaSource.equals(mediaSourceValueFileSystem)) {
-                // Specified 'image/*' and requested the filesystem, so go ahead and launch an
-                // OPENABLE intent.
-                startActivity(createOpenableIntent(imageMimeType));
-                return;
             } else {
-                // Specified just 'image/*', so launch an intent for both the Camera and image/*
-                // OPENABLE.
+                // Specified just 'image/*', capture=filesystem, or an invalid capture parameter.
+                // In all these cases we show a traditional picker filetered on accept type
+                // so launch an intent for both the Camera and image/* OPENABLE.
                 Intent chooser = createChooserIntent(createCameraIntent());
                 chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(imageMimeType));
                 startActivity(chooser);
@@ -154,14 +160,10 @@
                 // camcorder directly.
                 startActivity(createCamcorderIntent());
                 return;
-            } else if (mediaSource.equals(mediaSourceValueFileSystem)) {
-                // Specified 'video/*' and requested the filesystem, so go ahead and launch an
-                // an OPENABLE intent.
-                startActivity(createOpenableIntent(videoMimeType));
-                return;
-            } else {
-                // Specified just 'video/*', so go ahead and launch an intent for both camcorder and
-                // video/* OPENABLE.
+           } else {
+                // Specified just 'video/*', capture=filesystem or an invalid capture parameter.
+                // In all these cases we show an intent for the traditional file picker, filtered
+                // on accept type so launch an intent for both camcorder and video/* OPENABLE.
                 Intent chooser = createChooserIntent(createCamcorderIntent());
                 chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(videoMimeType));
                 startActivity(chooser);
@@ -173,13 +175,9 @@
                 // recorder.
                 startActivity(createSoundRecorderIntent());
                 return;
-            } else if (mediaSource.equals(mediaSourceValueFileSystem)) {
-                // Specified 'audio/*' and requested filesystem, so go ahead and launch an
-                // OPENABLE intent.
-                startActivity(createOpenableIntent(audioMimeType));
-                return;
             } else {
-                // Specified just 'audio/*', so go ahead and launch an intent for both the sound
+                // Specified just 'audio/*',  capture=filesystem of an invalid capture parameter.
+                // In all these cases so go ahead and launch an intent for both the sound
                 // recorder and audio/* OPENABLE.
                 Intent chooser = createChooserIntent(createSoundRecorderIntent());
                 chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(audioMimeType));
diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java
index a4df999..ac4b880 100644
--- a/src/com/android/browser/UrlHandler.java
+++ b/src/com/android/browser/UrlHandler.java
@@ -163,7 +163,7 @@
       // Re-use the existing tab if the intent comes back to us
       if (tab != null) {
           if (tab.getAppId() == null) {
-              tab.setAppId("com.android.browser-" + tab.getId());
+              tab.setAppId(mActivity.getPackageName() + "-" + tab.getId());
           }
           intent.putExtra(Browser.EXTRA_APPLICATION_ID, tab.getAppId());
       }
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 3c0de30..02bba3c 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -55,7 +55,6 @@
 
     static final String TYPED = "browser-type";
     static final String SUGGESTED = "browser-suggest";
-    static final String VOICE = "voice-search";
 
     static final int POST_DELAY = 100;
 
@@ -195,10 +194,6 @@
         return mState;
     }
 
-    void setVoiceResults(List<String> voiceResults) {
-        mAdapter.setVoiceResults(voiceResults);
-    }
-
     @Override
     protected void onConfigurationChanged(Configuration config) {
         super.onConfigurationChanged(config);
@@ -246,15 +241,15 @@
         showDropDown();
     }
 
-    void forceIme() {
-        mInputManager.focusIn(this);
-        mInputManager.showSoftInput(this, 0);
-    }
-
     void hideIME() {
         mInputManager.hideSoftInputFromWindow(getWindowToken(), 0);
     }
 
+    void showIME() {
+        mInputManager.focusIn(this);
+        mInputManager.showSoftInput(this, 0);
+    }
+
     private void finishInput(String url, String extra, String source) {
         mNeedsUpdate = true;
         dismissDropDown();
@@ -298,8 +293,7 @@
 
     @Override
     public void onSelect(String url, int type, String extra) {
-        finishInput(url, extra, (type == SuggestionsAdapter.TYPE_VOICE_SEARCH)
-                ? VOICE : SUGGESTED);
+        finishInput(url, extra, SUGGESTED);
     }
 
     @Override
diff --git a/src/com/android/browser/WebViewController.java b/src/com/android/browser/WebViewController.java
index 20027e0..fef6964 100644
--- a/src/com/android/browser/WebViewController.java
+++ b/src/com/android/browser/WebViewController.java
@@ -63,7 +63,7 @@
 
     boolean shouldOverrideKeyEvent(KeyEvent event);
 
-    void onUnhandledKeyEvent(KeyEvent event);
+    boolean onUnhandledKeyEvent(KeyEvent event);
 
     void doUpdateVisitedHistory(Tab tab, boolean isReload);
 
@@ -89,15 +89,11 @@
 
     void onUserCanceledSsl(Tab tab);
 
-    void activateVoiceSearchMode(String title, List<String> results);
-
-    void revertVoiceSearchMode(Tab tab);
-
     boolean shouldShowErrorConsole();
 
     void onUpdatedSecurityState(Tab tab);
 
-    void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType);
+    void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture);
 
     void endActionMode();
 
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index c828df4..3b8245a 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -28,14 +28,11 @@
 import android.os.Handler;
 import android.util.Log;
 import android.view.ActionMode;
-import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.WebChromeClient.CustomViewCallback;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 
 import java.util.List;
 
@@ -53,7 +50,6 @@
 
     private NavigationBarTablet mNavBar;
 
-    private PieControlXLarge mPieControl;
     private Handler mHandler;
 
     /**
@@ -85,41 +81,19 @@
 
     @Override
     public void setUseQuickControls(boolean useQuickControls) {
-        mUseQuickControls = useQuickControls;
-        mTitleBar.setUseQuickControls(mUseQuickControls);
-        if (useQuickControls) {
-            checkTabCount();
-            mPieControl = new PieControlXLarge(mActivity, mUiController, this);
-            mPieControl.attachToContainer(mContentView);
-            WebView web = getWebView();
-            if (web != null) {
-                web.setEmbeddedTitleBar(null);
-
-            }
-        } else {
-            mActivity.getActionBar().show();
-            if (mPieControl != null) {
-                mPieControl.removeFromContainer(mContentView);
-            }
-            WebView web = getWebView();
-            if (web != null) {
-                if (mTitleBar.getParent() != null) {
-                    ViewGroup p = (ViewGroup) mTitleBar.getParent();
-                    p.removeView(mTitleBar);
-                }
-                web.setEmbeddedTitleBar(mTitleBar);
-            }
-            setTitleGravity(Gravity.NO_GRAVITY);
+        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();
         }
-        updateUrlBarAutoShowManagerTarget();
     }
 
-    private void checkTabCount() {
+    private void checkHideActionBar() {
         if (mUseQuickControls) {
             mHandler.post(new Runnable() {
                 public void run() {
@@ -133,6 +107,7 @@
     public void onResume() {
         super.onResume();
         mNavBar.clearCompletions();
+        checkHideActionBar();
     }
 
     @Override
@@ -143,7 +118,7 @@
     void stopWebViewScrolling() {
         BrowserWebView web = (BrowserWebView) mUiController.getCurrentWebView();
         if (web != null) {
-            web.stopScroll();
+            WebViewClassic.fromWebView(web).stopScroll();
         }
     }
 
@@ -160,21 +135,12 @@
     // WebView callbacks
 
     @Override
-    public void onProgressChanged(Tab tab) {
-        int progress = tab.getLoadProgress();
-        mTabBar.onProgress(tab, progress);
-        if (tab.inForeground()) {
-            mTitleBar.setProgress(progress);
-        }
-    }
-
-    @Override
     public void addTab(Tab tab) {
         mTabBar.onNewTab(tab);
     }
 
     protected void onAddTabCompleted(Tab tab) {
-        checkTabCount();
+        checkHideActionBar();
     }
 
     @Override
@@ -189,30 +155,15 @@
             Log.e(LOGTAG, "active tab with no webview detected");
             return;
         }
-        // Request focus on the top window.
-        if (mUseQuickControls) {
-            mPieControl.forceToTop(mContentView);
-        } else {
-            // check if title bar is already attached by animation
-            if (mTitleBar.getParent() == null) {
-                view.setEmbeddedTitleBar(mTitleBar);
-            }
-        }
         mTabBar.onSetActiveTab(tab);
-        if (tab.isInVoiceSearchMode()) {
-            showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
-        } else {
-            revertVoiceTitleBar(tab);
-        }
         updateLockIconToLatest(tab);
-        tab.getTopWindow().requestFocus();
         mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     @Override
     public void updateTabs(List<Tab> tabs) {
         mTabBar.updateTabs(tabs);
-        checkTabCount();
+        checkHideActionBar();
     }
 
     @Override
@@ -225,7 +176,7 @@
     }
 
     protected void onRemoveTabCompleted(Tab tab) {
-        checkTabCount();
+        checkHideActionBar();
     }
 
     int getContentWidth() {
@@ -236,36 +187,11 @@
     }
 
     @Override
-    public void editUrl(boolean clearInput) {
+    public void editUrl(boolean clearInput, boolean forceIME) {
         if (mUseQuickControls) {
             mTitleBar.setShowProgressOnly(false);
         }
-        super.editUrl(clearInput);
-    }
-
-    void stopEditingUrl() {
-        mTitleBar.getNavigationBar().stopEditingUrl();
-    }
-
-    @Override
-    protected void showTitleBar() {
-        if (canShowTitleBar()) {
-            mTitleBar.show();
-        }
-    }
-
-    @Override
-    protected void hideTitleBar() {
-        if (isTitleBarShowing()) {
-            mTitleBar.hide();
-        }
-    }
-
-    @Override
-    protected void setTitleGravity(int gravity) {
-        if (!mUseQuickControls) {
-            super.setTitleGravity(gravity);
-        }
+        super.editUrl(clearInput, forceIME);
     }
 
     // action mode callbacks
@@ -280,7 +206,7 @@
 
     @Override
     public void onActionModeFinished(boolean inLoad) {
-        checkTabCount();
+        checkHideActionBar();
         if (inLoad) {
             // the titlebar was removed when the CAB was shown
             // if the page is loading, show it again
@@ -312,9 +238,7 @@
     @Override
     public void onHideCustomView() {
         super.onHideCustomView();
-        if (mUseQuickControls) {
-            checkTabCount();
-        }
+        checkHideActionBar();
     }
 
     @Override
@@ -327,13 +251,13 @@
                     case KeyEvent.KEYCODE_DPAD_UP:
                     case KeyEvent.KEYCODE_DPAD_LEFT:
                         if ((web != null) && web.hasFocus() && !mTitleBar.hasFocus()) {
-                            editUrl(false);
+                            editUrl(false, false);
                             return true;
                         }
                 }
                 boolean ctrl = event.hasModifiers(KeyEvent.META_CTRL_ON);
                 if (!ctrl && isTypingKey(event) && !mTitleBar.isEditingUrl()) {
-                    editUrl(true);
+                    editUrl(true, false);
                     return mContentView.dispatchKeyEvent(event);
                 }
             }
diff --git a/src/com/android/browser/homepages/HomeProvider.java b/src/com/android/browser/homepages/HomeProvider.java
index 98fcfbe..49ae694 100644
--- a/src/com/android/browser/homepages/HomeProvider.java
+++ b/src/com/android/browser/homepages/HomeProvider.java
@@ -16,8 +16,6 @@
  */

 package com.android.browser.homepages;

 

-import com.android.browser.BrowserSettings;

-

 import android.content.ContentProvider;

 import android.content.ContentValues;

 import android.content.Context;

@@ -28,8 +26,13 @@
 import android.util.Log;

 import android.webkit.WebResourceResponse;

 

+import com.android.browser.BrowserSettings;

+

+import java.io.File;

 import java.io.IOException;

 import java.io.InputStream;

+import java.io.PipedInputStream;

+import java.io.PipedOutputStream;

 

 public class HomeProvider extends ContentProvider {

 

@@ -95,8 +98,27 @@
                     return new WebResourceResponse("text/html", "utf-8", ins);

                 }

             }

+            boolean listFiles = BrowserSettings.getInstance().isDebugEnabled();

+            if (listFiles && interceptFile(url)) {

+                PipedInputStream ins = new PipedInputStream();

+                PipedOutputStream outs = new PipedOutputStream(ins);

+                new RequestHandler(context, Uri.parse(url), outs).start();

+                return new WebResourceResponse("text/html", "utf-8", ins);

+            }

         } catch (Exception e) {}

         return null;

     }

 

+    private static boolean interceptFile(String url) {

+        if (!url.startsWith("file:///")) {

+            return false;

+        }

+        String fpath = url.substring(7);

+        File f = new File(fpath);

+        if (!f.isDirectory()) {

+            return false;

+        }

+        return true;

+    }

+

 }

diff --git a/src/com/android/browser/homepages/RequestHandler.java b/src/com/android/browser/homepages/RequestHandler.java
index defda61..823935e 100644
--- a/src/com/android/browser/homepages/RequestHandler.java
+++ b/src/com/android/browser/homepages/RequestHandler.java
@@ -20,17 +20,25 @@
 import android.content.UriMatcher;

 import android.content.res.Resources;

 import android.database.Cursor;

+import android.database.MergeCursor;

 import android.net.Uri;

-import android.provider.Browser;

+import android.provider.BrowserContract.Bookmarks;

+import android.provider.BrowserContract.History;

 import android.text.TextUtils;

 import android.util.Base64;

 import android.util.Log;

 

 import com.android.browser.R;

+import com.android.browser.homepages.Template.ListEntityIterator;

 

+import java.io.File;

 import java.io.IOException;

 import java.io.InputStream;

 import java.io.OutputStream;

+import java.text.DateFormat;

+import java.text.DecimalFormat;

+import java.util.Arrays;

+import java.util.Comparator;

 import java.util.regex.Matcher;

 import java.util.regex.Pattern;

 

@@ -69,6 +77,10 @@
     }

 

     void doHandleRequest() throws IOException {

+        if ("file".equals(mUri.getScheme())) {

+            writeFolderIndex();

+            return;

+        }

         int match = sUriMatcher.match(mUri);

         switch (match) {

         case INDEX:

@@ -84,30 +96,131 @@
         return TextUtils.htmlEncode(s).getBytes();

     }

 

+    // We can reuse this for both History and Bookmarks queries because the

+    // columns defined actually belong to the CommonColumn and ImageColumn

+    // interfaces that both History and Bookmarks implement

+    private static final String[] PROJECTION = new String[] {

+        History.URL,

+        History.TITLE,

+        History.THUMBNAIL

+    };

+    private static final String SELECTION = History.URL

+            + " NOT LIKE 'content:%' AND " + History.THUMBNAIL + " IS NOT NULL";

     void writeTemplatedIndex() throws IOException {

         Template t = Template.getCachedTemplate(mContext, R.raw.most_visited);

-        Cursor cursor = mContext.getContentResolver().query(Browser.BOOKMARKS_URI,

-                new String[] { "DISTINCT url", "title", "thumbnail" },

-                "(visits > 0 OR bookmark = 1) AND url NOT LIKE 'content:%' AND thumbnail IS NOT NULL", null, "visits DESC LIMIT 12");

+        Cursor historyResults = mContext.getContentResolver().query(

+                History.CONTENT_URI, PROJECTION, SELECTION,

+                null, History.VISITS + " DESC LIMIT 12");

+        Cursor cursor = historyResults;

+        try {

+            if (cursor.getCount() < 12) {

+                Cursor bookmarkResults = mContext.getContentResolver().query(

+                        Bookmarks.CONTENT_URI, PROJECTION, SELECTION,

+                        null, Bookmarks.DATE_CREATED + " DESC LIMIT 12");

+                cursor = new MergeCursor(new Cursor[] { historyResults, bookmarkResults }) {

+                    @Override

+                    public int getCount() {

+                        return Math.min(12, super.getCount());

+                    }

+                };

+            }

+            t.assignLoop("most_visited", new Template.CursorListEntityWrapper(cursor) {

+                @Override

+                public void writeValue(OutputStream stream, String key) throws IOException {

+                    Cursor cursor = getCursor();

+                    if (key.equals("url")) {

+                        stream.write(htmlEncode(cursor.getString(0)));

+                    } else if (key.equals("title")) {

+                        stream.write(htmlEncode(cursor.getString(1)));

+                    } else if (key.equals("thumbnail")) {

+                        stream.write("data:image/png;base64,".getBytes());

+                        byte[] thumb = cursor.getBlob(2);

+                        stream.write(Base64.encode(thumb, Base64.DEFAULT));

+                    }

+                }

+            });

+            t.write(mOutput);

+        } finally {

+            cursor.close();

+        }

+    }

 

-        t.assignLoop("most_visited", new Template.CursorListEntityWrapper(cursor) {

+    private static final Comparator<File> sFileComparator = new Comparator<File>() {

+        @Override

+        public int compare(File lhs, File rhs) {

+            if (lhs.isDirectory() != rhs.isDirectory()) {

+                return lhs.isDirectory() ? -1 : 1;

+            }

+            return lhs.getName().compareTo(rhs.getName());

+        }

+    };

+

+    void writeFolderIndex() throws IOException {

+        File f = new File(mUri.getPath());

+        final File[] files = f.listFiles();

+        Arrays.sort(files, sFileComparator);

+        Template t = Template.getCachedTemplate(mContext, R.raw.folder_view);

+        t.assign("path", mUri.getPath());

+        t.assign("parent_url", f.getParent() != null ? f.getParent() : f.getPath());

+        t.assignLoop("files", new ListEntityIterator() {

+            int index = -1;

+

             @Override

             public void writeValue(OutputStream stream, String key) throws IOException {

-                Cursor cursor = getCursor();

-                if (key.equals("url")) {

-                    stream.write(htmlEncode(cursor.getString(0)));

-                } else if (key.equals("title")) {

-                    stream.write(htmlEncode(cursor.getString(1)));

-                } else if (key.equals("thumbnail")) {

-                    stream.write("data:image/png;base64,".getBytes());

-                    byte[] thumb = cursor.getBlob(2);

-                    stream.write(Base64.encode(thumb, Base64.DEFAULT));

+                File f = files[index];

+                if ("name".equals(key)) {

+                    stream.write(f.getName().getBytes());

                 }

+                if ("url".equals(key)) {

+                    stream.write(("file://" + f.getAbsolutePath()).getBytes());

+                }

+                if ("type".equals(key)) {

+                    stream.write((f.isDirectory() ? "dir" : "file").getBytes());

+                }

+                if ("size".equals(key)) {

+                    if (f.isFile()) {

+                        stream.write(readableFileSize(f.length()).getBytes());

+                    }

+                }

+                if ("last_modified".equals(key)) {

+                    String date = DateFormat.getDateTimeInstance(

+                            DateFormat.SHORT, DateFormat.SHORT)

+                            .format(f.lastModified());

+                    stream.write(date.getBytes());

+                }

+                if ("alt".equals(key)) {

+                    if (index % 2 == 0) {

+                        stream.write("alt".getBytes());

+                    }

+                }

+            }

+

+            @Override

+            public ListEntityIterator getListIterator(String key) {

+                return null;

+            }

+

+            @Override

+            public void reset() {

+                index = -1;

+            }

+

+            @Override

+            public boolean moveToNext() {

+                return (++index) < files.length;

             }

         });

         t.write(mOutput);

     }

 

+    static String readableFileSize(long size) {

+        if(size <= 0) return "0";

+        final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" };

+        int digitGroups = (int) (Math.log10(size) / Math.log10(1024));

+        return new DecimalFormat("#,##0.#").format(

+                size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];

+    }

+

     String getUriResourcePath() {

         final Pattern pattern = Pattern.compile("/?res/([\\w/]+)");

         Matcher m = pattern.matcher(mUri.getPath());

diff --git a/src/com/android/browser/preferences/BandwidthPreferencesFragment.java b/src/com/android/browser/preferences/BandwidthPreferencesFragment.java
index 2c147cc..0cb064a 100644
--- a/src/com/android/browser/preferences/BandwidthPreferencesFragment.java
+++ b/src/com/android/browser/preferences/BandwidthPreferencesFragment.java
@@ -16,9 +16,11 @@
 
 package com.android.browser.preferences;
 
+import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.preference.ListPreference;
 import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
 
 import com.android.browser.BrowserSettings;
 import com.android.browser.PreferenceKeys;
@@ -38,15 +40,24 @@
     @Override
     public void onResume() {
         super.onResume();
-        if (!getPreferenceScreen().getSharedPreferences()
-                .contains(PreferenceKeys.PREF_DATA_PRELOAD)) {
+        PreferenceScreen prefScreen = getPreferenceScreen();
+        SharedPreferences sharedPrefs = prefScreen.getSharedPreferences();
+        if (!sharedPrefs.contains(PreferenceKeys.PREF_DATA_PRELOAD)) {
             // set default value for preload setting
-            ListPreference preload = (ListPreference) getPreferenceScreen().findPreference(
+            ListPreference preload = (ListPreference) prefScreen.findPreference(
                     PreferenceKeys.PREF_DATA_PRELOAD);
             if (preload != null) {
                 preload.setValue(BrowserSettings.getInstance().getDefaultPreloadSetting());
             }
         }
+        if (!sharedPrefs.contains(PreferenceKeys.PREF_LINK_PREFETCH)) {
+            // set default value for link prefetch setting
+            ListPreference prefetch = (ListPreference) prefScreen.findPreference(
+                    PreferenceKeys.PREF_LINK_PREFETCH);
+            if (prefetch != null) {
+                prefetch.setValue(BrowserSettings.getInstance().getDefaultLinkPrefetchSetting());
+            }
+        }
     }
 
 }
diff --git a/src/com/android/browser/preferences/FontSizePreview.java b/src/com/android/browser/preferences/FontSizePreview.java
index 91ecb00..8825f3d 100644
--- a/src/com/android/browser/preferences/FontSizePreview.java
+++ b/src/com/android/browser/preferences/FontSizePreview.java
@@ -54,7 +54,7 @@
     }
 
     @Override
-    protected void updatePreview() {
+    protected void updatePreview(boolean forceReload) {
         if (mWebView == null) return;
 
         WebSettings ws = mWebView.getSettings();
diff --git a/src/com/android/browser/preferences/InvertedContrastPreview.java b/src/com/android/browser/preferences/InvertedContrastPreview.java
index c290daf..ed6eadf 100644
--- a/src/com/android/browser/preferences/InvertedContrastPreview.java
+++ b/src/com/android/browser/preferences/InvertedContrastPreview.java
@@ -19,7 +19,8 @@
 import android.content.Context;
 import android.text.TextUtils;
 import android.util.AttributeSet;
-import android.webkit.WebSettings;
+import android.webkit.WebSettingsClassic;
+import android.webkit.WebViewClassic;
 
 import com.android.browser.BrowserSettings;
 import com.android.browser.WebViewProperties;
@@ -73,16 +74,18 @@
     }
 
     @Override
-    protected void updatePreview() {
+    protected void updatePreview(boolean forceReload) {
         if (mWebView == null) return;
 
-        WebSettings ws = mWebView.getSettings();
+        WebSettingsClassic ws = WebViewClassic.fromWebView(mWebView).getSettings();
         BrowserSettings bs = BrowserSettings.getInstance();
         ws.setProperty(WebViewProperties.gfxInvertedScreen,
                 bs.useInvertedRendering() ? "true" : "false");
         ws.setProperty(WebViewProperties.gfxInvertedScreenContrast,
                 Float.toString(bs.getInvertedContrast()));
-        mWebView.loadData(mHtml, "text/html", null);
+        if (forceReload) {
+            mWebView.loadData(mHtml, "text/html", null);
+        }
     }
 
 }
diff --git a/src/com/android/browser/preferences/WebViewPreview.java b/src/com/android/browser/preferences/WebViewPreview.java
index a3c19a4..1f938f0 100644
--- a/src/com/android/browser/preferences/WebViewPreview.java
+++ b/src/com/android/browser/preferences/WebViewPreview.java
@@ -53,7 +53,7 @@
         setLayoutResource(R.layout.webview_preview);
     }
 
-    protected abstract void updatePreview();
+    protected abstract void updatePreview(boolean forceReload);
 
     protected void setupWebView(WebView view) {}
 
@@ -77,7 +77,7 @@
     protected void onBindView(View view) {
         super.onBindView(view);
         mWebView = (WebView) view.findViewById(R.id.webview);
-        updatePreview();
+        updatePreview(true);
     }
 
     @Override
@@ -95,7 +95,7 @@
     @Override
     public void onSharedPreferenceChanged(
             SharedPreferences sharedPreferences, String key) {
-        updatePreview();
+        updatePreview(false);
     }
 
 }
diff --git a/src/com/android/browser/provider/BrowserProvider.java b/src/com/android/browser/provider/BrowserProvider.java
index b55b84a..744032c 100644
--- a/src/com/android/browser/provider/BrowserProvider.java
+++ b/src/com/android/browser/provider/BrowserProvider.java
@@ -16,10 +16,6 @@
 
 package com.android.browser.provider;
 
-import com.android.browser.BrowserSettings;
-import com.android.browser.R;
-import com.android.browser.search.SearchEngine;
-
 import android.app.SearchManager;
 import android.app.backup.BackupManager;
 import android.content.ContentProvider;
@@ -42,14 +38,16 @@
 import android.preference.PreferenceManager;
 import android.provider.Browser;
 import android.provider.Browser.BookmarkColumns;
-import android.speech.RecognizerResultsIntent;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.Patterns;
 
+import com.android.browser.BrowserSettings;
+import com.android.browser.R;
+import com.android.browser.search.SearchEngine;
+
 import java.io.File;
 import java.io.FilenameFilter;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -751,105 +749,6 @@
 
     }
 
-    private static class ResultsCursor extends AbstractCursor {
-        // Array indices for RESULTS_COLUMNS
-        private static final int RESULT_ACTION_ID = 1;
-        private static final int RESULT_DATA_ID = 2;
-        private static final int RESULT_TEXT_ID = 3;
-        private static final int RESULT_ICON_ID = 4;
-        private static final int RESULT_EXTRA_ID = 5;
-
-        private static final String[] RESULTS_COLUMNS = new String[] {
-                "_id",
-                SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
-                SearchManager.SUGGEST_COLUMN_INTENT_DATA,
-                SearchManager.SUGGEST_COLUMN_TEXT_1,
-                SearchManager.SUGGEST_COLUMN_ICON_1,
-                SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA
-        };
-        private final ArrayList<String> mResults;
-        public ResultsCursor(ArrayList<String> results) {
-            mResults = results;
-        }
-        @Override
-        public int getCount() { return mResults.size(); }
-
-        @Override
-        public String[] getColumnNames() {
-            return RESULTS_COLUMNS;
-        }
-
-        @Override
-        public String getString(int column) {
-            switch (column) {
-                case RESULT_ACTION_ID:
-                    return RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS;
-                case RESULT_TEXT_ID:
-                // The data is used when the phone is in landscape mode.  We
-                // still want to show the result string.
-                case RESULT_DATA_ID:
-                    return mResults.get(mPos);
-                case RESULT_EXTRA_ID:
-                    // The Intent's extra data will store the index into
-                    // mResults so the BrowserActivity will know which result to
-                    // use.
-                    return Integer.toString(mPos);
-                case RESULT_ICON_ID:
-                    return Integer.valueOf(R.drawable.magnifying_glass)
-                            .toString();
-                default:
-                    return null;
-            }
-        }
-        @Override
-        public short getShort(int column) {
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public int getInt(int column) {
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public long getLong(int column) {
-            if ((mPos != -1) && column == 0) {
-                return mPos;        // use row# as the _id
-            }
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public float getFloat(int column) {
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public double getDouble(int column) {
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public boolean isNull(int column) {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-    /** Contains custom suggestions results set by the UI */
-    private ResultsCursor mResultsCursor;
-    /** Locks access to {@link #mResultsCursor} */
-    private Object mResultsCursorLock = new Object();
-
-    /**
-     * Provide a set of results to be returned to query, intended to be used
-     * by the SearchDialog when the BrowserActivity is in voice search mode.
-     * @param results Strings to display in the dropdown from the SearchDialog
-     */
-    public /* package */ void setQueryResults(ArrayList<String> results) {
-        synchronized (mResultsCursorLock) {
-            if (results == null) {
-                mResultsCursor = null;
-            } else {
-                mResultsCursor = new ResultsCursor(results);
-            }
-        }
-    }
-
     @Override
     public Cursor query(Uri url, String[] projectionIn, String selection,
             String[] selectionArgs, String sortOrder)
@@ -859,15 +758,6 @@
             throw new IllegalArgumentException("Unknown URL");
         }
 
-        // If results for the suggestion are already ready just return them directly
-        synchronized (mResultsCursorLock) {
-            if (match == URI_MATCH_SUGGEST && mResultsCursor != null) {
-                Cursor results = mResultsCursor;
-                mResultsCursor = null;
-                return results;
-            }
-        }
-
         if (match == URI_MATCH_SUGGEST || match == URI_MATCH_BOOKMARKS_SUGGEST) {
             // Handle suggestions
             return doSuggestQuery(selection, selectionArgs, match == URI_MATCH_BOOKMARKS_SUGGEST);
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 06ace20..a66c333 100644
--- a/src/com/android/browser/provider/BrowserProvider2.java
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -284,6 +284,17 @@
                 " FROM " + TABLE_BOOKMARKS + " A WHERE " +
                 "A." + Bookmarks._ID + "=" + TABLE_BOOKMARKS + "." + Bookmarks.INSERT_AFTER +
                 ") AS " + Bookmarks.INSERT_AFTER_SOURCE_ID);
+        map.put(Bookmarks.TYPE, "CASE "
+                + " WHEN " + Bookmarks.IS_FOLDER + "=0 THEN "
+                    + Bookmarks.BOOKMARK_TYPE_BOOKMARK
+                + " WHEN " + ChromeSyncColumns.SERVER_UNIQUE + "='"
+                    + ChromeSyncColumns.FOLDER_NAME_BOOKMARKS_BAR + "' THEN "
+                    + Bookmarks.BOOKMARK_TYPE_BOOKMARK_BAR_FOLDER
+                + " WHEN " + ChromeSyncColumns.SERVER_UNIQUE + "='"
+                    + ChromeSyncColumns.FOLDER_NAME_OTHER_BOOKMARKS + "' THEN "
+                    + Bookmarks.BOOKMARK_TYPE_OTHER_FOLDER
+                + " ELSE " + Bookmarks.BOOKMARK_TYPE_FOLDER
+                + " END AS " + Bookmarks.TYPE);
 
         // Other bookmarks
         OTHER_BOOKMARKS_PROJECTION_MAP.putAll(BOOKMARKS_PROJECTION_MAP);
@@ -386,6 +397,7 @@
         static final int DATABASE_VERSION = 32;
         public DatabaseHelper(Context context) {
             super(context, DATABASE_NAME, null, DATABASE_VERSION);
+            setWriteAheadLoggingEnabled(true);
         }
 
         @Override
@@ -624,7 +636,6 @@
         }
 
         public void onOpen(SQLiteDatabase db) {
-            db.enableWriteAheadLogging();
             mSyncHelper.onDatabaseOpened(db);
         }
 
@@ -697,6 +708,8 @@
                     }
                 }
             } catch (ArrayIndexOutOfBoundsException e) {
+            } finally {
+                preloads.recycle();
             }
         }
 
diff --git a/src/com/android/browser/provider/SnapshotProvider.java b/src/com/android/browser/provider/SnapshotProvider.java
index 437a867..e005c36 100644
--- a/src/com/android/browser/provider/SnapshotProvider.java
+++ b/src/com/android/browser/provider/SnapshotProvider.java
@@ -15,13 +15,10 @@
  */
 package com.android.browser.provider;
 
-import android.content.BroadcastReceiver;
 import android.content.ContentProvider;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.UriMatcher;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
@@ -29,15 +26,12 @@
 import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteQueryBuilder;
 import android.net.Uri;
-import android.os.Environment;
+import android.os.FileUtils;
 import android.provider.BrowserContract;
+import android.text.TextUtils;
 
 import java.io.File;
 
-/**
- * This provider is expected to be potentially flaky. It uses a database
- * stored on external storage, which could be yanked unexpectedly.
- */
 public class SnapshotProvider extends ContentProvider {
 
     public static interface Snapshots {
@@ -45,6 +39,7 @@
         public static final Uri CONTENT_URI = Uri.withAppendedPath(
                 SnapshotProvider.AUTHORITY_URI, "snapshots");
         public static final String _ID = "_id";
+        @Deprecated
         public static final String VIEWSTATE = "view_state";
         public static final String BACKGROUND = "background";
         public static final String TITLE = "title";
@@ -52,6 +47,8 @@
         public static final String FAVICON = "favicon";
         public static final String THUMBNAIL = "thumbnail";
         public static final String DATE_CREATED = "date_created";
+        public static final String VIEWSTATE_PATH = "viewstate_path";
+        public static final String VIEWSTATE_SIZE = "viewstate_size";
     }
 
     public static final String AUTHORITY = "com.android.browser.snapshots";
@@ -61,6 +58,8 @@
     static final int SNAPSHOTS = 10;
     static final int SNAPSHOTS_ID = 11;
     static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
+    // Workaround that we can't remove the "NOT NULL" constraint on VIEWSTATE
+    static final byte[] NULL_BLOB_HACK = new byte[0];
 
     SnapshotDatabaseHelper mOpenHelper;
 
@@ -72,15 +71,10 @@
     final static class SnapshotDatabaseHelper extends SQLiteOpenHelper {
 
         static final String DATABASE_NAME = "snapshots.db";
-        static final int DATABASE_VERSION = 2;
+        static final int DATABASE_VERSION = 3;
 
         public SnapshotDatabaseHelper(Context context) {
-            super(context, getFullDatabaseName(context), null, DATABASE_VERSION);
-        }
-
-        static String getFullDatabaseName(Context context) {
-            File dir = context.getExternalFilesDir(null);
-            return new File(dir, DATABASE_NAME).getAbsolutePath();
+            super(context, DATABASE_NAME, null, DATABASE_VERSION);
         }
 
         @Override
@@ -93,7 +87,9 @@
                     Snapshots.FAVICON + " BLOB," +
                     Snapshots.THUMBNAIL + " BLOB," +
                     Snapshots.BACKGROUND + " INTEGER," +
-                    Snapshots.VIEWSTATE + " BLOB NOT NULL" +
+                    Snapshots.VIEWSTATE + " BLOB NOT NULL," +
+                    Snapshots.VIEWSTATE_PATH + " TEXT," +
+                    Snapshots.VIEWSTATE_SIZE + " INTEGER" +
                     ");");
         }
 
@@ -103,64 +99,52 @@
                 db.execSQL("DROP TABLE " + TABLE_SNAPSHOTS);
                 onCreate(db);
             }
+            if (oldVersion < 3) {
+                db.execSQL("ALTER TABLE " + TABLE_SNAPSHOTS + " ADD COLUMN "
+                        + Snapshots.VIEWSTATE_PATH + " TEXT");
+                db.execSQL("ALTER TABLE " + TABLE_SNAPSHOTS + " ADD COLUMN "
+                        + Snapshots.VIEWSTATE_SIZE + " INTEGER");
+                db.execSQL("UPDATE " + TABLE_SNAPSHOTS + " SET "
+                        + Snapshots.VIEWSTATE_SIZE + " = length("
+                        + Snapshots.VIEWSTATE + ")");
+            }
         }
 
     }
 
+    static File getOldDatabasePath(Context context) {
+        File dir = context.getExternalFilesDir(null);
+        return new File(dir, SnapshotDatabaseHelper.DATABASE_NAME);
+    }
+
+    private void migrateToDataFolder() {
+        File dbPath = getContext().getDatabasePath(SnapshotDatabaseHelper.DATABASE_NAME);
+        if (dbPath.exists()) return;
+        File oldPath = getOldDatabasePath(getContext());
+        if (oldPath.exists()) {
+            // Try to move
+            if (!oldPath.renameTo(dbPath)) {
+                // Failed, do a copy
+                FileUtils.copyFile(oldPath, dbPath);
+            }
+            // Cleanup
+            oldPath.delete();
+        }
+    }
+
     @Override
     public boolean onCreate() {
-        IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_EJECT);
-        filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
-        getContext().registerReceiver(mExternalStorageReceiver, filter);
+        migrateToDataFolder();
+        mOpenHelper = new SnapshotDatabaseHelper(getContext());
         return true;
     }
 
-    final BroadcastReceiver mExternalStorageReceiver = new BroadcastReceiver() {
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (mOpenHelper != null) {
-                try {
-                    mOpenHelper.close();
-                } catch (Throwable t) {
-                    // We failed to close the open helper, which most likely means
-                    // another thread is busy attempting to open the database
-                    // or use the database. Let that thread try to gracefully
-                    // deal with the error
-                }
-            }
-        }
-    };
-
     SQLiteDatabase getWritableDatabase() {
-        String state = Environment.getExternalStorageState();
-        if (Environment.MEDIA_MOUNTED.equals(state)) {
-            try {
-                if (mOpenHelper == null) {
-                    mOpenHelper = new SnapshotDatabaseHelper(getContext());
-                }
-                return mOpenHelper.getWritableDatabase();
-            } catch (Throwable t) {
-                return null;
-            }
-        }
-        return null;
+        return mOpenHelper.getWritableDatabase();
     }
 
     SQLiteDatabase getReadableDatabase() {
-        String state = Environment.getExternalStorageState();
-        if (Environment.MEDIA_MOUNTED.equals(state)
-                || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
-            try {
-                if (mOpenHelper == null) {
-                    mOpenHelper = new SnapshotDatabaseHelper(getContext());
-                }
-                return mOpenHelper.getReadableDatabase();
-            } catch (Throwable t) {
-                return null;
-            }
-        }
-        return null;
+        return mOpenHelper.getReadableDatabase();
     }
 
     @Override
@@ -186,15 +170,11 @@
         default:
             throw new UnsupportedOperationException("Unknown URL " + uri.toString());
         }
-        try {
-            Cursor cursor = qb.query(db, projection, selection, selectionArgs,
-                    null, null, sortOrder, limit);
-            cursor.setNotificationUri(getContext().getContentResolver(),
-                    AUTHORITY_URI);
-            return cursor;
-        } catch (Throwable t) {
-            return null;
-        }
+        Cursor cursor = qb.query(db, projection, selection, selectionArgs,
+                null, null, sortOrder, limit);
+        cursor.setNotificationUri(getContext().getContentResolver(),
+                AUTHORITY_URI);
+        return cursor;
     }
 
     @Override
@@ -212,11 +192,10 @@
         long id = -1;
         switch (match) {
         case SNAPSHOTS:
-            try {
-                id = db.insert(TABLE_SNAPSHOTS, Snapshots.TITLE, values);
-            } catch (Throwable t) {
-                id = -1;
+            if (!values.containsKey(Snapshots.VIEWSTATE)) {
+                values.put(Snapshots.VIEWSTATE, NULL_BLOB_HACK);
             }
+            id = db.insert(TABLE_SNAPSHOTS, Snapshots.TITLE, values);
             break;
         default:
             throw new UnsupportedOperationException("Unknown insert URI " + uri);
@@ -229,6 +208,29 @@
         return inserted;
     }
 
+    static final String[] DELETE_PROJECTION = new String[] {
+        Snapshots.VIEWSTATE_PATH,
+    };
+    private void deleteDataFiles(SQLiteDatabase db, String selection,
+            String[] selectionArgs) {
+        Cursor c = db.query(TABLE_SNAPSHOTS, DELETE_PROJECTION, selection,
+                selectionArgs, null, null, null);
+        final Context context = getContext();
+        while (c.moveToNext()) {
+            String filename = c.getString(0);
+            if (TextUtils.isEmpty(filename)) {
+                continue;
+            }
+            File f = context.getFileStreamPath(filename);
+            if (f.exists()) {
+                if (!f.delete()) {
+                    f.deleteOnExit();
+                }
+            }
+        }
+        c.close();
+    }
+
     @Override
     public int delete(Uri uri, String selection, String[] selectionArgs) {
         SQLiteDatabase db = getWritableDatabase();
@@ -245,10 +247,8 @@
             // fall through
         }
         case SNAPSHOTS:
-            try {
-                deleted = db.delete(TABLE_SNAPSHOTS, selection, selectionArgs);
-            } catch (Throwable t) {
-            }
+            deleteDataFiles(db, selection, selectionArgs);
+            deleted = db.delete(TABLE_SNAPSHOTS, selection, selectionArgs);
             break;
         default:
             throw new UnsupportedOperationException("Unknown delete URI " + uri);
diff --git a/src/com/android/browser/search/DefaultSearchEngine.java b/src/com/android/browser/search/DefaultSearchEngine.java
index a575404..e4e0e96 100644
--- a/src/com/android/browser/search/DefaultSearchEngine.java
+++ b/src/com/android/browser/search/DefaultSearchEngine.java
@@ -118,10 +118,6 @@
     public void close() {
     }
 
-    public boolean supportsVoiceSearch() {
-        return getName().equals(SearchEngine.GOOGLE);
-    }
-
     @Override
     public String toString() {
         return "ActivitySearchEngine{" + mSearchable + "}";
diff --git a/src/com/android/browser/search/OpenSearchSearchEngine.java b/src/com/android/browser/search/OpenSearchSearchEngine.java
index 50585c0..e600aa9 100644
--- a/src/com/android/browser/search/OpenSearchSearchEngine.java
+++ b/src/com/android/browser/search/OpenSearchSearchEngine.java
@@ -195,10 +195,6 @@
         mHttpClient.close();
     }
 
-    public boolean supportsVoiceSearch() {
-        return getName().equals(SearchEngine.GOOGLE);
-    }
-
     private boolean isNetworkConnected(Context context) {
         NetworkInfo networkInfo = getActiveNetworkInfo(context);
         return networkInfo != null && networkInfo.isConnected();
diff --git a/src/com/android/browser/search/SearchEngine.java b/src/com/android/browser/search/SearchEngine.java
index 3643005..8f2d58d 100644
--- a/src/com/android/browser/search/SearchEngine.java
+++ b/src/com/android/browser/search/SearchEngine.java
@@ -58,11 +58,6 @@
     public void close();
 
     /**
-     * Checks whether this search engine supports voice search.
-     */
-    public boolean supportsVoiceSearch();
-
-    /**
      * Checks whether this search engine should be sent zero char query.
      */
     public boolean wantsEmptyQuery();
diff --git a/src/com/android/browser/stub/NullController.java b/src/com/android/browser/stub/NullController.java
new file mode 100644
index 0000000..149fe4e
--- /dev/null
+++ b/src/com/android/browser/stub/NullController.java
@@ -0,0 +1,152 @@
+package com.android.browser.stub;
+
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.view.ActionMode;
+import android.view.ContextMenu;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ContextMenu.ContextMenuInfo;
+
+import com.android.browser.ActivityController;
+
+
+public class NullController implements ActivityController {
+
+    public static NullController INSTANCE = new NullController();
+
+    private NullController() {}
+
+    @Override
+    public void start(Intent intent) {
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+    }
+
+    @Override
+    public void handleNewIntent(Intent intent) {
+    }
+
+    @Override
+    public void onResume() {
+    }
+
+    @Override
+    public boolean onMenuOpened(int featureId, Menu menu) {
+        return false;
+    }
+
+    @Override
+    public void onOptionsMenuClosed(Menu menu) {
+    }
+
+    @Override
+    public void onContextMenuClosed(Menu menu) {
+    }
+
+    @Override
+    public void onPause() {
+    }
+
+    @Override
+    public void onDestroy() {
+    }
+
+    @Override
+    public void onConfgurationChanged(Configuration newConfig) {
+    }
+
+    @Override
+    public void onLowMemory() {
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        return false;
+    }
+
+    @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        return false;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        return false;
+    }
+
+    @Override
+    public void onCreateContextMenu(ContextMenu menu, View v,
+            ContextMenuInfo menuInfo) {
+
+    }
+
+    @Override
+    public boolean onContextItemSelected(MenuItem item) {
+        return false;
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        return false;
+    }
+
+    @Override
+    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
+        return false;
+    }
+
+    @Override
+    public boolean onKeyUp(int keyCode, KeyEvent event) {
+        return false;
+    }
+
+    @Override
+    public void onActionModeStarted(ActionMode mode) {
+    }
+
+    @Override
+    public void onActionModeFinished(ActionMode mode) {
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+    }
+
+    @Override
+    public boolean onSearchRequested() {
+        return false;
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        return false;
+    }
+
+    @Override
+    public boolean dispatchKeyShortcutEvent(KeyEvent event) {
+        return false;
+    }
+
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        return false;
+    }
+
+    @Override
+    public boolean dispatchTrackballEvent(MotionEvent ev) {
+        return false;
+    }
+
+    @Override
+    public boolean dispatchGenericMotionEvent(MotionEvent ev) {
+        return false;
+    }
+
+}
diff --git a/src/com/android/browser/util/ThreadedCursorAdapter.java b/src/com/android/browser/util/ThreadedCursorAdapter.java
new file mode 100644
index 0000000..72a07ea
--- /dev/null
+++ b/src/com/android/browser/util/ThreadedCursorAdapter.java
@@ -0,0 +1,213 @@
+/*
+ * 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.util;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Message;
+import android.os.Process;
+import android.os.SystemProperties;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Adapter;
+import android.widget.BaseAdapter;
+import android.widget.CursorAdapter;
+
+import com.android.browser.R;
+
+import java.lang.ref.WeakReference;
+
+public abstract class ThreadedCursorAdapter<T> extends BaseAdapter {
+
+    private static final String LOGTAG = "BookmarksThreadedAdapter";
+    private static final boolean DEBUG = false;
+
+    private Context mContext;
+    private Object mCursorLock = new Object();
+    private CursorAdapter mCursorAdapter;
+    private T mLoadingObject;
+    private Handler mLoadHandler;
+    private Handler mHandler;
+    private int mSize;
+    private boolean mHasCursor;
+    private long mGeneration;
+
+    private class LoadContainer {
+        WeakReference<View> view;
+        int position;
+        T bind_object;
+        Adapter owner;
+        boolean loaded;
+        long generation;
+    }
+
+    public ThreadedCursorAdapter(Context context, Cursor c) {
+        mContext = context;
+        mHasCursor = (c != null);
+        mCursorAdapter = new CursorAdapter(context, c, 0) {
+
+            @Override
+            public View newView(Context context, Cursor cursor, ViewGroup parent) {
+                throw new IllegalStateException("not supported");
+            }
+
+            @Override
+            public void bindView(View view, Context context, Cursor cursor) {
+                throw new IllegalStateException("not supported");
+            }
+
+            @Override
+            public void notifyDataSetChanged() {
+                super.notifyDataSetChanged();
+                mSize = getCount();
+                mGeneration++;
+                ThreadedCursorAdapter.this.notifyDataSetChanged();
+            }
+
+            @Override
+            public void notifyDataSetInvalidated() {
+                super.notifyDataSetInvalidated();
+                mSize = getCount();
+                mGeneration++;
+                ThreadedCursorAdapter.this.notifyDataSetInvalidated();
+            }
+
+        };
+        mSize = mCursorAdapter.getCount();
+        HandlerThread thread = new HandlerThread("threaded_adapter_" + this,
+                Process.THREAD_PRIORITY_BACKGROUND);
+        thread.start();
+        mLoadHandler = new Handler(thread.getLooper()) {
+            @SuppressWarnings("unchecked")
+            @Override
+            public void handleMessage(Message msg) {
+                if (DEBUG) {
+                    Log.d(LOGTAG, "loading: " + msg.what);
+                }
+                loadRowObject(msg.what, (LoadContainer) msg.obj);
+            }
+        };
+        mHandler = new Handler() {
+            @Override
+            public void handleMessage(Message msg) {
+                @SuppressWarnings("unchecked")
+                LoadContainer container = (LoadContainer) msg.obj;
+                if (container == null) {
+                    return;
+                }
+                View view = container.view.get();
+                if (view == null
+                        || container.owner != ThreadedCursorAdapter.this
+                        || container.position != msg.what
+                        || view.getWindowToken() == null
+                        || container.generation != mGeneration) {
+                    return;
+                }
+                container.loaded = true;
+                bindView(view, container.bind_object);
+            }
+        };
+    }
+
+    @Override
+    public int getCount() {
+        return mSize;
+    }
+
+    @Override
+    public Cursor getItem(int position) {
+        return (Cursor) mCursorAdapter.getItem(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+        synchronized (mCursorLock) {
+            return getItemId(getItem(position));
+        }
+    }
+
+    private void loadRowObject(int position, LoadContainer container) {
+        if (container == null
+                || container.position != position
+                || container.owner != ThreadedCursorAdapter.this
+                || container.view.get() == null) {
+            return;
+        }
+        synchronized (mCursorLock) {
+            Cursor c = (Cursor) mCursorAdapter.getItem(position);
+            if (c == null || c.isClosed()) {
+                return;
+            }
+            container.bind_object = getRowObject(c, container.bind_object);
+        }
+        mHandler.obtainMessage(position, container).sendToTarget();
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        if (convertView == null) {
+            convertView = newView(mContext, parent);
+        }
+        @SuppressWarnings("unchecked")
+        LoadContainer container = (LoadContainer) convertView.getTag(R.id.load_object);
+        if (container == null) {
+            container = new LoadContainer();
+            container.view = new WeakReference<View>(convertView);
+            convertView.setTag(R.id.load_object, container);
+        }
+        if (container.position == position
+                && container.owner == this
+                && container.loaded
+                && container.generation == mGeneration) {
+            bindView(convertView, container.bind_object);
+        } else {
+            bindView(convertView, cachedLoadObject());
+            if (mHasCursor) {
+                container.position = position;
+                container.loaded = false;
+                container.owner = this;
+                container.generation = mGeneration;
+                mLoadHandler.obtainMessage(position, container).sendToTarget();
+            }
+        }
+        return convertView;
+    }
+
+    private T cachedLoadObject() {
+        if (mLoadingObject == null) {
+            mLoadingObject = getLoadingObject();
+        }
+        return mLoadingObject;
+    }
+
+    public void changeCursor(Cursor cursor) {
+        mLoadHandler.removeCallbacksAndMessages(null);
+        mHandler.removeCallbacksAndMessages(null);
+        synchronized (mCursorLock) {
+            mHasCursor = (cursor != null);
+            mCursorAdapter.changeCursor(cursor);
+        }
+    }
+
+    public abstract View newView(Context context, ViewGroup parent);
+    public abstract void bindView(View view, T object);
+    public abstract T getRowObject(Cursor c, T recycleObject);
+    public abstract T getLoadingObject();
+    protected abstract long getItemId(Cursor c);
+}
\ No newline at end of file
diff --git a/src/com/android/browser/view/BasePieView.java b/src/com/android/browser/view/BasePieView.java
index ec02e3a..b9178be 100644
--- a/src/com/android/browser/view/BasePieView.java
+++ b/src/com/android/browser/view/BasePieView.java
@@ -109,7 +109,8 @@
      * needs to set top, left, width, height
      */
     @Override
-    public void layout(int anchorX, int anchorY, boolean left, float angle) {
+    public void layout(int anchorX, int anchorY, boolean left, float angle,
+            int parentHeight) {
         if (mListener != null) {
             mListener.onLayout(anchorX, anchorY, left);
         }
diff --git a/src/com/android/browser/view/BookmarkContainer.java b/src/com/android/browser/view/BookmarkContainer.java
index 260b05e..5175589 100644
--- a/src/com/android/browser/view/BookmarkContainer.java
+++ b/src/com/android/browser/view/BookmarkContainer.java
@@ -29,7 +29,8 @@
 public class BookmarkContainer extends RelativeLayout implements OnClickListener {
 
     private OnClickListener mClickListener;
-    
+    private boolean mIgnoreRequestLayout = false;
+
     public BookmarkContainer(Context context) {
         super(context);
         init();
@@ -89,4 +90,15 @@
             mClickListener.onClick(view);
         }
     }
+
+    public void setIgnoreRequestLayout(boolean ignore) {
+        mIgnoreRequestLayout = ignore;
+    }
+
+    @Override
+    public void requestLayout() {
+        if (!mIgnoreRequestLayout) {
+            super.requestLayout();
+        }
+    }
 }
diff --git a/src/com/android/browser/view/BookmarkExpandableView.java b/src/com/android/browser/view/BookmarkExpandableView.java
index 0283448..7badaf5 100644
--- a/src/com/android/browser/view/BookmarkExpandableView.java
+++ b/src/com/android/browser/view/BookmarkExpandableView.java
@@ -17,7 +17,6 @@
 package com.android.browser.view;
 
 import android.content.Context;
-import android.database.Cursor;
 import android.database.DataSetObserver;
 import android.provider.BrowserContract;
 import android.util.AttributeSet;
@@ -33,13 +32,8 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-import com.android.browser.BookmarkDragHandler;
-import com.android.browser.BookmarkDragHandler.BookmarkDragAdapter;
-import com.android.browser.BookmarkDragHandler.BookmarkDragState;
 import com.android.browser.BreadCrumbView;
 import com.android.browser.BrowserBookmarksAdapter;
-import com.android.browser.BrowserBookmarksPage;
-import com.android.browser.BrowserBookmarksPage.ExtraDragState;
 import com.android.browser.R;
 import com.android.internal.view.menu.MenuBuilder;
 
@@ -54,9 +48,6 @@
 
     public static final String LOCAL_ACCOUNT_NAME = "local";
 
-    // Experimental drag & drop
-    private static final boolean ENABLE_DRAG_DROP = false;
-
     private BookmarkAccountAdapter mAdapter;
     private int mColumnWidth;
     private Context mContext;
@@ -65,9 +56,7 @@
     private OnCreateContextMenuListener mOnCreateContextMenuListener;
     private boolean mLongClickable;
     private BreadCrumbView.Controller mBreadcrumbController;
-    private BookmarkDragHandler mDragHandler;
     private int mMaxColumnCount;
-    private int mCurrentView = -1;
 
     public BookmarkExpandableView(Context context) {
         super(context);
@@ -141,9 +130,6 @@
                 adapter.registerDataSetObserver(mAdapter.mObserver);
             }
         } else {
-            if (mCurrentView >= 0) {
-                adapter.selectView(mCurrentView);
-            }
             mAdapter.mGroups.add(accountName);
             mAdapter.mChildren.add(adapter);
             adapter.registerDataSetObserver(mAdapter.mObserver);
@@ -229,36 +215,6 @@
         return mAdapter.mChildren.get(groupPosition);
     }
 
-    public BookmarkDragAdapter getDragAdapter() {
-        return mDragAdapter;
-    }
-
-    public void showContextMenuForState(BookmarkDragState state) {
-        ExtraDragState extraState = (ExtraDragState) state.extraState;
-        mContextMenuInfo = new BookmarkContextMenuInfo(
-                extraState.childPosition,
-                extraState.groupPosition);
-        if (getParent() != null) {
-            getParent().showContextMenuForChild(BookmarkExpandableView.this);
-        }
-    }
-
-    private BookmarkDragAdapter mDragAdapter = new BookmarkDragAdapter() {
-
-        @Override
-        public void setBookmarkDragHandler(BookmarkDragHandler handler) {
-            mDragHandler = handler;
-        }
-
-        @Override
-        public Cursor getItemForView(View v) {
-            int groupPosition = (Integer) v.getTag(R.id.group_position);
-            int childPosition = (Integer) v.getTag(R.id.child_position);
-            return getChildAdapter(groupPosition).getItem(childPosition);
-        }
-
-    };
-
     private OnClickListener mChildClickListener = new OnClickListener() {
 
         @Override
@@ -272,7 +228,7 @@
                     || mAdapter.mChildren.get(groupPosition).getCount() <= childPosition) {
                 return;
             }
-            long id = (Long) v.getTag(R.id.child_id);
+            long id = mAdapter.mChildren.get(groupPosition).getItemId(childPosition);
             if (mOnChildClickListener != null) {
                 mOnChildClickListener.onChildClick(BookmarkExpandableView.this,
                         v, groupPosition, childPosition, id);
@@ -293,35 +249,10 @@
         }
     };
 
-    private OnLongClickListener mChildOnLongClickListener = new OnLongClickListener() {
-
-        @Override
-        public boolean onLongClick(View v) {
-            if (!ENABLE_DRAG_DROP) {
-                return false;
-            }
-            ExtraDragState state = new ExtraDragState();
-            state.groupPosition = (Integer) v.getTag(R.id.group_position);
-            state.childPosition = (Integer) v.getTag(R.id.child_position);
-            long id = (Long) v.getTag(R.id.child_id);
-            Cursor c = getChildAdapter(state.groupPosition)
-                    .getItem(state.childPosition);
-            return mDragHandler.startDrag(v, c, id, state);
-        }
-    };
-
     public BreadCrumbView getBreadCrumbs(int groupPosition) {
         return mAdapter.getBreadCrumbView(groupPosition);
     }
 
-    public void selectView(int view) {
-        mCurrentView = view;
-        for (BrowserBookmarksAdapter adapter : mAdapter.mChildren) {
-            adapter.selectView(mCurrentView);
-        }
-        mAdapter.notifyDataSetChanged();
-    }
-
     public JSONObject saveGroupState() throws JSONException {
         JSONObject obj = new JSONObject();
         int count = mAdapter.getGroupCount();
@@ -386,9 +317,6 @@
             }
             BrowserBookmarksAdapter childAdapter = mChildren.get(groupPosition);
             int rowCount = mRowCount;
-            if (childAdapter.getViewMode() == BrowserBookmarksPage.VIEW_LIST) {
-                rowCount = 1;
-            }
             LinearLayout row = (LinearLayout) convertView;
             if (row.getChildCount() > rowCount) {
                 row.removeViews(rowCount, row.getChildCount() - rowCount);
@@ -403,13 +331,8 @@
                     View v = childAdapter.getView(realChildPosition, cv, row);
                     v.setTag(R.id.group_position, groupPosition);
                     v.setTag(R.id.child_position, realChildPosition);
-                    v.setTag(R.id.child_id, childAdapter.getItemId(realChildPosition));
                     v.setOnClickListener(mChildClickListener);
                     v.setLongClickable(mLongClickable);
-                    if (mDragHandler != null) {
-                        v.setOnLongClickListener(mChildOnLongClickListener);
-                        mDragHandler.registerBookmarkDragHandler(v);
-                    }
                     if (cv == null) {
                         row.addView(v);
                     } else if (cv != v) {
@@ -428,9 +351,6 @@
         @Override
         public int getChildrenCount(int groupPosition) {
             BrowserBookmarksAdapter adapter = mChildren.get(groupPosition);
-            if (adapter.getViewMode() == BrowserBookmarksPage.VIEW_LIST) {
-                return adapter.getCount();
-            }
             return (int) Math.ceil(adapter.getCount() / (float)mRowCount);
         }
 
@@ -517,20 +437,6 @@
         public boolean isChildSelectable(int groupPosition, int childPosition) {
             return true;
         }
-
-        @Override
-        public int getChildTypeCount() {
-            return 2;
-        }
-
-        @Override
-        public int getChildType(int groupPosition, int childPosition) {
-            BrowserBookmarksAdapter adapter = mChildren.get(groupPosition);
-            if (adapter.getViewMode() == BrowserBookmarksPage.VIEW_LIST) {
-                return 1;
-            }
-            return 0;
-        }
     }
 
     public static class BookmarkContextMenuInfo implements ContextMenuInfo {
diff --git a/src/com/android/browser/view/CustomScreenLinearLayout.java b/src/com/android/browser/view/CustomScreenLinearLayout.java
new file mode 100644
index 0000000..f5341e8
--- /dev/null
+++ b/src/com/android/browser/view/CustomScreenLinearLayout.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 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.content.Context;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+
+
+public class CustomScreenLinearLayout extends LinearLayout {
+
+    public CustomScreenLinearLayout(Context context) {
+        super(context);
+        setChildrenDrawingOrderEnabled(true);
+    }
+
+    public CustomScreenLinearLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setChildrenDrawingOrderEnabled(true);
+    }
+
+    public CustomScreenLinearLayout(Context context, AttributeSet attrs,
+            int defStyle) {
+        super(context, attrs, defStyle);
+        setChildrenDrawingOrderEnabled(true);
+    }
+
+    @Override
+    protected int getChildDrawingOrder(int childCount, int i) {
+        return childCount - i - 1;
+    }
+
+}
diff --git a/src/com/android/browser/view/PieItem.java b/src/com/android/browser/view/PieItem.java
index 3674447..9e04ecb 100644
--- a/src/com/android/browser/view/PieItem.java
+++ b/src/com/android/browser/view/PieItem.java
@@ -16,10 +16,12 @@
 
 package com.android.browser.view;
 
+import android.view.View;
+
 import com.android.browser.view.PieMenu.PieView;
 
-import android.graphics.Path;
-import android.view.View;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Pie menu item
@@ -31,20 +33,66 @@
     private int level;
     private float start;
     private float sweep;
+    private float animate;
     private int inner;
     private int outer;
     private boolean mSelected;
-    private Path mPath;
+    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) {
@@ -62,16 +110,19 @@
         return level;
     }
 
-    public void setGeometry(float st, float sw, int inside, int outside, Path p) {
+    public void setGeometry(float st, float sw, int inside, int outside) {
         start = st;
         sweep = sw;
         inner = inside;
         outer = outside;
-        mPath = p;
+    }
+
+    public float getStart() {
+        return start;
     }
 
     public float getStartAngle() {
-        return start;
+        return start + animate;
     }
 
     public float getSweep() {
@@ -99,11 +150,10 @@
     }
 
     public PieView getPieView() {
-        return mPieView;
-    }
-
-    public Path getPath() {
-        return mPath;
+        if (mEnabled) {
+            return mPieView;
+        }
+        return null;
     }
 
 }
diff --git a/src/com/android/browser/view/PieListView.java b/src/com/android/browser/view/PieListView.java
index 04b512b..1043fc7 100644
--- a/src/com/android/browser/view/PieListView.java
+++ b/src/com/android/browser/view/PieListView.java
@@ -39,13 +39,17 @@
      * this will be called before the first draw call
      */
     @Override
-    public void layout(int anchorX, int anchorY, boolean left, float angle) {
-        super.layout(anchorX, anchorY, left, angle);
+    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 = anchorY - mHeight / 2;
+        mTop = Math.max(anchorY - mHeight / 2, 0);
+        if (mTop + mHeight > pHeight) {
+            mTop = pHeight - mHeight;
+        }
         if (mViews != null) {
             layoutChildrenLinear();
         }
diff --git a/src/com/android/browser/view/PieMenu.java b/src/com/android/browser/view/PieMenu.java
index 536ac92..1699c27 100644
--- a/src/com/android/browser/view/PieMenu.java
+++ b/src/com/android/browser/view/PieMenu.java
@@ -16,8 +16,11 @@
 
 package com.android.browser.view;
 
-import com.android.browser.R;
-
+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;
@@ -34,12 +37,15 @@
 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 {
         /**
@@ -47,6 +53,8 @@
          * returns if pie state has been changed
          */
         public boolean onOpen();
+        public void stopEditingUrl();
+
     }
 
     /**
@@ -60,7 +68,8 @@
 
         public void setLayoutListener(OnLayoutListener l);
 
-        public void layout(int anchorX, int anchorY, boolean onleft, float angle);
+        public void layout(int anchorX, int anchorY, boolean onleft, float angle,
+                int parentHeight);
 
         public void draw(Canvas c);
 
@@ -73,6 +82,7 @@
     private int mRadiusInc;
     private int mSlop;
     private int mTouchOffset;
+    private Path mPath;
 
     private boolean mOpen;
     private PieController mController;
@@ -82,14 +92,20 @@
     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
-    PieItem mCurrentItem;
+    private PieItem mCurrentItem;
 
     private boolean mUseBackground;
+    private boolean mAnimating;
 
     /**
      * @param context
@@ -138,6 +154,9 @@
         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) {
@@ -175,18 +194,41 @@
     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();
-        }
-        if (!show) {
-            mCurrentItem = null;
-            mPieView = null;
+            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;
@@ -201,33 +243,32 @@
         int rgap = 2;
         int inner = mRadius + rgap;
         int outer = mRadius + mRadiusInc - rgap;
-        int radius = mRadius;
         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;
-            for (PieItem item : mItems) {
+            mPath = makeSlice(getDegrees(0) - gap, getDegrees(sweep) + gap, outer, inner, mCenter);
+            for (PieItem item : mCurrentItems) {
                 if (item.getLevel() == level) {
                     View view = item.getView();
-                    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;
+                    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);
                     }
-                    view.layout(x, y, x + w, y + h);
                     float itemstart = angle - sweep / 2;
-                    Path slice = makeSlice(getDegrees(itemstart) - gap,
-                            getDegrees(itemstart + sweep) + gap,
-                            outer, inner, mCenter);
-                    item.setGeometry(itemstart, sweep, inner, outer, slice);
+                    item.setGeometry(itemstart, sweep, inner, outer);
                     angle += sweep;
                 }
             }
@@ -265,15 +306,18 @@
                 mBackground.draw(canvas);
                 canvas.restoreToCount(state);
             }
-            for (PieItem item : mItems) {
-                Paint p = item.isSelected() ? mSelectedPaint : mNormalPaint;
-                state = canvas.save();
-                if (onTheLeft()) {
-                    canvas.scale(-1, 1);
+            // draw base menu
+            PieItem last = mCurrentItem;
+            if (mOpenItem != null) {
+                last = mOpenItem;
+            }
+            for (PieItem item : mCurrentItems) {
+                if (item != last) {
+                    drawItem(canvas, item);
                 }
-                drawPath(canvas, item.getPath(), p);
-                canvas.restoreToCount(state);
-                drawItem(canvas, item);
+            }
+            if (last != null) {
+                drawItem(canvas, last);
             }
             if (mPieView != null) {
                 mPieView.draw(canvas);
@@ -282,19 +326,26 @@
     }
 
     private void drawItem(Canvas canvas, PieItem item) {
-        int outer = item.getOuterRadius();
-        int left = mCenter.x - outer;
-        int top = mCenter.y - outer;
-        // draw the item view
-        View view = item.getView();
-        int state = canvas.save();
-        canvas.translate(view.getX(), view.getY());
-        view.draw(canvas);
-        canvas.restoreToCount(state);
-    }
-
-    private void drawPath(Canvas canvas, Path path, Paint paint) {
-        canvas.drawPath(path, paint);
+        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) {
@@ -331,10 +382,14 @@
                     handled = mPieView.onTouchEvent(evt);
                 }
                 PieItem item = mCurrentItem;
-                deselect();
+                if (!mAnimating) {
+                    deselect();
+                }
                 show(false);
-                if (!handled && (item != null)) {
-                    item.getView().performClick();
+                if (!handled && (item != null) && (item.getView() != null)) {
+                    if ((item == mOpenItem) || !mAnimating) {
+                        item.getView().performClick();
+                    }
                 }
                 return true;
             }
@@ -342,9 +397,13 @@
             if (mOpen) {
                 show(false);
             }
-            deselect();
+            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;
@@ -355,6 +414,15 @@
                 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);
@@ -365,9 +433,10 @@
                 return false;
             }
             PieItem item = findItem(polar);
-            if (mCurrentItem != item) {
+            if (item == null) {
+            } else if (mCurrentItem != item) {
                 onEnter(item);
-                if ((item != null) && item.isPieView()) {
+                if ((item != null) && item.isPieView() && (item.getView() != null)) {
                     int cx = item.getView().getLeft() + (onTheLeft()
                             ? item.getView().getWidth() : 0);
                     int cy = item.getView().getTop();
@@ -383,7 +452,7 @@
     }
 
     private void layoutPieView(PieView pv, int x, int y, float angle) {
-        pv.layout(x, y, onTheLeft(), angle);
+        pv.layout(x, y, onTheLeft(), angle, getHeight());
     }
 
     /**
@@ -401,14 +470,125 @@
             playSoundEffect(SoundEffectConstants.CLICK);
             item.setSelected(true);
             mPieView = null;
+            mCurrentItem = item;
+            if ((mCurrentItem != mOpenItem) && mCurrentItem.hasItems()) {
+                openSub(mCurrentItem);
+                mOpenItem = item;
+            }
+        } else {
+            mCurrentItem = null;
         }
-        mCurrentItem = item;
+
+    }
+
+    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;
     }
@@ -438,15 +618,19 @@
      */
     private PieItem findItem(PointF polar) {
         // find the matching item:
-        for (PieItem item : mItems) {
-            if ((item.getInnerRadius() - mTouchOffset < polar.y)
-                    && (item.getOuterRadius() - mTouchOffset > polar.y)
-                    && (item.getStartAngle() < polar.x)
-                    && (item.getStartAngle() + item.getSweep() > polar.x)) {
+        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
index ca641f9..e1f41bd 100644
--- a/src/com/android/browser/view/PieStackView.java
+++ b/src/com/android/browser/view/PieStackView.java
@@ -50,8 +50,6 @@
         super.setCurrent(ix);
         if (mCurrentListener != null) {
             mCurrentListener.onSetCurrent(ix);
-            buildViews();
-            layoutChildrenLinear();
         }
     }
 
@@ -59,8 +57,9 @@
      * this will be called before the first draw call
      */
     @Override
-    public void layout(int anchorX, int anchorY, boolean left, float angle) {
-        super.layout(anchorX, anchorY, left, angle);
+    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;
@@ -84,7 +83,7 @@
 
     @Override
     public void draw(Canvas canvas) {
-        if (mViews != null) {
+        if ((mViews != null) && (mCurrent > -1)) {
             final int n = mViews.size();
             for (int i = 0; i < mCurrent; i++) {
                 drawView(mViews.get(i), canvas);
diff --git a/tests/assets/bindings_test.html b/tests/assets/bindings_test.html
deleted file mode 100755
index 7218f58..0000000
--- a/tests/assets/bindings_test.html
+++ /dev/null
@@ -1,239 +0,0 @@
-<html>
-<head>
-<script type="text/javascript">
-
-function testPrimitiveTypes() {
-  return JNIBindingsTest.testPrimitiveTypes(100, 'c', 123.34567890, 456.789, 1234567, 1234567890, 6000, true);
-}
-
-function testObjectTypes() {
-  return JNIBindingsTest.testObjectTypes("Foo", "", null, {"foo":"bar"}, {});
-}
-
-function testArray() {
-  return JNIBindingsTest.testArray([1,2,3], ['d', 'o', 'g'], [1.2, 2.3, 3.4], [4.5,5.6,6.7], [1,2,3], [4,5,6], [7,8,9], [true, false]);
-}
-
-function testObjectArray() {
-  return JNIBindingsTest.testObjectArray(['Hello', 'World', '!'], [], [{"foo":"bar"}]);
-}
-
-function testObjectMembers() {
-  var foo = {"bool":true,
-             "byte":101,
-             "char":'d',
-             "double":123.456,
-             "float":456.789,
-             "int":102,
-             "long":103,
-             "short":104,
-             "string":"Hello World",
-             "array": [1,2,3],
-             "objArray":["foo", "bar", "baz"],
-             "object": {"foo":1}
-  };
-  return JNIBindingsTest.testObjectMembers(foo.bool, foo.byte, foo.char, foo.double, foo.float, foo.int, foo.long, foo.short, foo.string, foo.array, foo.objArray, foo.object);
-}
-
-function testJSPrimitivesToStringsInJava() {
-    return JNIBindingsTest.testJSPrimitivesToStringsInJava(123, null, 456.789, true, 'd', undefined);
-}
-
-function testJavaReturnTypes() {
-  var expectedBoolReturn = true;
-  var expectedByteReturn = 1;
-  var expectedCharReturn = 98; // 'b'; Currently bindings in JSC and V8 return chars as their ASCII equivalent.
-  var expectedDoubleReturn = 123.456;
-  var expectedFloatReturn = 456.789;
-  var expectedIntReturn = 123;
-  var expectedLongReturn = 1234;
-  var expectedShortReturn = 12345;
-  var expectedStringReturn = "Hello World!";
-
-  var returned = JNIBindingsTest.returnBool();
-  if (returned != expectedBoolReturn) {
-    appendLog("returnBool() failed: expected "+ expectedBoolReturn +", got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnByte();
-  if (returned != expectedByteReturn) {
-    appendLog("returnByte() failed: expected "+ expectedByteReturn +", got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnChar();
-  if (returned != expectedCharReturn) {
-    appendLog("returnChar() failed: expected "+ expectedCharReturn +", got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnDouble();
-  if (returned != expectedDoubleReturn) {
-    appendLog("returnDouble() failed: expected "+ expectedDoubleReturn +", got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnFloat();
-  if (Math.abs(returned - expectedFloatReturn) > 0.001) {
-    appendLog("returnFloat() failed: expected "+ expectedFloatReturn +", got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnInt();
-  if (returned != expectedIntReturn) {
-    appendLog("returnInt() failed: expected "+ expectedIntReturn +", got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnLong();
-  if (returned != expectedLongReturn) {
-    appendLog("returnLong() failed: expected "+ expectedLongReturn +", got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnShort();
-  if (returned != expectedShortReturn) {
-    appendLog("returnShort() failed: expected "+ expectedShortReturn +", got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnString();
-  if (returned != expectedStringReturn) {
-    appendLog("returnString() failed: expected "+ expectedStringReturn +", got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnNullString();
-  if (returned !== undefined) {
-    appendLog("returnNullString() failed: expected undefined, got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnObject();
-  if (returned == null) {
-    appendLog("returnObject() failed: expected non-null, got " + returned);
-    return false;
-  } else if (returned.x != undefined) {
-    // We do not support getting object properties.
-    appendLog("returnObject() failed: expected 'x' property undefined, got " + returned.x)
-    return false;
-  } else if (returned.s != undefined) {
-    // We do not support getting object properties.
-    appendLog("returnObject() failed: expected 's' property undefined, got " + returned.s);
-    return false;
-  } else if (!returned.aMethod()) {
-    appendLog("returnObject() failed: expected 'aMethod' method to return true, got " + returned.aMethod());
-    return false;
-  } else if (returned.anotherMethod() != "Hello World") {
-    appendLog("returnObject() failed: expected 'anotherMethod' to return 'Hello World' got "+ returned.anotherMethod());
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnArray();
-  if (returned != null) {
-    appendLog("returnArray() failed: expected null, got " + returned);
-    return false;
-  }
-
-  returned = JNIBindingsTest.returnVoid();
-  if (returned != null) {
-    appendLog("returnVoid() failed: expected null, got " + returned);
-    return false;
-  }
-
-  return true;
-}
-
-function getIfaceProperties() {
-  if (JNIBindingsTest.mInt != undefined) {
-    // We do not support getting object properties.
-    appendLog("getIfaceProperties() failed: expected mInt = undefined, got " + JNIBindingsTest.mInt);
-    return false;
-  }
-
-  if (JNIBindingsTest.mString != undefined) {
-    // We do not support getting object properties.
-    appendLog("getIfaceProperties() failed: expected mString = undefined, got " + JNIBindingsTest.mString);
-    return false;
-  }
-
-  return true;
-}
-
-function testParameterTypeMismatch() {
-  return JNIBindingsTest.testParameterTypeMismatch("dog");
-}
-
-function appendLog(msg) {
-  var log = document.getElementById("status");
-  log.innerHTML += "<br/>" + msg;
-}
-
-function runTests() {
-
-  // Assume that if the test isn't done after 10s that we failed.
-  window.setTimeout(function() { JNIBindingsTest.notifyComplete(); }, 10000);
-
-  if (testPrimitiveTypes()) {
-    appendLog("testPrimitiveTypes passed!");
-  } else {
-    appendLog("testPrimtiveTypes failed!");
-  }
-
-  if (testObjectTypes()) {
-    appendLog("testObjectTypes passed!");
-  } else {
-    appendLog("testObjectTypes failed!");
-  }
-
-  if (testArray()) {
-    appendLog("testArray passed!");
-  } else {
-    appendLog("testArray failed!");
-  }
-
-  if (testObjectArray()) {
-    appendLog("testObjectArray passed!");
-  } else {
-    appendLog("testObjectArray failed!");
-  }
-
-  if (testObjectMembers()) {
-    appendLog("testObjectMembers passed!");
-  } else {
-    appendLog("<br/>testObjectMembers failed!");
-  }
-
-  if (testJSPrimitivesToStringsInJava()) {
-    appendLog("testJSPrimitivesToStringsInJava passed!");
-  } else {
-    appendLog("testJSPrimitivesToStringsInJava failed!");
-  }
-
-  if (testJavaReturnTypes()) {
-    appendLog("testJavaReturnTypes passed!");
-  } else {
-    appendLog("testJavaReturnTypes failed!");
-  }
-
-  if (getIfaceProperties()) {
-    appendLog("getIfaceProperties passed!");
-  } else {
-    appendLog("getIfaceProperties failed!");
-  }
-
-  if (testParameterTypeMismatch()) {
-    appendLog("testParameterTypeMismatch passed!");
-  } else {
-    appendLog("testParameterTypeMismatch failed!");
-  }
-
-  JNIBindingsTest.notifyComplete();
-}
-</script>
-
-<body onload="runTests();">
-<p id="status">Running JNI Bindings test...</p>
-</body>
-</html>
diff --git a/tests/src/com/android/browser/JNIBindingsTest.java b/tests/src/com/android/browser/JNIBindingsTest.java
deleted file mode 100644
index ae694c9..0000000
--- a/tests/src/com/android/browser/JNIBindingsTest.java
+++ /dev/null
@@ -1,288 +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;
-
-import android.test.AndroidTestCase;
-import android.util.Log;
-
-import java.util.Arrays;
-
-import junit.framework.AssertionFailedError;
-
-public class JNIBindingsTest extends AndroidTestCase {
-
-    private final static String LOGTAG = "JNIBindingsTest";
-    private JNIBindingsTestApp mTestApp;
-
-    public int mInt = 123;
-    public String mString = "Hello World";
-
-    public JNIBindingsTest(JNIBindingsTestApp testApp) {
-        mTestApp = testApp;
-    }
-
-    public void notifyComplete() {
-        Log.v(LOGTAG, "Completing the test.");
-        mTestApp.notifyComplete();
-    }
-
-    public void printAssertionFailed(AssertionFailedError e) {
-        Log.e(LOGTAG, "");
-        Log.e(LOGTAG, "*** ASSERTION FAILED: " + e.getMessage());
-        Log.e(LOGTAG, "*** Stack trace:");
-        StackTraceElement[] trace = e.getStackTrace();
-        for(StackTraceElement elem : trace) {
-            Log.e(LOGTAG, "***\t" + elem.toString());
-        }
-        Log.e(LOGTAG, "");
-    }
-
-    public boolean testPrimitiveTypes(byte byteParam, char charParam, double doubleParam,
-            float floatParam, int intParam, long longParam, short shortParam,
-            boolean booleanParam) {
-        byte expectedByteParam = 100;
-        char expectedCharParam = 'c';
-        double expectedDoubleParam = 123.34567890;
-        float expectedFloatParam = 456.789f;
-        int expectedIntParam = 1234567;
-        long expectedLongParam = 1234567890L;
-        short expectedShortParam = 6000;
-        boolean expectedBooleanParam = true;
-
-        try {
-            assertEquals(expectedByteParam, byteParam);
-
-            // EMULATE_JSC_BINDINGS: JSC does not pass chars correctly
-            // assertEquals(expectedCharParam, charParam);
-
-            assertEquals(expectedDoubleParam, doubleParam);
-            assertEquals(expectedFloatParam, floatParam);
-            assertEquals(expectedIntParam, intParam);
-            assertEquals(expectedLongParam, longParam);
-            assertEquals(expectedShortParam, shortParam);
-            assertEquals(expectedBooleanParam, booleanParam);
-        } catch (AssertionFailedError e) {
-            printAssertionFailed(e);
-           return false;
-        }
-        return true;
-    }
-
-    public boolean testObjectTypes(String stringParam, String emptyString, String nullString,
-            Object objectParam, Object emptyObject) {
-        String expectedString = "Foo";
-        String expectedEmptyString = "";
-
-        try {
-            assertNotNull(stringParam);
-            assertNotNull(emptyString);
-            assertEquals(expectedString, stringParam);
-            assertEquals(expectedEmptyString, emptyString);
-            assertNull(nullString);
-            assertNull(objectParam);
-            assertNull(emptyObject);
-        } catch (AssertionFailedError e) {
-            printAssertionFailed(e);
-            return false;
-        }
-        return true;
-    }
-
-    public boolean testArray(byte[] byteArray, char[] charArray, double[] doubleArray,
-            float[] floatArray, int[] intArray, long[] longArray, short[] shortArray,
-            boolean[] booleanArray) {
-        byte[] expectedByteArray = { 1,2,3};
-        char[] expectedCharArray = {'d', 'o', 'g'};
-        double[] expectedDoubleArray = {1.2,2.3,3.4};
-        float[] expectedFloatArray = {4.5F,5.6F,6.7F};
-        int[] expectedIntArray = {1,2,3};
-        long[] expectedLongArray = {4L,5L,6L};
-        short[] expectedShortArray = {7,8,9};
-        boolean[] expectedBooleanArray = {true, false};
-
-        try {
-            assertNotNull(byteArray);
-            assertNotNull(charArray);
-            assertNotNull(doubleArray);
-            assertNotNull(floatArray);
-            assertNotNull(intArray);
-            assertNotNull(longArray);
-            assertNotNull(shortArray);
-            assertNotNull(booleanArray);
-            assertEquals(Arrays.toString(expectedByteArray), Arrays.toString(byteArray));
-            assertEquals(Arrays.toString(expectedCharArray), Arrays.toString(charArray));
-            assertEquals(Arrays.toString(expectedDoubleArray), Arrays.toString(doubleArray));
-            assertEquals(Arrays.toString(expectedFloatArray), Arrays.toString(floatArray));
-            assertEquals(Arrays.toString(expectedIntArray), Arrays.toString(intArray));
-            assertEquals(Arrays.toString(expectedLongArray), Arrays.toString(longArray));
-            assertEquals(Arrays.toString(expectedShortArray), Arrays.toString(shortArray));
-            assertEquals(Arrays.toString(expectedBooleanArray), Arrays.toString(booleanArray));
-        } catch (AssertionFailedError e) {
-            printAssertionFailed(e);
-            return false;
-        }
-        return true;
-    }
-
-    public boolean testObjectArray(String[] stringArray, Object[] emptyArray,
-            Object[] objectArray) {
-        String[] expectedStringArray = {"Hello", "World", "!"};
-        String expectedStringArrayClassName = "[Ljava.lang.String;";
-        Object[] expectedObjectArray = {};
-
-        try {
-            assertNotNull(stringArray);
-
-            // EMULATE_JSC_BINDINGS JSC pass null for object arrays that are not strings.
-            // Should be an empty array?
-            assertNull(emptyArray);
-            assertNull(objectArray);
-
-            assertEquals(Arrays.toString(expectedStringArray), Arrays.toString(stringArray));
-            assertEquals(expectedStringArrayClassName, stringArray.getClass().getName());
-
-            // EMULATE_JSC_BINDINGS
-            // assertEquals(Arrays.toString(expectedObjectArray), Arrays.toString(emptyArray));
-            // assertEquals(expectedObjectArrayClassName, emptyArray.getClass().getName());
-            // assertEquals(Arrays.toString(expectedObjectArray), Arrays.toString(objectArray));
-            // assertEquals(expectedStringObjectClassName, objectArray.getClass().getName());
-
-        } catch (AssertionFailedError e) {
-            printAssertionFailed(e);
-            return false;
-        }
-        return true;
-    }
-
-    public boolean testObjectMembers(boolean boolParam, byte byteParam, char charParam,
-            double doubleParam, float floatParam, int intParam, long longParam, short shortParam,
-            String stringParam, int[] intArrayParam, String[] stringArrayParam,
-            Object objectParam) {
-        boolean expectedBoolParam = true;
-        byte expectedByteParam = 101;
-        char expectedCharParam = 'd';
-        double expectedDoubleParam = 123.456;
-        float expectedFloatParam = 456.789F;
-        int expectedIntParam = 102;
-        long expectedLongParam = 103L;
-        short expectedShortParam = 104;
-        String expectedStringParam = "Hello World";
-        int[] expectedIntArray = {1,2,3};
-        String[] expectedStringArrayParam = {"foo", "bar", "baz"};
-        String expectedStringArrayClassName = "[Ljava.lang.String;";
-
-        try {
-            assertEquals(expectedBoolParam, boolParam);
-            assertEquals(expectedByteParam, byteParam);
-
-            // EMULATE_JSC_BINDINGS: JSC does not pass chars correctly. (chars are strings in JS)
-            // assertEquals(expectedCharParam, charParam);
-
-            assertEquals(expectedDoubleParam, doubleParam);
-            assertEquals(expectedFloatParam, floatParam);
-            assertEquals(expectedIntParam, intParam);
-            assertEquals(expectedLongParam, longParam);
-            assertEquals(expectedShortParam, shortParam);
-            assertEquals(expectedStringParam, stringParam);
-            assertEquals(Arrays.toString(expectedIntArray), Arrays.toString(intArrayParam));
-            assertEquals(Arrays.toString(expectedStringArrayParam),
-                    Arrays.toString(stringArrayParam));
-            assertEquals(expectedStringArrayClassName, stringArrayParam.getClass().getName());
-            assertNull(objectParam);
-        } catch (AssertionFailedError e) {
-            printAssertionFailed(e);
-            return false;
-        }
-        return true;
-    }
-
-    public boolean testJSPrimitivesToStringsInJava(String intParam, String nullParam,
-            String doubleParam, String booleanParam, String charParam,
-            String undefinedParam) {
-        String expectedIntParam = "123";
-        String expectedDoubleParam = "456.789";
-        String expectedBooleanParam = "true";
-        String expectedCharParam = "d";
-
-        // EMULATE_JSC_BINDINGS JSC passes "undefined" for undefined types. Should be null?
-        String expectedUndefinedParam = "undefined";
-
-        try {
-            assertNotNull(intParam);
-            assertNull(nullParam);
-            assertNotNull(doubleParam);
-            assertNotNull(booleanParam);
-            assertNotNull(charParam);
-
-            // EMULATE_JSC_BINDINGS JSC passes "undefined" for undefined types.
-            assertNotNull(undefinedParam);
-
-            assertEquals(expectedIntParam, intParam);
-            assertEquals(expectedDoubleParam, doubleParam);
-            assertEquals(expectedBooleanParam, booleanParam);
-            assertEquals(expectedCharParam, charParam);
-
-            // EMULATE_JSC_BINDINGS  JSC passes "undefined" for undefined types.
-            assertEquals(expectedUndefinedParam, undefinedParam);
-
-        } catch (AssertionFailedError e) {
-            printAssertionFailed(e);
-            return false;
-        }
-        return true;
-    }
-
-    public boolean testParameterTypeMismatch(String[] stringArrayParam) {
-        // The JS test will pass a string, not an array to this test.
-        try {
-            assertNull(stringArrayParam);
-        } catch (AssertionFailedError e) {
-            printAssertionFailed(e);
-            return false;
-        }
-
-        return true;
-    }
-
-    public boolean returnBool() { return true; }
-    public byte returnByte() { return 1; }
-    public char returnChar() { return 'b'; }
-    public double returnDouble() { return 123.456; }
-    public float returnFloat() { return 456.789F; }
-    public int returnInt() { return 123; }
-    public long returnLong() { return 1234L; }
-    public short returnShort() { return 12345; }
-    public String returnString() { return "Hello World!"; }
-    public String returnNullString() { return null; }
-
-    public class TestObject {
-        public int x = 123;
-        public String s = "Hello World!";
-
-        public boolean aMethod() { return true; }
-        public String anotherMethod() { return "Hello World"; }
-    }
-
-    public TestObject returnObject() { return new TestObject(); }
-
-    public int[] returnArray() {
-        int[] array = {1,2,3,4,5};
-        return array;
-    }
-
-    public void returnVoid() { }
-}
diff --git a/tests/src/com/android/browser/JNIBindingsTestApp.java b/tests/src/com/android/browser/JNIBindingsTestApp.java
deleted file mode 100644
index 5d1fd0d..0000000
--- a/tests/src/com/android/browser/JNIBindingsTestApp.java
+++ /dev/null
@@ -1,274 +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;
-
-import android.app.Instrumentation;
-import android.net.http.SslError;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-import android.webkit.ClientCertRequestHandler;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebView;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Adds a JavaScript interface to the webview and calls functions on it to verify variables
- * are passed from JS to Java correctly.
- * To run this test, execute:
- * adb shell am instrument -w -e class com.android.browser.JNIBindingsTestApp#testJNIBindings \
- *     com.android.browser.tests/android.test.InstrumentationTestRunner
- */
-public class JNIBindingsTestApp extends ActivityInstrumentationTestCase2<BrowserActivity> {
-
-    private final static String TAG = "JNIBindingsTest";
-
-    private static final String SDCARD_BINDINGS_TEST_HTML = "/sdcard/bindings_test.html";
-
-    private static final int MSG_WEBKIT_DATA_READY = 101;
-
-    private BrowserActivity mActivity = null;
-    private Controller mController = null;
-    private Instrumentation mInst = null;
-
-    private boolean mTestDone = false;
-    private String mWebKitResult;
-
-    private String mExpectedWebKitResult = "Running JNI Bindings test...\n" +
-            "testPrimitiveTypes passed!\n" +
-            "testObjectTypes passed!\n" +
-            "testArray passed!\n" +
-            "testObjectArray passed!\n" +
-            "testObjectMembers passed!\n" +
-            "testJSPrimitivesToStringsInJava passed!\n" +
-            "testJavaReturnTypes passed!\n" +
-            "getIfaceProperties passed!\n" +
-            "testParameterTypeMismatch passed!\n";
-
-
-    private class GetWebKitDataThread extends Thread {
-        private JNIBindingsTestApp mTestApp;
-        private WebView mWebView;
-        private Handler mHandler;
-
-        GetWebKitDataThread(JNIBindingsTestApp testApp, WebView webView) {
-            mTestApp = testApp;
-            mWebView = webView;
-        }
-
-        @Override
-        public void run() {
-            Looper.prepare();
-            mHandler = new Handler() {
-                @Override
-                public void handleMessage(Message msg) {
-                    switch (msg.what) {
-                        case MSG_WEBKIT_DATA_READY: {
-                            mTestApp.setWebKitResult((String)msg.obj);
-                            Looper.myLooper().quit();
-                        }
-                        default: super.handleMessage(msg); break;
-                    }
-                }
-            };
-            mWebView.documentAsText(mHandler.obtainMessage(MSG_WEBKIT_DATA_READY, 1, 0));
-            Looper.loop();
-        }
-    }
-
-    public synchronized void setWebKitResult(String result) {
-       mWebKitResult = result;
-       notify();
-    }
-
-    public JNIBindingsTestApp() {
-        super(BrowserActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mActivity = getActivity();
-        mController = mActivity.getController();
-        mInst = getInstrumentation();
-        mInst.waitForIdleSync();
-
-        extractAsset();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        removeAsset();
-        super.tearDown();
-    }
-
-    protected void extractAsset() throws IOException {
-        InputStream in = getInstrumentation().getContext().getAssets().open("bindings_test.html");
-        OutputStream out = new FileOutputStream(SDCARD_BINDINGS_TEST_HTML);
-
-        byte[] buf = new byte[2048];
-        int len;
-
-        while ((len = in.read(buf)) >= 0 ) {
-            out.write(buf, 0, len);
-        }
-        out.close();
-        in.close();
-    }
-
-    protected void removeAsset(){
-        File fileToDelete = new File(SDCARD_BINDINGS_TEST_HTML);
-        fileToDelete.delete();
-    }
-
-    /**
-     * Gets the browser ready for testing by starting the application
-     * and wrapping the WebView's helper clients.
-     */
-    void setUpBrowser() {
-        Tab tab = mController.getTabControl().getCurrentTab();
-        WebView webView = tab.getWebView();
-        webView.addJavascriptInterface(new JNIBindingsTest(this), "JNIBindingsTest");
-
-        webView.setWebChromeClient(new TestWebChromeClient(webView.getWebChromeClient()) {
-
-            /**
-             * Dismisses and logs Javascript alerts.
-             */
-            @Override
-            public boolean onJsAlert(WebView view, String url, String message,
-                    JsResult result) {
-                String logMsg = String.format("JS Alert '%s' received from %s", message, url);
-                Log.w(TAG, logMsg);
-                result.confirm();
-
-                return true;
-            }
-
-            /**
-             * Confirms and logs Javascript alerts.
-             */
-            @Override
-            public boolean onJsConfirm(WebView view, String url, String message,
-                    JsResult result) {
-                String logMsg = String.format("JS Confirmation '%s' received from %s",
-                        message, url);
-                Log.w(TAG, logMsg);
-                result.confirm();
-
-                return true;
-            }
-
-            /**
-             * Confirms and logs Javascript alerts, providing the default value.
-             */
-            @Override
-            public boolean onJsPrompt(WebView view, String url, String message,
-                    String defaultValue, JsPromptResult result) {
-                String logMsg = String.format("JS Prompt '%s' received from %s; " +
-                        "Giving default value '%s'", message, url, defaultValue);
-                Log.w(TAG, logMsg);
-                result.confirm(defaultValue);
-
-                return true;
-            }
-        });
-
-        webView.setWebViewClient(new TestWebViewClient(webView.getWebViewClient()) {
-
-            /**
-             * Bypasses and logs errors.
-             */
-            @Override
-            public void onReceivedError(WebView view, int errorCode,
-                    String description, String failingUrl) {
-                String message = String.format("Error '%s' (%d) loading url: %s",
-                        description, errorCode, failingUrl);
-                Log.w(TAG, message);
-            }
-
-            /**
-             * Ignores and logs SSL errors.
-             */
-            @Override
-            public void onReceivedSslError(WebView view, SslErrorHandler handler,
-                    SslError error) {
-                Log.w(TAG, "SSL error: " + error);
-                handler.proceed();
-            }
-
-            /**
-             * Ignores and logs SSL client certificate requests.
-             */
-            @Override
-            public void onReceivedClientCertRequest(WebView view, ClientCertRequestHandler handler,
-                    String host_and_port) {
-                Log.w(TAG, "SSL client certificate request: " + host_and_port);
-                handler.cancel();
-            }
-
-        });
-    }
-
-    public synchronized void notifyComplete() {
-        mTestDone = true;
-        notify();
-    }
-
-    public void testJNIBindings() {
-        setUpBrowser();
-
-        Tab tab = mController.getTabControl().getCurrentTab();
-        WebView webView = tab.getWebView();
-        webView.loadUrl("file://" + SDCARD_BINDINGS_TEST_HTML);
-        synchronized(this) {
-            while(!mTestDone) {
-                try {
-                    wait();
-                } catch (InterruptedException e) {}
-            }
-        }
-
-        // Now the tests are complete grab the DOM content and compare to the reference.
-        GetWebKitDataThread getWKData = new GetWebKitDataThread(this, webView);
-        mWebKitResult = null;
-        getWKData.start();
-
-        synchronized(this) {
-            while(mWebKitResult == null) {
-                try {
-                    wait();
-                } catch (InterruptedException e) {}
-            }
-        }
-
-        Log.v(TAG, "WebKit result:");
-        Log.v(TAG, mWebKitResult);
-        assertEquals("Bindings test failed! See logcat for more details!", mExpectedWebKitResult,
-                mWebKitResult);
-    }
-}
diff --git a/tests/src/com/android/browser/PopularUrlsTest.java b/tests/src/com/android/browser/PopularUrlsTest.java
index cbe8324..566d74b 100644
--- a/tests/src/com/android/browser/PopularUrlsTest.java
+++ b/tests/src/com/android/browser/PopularUrlsTest.java
@@ -32,6 +32,7 @@
 import android.webkit.JsResult;
 import android.webkit.SslErrorHandler;
 import android.webkit.WebView;
+import android.webkit.WebViewClassic;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -134,7 +135,8 @@
         Tab tab = mController.getTabControl().getCurrentTab();
         WebView webView = tab.getWebView();
 
-        webView.setWebChromeClient(new TestWebChromeClient(webView.getWebChromeClient()) {
+        webView.setWebChromeClient(new TestWebChromeClient(
+                WebViewClassic.fromWebView(webView).getWebChromeClient()) {
 
             @Override
             public void onProgressChanged(WebView view, int newProgress) {
@@ -203,7 +205,8 @@
             }
         });
 
-        webView.setWebViewClient(new TestWebViewClient(webView.getWebViewClient()) {
+        webView.setWebViewClient(new TestWebViewClient(
+                WebViewClassic.fromWebView(webView).getWebViewClient()) {
 
             /**
              * Bypasses and logs errors.
diff --git a/tests/src/com/android/browser/TestWebChromeClient.java b/tests/src/com/android/browser/TestWebChromeClient.java
index dd84b3a..e876902 100644
--- a/tests/src/com/android/browser/TestWebChromeClient.java
+++ b/tests/src/com/android/browser/TestWebChromeClient.java
@@ -197,7 +197,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType) {
-        mWrappedClient.openFileChooser(uploadFile, acceptType);
+    public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture) {
+        mWrappedClient.openFileChooser(uploadFile, acceptType, capture);
     }
 }
diff --git a/tests/src/com/android/browser/tests/utils/MockContentResolver2.java b/tests/src/com/android/browser/tests/utils/MockContentResolver2.java
index 20f5521..4fed65a 100644
--- a/tests/src/com/android/browser/tests/utils/MockContentResolver2.java
+++ b/tests/src/com/android/browser/tests/utils/MockContentResolver2.java
@@ -84,6 +84,20 @@
         return true;
     }
 
+    /** @hide */
+    protected IContentProvider acquireUnstableProvider(Context c, String name) {
+        return acquireProvider(c, name);
+    }
+
+    /** @hide */
+    public boolean releaseUnstableProvider(IContentProvider icp) {
+        return releaseProvider(icp);
+    }
+
+    /** @hide */
+    public void unstableProviderDied(IContentProvider icp) {
+    }
+
     @Override
     public void notifyChange(Uri uri, ContentObserver observer,
             boolean syncToNetwork) {
diff --git a/tools/get_search_engines.py b/tools/get_search_engines.py
index 86393f1..17916c8 100755
--- a/tools/get_search_engines.py
+++ b/tools/get_search_engines.py
@@ -39,9 +39,9 @@
 
 google_data = ["google", "Google", "google.com",
   "http://www.google.com/favicon.ico",
-  "http://www.google.com/search?hl={language}&amp;ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}",
+  "http://www.google.com/search?ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}",
   "UTF-8",
-  "http://www.google.com/complete/search?hl={language}&amp;client=android&amp;q={searchTerms}"]
+  "http://www.google.com/complete/search?client=android&amp;q={searchTerms}"]
 
 class SearchEngineManager(object):
   """Manages list of search engines and creates locale specific lists.