Merge "Modify browser file origin policy."
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-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-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/values-af/strings.xml b/res/values-af/strings.xml
index 821135d..8abba06 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -281,6 +281,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 +349,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 f8297d6..5fa73de 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -182,7 +182,7 @@
     <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="7123905786076456503">"አሳሹ እንደዚህ ዓይነቶቹን የድር ቅርጾች በራስ ሰር ያሟላል፡፡ የራስህን ራስ-ሙላ ጽሑፍ ማዘጋጀት ትፈልጋለህ?"</string>
-    <string name="autofill_setup_dialog_negative_toast" msgid="3288881675232206984">"የራስህን ራስ ሰር ሙላ ጽሑፍ ከአሳሽ ላይ&gt;  ቅንጅቶች&gt;  አጠቃላይ ማያ ላይ ሁልጊዜ ማዘጋጀት ትችላለህ፡፡"</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 +281,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 +334,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 +349,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 2eddd9a..077f798 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -138,7 +138,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">
@@ -281,6 +281,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 +349,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-be/strings.xml b/res/values-be/strings.xml
index 6a5c87c..3f885f4 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -281,6 +281,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 +349,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 9504531..d639fcf 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -281,6 +281,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 +349,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 d93d14b..e43c2e6 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -281,6 +281,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 +349,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 787f1f1..c749e4a 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -281,6 +281,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í webových strá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í webových strá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 +301,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">"Vyhledávejte či zadejte 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 +330,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 +349,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>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 73f84bb..477c601 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -281,6 +281,14 @@
   </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>
@@ -341,6 +349,7 @@
     <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 241e297..cbe512f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -185,7 +185,7 @@
     <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="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>
@@ -281,6 +281,14 @@
   </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_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">"Browser kann 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>
@@ -341,6 +349,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 93f7bb8..c312349 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -281,6 +281,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 +349,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 3f74588..1fcebde 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -281,6 +281,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 +349,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 504a1a3..bfb3a56 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -281,6 +281,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 +349,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 81b533a..b42618a 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -281,6 +281,14 @@
   </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="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -341,6 +349,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 8ae17f0..1680ebb 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -281,6 +281,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 +349,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 1b49893..5a8e87a 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -281,6 +281,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 +349,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 4fbbc80..594eae3 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -281,6 +281,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 +349,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 c4b7f7c..379523f 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -281,6 +281,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 +349,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 a1fc39a..dace797 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -281,6 +281,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 +349,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 d4c5a1a..b86ec0b 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -281,6 +281,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 +349,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 34f3982..698778c 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -281,6 +281,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 +349,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 07e9767..e25771b 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -33,7 +33,7 @@
     <string name="action" msgid="183105774472071343">"Masuk"</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,13 +49,13 @@
     <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>
@@ -130,7 +130,7 @@
     <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>
@@ -189,9 +189,9 @@
     <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_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 browser"</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 browser"</string>
     <string name="pref_privacy_clear_history_dlg" msgid="6934317391642846227">"Hapus riwayat navigasi browser?"</string>
@@ -215,8 +215,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>
@@ -272,7 +272,7 @@
     <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>
@@ -281,6 +281,14 @@
   </string-array>
     <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 file"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2385512101948178841"></string>
@@ -318,7 +326,7 @@
     <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 +340,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>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 8bb41f7..aaf0b72 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -281,6 +281,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 +349,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 6196117..021aad2 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -281,6 +281,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 +349,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-ja/strings.xml b/res/values-ja/strings.xml
