merge in jb-release history after reset to master
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 679e0fb..1010a97 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -281,14 +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">"Vooraf laai webbladsy"</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">"Vooraf laai webbladsy"</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>
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 e6682dc..8365474 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"ልጣፍ በማቀናበር ላይ...."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"እልባቶች"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ምንም ዕልባቶች የሉም"</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 0543207..8f31ceb 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"جارٍ تعيين الخلفية..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"الإشارات"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ليست هناك أية إشارات مرجعية."</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 fd09a25..5b7f932 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Усталяванне шпалер..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Закладкі"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Няма закладак"</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 ed08812..9c9dceb 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Тапетът се задава..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Отметки"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Няма отметки."</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 9245b16..3fbaaf9 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 0d9c656..d62824f 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 f042171..ee00b4b 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 9eb5392..a13b045 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 9aa7fe8..71bb8c0 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Ορισμός ταπετσαρίας..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Σελιδοδείκτες"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Δεν υπάρχουν σελιδοδείκτες"</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 9e6195d..0cdf775 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 fa528d0..2d34446 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 b726244..fe6983f 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 e59796c..4b23a9b 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 c087c78..612f3a3 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"تنظیم تصویر زمینه..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"نشانک ها"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"نشانکی موجود نیست."</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 b89b77d..a5a6426 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 1b93bcf..3d87590 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 d1376b3..47749a3 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"वॉलपेपर सेट कर रहा है..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"बुकमार्क"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"कोई बुकमार्क नहीं."</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 4cf6f1c..3a3b609 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 678de27..9059529 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 7b36790..5beaec8 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>
@@ -55,7 +55,7 @@
     <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>
@@ -326,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>
@@ -340,15 +340,17 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 3e2a6ac..e3b380a 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 3013486..dfe5630 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"מגדיר טפט..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"סימניות"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ללא סימניות."</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 e420fec..871e8fb 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"壁紙を設定しています..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"ブックマーク"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ブックマークはありません。"</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 a3021a7..84fc468 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"배경화면을 설정하는 중..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"북마크"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"북마크가 없습니다."</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 bb689e3..e6b0f0c 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 47cd718..4726d0d 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 a7ad2bc..53a51a9 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 7bcf5c0..8eeae8e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 fe0ad5f..47c6656 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 dbc249b..f62a50b 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 242bb0a..1862289 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 97d8189..cf87fb8 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 689a2ef..7d52a3c 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -502,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 76ca052..9b46400 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 c913b5d..96bb6b3 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Установка обоев..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Закладки"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Нет закладок"</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 ccc1f58..0e71cd6 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 1e59555..718d3f9 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 9071e2a..a920c55 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Подешавање позадине..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Обележивачи"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Нема обележивача."</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 7e85531..9025f9c 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 561cef7..28b3645 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 8516c9e..2a90c12 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"กำลังตั้งค่าวอลเปเปอร์..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"บุ๊กมาร์ก"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"ไม่มีบุ๊กมาร์ก"</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 d2d7ac3..89b5ae7 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 294ec3e..1483c98 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 ba45121..a46b299 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"Встановлення фонового малюнка…"</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"Закладки"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"Закладок немає."</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 a423774..c9666bc 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 a024860..d4da826 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"正在设置壁纸..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"书签"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"没有书签。"</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 53826b2..15fd98f 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -349,6 +349,8 @@
     <string name="progress_dialog_setting_wallpaper" msgid="2031391201442335889">"正在設定桌布..."</string>
     <string name="defaultBookmarksUpButton" msgid="2303951020715704735">"書籤"</string>
     <string name="empty_bookmarks_folder" msgid="6239830231917618556">"沒有書籤。"</string>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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 59e528c..d25ae67 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -349,6 +349,8 @@
     <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>
+    <!-- no translation found for other_bookmarks (8021889794475657319) -->
+    <skip />
     <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/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/strings.xml b/res/values/strings.xml
index 2a7fa96..95d383c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -883,6 +883,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/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 9aaceeb..652f9d7 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -312,26 +312,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);
     }
@@ -472,6 +462,10 @@
         return mTitleBar.isEditingUrl();
     }
 