index 8938f25..50417a3 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -281,6 +281,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 +349,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 c78b3aa..cca8540 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -281,6 +281,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 +349,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 58da84c..758b431 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -281,6 +281,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 +349,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 4234ee2..75dc841 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -281,6 +281,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 +349,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 6f69194..0b005c0 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -281,6 +281,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 +349,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 b6ab845..8ff8b6d 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -281,6 +281,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 +349,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 50528e9..692e7ad 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -281,6 +281,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 +349,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 a897f2d..8acb401 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -281,6 +281,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 strony internetowej"</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 w tle stron internetowych, do których istnieją linki"</string>
+    <string name="pref_link_prefetch_dialogtitle" msgid="3804646141622839765">"Wstępne wczytywanie strony internetowej"</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 +349,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 5ebc993..93595f9 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -281,6 +281,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 +349,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 f80a356..767f2b3 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -281,6 +281,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 +349,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 2eca8ed..7d52a3c 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -402,6 +402,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 +502,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 8b1e5bd..ae93e00 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -281,6 +281,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 +349,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 2fcad2c..ac4a717 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -281,6 +281,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 +349,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 c503da5..670b5f2 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -281,6 +281,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 +349,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 1377bc5..563e831 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -281,6 +281,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 +349,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 f109e31..81a75d0 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -281,6 +281,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 +349,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 d9fe103..75dabf9 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -281,6 +281,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 +349,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 fd41f49..72d17b8 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -281,6 +281,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 +349,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/dimensions.xml b/res/values-sw600dp/dimensions.xml
index ed75f60..a6797f0 100644
--- a/res/values-sw600dp/dimensions.xml
+++ b/res/values-sw600dp/dimensions.xml
@@ -25,8 +25,8 @@
     <!-- 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 5a4d6c1..021be1b 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -281,6 +281,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 +349,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 b926947..be6ae22 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -281,6 +281,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 +349,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 e497097..ae7cc53 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -281,6 +281,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 +349,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 827ab2e..c995f53 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -281,6 +281,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 +349,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 e50f72e..0b834cd 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -263,7 +263,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 +281,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 +349,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 5d1129c..59b7d1a 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -267,7 +267,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>
@@ -281,6 +281,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>
@@ -312,7 +320,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 +349,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-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 168814c..536941b 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -281,6 +281,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 +349,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 6ea0e55..cc3d0a6 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -281,6 +281,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 +349,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..e472915 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>
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 2de5e58..90ec428 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -215,6 +215,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] -->
@@ -664,6 +666,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>
@@ -763,14 +787,9 @@
     <!-- Do not translate.  Testing only -->
     <string name="dump_nav" translatable="false">Dump navigation cache</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">
@@ -866,6 +885,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/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/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index ffb2928..54b2f18 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;
@@ -112,6 +111,7 @@
     protected boolean mUseQuickControls;
     protected TitleBar mTitleBar;
     private NavigationBarBase mNavigationBar;
+    protected PieControl mPieControl;
 
     public BaseUi(Activity browser, UiController controller) {
         mActivity = browser;
@@ -196,6 +196,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) {
@@ -247,9 +262,21 @@
             }
         }
         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);
+            } else {
+                web.setTitleBar(mTitleBar);
+                mTitleBar.onScrollChanged();
+            }
+        }
+        mTitleBar.bringToFront();
+        tab.getTopWindow().requestFocus();
         setShouldShowErrorConsole(tab, mUiController.shouldShowErrorConsole());
         onTabDataChanged(tab);
         onProgressChanged(tab);
@@ -310,26 +337,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);
     }
@@ -345,7 +362,6 @@
         // Remove the container from the content and then remove the
         // WebView from the container. This will trigger a focus change
         // needed by WebView.
-        WebViewClassic.fromWebView(mainView).setEmbeddedTitleBar(null);
         FrameLayout wrapper =
                 (FrameLayout) container.findViewById(R.id.webview_wrapper);
         wrapper.removeView(mainView);
@@ -471,15 +487,12 @@
         return mTitleBar.isEditingUrl();
     }
 