+    public void stopEditingUrl() {
+        mTitleBar.getNavigationBar().stopEditingUrl();
+    }
+
     public TitleBar getTitleBar() {
         return mTitleBar;
     }
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/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 2fd880c..fcc3f27 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -20,6 +20,7 @@
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.provider.BrowserContract.Bookmarks;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -52,6 +53,15 @@
         }
     }
 
+    CharSequence getTitle(Cursor cursor, Context context) {
+        int type = cursor.getInt(BookmarksLoader.COLUMN_INDEX_TYPE);
+        switch (type) {
+        case Bookmarks.BOOKMARK_TYPE_OTHER_FOLDER:
+            return context.getText(R.string.other_bookmarks);
+        }
+        return cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
+    }
+
     void bindGridView(View view, Context context, Cursor cursor) {
         // We need to set this to handle rotation and other configuration change
         // events. If the padding didn't change, this is a no op.
@@ -62,7 +72,7 @@
         ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
         TextView tv = (TextView) view.findViewById(R.id.label);
 
-        tv.setText(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
+        tv.setText(getTitle(cursor, context));
         if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0) {
             // folder
             thumb.setImageResource(R.drawable.thumb_bookmark_widget_folder_holo);
@@ -89,7 +99,7 @@
         ImageView favicon = (ImageView) view.findViewById(R.id.favicon);
         TextView tv = (TextView) view.findViewById(R.id.label);
 
-        tv.setText(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
+        tv.setText(getTitle(cursor, context));
         if (cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0) {
             // folder
             favicon.setImageResource(R.drawable.ic_folder_holo_dark);
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index da60fda..2c8a27a 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -37,7 +37,6 @@
 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;
@@ -285,8 +284,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/Controller.java b/src/com/android/browser/Controller.java
index 9861184..fcbe387 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -788,8 +788,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 +1589,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,14 +1623,11 @@
                 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:
@@ -1703,9 +1699,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 +1731,34 @@
         return 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 +1965,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/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 128304c..ed96257 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();
             }
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index a1f70da..153533b 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -52,7 +52,7 @@
     private static final String LOGTAG = "PhoneUi";
     private static final int MSG_INIT_NAVSCREEN = 100;
 
-    private PieControlPhone mPieControl;
+    private PieControl mPieControl;
     private NavScreen mNavScreen;
     private AnimScreen mAnimScreen;
     private NavigationBarPhone mNavigationBar;
@@ -268,7 +268,7 @@
         mUseQuickControls = useQuickControls;
         mTitleBar.setUseQuickControls(mUseQuickControls);
         if (useQuickControls) {
-            mPieControl = new PieControlPhone(mActivity, mUiController, this);
+            mPieControl = new PieControl(mActivity, mUiController, this);
             mPieControl.attachToContainer(mContentView);
         } else {
             if (mPieControl != null) {
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/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/Tab.java b/src/com/android/browser/Tab.java
index cfbd88a..9b5a675 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -1234,9 +1234,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);
             }
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/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 3c0de30..2f0c6a8 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -246,11 +246,6 @@
         showDropDown();
     }
 
-    void forceIme() {
-        mInputManager.focusIn(this);
-        mInputManager.showSoftInput(this, 0);
-    }
-
     void hideIME() {
         mInputManager.hideSoftInputFromWindow(getWindowToken(), 0);
     }
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 b372fab..391b83e 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -50,7 +50,7 @@
 
     private NavigationBarTablet mNavBar;
 
-    private PieControlXLarge mPieControl;
+    private PieControl mPieControl;
     private Handler mHandler;
 
     /**
@@ -86,7 +86,7 @@
         mTitleBar.setUseQuickControls(mUseQuickControls);
         if (useQuickControls) {
             checkTabCount();
-            mPieControl = new PieControlXLarge(mActivity, mUiController, this);
+            mPieControl = new PieControl(mActivity, mUiController, this);
             mPieControl.attachToContainer(mContentView);
         } else {
             mActivity.getActionBar().show();
@@ -230,10 +230,6 @@
         super.editUrl(clearInput);
     }
 
-    void stopEditingUrl() {
-        mTitleBar.getNavigationBar().stopEditingUrl();
-    }
-
     @Override
     protected void showTitleBar() {
         if (canShowTitleBar()) {
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/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 6121abc..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);
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);
     }
 }