-    public TitleBar getTitleBar() {
-        return mTitleBar;
+    public void stopEditingUrl() {
+        mTitleBar.getNavigationBar().stopEditingUrl();
     }
 
-    protected void setTitleGravity(int gravity) {
-        WebView web = getWebView();
-        if (web != null) {
-            WebViewClassic.fromWebView(web).setTitleBarGravity(gravity);
-        }
+    public TitleBar getTitleBar() {
+        return mTitleBar;
     }
 
     @Override
diff --git a/src/com/android/browser/BookmarksLoader.java b/src/com/android/browser/BookmarksLoader.java
index bc06497..80d4255 100644
--- a/src/com/android/browser/BookmarksLoader.java
+++ b/src/com/android/browser/BookmarksLoader.java
@@ -34,7 +34,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 +46,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 77fac4f..1d53626 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;
@@ -56,6 +58,11 @@
         }
         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())) {
@@ -86,6 +93,7 @@
 
     @Override
     protected void onNewIntent(Intent intent) {
+        if (shouldIgnoreIntents()) return;
         if (ACTION_RESTART.equals(intent.getAction())) {
             Bundle outState = new Bundle();
             mController.onSaveInstanceState(outState);
@@ -99,6 +107,25 @@
         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();
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 2fd880c..be3c211 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -19,18 +19,24 @@
 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.
@@ -38,21 +44,53 @@
     public BrowserBookmarksAdapter(Context context, int defaultView) {
         // 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);
+        mContext = context;
         selectView(defaultView);
     }
 
     @Override
-    public void bindView(View view, Context context, Cursor cursor) {
+    public View newView(Context context, ViewGroup parent) {
         if (mCurrentView == BrowserBookmarksPage.VIEW_LIST) {
-            bindListView(view, context, cursor);
+            return mInflater.inflate(R.layout.bookmark_list, parent, false);
         } else {
-            bindGridView(view, context, cursor);
+            return mInflater.inflate(R.layout.bookmark_thumbnail, parent, false);
         }
     }
 
-    void bindGridView(View view, Context context, Cursor cursor) {
+    @Override
+    public void bindView(View view, BrowserBookmarksAdapterItem object) {
+        BookmarkContainer container = (BookmarkContainer) view;
+        container.setIgnoreRequestLayout(true);
+        if (mCurrentView == BrowserBookmarksPage.VIEW_LIST) {
+            bindListView(view, mContext, object);
+        } else {
+            bindGridView(view, mContext, object);
+        }
+        container.setIgnoreRequestLayout(false);
+    }
+
+    void clearView(View view) {
+        if (mCurrentView == BrowserBookmarksPage.VIEW_LIST) {
+            ImageView favicon = (ImageView) view.findViewById(R.id.favicon);
+            favicon.setImageBitmap(null);
+        } else {
+            ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
+            thumb.setImageBitmap(null);
+        }
+    }
+
+    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,63 +100,42 @@
         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) {
                 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) {
+    void bindListView(View view, Context context, BrowserBookmarksAdapterItem item) {
         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) {
+        tv.setText(item.title);
+        if (item.is_folder) {
             // folder
             favicon.setImageResource(R.drawable.ic_folder_holo_dark);
-            favicon.setBackgroundDrawable(null);
+            favicon.setBackground(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) {
+            if (item.favicon == null) {
                 favicon.setImageResource(R.drawable.app_web_browser_sm);
             } else {
-                favicon.setImageBitmap(faviconBitmap);
+                favicon.setImageDrawable(item.favicon);
             }
             favicon.setBackgroundResource(R.drawable.bookmark_list_favicon_bg);
         }
     }
 
-    @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) {
@@ -132,7 +149,34 @@
     }
 
     @Override
-    public Cursor getItem(int position) {
-        return (Cursor) super.getItem(position);
+    public BrowserBookmarksAdapterItem getRowObject(Cursor c,
+            BrowserBookmarksAdapterItem item) {
+        if (item == null) {
+            item = new BrowserBookmarksAdapterItem();
+        }
+        Bitmap favicon = item.favicon != null ? item.favicon.getBitmap() : null;
+        Bitmap thumbnail = item.thumbnail != null ? item.thumbnail.getBitmap() : null;
+        favicon = BrowserBookmarksPage.getBitmap(c,
+                BookmarksLoader.COLUMN_INDEX_FAVICON, favicon);
+        thumbnail = BrowserBookmarksPage.getBitmap(c,
+                BookmarksLoader.COLUMN_INDEX_THUMBNAIL, thumbnail);
+        if (favicon != null
+                && (item.favicon == null || item.favicon.getBitmap() != favicon)) {
+            item.favicon = new BitmapDrawable(mContext.getResources(), favicon);
+        }
+        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 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..913b0fd
--- /dev/null
+++ b/src/com/android/browser/BrowserBookmarksAdapterItem.java
@@ -0,0 +1,27 @@
+/*
+ * 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.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+
+public class BrowserBookmarksAdapterItem {
+    public String url;
+    public CharSequence title;
+    public BitmapDrawable favicon;
+    public BitmapDrawable thumbnail;
+    public boolean is_folder;
+}
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index da60fda..5a609b1 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -32,12 +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;
@@ -236,11 +236,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 +304,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) {
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 22f6fd2..cddeda6 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;
@@ -115,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;
@@ -290,6 +295,8 @@
             settings.setProperty(WebViewProperties.gfxEnableCpuUploadPath,
                     enableCpuUploadPath() ? "true" : "false");
         }
+
+        settings.setLinkPrefetchEnabled(mLinkPrefetchAllowed);
     }
 
     /**
@@ -364,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());
             }
@@ -373,6 +379,8 @@
             if (mController.getUi() != null) {
                 mController.getUi().setUseQuickControls(sharedPreferences.getBoolean(key, false));
             }
+        } else if (PREF_LINK_PREFETCH.equals(key)) {
+            updateConnectionType();
         }
     }
 
@@ -579,6 +587,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
     // -----------------------------
@@ -861,6 +900,30 @@
         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
     // -----------------------------
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 49d1a2e..12d511f 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -74,6 +74,10 @@
         super(context);
     }
 
+    public void setTitleBar(TitleBar title) {
+        mTitleBar = title;
+    }
+
     // From TitleBarDelegate
     @Override
     public int getTitleHeight() {
@@ -83,7 +87,6 @@
     // From TitleBarDelegate
     @Override
     public void onSetEmbeddedTitleBar(final View title) {
-        mTitleBar = (TitleBar) title;
     }
 
     public boolean hasTitleBar() {
@@ -110,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);
         }
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 9861184..05ccdd2 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -17,7 +17,10 @@
 package com.android.browser;
 
 import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
 import android.app.DownloadManager;
+import android.app.ProgressDialog;
 import android.app.SearchManager;
 import android.content.ClipboardManager;
 import android.content.ContentProvider;
@@ -26,6 +29,8 @@
 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;
@@ -788,8 +793,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() {
@@ -1587,10 +1594,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:
@@ -1624,50 +1628,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:
@@ -1703,9 +1674,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:
@@ -1737,6 +1706,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);
@@ -1943,9 +2003,9 @@
     }
 
     // file chooser
-    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
+    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
         mUploadHandler = new UploadHandler(this);
-        mUploadHandler.openFileChooser(uploadMsg, acceptType);
+        mUploadHandler.openFileChooser(uploadMsg, acceptType, capture);
     }
 
     // thumbnails
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index ecd4545..b21c688 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -157,6 +157,16 @@
                 mController.openTab(urlData);
                 return;
             }
+            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)
                     // If a voice search has no appId, it means that it came
                     // from the browser.  In that case, reuse the current tab.
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 128304c..41af619 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -108,7 +108,6 @@
         }
         if (hasFocus) {
             mBaseUi.showTitleBar();
-            mUrlInput.forceIme();
             if (mInVoiceMode) {
                 mUrlInput.forceFilter();
             }
@@ -262,6 +261,9 @@
         } else if (mInVoiceMode) {
             mUrlInput.showDropDown();
         }
+        if (mTitleBar.useQuickControls()) {
+            mUrlInput.showIME();
+        }
     }
 
     public void onProgressStarted() {
diff --git a/src/com/android/browser/NetworkStateHandler.java b/src/com/android/browser/NetworkStateHandler.java
index 4ae91ba..4480664 100644
--- a/src/com/android/browser/NetworkStateHandler.java
+++ b/src/com/android/browser/NetworkStateHandler.java
@@ -26,6 +26,8 @@
 import android.webkit.WebView;
 import android.webkit.WebViewClassic;
 
+import com.android.browser.BrowserSettings;
+
 /**
  * Handle network state changes
  */
@@ -68,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);
@@ -87,6 +90,7 @@
     void onResume() {
         mActivity.registerReceiver(mNetworkStateIntentReceiver,
                 mNetworkStateChangedFilter);
+        BrowserSettings.getInstance().updateConnectionType();
     }
 
     /**
@@ -114,5 +118,4 @@
             WebViewClassic.fromWebView(w).setNetworkType(type, subtype);
         }
     }
-
 }
diff --git a/src/com/android/browser/PageDialogsHandler.java b/src/com/android/browser/PageDialogsHandler.java
index 19cbfcd..3ed1004 100644
--- a/src/com/android/browser/PageDialogsHandler.java
+++ b/src/com/android/browser/PageDialogsHandler.java
@@ -137,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);
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 5afb9c4..7db5563 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -29,17 +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.webkit.WebViewClassic;
-import android.widget.FrameLayout;
 import android.widget.ImageView;
 
 import com.android.browser.UrlInputView.StateListener;
@@ -52,7 +48,6 @@
     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;
@@ -124,7 +119,6 @@
                 if (!mOptionsMenuOpen || mExtendedMenuOpen) {
                     if (mUseQuickControls && !mTitleBar.isEditingUrl()) {
                         mTitleBar.setShowProgressOnly(true);
-                        setTitleGravity(Gravity.TOP);
                     }
                     showTitleBar();
                 }
@@ -167,11 +161,9 @@
         // Request focus on the top window.
         if (mUseQuickControls) {
             mPieControl.forceToTop(mContentView);
+            view.setTitleBar(null);
         } else {
-            // check if title bar is already attached by animation
-            if (mTitleBar.getParent() == null) {
-                WebViewClassic.fromWebView(view).setEmbeddedTitleBar(mTitleBar);
-            }
+            view.setTitleBar(mTitleBar);
         }
         if (tab.isInVoiceSearchMode()) {
             showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
@@ -181,7 +173,6 @@
         // update nav bar state
         mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
         updateLockIconToLatest(tab);
-        tab.getTopWindow().requestFocus();
         mTitleBar.setSkipTitleBarAnimations(false);
     }
 
@@ -268,46 +259,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) {
-                WebViewClassic.fromWebView(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);
-                }
-                WebViewClassic.fromWebView(web).setEmbeddedTitleBar(mTitleBar);
-            }
-            setTitleGravity(Gravity.NO_GRAVITY);
-        }
-        updateUrlBarAutoShowManagerTarget();
-    }
-
-    @Override
     public boolean isWebShowing() {
         return super.isWebShowing() && !showingNavScreen();
     }
diff --git a/src/com/android/browser/PieControl.java b/src/com/android/browser/PieControl.java
new file mode 100644
index 0000000..68b0c7b
--- /dev/null
+++ b/src/com/android/browser/PieControl.java
@@ -0,0 +1,329 @@
+/*
+ * 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();
+        mForward.setEnabled(tab.canGoForward());
+        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);
+        // 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);
+        } 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);
+        } else if (mIncognito.getView() == v) {
+            mUiController.openIncognitoTab();
+            mUi.editUrl(false);
+        } 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();
+        }
+    }
+
+    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 1a20495..ff42aaf 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -102,6 +102,7 @@
     // 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";
 
     // ----------------------
diff --git a/src/com/android/browser/PreloadController.java b/src/com/android/browser/PreloadController.java
index 5de5be0..0efe119 100644
--- a/src/com/android/browser/PreloadController.java
+++ b/src/com/android/browser/PreloadController.java
@@ -214,7 +214,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/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 f58f88b..e14f095 100644
--- a/src/com/android/browser/SnapshotTab.java
+++ b/src/com/android/browser/SnapshotTab.java
@@ -18,11 +18,13 @@
 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;
@@ -30,6 +32,8 @@
 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;
 
@@ -75,7 +79,7 @@
 
     void loadData() {
         if (mLoadTask == null) {
-            mLoadTask = new LoadData(this, mContext.getContentResolver());
+            mLoadTask = new LoadData(this, mContext);
             mLoadTask.execute();
         }
     }
@@ -152,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
@@ -175,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);
                     }
                     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/Tab.java b/src/com/android/browser/Tab.java
index acccb31..c73bdf6 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -64,8 +64,8 @@
 import android.webkit.WebResourceResponse;
 import android.webkit.WebStorage;
 import android.webkit.WebView;
-import android.webkit.WebViewClassic;
 import android.webkit.WebView.PictureListener;
+import android.webkit.WebViewClassic;
 import android.webkit.WebViewClient;
 import android.widget.CheckBox;
 import android.widget.Toast;
@@ -76,12 +76,16 @@
 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;
@@ -1234,9 +1238,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);
             }
@@ -1566,8 +1570,6 @@
     void destroy() {
         if (mMainView != null) {
             dismissSubWindow();
-            // Make sure the embedded title bar isn't still attached
-            getWebViewClassic().setEmbeddedTitleBar(null);
             // save the WebView to call destroy() after detach it from the tab
             WebView webView = mMainView;
             setWebView(null);
@@ -2059,26 +2061,29 @@
         return false;
     }
 
-    public ContentValues createSnapshotValues() {
-        if (mMainView == null) return null;
-        SnapshotByteArrayOutputStream bos = new SnapshotByteArrayOutputStream();
-        try {
-            GZIPOutputStream stream = new GZIPOutputStream(bos);
-            if (!getWebViewClassic().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, getWebViewClassic().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,
@@ -2088,6 +2093,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;
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
index 8fa4d43..bb0eec5 100644
--- a/src/com/android/browser/TitleBar.java
+++ b/src/com/android/browser/TitleBar.java
@@ -21,7 +21,6 @@
 import android.animation.ObjectAnimator;
 import android.content.Context;
 import android.content.res.Resources;
-import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -31,7 +30,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;
 
@@ -67,6 +65,7 @@
         mBaseUi = ui;
         mParent = parent;
         initLayout(context);
+        mParent.addView(this, makeLayoutParams());
     }
 
     private void initLayout(Context context) {
@@ -107,7 +106,11 @@
 
     public void setUseQuickControls(boolean use) {
         mUseQuickControls = use;
-        setLayoutParams(makeLayoutParams());
+        if (use) {
+            this.setVisibility(View.GONE);
+        } else {
+            this.setVisibility(View.VISIBLE);
+        }
     }
 
     void setShowProgressOnly(boolean progress) {
@@ -132,7 +135,8 @@
 
     void show() {
         if (mUseQuickControls) {
-            mParent.addView(this);
+            this.setVisibility(View.VISIBLE);
+            this.setTranslationY(0);
         } else {
             if (!mSkipTitleBarAnimations) {
                 cancelTitleBarAnimation(false);
@@ -147,14 +151,13 @@
                 setupTitleBarAnimator(mTitleBarAnimator);
                 mTitleBarAnimator.start();
             }
-            mBaseUi.setTitleGravity(Gravity.TOP);
         }
         mShowing = true;
     }
 
     void hide() {
         if (mUseQuickControls) {
-            mParent.removeView(this);
+            this.setVisibility(View.GONE);
         } else {
             if (!mSkipTitleBarAnimations) {
                 cancelTitleBarAnimation(false);
@@ -166,7 +169,7 @@
                 setupTitleBarAnimator(mTitleBarAnimator);
                 mTitleBarAnimator.start();
             } else {
-                mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
+                onScrollChanged();
             }
         }
         mShowing = false;
@@ -188,10 +191,8 @@
 
     private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() {
 
-        boolean mWasCanceled;
         @Override
         public void onAnimationStart(Animator animation) {
-            mWasCanceled = false;
         }
 
         @Override
@@ -200,15 +201,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;
         }
     };
 
@@ -252,6 +250,7 @@
     }
 
     public int getEmbeddedHeight() {
+        if (mUseQuickControls) return 0;
         int height = mNavBar.getHeight();
         if (mAutoLogin != null && mAutoLogin.getVisibility() == View.VISIBLE) {
             height += mAutoLogin.getHeight();
@@ -355,14 +354,8 @@
     }
 
     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
@@ -390,4 +383,10 @@
         }
     }
 
+    public void onScrollChanged() {
+        if (!mShowing) {
+            setTranslationY(getVisibleTitleHeight() - getEmbeddedHeight());
+        }
+    }
+
 }
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
index e7a8953..46c0432 100644
--- a/src/com/android/browser/UiController.java
+++ b/src/com/android/browser/UiController.java
@@ -65,6 +65,8 @@
 
     void bookmarksOrHistoryPicker(ComboViews startView);
 
+    void bookmarkCurrentPage();
+
     void startVoiceSearch();
 
     boolean supportsVoiceSearch();
@@ -103,4 +105,10 @@
 
     void showPageInfo();
 
+    void openPreferences();
+
+    void findOnPage();
+
+    void toggleUserAgent();
+
 }
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..1ba26fe 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -246,15 +246,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();
diff --git a/src/com/android/browser/WebViewController.java b/src/com/android/browser/WebViewController.java
index 20027e0..30eec4f 100644
--- a/src/com/android/browser/WebViewController.java
+++ b/src/com/android/browser/WebViewController.java
@@ -97,7 +97,7 @@
 
     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 46149aa..e0a6be2 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -28,13 +28,9 @@
 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;
 
@@ -54,7 +50,6 @@
 
     private NavigationBarTablet mNavBar;
 
-    private PieControlXLarge mPieControl;
     private Handler mHandler;
 
     /**
@@ -86,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) {
-                WebViewClassic.fromWebView(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);
-                }
-                WebViewClassic.fromWebView(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() {
@@ -134,7 +107,7 @@
     public void onResume() {
         super.onResume();
         mNavBar.clearCompletions();
-        checkTabCount();
+        checkHideActionBar();
     }
 
     @Override
@@ -182,7 +155,7 @@
     }
 
     protected void onAddTabCompleted(Tab tab) {
-        checkTabCount();
+        checkHideActionBar();
     }
 
     @Override
@@ -197,15 +170,6 @@
             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) {
-                WebViewClassic.fromWebView(view).setEmbeddedTitleBar(mTitleBar);
-            }
-        }
         mTabBar.onSetActiveTab(tab);
         if (tab.isInVoiceSearchMode()) {
             showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
@@ -213,14 +177,13 @@
             revertVoiceTitleBar(tab);
         }
         updateLockIconToLatest(tab);
-        tab.getTopWindow().requestFocus();
         mTitleBar.setSkipTitleBarAnimations(false);
     }
 
     @Override
     public void updateTabs(List<Tab> tabs) {
         mTabBar.updateTabs(tabs);
-        checkTabCount();
+        checkHideActionBar();
     }
 
     @Override
@@ -233,7 +196,7 @@
     }
 
     protected void onRemoveTabCompleted(Tab tab) {
-        checkTabCount();
+        checkHideActionBar();
     }
 
     int getContentWidth() {
@@ -251,10 +214,6 @@
         super.editUrl(clearInput);
     }
 
-    void stopEditingUrl() {
-        mTitleBar.getNavigationBar().stopEditingUrl();
-    }
-
     @Override
     protected void showTitleBar() {
         if (canShowTitleBar()) {
@@ -269,13 +228,6 @@
         }
     }
 
-    @Override
-    protected void setTitleGravity(int gravity) {
-        if (!mUseQuickControls) {
-            super.setTitleGravity(gravity);
-        }
-    }
-
     // action mode callbacks
 
     @Override
@@ -288,7 +240,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
@@ -320,9 +272,7 @@
     @Override
     public void onHideCustomView() {
         super.onHideCustomView();
-        if (mUseQuickControls) {
-            checkTabCount();
-        }
+        checkHideActionBar();
     }
 
     @Override
diff --git a/src/com/android/browser/homepages/RequestHandler.java b/src/com/android/browser/homepages/RequestHandler.java
index b3a03b9..13b52e3 100644
--- a/src/com/android/browser/homepages/RequestHandler.java
+++ b/src/com/android/browser/homepages/RequestHandler.java
@@ -37,6 +37,8 @@
 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;

 

@@ -140,9 +142,20 @@
         t.write(mOutput);

     }

 

+    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());

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 ba00421..ed6eadf 100644
--- a/src/com/android/browser/preferences/InvertedContrastPreview.java
+++ b/src/com/android/browser/preferences/InvertedContrastPreview.java
@@ -74,7 +74,7 @@
     }
 
     @Override
-    protected void updatePreview() {
+    protected void updatePreview(boolean forceReload) {
         if (mWebView == null) return;
 
         WebSettingsClassic ws = WebViewClassic.fromWebView(mWebView).getSettings();
@@ -83,7 +83,9 @@
                 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/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 8d71266..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);
         }
 
diff --git a/src/com/android/browser/provider/SnapshotProvider.java b/src/com/android/browser/provider/SnapshotProvider.java
index 437a867..291e93b 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,11 @@
 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 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 +38,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 +46,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 +57,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 +70,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 +86,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 +98,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 +169,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 +191,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 +207,25 @@
         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()) {
+            File f = context.getFileStreamPath(c.getString(0));
+            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 +242,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/SearchEngineInfo.java b/src/com/android/browser/search/SearchEngineInfo.java
index 0c11a04..ec304f6 100644
--- a/src/com/android/browser/search/SearchEngineInfo.java
+++ b/src/com/android/browser/search/SearchEngineInfo.java
@@ -83,15 +83,13 @@
 
         // Add the current language/country information to the URIs.
         Locale locale = context.getResources().getConfiguration().locale;
-        String language = locale.getLanguage();
-        StringBuilder languageBuilder = new StringBuilder(language);
-        String country = locale.getCountry();
-        if (!TextUtils.isEmpty(country) && useLangCountryHl(language, country)) {
-            languageBuilder.append('-');
-            languageBuilder.append(country);
+        StringBuilder language = new StringBuilder(locale.getLanguage());
+        if (!TextUtils.isEmpty(locale.getCountry())) {
+            language.append('-');
+            language.append(locale.getCountry());
         }
 
-        String language_str = languageBuilder.toString();
+        String language_str = language.toString();
         mSearchEngineData[FIELD_SEARCH_URI] =
                 mSearchEngineData[FIELD_SEARCH_URI].replace(PARAMETER_LANGUAGE, language_str);
         mSearchEngineData[FIELD_SUGGEST_URI] =
@@ -111,19 +109,6 @@
                 mSearchEngineData[FIELD_SUGGEST_URI].replace(PARAMETER_INPUT_ENCODING, enc);
     }
 
-    private static boolean useLangCountryHl(String language, String country) {
-        // lang-country is currently only supported for a small number of locales
-        if("en".equals(language)) {
-            return "GB".equals(country);
-        } else if ("zh".equals(language)) {
-            return "CN".equals(country) || "TW".equals(country);
-        } else if ("pt".equals(language)) {
-            return "BR".equals(country) || "PT".equals(country);
-        } else {
-            return false;
-        }
-    }
-
     public String getName() {
         return mName;
     }
diff --git a/src/com/android/browser/util/ThreadedCursorAdapter.java b/src/com/android/browser/util/ThreadedCursorAdapter.java
new file mode 100644
index 0000000..fe59ad1
--- /dev/null
+++ b/src/com/android/browser/util/ThreadedCursorAdapter.java
@@ -0,0 +1,193 @@
+/*
+ * 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.util.Log;
+import android.util.SparseArray;
+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;
+import java.util.HashMap;
+
+public abstract class ThreadedCursorAdapter<T> extends BaseAdapter {
+
+    private static final String LOGTAG = "tca";
+    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 class LoadContainer {
+        WeakReference<View> view;
+        int position;
+        T bind_object;
+        Adapter owner;
+        boolean loaded;
+    }
+
+    public ThreadedCursorAdapter(Context context, Cursor c) {
+        mContext = context;
+        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();
+                ThreadedCursorAdapter.this.notifyDataSetChanged();
+            }
+
+            @Override
+            public void notifyDataSetInvalidated() {
+                super.notifyDataSetInvalidated();
+                mSize = getCount();
+                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) {
+                    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) {
+        return 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);
+            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) {
+            bindView(convertView, container.bind_object);
+        } else {
+            bindView(convertView, cachedLoadObject());
+            container.position = position;
+            container.loaded = false;
+            container.owner = this;
+            mLoadHandler.obtainMessage(position, container).sendToTarget();
+        }
+        return convertView;
+    }
+
+    private T cachedLoadObject() {
+        if (mLoadingObject == null) {
+            mLoadingObject = getLoadingObject();
+        }
+        return mLoadingObject;
+    }
+
+    public void changeCursor(Cursor cursor) {
+        synchronized (mCursorLock) {
+            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();
+}
\ No newline at end of file
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/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/PieMenu.java b/src/com/android/browser/view/PieMenu.java
index 7f8dd6b..1fd0e99 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();
+
     }
 
     /**
@@ -74,6 +82,7 @@
     private int mRadiusInc;
     private int mSlop;
     private int mTouchOffset;
+    private Path mPath;
 
     private boolean mOpen;
     private PieController mController;
@@ -83,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
@@ -139,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) {
@@ -176,18 +194,39 @@
     private void show(boolean show) {
         mOpen = show;
         if (mOpen) {
+            mController.stopEditingUrl();
+            mCurrentItems = mItems;
             if (mController != null) {
                 boolean changed = mController.onOpen();
             }
             layoutPie();
+            animateOpen();
         }
         if (!show) {
+            mAnimating = false;
             mCurrentItem = null;
+            mOpenItem = null;
             mPieView = null;
         }
         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;
@@ -202,33 +241,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;
                 }
             }
@@ -266,15 +304,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);
@@ -283,19 +324,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) {
@@ -332,9 +380,11 @@
                     handled = mPieView.onTouchEvent(evt);
                 }
                 PieItem item = mCurrentItem;
-                deselect();
+                if (!mAnimating) {
+                    deselect();
+                }
                 show(false);
-                if (!handled && (item != null)) {
+                if (!mAnimating && !handled && (item != null) && (item.getView() != null)) {
                     item.getView().performClick();
                 }
                 return true;
@@ -343,9 +393,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;
@@ -356,6 +410,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);
@@ -366,9 +429,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();
@@ -402,14 +466,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;
     }
@@ -439,15 +614,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 16d42cb..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();
         }
     }
 
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/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.