diff --git a/res/layout-land/nav_screen.xml b/res/layout-land/nav_screen.xml
index 885bfd1..ba7ac26 100644
--- a/res/layout-land/nav_screen.xml
+++ b/res/layout-land/nav_screen.xml
@@ -20,12 +20,16 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@drawable/browser_background_holo" >
+    <com.android.browser.NavTabScroller
+        android:id="@+id/scroller"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
     <LinearLayout
         android:id="@+id/tabbar"
         android:orientation="horizontal"
         android:layout_width="match_parent"
-        android:layout_height="44dip"
-        android:layout_alignParentBottom="true"
+        android:layout_height="@dimen/toolbar_height"
+        android:layout_gravity="top"
         android:gravity="right"
         android:background="#C0404040">
         <ImageButton
@@ -54,9 +58,4 @@
             android:contentDescription="@string/accessibility_button_more"
             android:src="@drawable/ic_menu_overflow" />
     </LinearLayout>
-    <com.android.browser.NavTabGallery
-        android:id="@+id/scroller"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_above="@id/tabbar" />
 </RelativeLayout>
diff --git a/res/layout/anim_screen.xml b/res/layout/anim_screen.xml
index 399595e..0cdc931 100644
--- a/res/layout/anim_screen.xml
+++ b/res/layout/anim_screen.xml
@@ -20,13 +20,15 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
-    android:focusable="false">
+    android:focusable="false"
+    android:background="@drawable/browser_background_holo">
     <ImageView
         android:id="@+id/title"
         android:layout_width="match_parent"
         android:layout_height="@dimen/toolbar_height" />
     <ImageView
         android:id="@+id/content"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@color/white" />
 </LinearLayout>
diff --git a/res/layout/bookmarkthumbnailwidget.xml b/res/layout/bookmarkthumbnailwidget.xml
index 967e4c1..0bff98e 100644
--- a/res/layout/bookmarkthumbnailwidget.xml
+++ b/res/layout/bookmarkthumbnailwidget.xml
@@ -16,38 +16,28 @@
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingTop="0dip"
-    android:paddingBottom="3dip"
-    android:paddingLeft="0dip"
-    android:paddingRight="0dip">
+    android:layout_height="match_parent">
     <GridView
         android:id="@+id/bookmarks_list"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:numColumns="auto_fit"
         android:columnWidth="@dimen/widgetColumnWidth"
-        android:paddingTop="6dip"
-        android:paddingRight="7dip"
-        android:paddingLeft="7dip"
         android:stretchMode="columnWidth"
         android:horizontalSpacing="@dimen/widgetHorizontalSpacing"
         android:verticalSpacing="@dimen/widgetVerticalSpacing"
         android:drawSelectorOnTop="true"
         android:listSelector="@drawable/bookmark_widget_thumb_selector"
-        android:fadingEdgeLength="24dp"
-        android:scrollbarStyle="outsideOverlay"
         android:background="@drawable/bg_bookmarks_widget_holo" />
 
     <ImageButton
         android:id="@+id/app_shortcut"
-        android:layout_width="56dip"
-        android:layout_height="56dip"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         android:layout_alignParentBottom="true"
         android:layout_alignParentRight="true"
         android:layout_marginRight="4dip"
-        android:layout_marginBottom="6dip"
-        android:scaleType="centerInside"
+        android:layout_marginBottom="4dip"
         android:src="@mipmap/ic_launcher_browser"
         android:background="@drawable/bookmark_widget_thumb_selector"
         android:padding="4dip" />
diff --git a/res/layout/nav_screen.xml b/res/layout/nav_screen.xml
index baabcc7..ae0db1b 100644
--- a/res/layout/nav_screen.xml
+++ b/res/layout/nav_screen.xml
@@ -19,9 +19,8 @@
     android:id="@+id/nav_screen"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical"
     android:background="@drawable/browser_background_holo">
-    <com.android.browser.NavTabGallery
+    <com.android.browser.NavTabScroller
         android:id="@+id/scroller"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -30,7 +29,8 @@
         android:id="@+id/tabbar"
         android:orientation="horizontal"
         android:layout_width="match_parent"
-        android:layout_height="44dip"
+        android:layout_height="@dimen/toolbar_height"
+        android:layout_gravity="top"
         android:gravity="right"
         android:background="#C0404040">
         <ImageButton
diff --git a/res/menu/browser.xml b/res/menu/browser.xml
index 7d288c1..2b651c3 100644
--- a/res/menu/browser.xml
+++ b/res/menu/browser.xml
@@ -50,21 +50,30 @@
             android:icon="@drawable/ic_bookmarks_history_holo_dark"
             android:alphabeticShortcut="b"
             android:visible="@bool/menu_show_bookmarks" />
-        <item
-            android:id="@+id/share_page_menu_id"
-            android:title="@string/share_page"
-            android:icon="@drawable/ic_share_holo_dark"
-            android:alphabeticShortcut="s" />
-        <item
-            android:id="@+id/find_menu_id"
-            android:title="@*android:string/find_on_page"/>
-        <item
-            android:id="@+id/ua_desktop_menu_id"
-            android:checkable="true"
-            android:title="@string/ua_switcher_desktop" />
-        <item
-            android:id="@+id/save_snapshot_menu_id"
-            android:title="@string/menu_save_snapshot" />
+        <group
+            android:id="@+id/LIVE_MENU">
+            <item
+                android:id="@+id/share_page_menu_id"
+                android:title="@string/share_page"
+                android:icon="@drawable/ic_share_holo_dark"
+                android:alphabeticShortcut="s" />
+            <item
+                android:id="@+id/find_menu_id"
+                android:title="@*android:string/find_on_page"/>
+            <item
+                android:id="@+id/ua_desktop_menu_id"
+                android:checkable="true"
+                android:title="@string/ua_switcher_desktop" />
+            <item
+                android:id="@+id/save_snapshot_menu_id"
+                android:title="@string/menu_save_snapshot" />
+        </group>
+        <group
+            android:id="@+id/SNAPSHOT_MENU">
+            <item
+                android:id="@+id/snapshot_go_live"
+                android:title="@string/snapshot_go_live" />
+        </group>
         <item
             android:id="@+id/page_info_menu_id"
             android:title="@string/page_info" />
diff --git a/res/menu/snapshot_go_live.xml b/res/menu/snapshot_go_live.xml
deleted file mode 100644
index aa6b38e..0000000
--- a/res/menu/snapshot_go_live.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:id="@+id/snapshot_go_live"
-        android:title="@string/snapshot_go_live" />
-</menu>
-
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index e1c45b1..718f3ba 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -46,7 +46,7 @@
     <string name="ssl_untrusted" msgid="5369967226521102194">"ይህ ምስክር ከታማኝ ቦታ አይደለም።"</string>
     <string name="ssl_mismatch" msgid="558688832420069896">"የገፁ ስም የምስክሩን ስም አይዛመድም።"</string>
     <string name="ssl_expired" msgid="5739349389499575559">"ይህ ምስክር ጊዜው አልፏል"</string>
-    <string name="ssl_not_yet_valid" msgid="2893167846212645846">"ይህ ምስክር ገና ትክክል አይደለም።"</string>
+    <string name="ssl_not_yet_valid" msgid="2893167846212645846">"ይህምስክር ገና ትክክል አይደለም።"</string>
     <string name="ssl_date_invalid" msgid="3705563379257285534">"ይህ ምስክር ትክክለኛ ቀን አለው።"</string>
     <string name="ssl_invalid" msgid="9041704741505449967">"ይህ ምስክር ትክክል ያልሆነ ነው።"</string>
     <string name="ssl_unknown" msgid="5679243486524754571">"ያልታወቀ የምስክር ስህተት።"</string>
@@ -189,7 +189,7 @@
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"ግላዊነት&amp; ደህንነት"</string>
     <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"መሸጎጫ አጥራ"</string>
     <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"በአካባቢ የተሸጎጠ ይዘት እና የውሂብ ጎታዎችን አጥራ"</string>
-    <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"እዛው  አካባቢ የተሸጎጠ ይዘት እና የውሂብ ጎታዎች ይሰረዛሉ።"</string>
+    <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"እዛው አካባቢየተሸጎጠ ይዘት እና የውሂብ ጎታዎች ይሰረዛሉ።"</string>
     <string name="pref_privacy_cookies_title" msgid="6763274282214830526">"ኩኪዎች"</string>
     <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"ሁሉንም የውሂብ ኩኪ አጥራ"</string>
     <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"ሁሉንም የአሳሽ ኩኪዎች አጥራ"</string>
@@ -198,7 +198,7 @@
     <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"የአሳሹን ዳሰሳታሪክ አጥራ"</string>
     <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"የአሳሹ መዳሰሻ ታሪክ ይሰረዛል።"</string>
     <string name="pref_privacy_formdata_title" msgid="6549813837982050424">"የውሂብ ቅፅ"</string>
-    <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"ውሂቦች ቅፅ አጥራ"</string>
+    <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"ውሂቦችቅፅ አጥራ"</string>
     <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"ሁሉንም የተቀመጡ ውሂቦችቅፅ አጥራ"</string>
     <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"የተቀመጡ የውሂብ ቅፆች ሁሉ ይሰረዛሉ።"</string>
     <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"ይለፍቃሎች አጥራ"</string>
@@ -215,7 +215,7 @@
     <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"ለድረ ገፆች ተጠቃሚ ስሞች እና የይለፍ ቃሎች አስቀምጥ"</string>
     <string name="pref_security_save_form_data" msgid="1213669802810198893">"የቅፅውሂብ አስታውስ"</string>
     <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"ለኋላ አገልግሎት የተየብኩትን ውሂብ ቅፆች ላይ አስታውስ"</string>
-    <string name="pref_security_show_security_warning" msgid="8901135676266754559">"የደህንነት ማስጠንቀቂያዎች  አሳይ"</string>
+    <string name="pref_security_show_security_warning" msgid="8901135676266754559">"የደህንነት ማስጠንቀቂያዎች አሳይ"</string>
     <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"ከድረ ገፅ ደህንነት ጋር ችግር ካለማስጠንቀቂያ አሳይ"</string>
     <string name="pref_security_accept_cookies" msgid="3201367661925047989">"ኩኪዎች ተቀበል"</string>
     <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"ድረ ገፆች እንዲያስቀምጡ እና \"ኩኪ\" ውሂብ እንዲያነቡ ፍቀድ"</string>
@@ -242,7 +242,7 @@
     <item msgid="3840999588443167001">"ዝጋ"</item>
   </string-array>
     <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"ነባሪ አጉላ"</string>
-    <string name="pref_content_load_page" msgid="2219810141690955452">"በጠቅላይ ቅኝት ላይ ገፆች ክፈት"</string>
+    <string name="pref_content_load_page" msgid="2219810141690955452">"በጠቅላይ ቅኝት ላይ ገፆችክፈት"</string>
     <string name="pref_content_load_page_summary" msgid="8792093504054149369">"አዲስ የተከፈቱ ገፆችን በጠቅላይ ቅኝት አሳይ"</string>
     <string name="pref_extras_title" msgid="7075456173747370647">"ከፍተኛ"</string>
     <string name="pref_extras_website_settings" msgid="67866640052455549">"የድረ ገፅ ቅንብሮች"</string>
@@ -286,7 +286,7 @@
     <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"የውሂብ ተያያዥነት ችግር"</string>
     <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"የፋይሉ ችግር"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"አረጋግጥ"</string>
-    <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"ለማየት እየሞከሩ ያሉት ገፅ (\"POSTDATA\") ቀደም ብሎ የተረከበ ውሂብ ይዝዋል። ውሂቡን ድጋሚ ከላኩት፣ ማንኛውም በገፁ ቅፅ ላይ ያለ ርምጃ ይከናወናል(ለምሳሌ ፍለጋ ወይም የመስመር ላይ ግዢ) ይደገማል።"</string>
+    <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"ለማየት እየሞከሩ ያሉት ገፅ (\"POSTDATA\") ቀደም ብሎ የተረከበ ውሂብ ይዝዋል። ውሂቡን ድጋሚ ከላኩት፣ ማንኛውም በገፁ ቅፅላይ ያለ ርምጃ ይከናወናል(ለምሳሌ ፍለጋ ወይም የመስመር ላይ ግዢ) ይደገማል።"</string>
     <string name="loadSuspendedTitle" msgid="675991625288706944">"ምንም የአውታረመረብ ተያያዥ የለም"</string>
     <string name="loadSuspended" msgid="3133656588880851273">"አሳሽ ይህን ገፅ ማስገባት አልቻለም ምክያቱም የበይነመረብ ተያያዥነት የለም።"</string>
     <string name="clear_history" msgid="5998307092715979619">"ታሪክ አጥራ"</string>
@@ -317,7 +317,7 @@
     <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"ሁሉም <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> አውርዶች ከአውርድ ታሪክ ውስጥ ይቀሩ እና ይጠራሉ።"</string>
     <string name="download_delete_file" msgid="5330036497843073249">"ፋይሉ ይሰረዛል"</string>
     <string name="download_file_error_dlg_title" msgid="2693630283595384874">"ቦታ ሞልቷል"</string>
-    <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> ማውረድ አልተቻለም። "\n" ስልክዎ ላይ ትንሽ ቦታ ያስለቅቁ እና እንደገና ይሞክሩ።"</string>
+    <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> ማውረድ አልተቻለም።"\n" ስልክዎ ላይ ትንሽ ቦታ ያስለቅቁ እና እንደገና ይሞክሩ።"</string>
     <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"አውርድ አልተሳካም"</string>
     <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"የUSB ማከማቻ የለም"</string>
     <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"ምንም SD ካርድ የለም"</string>
@@ -338,7 +338,7 @@
     <string name="download_pending_network" msgid="6548714525679461053">"የውሂብ ትይይዝ በመጠበቅ ላይ..."</string>
     <string name="download_running_paused" msgid="6418029352085656495">"የውሂብ ትይይዝ በመጠበቅ ላይ..."</string>
     <string name="download_canceled" msgid="6057083743144492515">"አውርድ ቀርቷል።"</string>
-    <string name="download_not_acceptable" msgid="313769696131563652">"ማውረድ አልተቻለም። ይዘቱ በዚህ ስልክ ላይ አይታገዝም።"</string>
+    <string name="download_not_acceptable" msgid="313769696131563652">"ማውረድ አልተቻለም።ይዘቱ በዚህ ስልክ ላይ አይታገዝም።"</string>
     <string name="download_file_error" msgid="1206648050615176113">"አውርድ መጨረስ አልቻለም። ምንም በቂ ባዶ ቦታ የለም።"</string>
     <string name="download_length_required" msgid="9038605488460437406">"ማውረድ አልተቻለም። የአይነቱ መጠን መታወቅ አልቻለም።"</string>
     <string name="download_precondition_failed" msgid="8327584102874295580">"አውርድ ተስተጓጉሏል። መቀጠል አይችልም።"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index d49ae38..af79d83 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -342,7 +342,7 @@
     <string name="download_file_error" msgid="1206648050615176113">"Download kann nicht beendet werden, da nicht genügend Speicherplatz vorhanden ist."</string>
     <string name="download_length_required" msgid="9038605488460437406">"Download kann nicht gestartet werden, da die Größe des Elements nicht bestimmt werden kann."</string>
     <string name="download_precondition_failed" msgid="8327584102874295580">"Download wurde unterbrochen und kann nicht fortgesetzt werden."</string>
-    <string name="search_the_web" msgid="6046130189241962337">"Im Web suchen"</string>
+    <string name="search_the_web" msgid="6046130189241962337">"Web durchsuchen"</string>
     <string name="webstorage_outofspace_notification_title" msgid="1160474608059771788">"Browserspeicher voll"</string>
     <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Klicken Sie, um Speicherplatz freizugeben."</string>
     <string name="webstorage_clear_data_title" msgid="689484577124333977">"Gespeicherte Daten löschen"</string>
@@ -402,7 +402,7 @@
     <string name="accessibility_button_forward" msgid="1236827218480658168">"Weiter"</string>
     <string name="accessibility_button_refresh" msgid="1023441396241841313">"Seite aktualisieren"</string>
     <string name="accessibility_button_stop" msgid="6793644120043222148">"Laden der Seite anhalten"</string>
-    <string name="accessibility_button_addbookmark" msgid="4787844912630006181">"Seite als Lesezeichen speichern"</string>
+    <string name="accessibility_button_addbookmark" msgid="4787844912630006181">"Seite mit Lesezeichen versehen"</string>
     <string name="accessibility_button_search" msgid="5357014102136055376">"Suchen"</string>
     <string name="accessibility_button_voice" msgid="152016375096083337">"Sprachsuche starten"</string>
     <string name="accessibility_button_bookmarks" msgid="7435055677299151649">"Lesezeichen"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index e442691..24f8bb0 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -402,7 +402,7 @@
     <string name="accessibility_button_forward" msgid="1236827218480658168">"Maju"</string>
     <string name="accessibility_button_refresh" msgid="1023441396241841313">"Menyegarkan laman"</string>
     <string name="accessibility_button_stop" msgid="6793644120043222148">"Menghentikan pemuatan laman"</string>
-    <string name="accessibility_button_addbookmark" msgid="4787844912630006181">"Bookmark laman"</string>
+    <string name="accessibility_button_addbookmark" msgid="4787844912630006181">"Mem-bookmark laman"</string>
     <string name="accessibility_button_search" msgid="5357014102136055376">"Penelusuran"</string>
     <string name="accessibility_button_voice" msgid="152016375096083337">"Memulai penelusuran suara"</string>
     <string name="accessibility_button_bookmarks" msgid="7435055677299151649">"Mem-bookmark"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 92f2310..3cf5c6f 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -244,7 +244,7 @@
     <string name="pref_default_zoom_dialogtitle" msgid="6095974367125109021">"Масштаб по умолчанию"</string>
     <string name="pref_content_load_page" msgid="2219810141690955452">"Обзор страниц"</string>
     <string name="pref_content_load_page_summary" msgid="8792093504054149369">"Открывать страницы в мелком маштабе для ознакомления"</string>
-    <string name="pref_extras_title" msgid="7075456173747370647">"Расширенные"</string>
+    <string name="pref_extras_title" msgid="7075456173747370647">"Дополнительные функции"</string>
     <string name="pref_extras_website_settings" msgid="67866640052455549">"Настройки веб-сайтов"</string>
     <string name="pref_extras_website_settings_summary" msgid="1656771443223494406">"Дополнительные настройки для отдельных сайтов"</string>
     <string name="pref_extras_reset_default_title" msgid="3579760449455761762">"Сброс настроек"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 37a7d50..a5d1720 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -18,10 +18,10 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="application_name" msgid="1935869255545976415">" Kivinjari"</string>
     <string name="choose_upload" msgid="3649366287575002063">"Chagua faili ya kupakia"</string>
-    <string name="uploads_disabled" msgid="463761197575372994">"Upakiaji wa faili umelemazwa."</string>
+    <string name="uploads_disabled" msgid="463761197575372994">"Upakuzi wa faili umelemazwa."</string>
     <string name="new_tab" msgid="7971857320679510529">"Tabo mpya"</string>
     <string name="new_incognito_tab" msgid="3606197964239039478">"Kichupo fiche kipya"</string>
-    <string name="tab_bookmarks" msgid="2305793036003473653">"Alamisho"</string>
+    <string name="tab_bookmarks" msgid="2305793036003473653">"Vialamisho"</string>
     <string name="tab_most_visited" msgid="1077402532455000703">"Zilizotembelewa sana"</string>
     <string name="tab_history" msgid="1979267558744613746">"Historia"</string>
     <string name="tab_snapshots" msgid="4435852763803720588">"Kurasa zilizohifadhiwa"</string>
@@ -35,17 +35,17 @@
     <string name="cancel" msgid="3017274947407233702">"Ghairi"</string>
     <string name="ok" msgid="1509280796718850364">"Sawa"</string>
     <string name="title_bar_loading" msgid="7438217780834640678">"Inapakia…"</string>
-    <string name="page_info" msgid="4048529256302257195">"Maelezo ya ukurasa"</string>
-    <string name="page_info_view" msgid="5303490449842635158">"Tazama maelezo ya ukurasa"</string>
+    <string name="page_info" msgid="4048529256302257195">"Maezo ya ukurasa"</string>
+    <string name="page_info_view" msgid="5303490449842635158">"Angalia maelezo ya ukurasa"</string>
     <string name="page_info_address" msgid="2222306609532903254">"Anwani:"</string>
-    <string name="ssl_warnings_header" msgid="79744901983636370">"Kuna matatizo katika vyeti vya usalama vya tovuti hii."</string>
+    <string name="ssl_warnings_header" msgid="79744901983636370">"Kuna hitilafu kwa vyeti vya usalama katika tovuti hii."</string>
     <string name="ssl_continue" msgid="8031515015829358457">"Endelea"</string>
-    <string name="security_warning" msgid="6607795404322797541">"Ilani ya usalama"</string>
-    <string name="view_certificate" msgid="1472768887529093862">"Tazama cheti"</string>
+    <string name="security_warning" msgid="6607795404322797541">"Onyo la usalama"</string>
+    <string name="view_certificate" msgid="1472768887529093862">"Ona cheti"</string>
     <string name="ssl_go_back" msgid="4598951822061593819">"Rudi nyuma"</string>
-    <string name="ssl_untrusted" msgid="5369967226521102194">"Cheti hiki hakijatolewa na mamlaka ya kuaminika."</string>
+    <string name="ssl_untrusted" msgid="5369967226521102194">"Cheti hiki hakijatoka kwa mamlaka ya kuaminika"</string>
     <string name="ssl_mismatch" msgid="558688832420069896">"Jina la tovuti halioani na jina lililo katika cheti"</string>
-    <string name="ssl_expired" msgid="5739349389499575559">"Cheti hiki kimepitwa na muda"</string>
+    <string name="ssl_expired" msgid="5739349389499575559">"cheti hiki kimepitwa na muda"</string>
     <string name="ssl_not_yet_valid" msgid="2893167846212645846">"Bado cheti si sahihi"</string>
     <string name="ssl_date_invalid" msgid="3705563379257285534">"Cheti hiki kina tarehe batili."</string>
     <string name="ssl_invalid" msgid="9041704741505449967">"Hati hii ni batili."</string>
@@ -77,14 +77,14 @@
     <string name="open_bookmark" msgid="8473581305759935790">"Fungua"</string>
     <string name="remove_bookmark" msgid="8407495852801410891">"Futa  alamisho"</string>
     <string name="remove_from_bookmarks" msgid="4374080666576982775">"Ondoa kutoka kwa alamisho"</string>
-    <string name="remove_history_item" msgid="5021424935726728618">"Ondoa kwenye historia"</string>
+    <string name="remove_history_item" msgid="5021424935726728618">"Ondoa kwa historia"</string>
     <string name="set_as_homepage" msgid="4752937379414905560">"Weka uwe ukurasa wa nyumbani"</string>
-    <string name="bookmark_saved" msgid="2766434679871317557">"Imehifadhiwa kwa alamisho"</string>
+    <string name="bookmark_saved" msgid="2766434679871317557">"Imehifadhiwa kwa vialamisho"</string>
     <string name="bookmark_not_saved" msgid="700600955089376724">"Haiwezi kuhifadhi alamisho."</string>
     <string name="homepage_set" msgid="8768087280310966395">"Ukurasa wa nyumbani umewekwa."</string>
     <string name="bookmark_needs_title" msgid="6245900436119218187">"Alamisho lazima iwe na jina."</string>
     <string name="bookmark_needs_url" msgid="7809876865972755158">"Alamisho lazima iwe na mahali."</string>
-    <string name="bookmark_url_not_valid" msgid="6719785633980202419">"URL sio sahihi."</string>
+    <string name="bookmark_url_not_valid" msgid="6719785633980202419">"KISARA sio sahihi."</string>
     <string name="bookmark_cannot_save_url" msgid="791722768778386941">"URL hii haiwezi kualamishwa."</string>
     <string name="delete_bookmark" msgid="2422989994934201992">"Futa"</string>
     <string name="bookmark_page" msgid="6845189305130307274">"Alamisha ukurasa ulioonyeshwa mwisho"</string>
@@ -95,12 +95,12 @@
     <string name="open_all_in_new_window" msgid="455786763426575293">"Fungua zote kwenye vichupo vipya"</string>
     <string name="goto_dot" msgid="3895839050522602723">"Nenda"</string>
     <string name="select_dot" msgid="6299170761900561967">"Chagua maandishi"</string>
-    <string name="bookmarks" msgid="1961279134885867815">"Alamisho"</string>
+    <string name="bookmarks" msgid="1961279134885867815">"Vialamisho"</string>
     <string name="shortcut_bookmark" msgid="3974876480401135895">"Alamisho"</string>
     <string name="shortcut_bookmark_title" msgid="3072725276532691472">"Teua alamisho"</string>
     <string name="history" msgid="2451240511251410032">"Historia"</string>
     <string name="menu_view_download" msgid="2124570321712995120">"Vipakuzi"</string>
-    <string name="copy_page_url" msgid="7635062169011319208">"Nakili url ya kurasa"</string>
+    <string name="copy_page_url" msgid="7635062169011319208">"Nakili KISARA cha kurasa"</string>
     <string name="share_page" msgid="593756995297268343">"Shiriki ukurasa"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Hifadhi kwa usomaji wa nje ya mtandao"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Haikuweza kuhifadhi usomaji mkondoni."</string>
@@ -112,9 +112,9 @@
     <string name="contextmenu_savelink" msgid="5508554930832538184">"Hifadhi kiungo"</string>
     <string name="contextmenu_sharelink" msgid="5392275392280130331">"Shiriki kiungo"</string>
     <string name="contextmenu_copy" msgid="398860586635404030">"Nakala"</string>
-    <string name="contextmenu_copylink" msgid="5153657160294534270">"Nakili kingo cha URL"</string>
+    <string name="contextmenu_copylink" msgid="5153657160294534270">"Nakili kingo cha KISARA"</string>
     <string name="contextmenu_download_image" msgid="4243829645180686912">"Hifadhi picha"</string>
-    <string name="contextmenu_view_image" msgid="3870625602053600905">"Tazama picha"</string>
+    <string name="contextmenu_view_image" msgid="3870625602053600905">"Ona picha"</string>
     <string name="contextmenu_set_wallpaper" msgid="3691902960115350686">"Weka kama taswira"</string>
     <string name="contextmenu_dial_dot" msgid="5856550683415933806">"Piga…"</string>
     <string name="contextmenu_add_contact" msgid="3183511922223645716">"Ongeza anwani"</string>
@@ -123,14 +123,14 @@
     <string name="choosertitle_sharevia" msgid="4600490613341909086">"Shiriki kupitia"</string>
     <string name="clear" msgid="7070043081700011461">"Futa"</string>
     <string name="replace" msgid="4843033491070384047">"Badilisha"</string>
-    <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Alamisho"</string>
+    <string name="browser_bookmarks_page_bookmarks_text" msgid="6787605028726162673">"Vialamisho"</string>
     <string name="menu_preferences" msgid="6709237687234102240">"Mipangilio"</string>
     <string name="pref_content_title" msgid="722227111894838633">"Mipangilo ya maudhui ya ukurasa"</string>
     <string name="pref_content_load_images" msgid="2125616852957377561">"Pakia picha"</string>
     <string name="pref_content_load_images_summary" msgid="5055874125248398584">"Onyesha picha kwenye kurasa za wavuti"</string>
-    <string name="pref_content_block_popups" msgid="4158524847764470895">"Zuia madirisha ibukizi"</string>
+    <string name="pref_content_block_popups" msgid="4158524847764470895">"Zuia dukizo"</string>
     <string name="pref_content_javascript" msgid="4570972030299516843">"Wezesha JavaScript"</string>
-    <string name="pref_content_open_in_background" msgid="824123779725118663">"Fungua katika usuli"</string>
+    <string name="pref_content_open_in_background" msgid="824123779725118663">"Fungua katika onyesho"</string>
     <string name="pref_content_plugins" msgid="7231944644794301582">"Wezesha programu-jalizi"</string>
   <string-array name="pref_content_plugins_choices">
     <item msgid="6745108155096660725">"Imewashwa kila wakati"</item>
@@ -146,25 +146,25 @@
     <item msgid="844041670142910837">"Ukurasa uliopo"</item>
     <item msgid="4430498748295169195">"Ukurasa mtupu"</item>
     <item msgid="5747608191946904074">"Ukurasa chaguo-msingi"</item>
-    <item msgid="6092441301001006473">"Tovuti zilizotembelewa zaidi"</item>
+    <item msgid="6092441301001006473">"Wavuti uliotembelewa zaidi"</item>
     <item msgid="5021822752506507426">"Nyinginezo…"</item>
   </string-array>
-    <string name="pref_content_autofit" msgid="8260474534053660809">"Tosheza kwa kurasa kiotomatiki"</string>
+    <string name="pref_content_autofit" msgid="8260474534053660809">"Kuweka kiotomatiki kurasa"</string>
     <string name="pref_content_autofit_summary" msgid="4587831659894879986">"Fomati kurasa za wavuti ili zitoshee skrini"</string>
     <string name="pref_general_title" msgid="1946872771219249323">"Kawaida"</string>
     <string name="pref_general_sync_title" msgid="3138637035975860324">"Sawazisha"</string>
-    <string name="pref_general_autofill_title" msgid="547881256865816858">"Jaza kiotomatiki"</string>
+    <string name="pref_general_autofill_title" msgid="547881256865816858">"Jaza otomatiki"</string>
     <string name="pref_autofill_enabled" msgid="1015751713312396713">"Jaza fomu kiotomatiki"</string>
     <string name="pref_autofill_enabled_summary" msgid="422640696197018914">"Jaza fomu za wavuti kwa kobofya mara moja tu"</string>
-    <string name="pref_autofill_profile_editor" msgid="3864116896052437796">" Data ya kujaza kiotomatiki"</string>
-    <string name="pref_autofill_profile_editor_summary" msgid="3653552312512743181">"Ingiza na uhifadhi data ya kujaza sehemu za fomu kwenye wavuti kiotomatiki"</string>
+    <string name="pref_autofill_profile_editor" msgid="3864116896052437796">"Kujaza kiotomatiki data"</string>
+    <string name="pref_autofill_profile_editor_summary" msgid="3653552312512743181">"Ingiza na uhifadhi data ya kujaza kiotomatiki nyuga za fomu ya wavuti"</string>
     <string name="pref_autologin_title" msgid="2362827272595366379">"Ingia katika Google kiotomatiki"</string>
     <string name="pref_autologin_progress" msgid="8333244467048833461">"Kuingia kwa tovuti za Google kwa kutumia <xliff:g id="ID_1">%s</xliff:g>"</string>
     <string name="autologin_bar_text" msgid="3684581827167173371">"Ingia kama"</string>
     <string name="autologin_bar_login_text" msgid="3336615320510851879">"Ingia ndani"</string>
     <string name="autologin_bar_hide_text" msgid="3629355974385859580">"Ficha"</string>
     <string name="autologin_bar_error" msgid="7470001207395920811">"Haingeweza kuinga ndani"</string>
-    <string name="autofill_profile_editor_heading" msgid="8392952553626722083">"Ingiza data unayotaka kujaza kiotomatiki katika sehemu za wavuti unapoziguza."</string>
+    <string name="autofill_profile_editor_heading" msgid="8392952553626722083">"Ingiza data unayotaka kujaza kiotomatiki katika nyuga za wavuti unapoziguza."</string>
     <string name="autofill_profile_editor_name" msgid="8566130291459685955">"Jina kamili:"</string>
     <string name="autofill_profile_editor_email_address" msgid="7967585896612797173">"Barua pepe"</string>
     <string name="autofill_profile_editor_company_name" msgid="2813443159949210417">"Jina la kampuni:"</string>
@@ -184,22 +184,22 @@
     <string name="autofill_profile_editor_delete_profile" msgid="2754563301088418752">"Futa maelezo mafupi"</string>
     <string name="autofill_setup_dialog_title" msgid="1955613311837926540">"Sanidi kujaza kiotomatiki?"</string>
     <string name="autofill_setup_dialog_message" msgid="6605682320156223114">"Kivinjari kinaweza kukamilisha fomu za wavuti  kama hii kiotomatiki. Je, ungependa kuweka maelezo yako mafupi?"</string>
-    <string name="autofill_setup_dialog_negative_toast" msgid="6990737008936188620">"Kujaza kiotomatiki kila wakati kunaweza kusanidiwa kupitia Mipangilio ya Kivinjari."</string>
-    <string name="disable_autofill" msgid="8305901059849400354">"Zima uwezo wa kujaza kiotomatiki"</string>
+    <string name="autofill_setup_dialog_negative_toast" msgid="6990737008936188620">"Kujaza otomatiki kila wakati kunaweza kusanidiwa kupitia Mipangilio ya Kivinjari."</string>
+    <string name="disable_autofill" msgid="8305901059849400354">"Lemaza mjazo-otomatiki"</string>
     <string name="pref_privacy_security_title" msgid="3480313968942160914">"Faragha na Usalama"</string>
     <string name="pref_privacy_clear_cache" msgid="3380316479925886998">"Futa kache"</string>
     <string name="pref_privacy_clear_cache_summary" msgid="2216463577207991454">"Futa maudhui na hifadhidata zilizohifadhiwa kwenye simu"</string>
     <string name="pref_privacy_clear_cache_dlg" msgid="5541011591300753881">"Maudhui na hifadhidata zilizoakibishwa kwenye simu zitafutwa."</string>
     <string name="pref_privacy_cookies_title" msgid="6763274282214830526">"Kuki"</string>
-    <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Futa data yote ya vidakuzi"</string>
+    <string name="pref_privacy_clear_cookies" msgid="3095583579133780331">"Futa data zote za cookies"</string>
     <string name="pref_privacy_clear_cookies_summary" msgid="6962742063990677520">"Futa kuki zote za kivinjari"</string>
-    <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Vidakuzi vyote vitafutwa."</string>
+    <string name="pref_privacy_clear_cookies_dlg" msgid="552855688091432682">"Kuki zote zitafutwa."</string>
     <string name="pref_privacy_clear_history" msgid="8723795508825198477">"Futa historia"</string>
-    <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Futa historia ya kivinjari"</string>
-    <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Historia ya kivinjari itafutwa."</string>
+    <string name="pref_privacy_clear_history_summary" msgid="6868501330708940734">"Futa historia ya urambazi  wa kivinjari"</string>
+    <string name="pref_privacy_clear_history_dlg" msgid="544903007914753853">"Historia ya urambazi wa kivinjari itafutwa."</string>
     <string name="pref_privacy_formdata_title" msgid="6549813837982050424">"Data ya fomu"</string>
-    <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Futa data katika fomu"</string>
-    <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Futa data yote ya fomu iliyohifadhiwa"</string>
+    <string name="pref_privacy_clear_form_data" msgid="4232668196344383987">"Futa aina ya data"</string>
+    <string name="pref_privacy_clear_form_data_summary" msgid="1790390894719517167">"Futa aina zote za data iliyohifadhiwa"</string>
     <string name="pref_privacy_clear_form_data_dlg" msgid="4443621086781197928">"Data yote iliyohifadhiwa ya fomu itafutwa."</string>
     <string name="pref_privacy_clear_passwords" msgid="4750234112289277480">"Futa manenosiri"</string>
     <string name="pref_privacy_clear_passwords_summary" msgid="8856782718942903335">"Futa manenosiri yote yaliyohifadhiwa"</string>
@@ -208,17 +208,17 @@
     <string name="pref_privacy_enable_geolocation" msgid="1395040170290765686">"Wezesha mahali"</string>
     <string name="pref_privacy_enable_geolocation_summary" msgid="8437020934664306205">"Ruhusu tovuti kuomba ufikiaji mahali pako"</string>
     <string name="pref_privacy_clear_geolocation_access" msgid="6649680770030042980">"Futa ufikiaji mahali"</string>
-    <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Futa ufikiaji kwa tovuti zote"</string>
-    <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Futa ufikiaji mahali kwa tovuti zote"</string>
+    <string name="pref_privacy_clear_geolocation_access_summary" msgid="7750143359497314679">"Futa ufikiaji mahali kwa wavuti zote"</string>
+    <string name="pref_privacy_clear_geolocation_access_dlg" msgid="7327063124488827244">"Futa ufikiaji mahali kwa wavuti zote"</string>
     <string name="pref_security_passwords_title" msgid="5734190542383756711">"Manenosiri"</string>
     <string name="pref_security_remember_passwords" msgid="6492957683454529549">"Kumbuka manenosiri"</string>
     <string name="pref_security_remember_passwords_summary" msgid="256388703356349137">"Hifadhi majina ya mtumiaji na manenosiri ya tovuti"</string>
-    <string name="pref_security_save_form_data" msgid="1213669802810198893">"Kumbuka data ya fomu"</string>
-    <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Kumbuka fomu ya aina 1 ya data kwa matumizi ya baadaye"</string>
-    <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Onyesha ilani za usalama"</string>
+    <string name="pref_security_save_form_data" msgid="1213669802810198893">"Kumbuka fomu ya data"</string>
+    <string name="pref_security_save_form_data_summary" msgid="4994074685153708026">"Kumbuka fomu ya aina ya data I kwa matumizi ya baadaye"</string>
+    <string name="pref_security_show_security_warning" msgid="8901135676266754559">"Onyesha maonyo ya usalama"</string>
     <string name="pref_security_show_security_warning_summary" msgid="8968906112720511704">"Onyesha onyo kama kuna tatizo la usalama wa tovuti"</string>
-    <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Kubali vidakuzi"</string>
-    <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Ruhusu tovuti kuhifadhi na kusoma data ya \"vidakuzi\"."</string>
+    <string name="pref_security_accept_cookies" msgid="3201367661925047989">"Kubali kuki"</string>
+    <string name="pref_security_accept_cookies_summary" msgid="1465118934875026920">"Ruhusu tovuti kuhifadhi na kusoma data ya \"kuki\"."</string>
   <string-array name="pref_text_size_choices">
     <item msgid="4952686548944739548">"Dogo sana"</item>
     <item msgid="1950030433642671460">"Ndogo"</item>
@@ -226,7 +226,7 @@
     <item msgid="5043128215356351184">"Kubwa"</item>
     <item msgid="7201512237890458902">"Kubwa mno"</item>
   </string-array>
-    <string name="pref_min_font_size" msgid="8811125835817449131">"Ukubwa wa chini wa fonti"</string>
+    <string name="pref_min_font_size" msgid="8811125835817449131">"Wastani wa ukubwa wa fonti"</string>
     <string name="pref_min_font_size_value" msgid="2924708480509060209">"pt <xliff:g id="FONT_SIZE">%d</xliff:g>"</string>
     <string name="pref_text_zoom" msgid="8387229123479610157">"Kuza maandishi"</string>
     <string name="pref_force_userscalable" msgid="5641500562399892621">"Lazimishakuwezesha kukuza"</string>
@@ -252,7 +252,7 @@
     <string name="pref_extras_reset_default_summary" msgid="4247870778270414501">"Rejesha mipangilio chaguo-msingi"</string>
     <string name="pref_extras_reset_default_dlg" msgid="6640261575874704022">"Mipangilio zitarejeshwa kwa thamani chaguo-msingi"</string>
     <string name="pref_extras_reset_default_dlg_title" msgid="2250334970728938936">"Weka upya kwa chaguo-msingi"</string>
-    <string name="pref_development_title" msgid="3263854204533056480">"Tatua"</string>
+    <string name="pref_development_title" msgid="3263854204533056480">"Rekebisha"</string>
     <string name="pref_default_text_encoding" msgid="5742965543955558478">"Usimbaji maandishi"</string>
   <string-array name="pref_default_text_encoding_choices">
     <item msgid="7275223955790513818">"Kilatini-1 (ISO-8859-1)"</item>
@@ -269,13 +269,13 @@
     <string name="pref_font_size_category" msgid="6288925476811083551">"Ukubwa wa fonti"</string>
     <string name="pref_lab_title" msgid="5571091610359629423">"Maabara"</string>
     <string name="pref_lab_quick_controls" msgid="3267606522082281367">"Vidhibiti vya Haraka"</string>
-    <string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Badilisha kijipucha kutoka upembe wa kushoto hadi wakulia ili uweze kudhibiti kwa urahisina kuficha programuna sehemu za url"</string>
-    <string name="pref_use_instant_search" msgid="1119176077760723740">"Google Instant"</string>
-    <string name="pref_use_instant_search_summary" msgid="839320474961917522">"Tumia Google Instant unapotumia Utafutaji wa Google, ili kuonyesha matokeo unapoendelea kuchapa (hii inaweza kuongeza matumizi ya data)."</string>
+    <string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Badilisha kijipucha kutoka upembe wa kushoto hadi wakulia ili uweze kudhibiti kwa urahisina kuficha programuna sehemu za KISARA"</string>
+    <string name="pref_use_instant_search" msgid="1119176077760723740">"Google Moja kwa moja"</string>
+    <string name="pref_use_instant_search_summary" msgid="839320474961917522">"Tumia Google Moja kwa moja unapotumia Google Search, ili kuonyesha matokeo unapokiwaukichapisha (hii inaweza kuongeza kuongeza data inayotumika)"</string>
     <string name="pref_lab_fullscreen" msgid="8173609016657987973">"Skrini nzima"</string>
-    <string name="pref_lab_fullscreen_summary" msgid="6853711692160711419">"Tumia hali ya skrini nzima ili kuficha mwamba hali."</string>
+    <string name="pref_lab_fullscreen_summary" msgid="6853711692160711419">"Tumia modi ya skrini nzima ili kuficha mwamba hali."</string>
     <string name="pref_data_title" msgid="750316606686075162">"Udhibitii wa Kipimo-Data"</string>
-    <string name="pref_data_preload_title" msgid="4479320472980292873">"Matokeo ya utafutaji yanapakia awali"</string>
+    <string name="pref_data_preload_title" msgid="4479320472980292873">"Matokeo ya utafutaji yanapakia kabla"</string>
   <string-array name="pref_data_preload_choices">
     <item msgid="5180466923190095508">"kamwe"</item>
     <item msgid="1791664748778640002">"kwenye Wi-Fi tu"</item>
@@ -284,41 +284,41 @@
     <string name="pref_data_preload_summary" msgid="7488335627364473744">"Ruhusu kivinjari kipakie matokeo ya ubora wa juu awali katika usuli"</string>
     <string name="pref_data_preload_dialogtitle" msgid="8421297746110796536">"Matokea ya utafiti yanaandaliwa"</string>
     <string name="browserFrameNetworkErrorLabel" msgid="126892350904924893">"Tatizo la muunganisho wa data"</string>
-    <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Hitilafu katika faili"</string>
+    <string name="browserFrameFileErrorLabel" msgid="8063691502792670367">"Hitilafu na faili"</string>
     <string name="browserFrameFormResubmitLabel" msgid="2685923472682180360">"Thibitisha"</string>
     <string name="browserFrameFormResubmitMessage" msgid="2752182215695632138">"Ukurasa unaojaribu kuangalia una data ambayo imewasilishwa tayari (\"POSTDATA\"). Ukituma data tena, kitendo chochote ambacho fomu kwenye ukurasa ilitekeleza (kama vile utafutaji au ununuzi kwenye wavuti) kitarudiwa."</string>
     <string name="loadSuspendedTitle" msgid="675991625288706944">"Hakuna muunganisho wa mtandao"</string>
-    <string name="loadSuspended" msgid="3133656588880851273">"Kivinjari hakiwezi kupakia ukurasa huu kwa sababu hakuna muunganisho wa mtandao."</string>
+    <string name="loadSuspended" msgid="3133656588880851273">"Kivinjari hakiwezi kupakia ukurasa huu kwa sababu hakuna muunganisho wa mtandao"</string>
     <string name="clear_history" msgid="5998307092715979619">"Futa historia"</string>
     <string name="browser_history" msgid="1038987118290272525">"Kurasa zilizotembelewa hivi karibuni"</string>
     <string name="empty_history" msgid="8738772352308207274">"Historia ya kivinjari ni tupu."</string>
     <string name="go_home" msgid="3140773562046381164">"Nyumbani"</string>
     <string name="add_new_bookmark" msgid="8086367791400349049">"Ongeza alamisho..."</string>
     <string name="add_bookmark_short" msgid="3783984330998103735">"Ongeza"</string>
-    <string name="search_hint" msgid="4647356319916631820">"Tafuta au chapisha URL"</string>
+    <string name="search_hint" msgid="4647356319916631820">"Tafuta au chapisha KISARA"</string>
     <string name="search_button_text" msgid="5235226933877634410">"Nenda"</string>
-    <string name="search_settings_description" msgid="1422401062529014107">"Historia ya vialamisho na wavuti"</string>
+    <string name="search_settings_description" msgid="1422401062529014107">"Vialamisho na historia ya wavuti"</string>
     <string name="attention" msgid="3473639060042811244">"Zingatia"</string>
-    <string name="popup_window_attempt" msgid="2673111696288657989">"Tovuti hii inajaribu kufungua dirisha ibukizi."</string>
+    <string name="popup_window_attempt" msgid="2673111696288657989">"Tovuti hii inajaribu kufungua dirisha dukizi."</string>
     <string name="allow" msgid="1157313689171991335">"Ruhusu"</string>
     <string name="block" msgid="9172175889884707800">"Zuia"</string>
     <string name="too_many_windows_dialog_title" msgid="5709782301477380438">"Kikomo cha kichupo kimefikiwa"</string>
     <string name="too_many_windows_dialog_message" msgid="7417529754382308997">"Haikuweza kufungua kichupo kipya kwa sababu umefungua tayari idadi ya juu."</string>
-    <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Dirisha ibukizi tayari limefunguliwa"</string>
-    <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Haikuweza kufungua dirisha jipya ibukizi kwa sababu ni moja tu linaloweza kufunguliwa kwa wakati mmoja."</string>
-    <string name="download_title" msgid="2122874021047565594">"Historia ya upakuaji"</string>
+    <string name="too_many_subwindows_dialog_title" msgid="3805453941587725944">"Tayari dukizo imefunguliwa"</string>
+    <string name="too_many_subwindows_dialog_message" msgid="5827289829907966657">"Haikuweza kufungua dirisha jipya dukizi kwa sababu ni unaweza kufungua moja kwa wakati mmoja."</string>
+    <string name="download_title" msgid="2122874021047565594">"Historia ya upakuzi"</string>
     <string name="download_unknown_filename" msgid="4013465542563652175">"&lt;Haijulikani&gt;"</string>
     <string name="download_menu_open" msgid="4888327480367757513">"Fungua"</string>
-    <string name="download_menu_clear" msgid="6264454531553418124">"Futa kutoka kwenye orodha"</string>
+    <string name="download_menu_clear" msgid="6264454531553418124">"Futa kutoka kwa orodha"</string>
     <string name="download_menu_delete" msgid="8815502136393894148">"Futa"</string>
     <string name="download_menu_cancel" msgid="2545333007601851574">"Ghairi kupakua"</string>
     <string name="download_menu_cancel_all" msgid="2136550823151999166">"Ghairi vipakuliwa vyote"</string>
-    <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Ghairi upakuaji"</string>
-    <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Vipakuzi vyote <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> vitaghairiwa na kufutwa kutoka kwenye historia ya upakuaji."</string>
+    <string name="download_cancel_dlg_title" msgid="8909108500262799748">"Ghairi vipakuliwa"</string>
+    <string name="download_cancel_dlg_msg" msgid="6285389170052357797">"Vipakuzi <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> vyote vitaghairiwa na kufutwa kutoka historia ya upakuzi."</string>
     <string name="download_delete_file" msgid="5330036497843073249">"Faili itafutwa"</string>
     <string name="download_file_error_dlg_title" msgid="2693630283595384874">"Hakuna nafasi"</string>
     <string name="download_file_error_dlg_msg" msgid="5156405410324072471">"<xliff:g id="FILENAME">%s</xliff:g> haikuweza kupakuliwa."\n" Futa vitu kadhaa upate nafasi kwenye simu yako kisha ujaribu tena."</string>
-    <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Upakuaji haujafanikiwa"</string>
+    <string name="download_failed_generic_dlg_title" msgid="6106781095337833391">"Upakuzi hujafanikiwa"</string>
     <string name="download_no_sdcard_dlg_title" product="nosdcard" msgid="56777245081568508">"Hifadhi ya USB haipatikani"</string>
     <string name="download_no_sdcard_dlg_title" product="default" msgid="605904452159416792">"Hakuna kadi ya SD"</string>
     <string name="download_no_sdcard_dlg_msg" product="nosdcard" msgid="3144652102051031721">"Hifadhi ya USB inahitajika ili kupakua <xliff:g id="FILENAME">%s</xliff:g>."</string>
@@ -326,18 +326,18 @@
     <string name="download_sdcard_busy_dlg_title" product="nosdcard" msgid="8081445664689818973">"Hifadhi ya USB haipatikani"</string>
     <string name="download_sdcard_busy_dlg_title" product="default" msgid="6877712666046917741">"Kadi ya SD haipatikani"</string>
     <string name="download_sdcard_busy_dlg_msg" product="nosdcard" msgid="3979329954835690147">"Hifadhi ya USB ina shughuli. Ili kuruhusu vipakuzi, chagua \"Zima hifadhi ya USB\" katika arifa."</string>
-    <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Kadi ya SD inatumika. Kuruhusu vipakuzi, chagua \"Zima hifadhi ya USB\" katika arifa."</string>
-    <string name="cannot_download" msgid="8150552478556798780">"Inaweza kupakua tu URLs za \"http\" au \"https\"."</string>
+    <string name="download_sdcard_busy_dlg_msg" product="default" msgid="3473883538192835204">"Kadi ya SD inayumika. Kuruhusu vipakuzi, chagua \"Zima hifadhi ya USB\" katika arifa."</string>
+    <string name="cannot_download" msgid="8150552478556798780">"Inaweza kupakua tu VISARA vya \"http\" au \"https\"."</string>
     <string name="download_no_application_title" msgid="1286056729168874295">"Haiwezi kufungua faili"</string>
     <string name="retry" msgid="1835923075542266721">"Jaribu tena"</string>
-    <string name="no_downloads" msgid="3947445710685021498">"Historia ya upakuaji haina chochote."</string>
-    <string name="download_error" msgid="413496839831257187">"Upakuaji haukufaulu."</string>
+    <string name="no_downloads" msgid="3947445710685021498">"Historia ya upakuzi haina chochote."</string>
+    <string name="download_error" msgid="413496839831257187">"Kupakua hakujafanikiwa."</string>
     <string name="download_success" msgid="2279041638155595203">"Upakuzi <xliff:g id="FILE">%s</xliff:g> umekamilika."</string>
     <string name="download_running" msgid="2622942231322015059">"Inapakua…"</string>
-    <string name="download_pending" msgid="2599683668575349559">"Inaanza kupakua..."</string>
-    <string name="download_pending_network" msgid="6548714525679461053">"Inasubiri muunganisho wa data..."</string>
+    <string name="download_pending" msgid="2599683668575349559">"Inaanza kupakua"</string>
+    <string name="download_pending_network" msgid="6548714525679461053">"Inasubiri muunganisho wa data"</string>
     <string name="download_running_paused" msgid="6418029352085656495">"Inasubiri muunganisho wa data"</string>
-    <string name="download_canceled" msgid="6057083743144492515">"Upakuaji umeghairiwa."</string>
+    <string name="download_canceled" msgid="6057083743144492515">"Kupakua kumeghairiwa."</string>
     <string name="download_not_acceptable" msgid="313769696131563652">"Haiwezi kupakua. Maudhui hayahimiliwi kwenye simu hii."</string>
     <string name="download_file_error" msgid="1206648050615176113">"Haiwezi kukamilisha kupakua. Hakuna nafasi ya kutosha."</string>
     <string name="download_length_required" msgid="9038605488460437406">"Haiwezi kupakua. Ukubwa wa kipengee hauwezi kutathminiwa."</string>
@@ -347,12 +347,12 @@
     <string name="webstorage_outofspace_notification_text" msgid="7341075135051829692">"Bofya ili kupata nafasi."</string>
     <string name="webstorage_clear_data_title" msgid="689484577124333977">"Futa data iliyohifadhiwa"</string>
     <string name="webstorage_clear_data_dialog_title" msgid="345457466368974706">"Futa data iliyohifadhiwa"</string>
-    <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Data zote zilizohifadhiwa na wavuti hii itafutwa"</string>
+    <string name="webstorage_clear_data_dialog_message" msgid="6678281256970470125">"Data yote iliyohifadhiwa na wavuti huu itafutwa"</string>
     <string name="webstorage_clear_data_dialog_ok_button" msgid="2516563534211898636">"Futa zote"</string>
     <string name="webstorage_clear_data_dialog_cancel_button" msgid="2028867751958942762">"Ghairi"</string>
     <string name="webstorage_origin_summary_mb_stored" msgid="1985885826292236210">"MB imehifadhiwa kwenye simu yako"</string>
     <string name="loading_video" msgid="4887871585216091096">"Inapakia video"</string>
-    <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> anataka kujua eneo lako"</string>
+    <string name="geolocation_permissions_prompt_message" msgid="356796102004052471">"<xliff:g id="WEBSITE_ORIGIN">%s</xliff:g> anataka kujua mahali uliko"</string>
     <string name="geolocation_permissions_prompt_share" msgid="9084486342048347976">"Shiriki mahali"</string>
     <string name="geolocation_permissions_prompt_dont_share" msgid="6303025160237860300">"Kataa"</string>
     <string name="geolocation_permissions_prompt_remember" msgid="3118526300707348308">"Kumbuka mapendeleo"</string>
@@ -362,12 +362,12 @@
     <string name="geolocation_settings_page_summary_allowed" msgid="9180251524290811398">"Tovuti hii kwa sasa inaweza kufikia mahali ulipo"</string>
     <string name="geolocation_settings_page_summary_not_allowed" msgid="4589649082203102544">"Tovuti hii kwa sasa haiwezi kufikia mahali ulipo"</string>
     <string name="geolocation_settings_page_dialog_title" msgid="1549842043381347668">"Futa ufikiaji mahali"</string>
-    <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Uwezo wa tovuti tovuti hii kufika eneo lako utafutwa"</string>
+    <string name="geolocation_settings_page_dialog_message" msgid="7586671987576403993">"Mfikio wa tovuti hii kufikia mahali ulipo utafutwa"</string>
     <string name="geolocation_settings_page_dialog_ok_button" msgid="4789434178048077287">"Futa ufikiaji"</string>
     <string name="geolocation_settings_page_dialog_cancel_button" msgid="7941036504673409747">"Ghairi"</string>
     <string name="website_settings_clear_all" msgid="8739804325997655980">"Futa zote"</string>
     <string name="website_settings_clear_all_dialog_title" msgid="7791826325122461718">"Futa mipangilio yote ya tovuti?"</string>
-    <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Data zote za wavuti na vibali vya mahali vitafutwa."</string>
+    <string name="website_settings_clear_all_dialog_message" msgid="6150502090601476333">"Data ya wavuti zote na vibali vya mahali vitafutwa."</string>
     <string name="website_settings_clear_all_dialog_ok_button" msgid="6401582240627669431">"Futa data yote"</string>
     <string name="website_settings_clear_all_dialog_cancel_button" msgid="1896757051856611674">"Ghairi"</string>
     <string name="progress_dialog_setting_wallpaper" msgid="4871900779338536674">"Inapangilia taswira..."</string>
@@ -376,21 +376,21 @@
     <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>
-    <string name="import_bookmarks_dialog_description" msgid="1942452375564381488">"Alamisho kwenye kifaa hiki bado haihusishwi na akaunti ya Google. Hifadhi alamisho hii kwa kuiongeza kwa akaunti. Futa alamisho hii ikiwa hautaki kuisawazishwa."</string>
-    <string name="import_bookmarks_dialog_select_add_account" msgid="3102882579089291099">"Ongeza alamisho vilivyo kwenye kifaa hiki sasa na unze kusawazisha na Akaunti ya Google"</string>
-    <string name="import_bookmarks_dialog_delete_select_account" msgid="5192284761080626386">"Futa alamisho iliyo sasa kwenye kifaa hiki na uanze usawazishaji na Akaunti ya Google"</string>
-    <string name="import_bookmarks_dialog_confirm_delete" msgid="8854001080444749211">"Futa alamisho vilivyo katika kifaa hiki sasa  uanze kusawazisha alamisho na <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
-    <string name="import_bookmarks_dialog_confirm_add" msgid="5433677293195372675">"Ongeza alamisho vilivyo kwenye kifaa hiki sasa na anza kusawazisha alamisho na <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>."</string>
-    <string name="import_bookmarks_dialog_remove" msgid="5984607822851800902">"Futa alamisho"</string>
+    <string name="import_bookmarks_dialog_description" msgid="1942452375564381488">"Vialamisho kwenye kifaa hiki bado havihusishwi na akaunti ya Google. Hifadhi vialamisho hivi kwa kuviongeza kwa akaunti. futa vialamisho hivi ikiwa hutaki kuvisawazishwa."</string>
+    <string name="import_bookmarks_dialog_select_add_account" msgid="3102882579089291099">"Ongeza vialamisho vilivyo kwenye kifaa hiki sasa na anza kusawazisha na Akaunti ya Google"</string>
+    <string name="import_bookmarks_dialog_delete_select_account" msgid="5192284761080626386">"Futa vialamisho vilivyo sasa kwenye kifaa hiki na uanze usawazishaji na Akaunti ya Google"</string>
+    <string name="import_bookmarks_dialog_confirm_delete" msgid="8854001080444749211">"Futa vialamisho vilivyo katika kifaa hiki sasa  anza kusawazisha vialamisho na <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
+    <string name="import_bookmarks_dialog_confirm_add" msgid="5433677293195372675">"Ongeza vialamisho vilivyo kwenye kifaa hiki sasa na anza kusawazisha vialamisho na <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>."</string>
+    <string name="import_bookmarks_dialog_remove" msgid="5984607822851800902">"Futa vialamisho"</string>
     <string name="import_bookmarks_wizard_next" msgid="7578143961884352676">"Ifuatayo"</string>
     <string name="import_bookmarks_wizard_previous" msgid="8551440353688257031">"Iliyotangulia"</string>
     <string name="import_bookmarks_wizard_cancel" msgid="4936061122806506634">"Ghairi"</string>
     <string name="import_bookmarks_wizard_done" msgid="1446247092194489191">"Kwisha"</string>
-    <string name="import_bookmarks_dialog_add" msgid="7552306756868669353">"Ongeza alamisho kwenye Akaunti ya Google"</string>
+    <string name="import_bookmarks_dialog_add" msgid="7552306756868669353">"Ongeza vialamisho kwenye Akaunti ya Google"</string>
     <string name="import_bookmarks_dialog_import" msgid="6933613853573899218">"Ongeza alamamisho zako za Android kwa alamisho za <xliff:g id="GOOGLE_ACCOUNT">%s</xliff:g>"</string>
     <string name="menu_share_url" msgid="5851814357333739700">"Shiriki"</string>
     <string name="max_tabs_warning" msgid="4122034303809457570">"Hakuna vichupo zaidi vinavyopatikana"</string>
-    <string name="instant_search_label" msgid="8769284297650716935">"Google Instant (Majaribio)"</string>
+    <string name="instant_search_label" msgid="8769284297650716935">"(Maabara) Google Moja kwa moja"</string>
     <string name="preview" msgid="6450823514561689038">"Hakiki"</string>
     <string name="local_bookmarks" msgid="533816851415228520">"Ya nchini"</string>
     <string name="ua_switcher_desktop" msgid="220097077327558435">"Omba tovuti ya eneo kazi"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 14ee991..5f7e273 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -101,7 +101,7 @@
     <string name="history" msgid="2451240511251410032">"Umlando"</string>
     <string name="menu_view_download" msgid="2124570321712995120">"Okulayishiwe"</string>
     <string name="copy_page_url" msgid="7635062169011319208">"Kopisha i-url yekhasi"</string>
-    <string name="share_page" msgid="593756995297268343">"Yabelana ngekhasi"</string>
+    <string name="share_page" msgid="593756995297268343">"Yabelana nekhasi"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Gcina ukufunda ungaxhumekile kwi-inthanethi"</string>
     <string name="snapshot_failed" msgid="4584580873565876033">"Angikwazanga ukulondolozela ukufunda ngaphandle kwe-inthanethi."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> amabhukimakhi"</string>
@@ -110,7 +110,7 @@
     <string name="contextmenu_openlink_newwindow" msgid="1205313604181761403">"Vula kwisithikithana esitsha"</string>
     <string name="contextmenu_openlink_newwindow_background" msgid="4690381019116746687">"Vula kwisithikithana sangemuva"</string>
     <string name="contextmenu_savelink" msgid="5508554930832538184">"Londoloza isihlanganisi"</string>
-    <string name="contextmenu_sharelink" msgid="5392275392280130331">"Yabelana ngesihlanganisi"</string>
+    <string name="contextmenu_sharelink" msgid="5392275392280130331">"Yabelana nesihlanganisi"</string>
     <string name="contextmenu_copy" msgid="398860586635404030">"Kopisha"</string>
     <string name="contextmenu_copylink" msgid="5153657160294534270">"Kopisha isihlanganisi se-URL"</string>
     <string name="contextmenu_download_image" msgid="4243829645180686912">"Londoloza isithombe"</string>
@@ -270,7 +270,7 @@
     <string name="pref_lab_title" msgid="5571091610359629423">"Amalebhu"</string>
     <string name="pref_lab_quick_controls" msgid="3267606522082281367">"Izilawuli ezisheshayo"</string>
     <string name="pref_lab_quick_controls_summary" msgid="1564546156544675707">"Swayipha isithupha kusuka ekucupheleni okwesobunxele kuya kokwesokudla ukuze ufinyelele izimpathi ngokushesha bese ufihla izinhlelo zokusebenza namabha e-URL."</string>
-    <string name="pref_use_instant_search" msgid="1119176077760723740">"Google Instant"</string>
+    <string name="pref_use_instant_search" msgid="1119176077760723740">"I-Google Instant"</string>
     <string name="pref_use_instant_search_summary" msgid="839320474961917522">"Sebenzisa i-Google Instant uma usebenzisa Usesho lwe-Google, ukubonisa imiphumelo njengoba uthayipha (lokhu kungakhuphula ukusetshenziswa kwedatha)."</string>
     <string name="pref_lab_fullscreen" msgid="8173609016657987973">"Isikrini esigcwele"</string>
     <string name="pref_lab_fullscreen_summary" msgid="6853711692160711419">"Sebenzisa imodi yesikrini esiphelele ukuze ufihle umudwa ochaza ngesimo."</string>
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
index 3a25e4e..5652451 100644
--- a/res/values/dimensions.xml
+++ b/res/values/dimensions.xml
@@ -50,7 +50,7 @@
     <dimen name="widgetThumbnailHeight">94dip</dimen>
     <dimen name="widgetHorizontalSpacing">6dip</dimen>
     <dimen name="widgetVerticalSpacing">6dip</dimen>
-    <dimen name="widgetColumnWidth">90dip</dimen>
+    <dimen name="widgetColumnWidth">80dip</dimen>
     <!-- For the combined Bookmarks History view -->
     <dimen name="combo_paddingTop">0dip</dimen>
     <dimen name="combo_horizontalSpacing">6dip</dimen>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index c9cb170..361702e 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -21,9 +21,9 @@
     <style name="BrowserTheme" parent="@android:Theme.Holo">
         <item name="android:windowBackground">@color/white</item>
         <item name="android:colorBackground">#FFFFFFFF</item>
-        <item name="android:windowActionBar">true</item>
-        <item name="android:windowNoTitle">false</item>
-        <item name="android:windowActionBarOverlay">false</item>
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowActionModeOverlay">true</item>
         <item name="android:actionBarStyle">@style/ActionBarStyle</item>
     </style>
     <style name="DialogWhenLarge" parent="@android:style/Theme.Holo.DialogWhenLarge" >
diff --git a/res/xml-sw600dp/bookmarkthumbnailwidget_info.xml b/res/xml-sw600dp/bookmarkthumbnailwidget_info.xml
index 99afda7..7fdcbef 100644
--- a/res/xml-sw600dp/bookmarkthumbnailwidget_info.xml
+++ b/res/xml-sw600dp/bookmarkthumbnailwidget_info.xml
@@ -17,10 +17,10 @@
 <!-- 3x3 Widget displaying the user's bookmarks as a list with favicons. -->
 <appwidget-provider
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:minWidth="219dip"
-    android:minHeight="219dip"
-    android:minResizeHeight="72dip"
-    android:minResizeWidth="146dip"
+    android:minWidth="180dip"
+    android:minHeight="180dip"
+    android:minResizeHeight="40dip"
+    android:minResizeWidth="110dip"
     android:updatePeriodMillis="0"
     android:previewImage="@drawable/browser_widget_preview"
     android:initialLayout="@layout/bookmarkthumbnailwidget"
diff --git a/res/xml/bookmarkthumbnailwidget_info.xml b/res/xml/bookmarkthumbnailwidget_info.xml
index bf2e612..f8ca797 100644
--- a/res/xml/bookmarkthumbnailwidget_info.xml
+++ b/res/xml/bookmarkthumbnailwidget_info.xml
@@ -17,10 +17,10 @@
 <!-- 3x2 Widget displaying the user's bookmarks as a list with favicons. -->
 <appwidget-provider
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:minWidth="219dip"
-    android:minHeight="146dip"
-    android:minResizeHeight="72dip"
-    android:minResizeWidth="146dip"
+    android:minWidth="180dip"
+    android:minHeight="110dip"
+    android:minResizeHeight="40dip"
+    android:minResizeWidth="110dip"
     android:updatePeriodMillis="0"
     android:previewImage="@drawable/browser_widget_preview"
     android:initialLayout="@layout/bookmarkthumbnailwidget"
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 27f6ef8..da60fda 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -422,7 +422,6 @@
             return true;
         }
 
-        // TODO: Folder stuff
         if (isFolder) {
             String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
             Uri uri = ContentUris.withAppendedId(
@@ -431,6 +430,7 @@
             if (crumbs != null) {
                 // update crumbs
                 crumbs.pushView(title, uri);
+                crumbs.setVisibility(View.VISIBLE);
             }
             loadFolder(groupPosition, uri);
         }
@@ -563,6 +563,11 @@
             uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
         }
         loadFolder(groupPosition, uri);
+        if (level <= 1) {
+            view.setVisibility(View.GONE);
+        } else {
+            view.setVisibility(View.VISIBLE);
+        }
     }
 
     /**
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 6b8daec..cfaa18a 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -25,6 +25,7 @@
 import android.os.Message;
 import android.preference.PreferenceManager;
 import android.provider.Browser;
+import android.util.DisplayMetrics;
 import android.webkit.CookieManager;
 import android.webkit.GeolocationPermissions;
 import android.webkit.WebIconDatabase;
@@ -104,6 +105,7 @@
     private WeakHashMap<WebSettings, String> mCustomUserAgents;
     private static boolean sInitialized = false;
     private boolean mNeedsSharedSync = true;
+    private float mFontSizeMult = 1.0f;
 
     // Cached values
     private int mPageCacheCapacity = 1;
@@ -158,6 +160,8 @@
 
         @Override
         public void run() {
+            DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
+            mFontSizeMult = metrics.scaledDensity / metrics.density;
             // the cost of one cached page is ~3M (measured using nytimes.com). For
             // low end devices, we only cache one page. For high end devices, we try
             // to cache more pages, currently choose 5.
@@ -522,9 +526,9 @@
         return rawValue;
     }
 
-    public static int getAdjustedTextZoom(int rawValue) {
+    public int getAdjustedTextZoom(int rawValue) {
         rawValue = (rawValue - TEXT_ZOOM_START_VAL) * TEXT_ZOOM_STEP;
-        return rawValue + 100;
+        return (int) ((rawValue + 100) * mFontSizeMult);
     }
 
     static int getRawTextZoom(int percent) {
diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java
index 2042ccf..b763cf1 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -121,4 +121,9 @@
         mOnScrollChangedListener = listener;
     }
 
+    @Override
+    public boolean showContextMenuForChild(View originalView) {
+        return false;
+    }
+
 }
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 3533bf1..aa7ecd9 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -211,8 +211,6 @@
     private ContentObserver mBookmarksObserver;
     private CrashRecoveryHandler mCrashRecoveryHandler;
 
-    private boolean mSimulateActionBarOverlayMode;
-
     private boolean mBlockEvents;
 
     public Controller(Activity browser, boolean preloadCrashState) {
@@ -251,7 +249,6 @@
         mSystemAllowGeolocationOrigins.start();
 
         openIconDatabase();
-        mSimulateActionBarOverlayMode = !BrowserActivity.isTablet(mActivity);
     }
 
     void start(final Bundle icicle, final Intent intent) {
@@ -803,9 +800,6 @@
             resumeWebViewTimers(tab);
         }
         mLoadStopped = false;
-        if (!mNetworkHandler.isNetworkUp()) {
-            mNetworkHandler.createAndShowNetworkDialog();
-        }
         endActionMode();
 
         mUi.onTabDataChanged(tab);
@@ -1245,10 +1239,6 @@
         }
         MenuInflater inflater = mActivity.getMenuInflater();
         inflater.inflate(R.menu.browser, menu);
-        updateInLoadMenuItems(menu);
-        // hold on to the menu reference here; it is used by the page callbacks
-        // to update the menu based on loading state
-        mCachedMenu = menu;
         return true;
     }
 
@@ -1432,6 +1422,10 @@
     }
 
     boolean onPrepareOptionsMenu(Menu menu) {
+        updateInLoadMenuItems(menu);
+        // hold on to the menu reference here; it is used by the page callbacks
+        // to update the menu based on loading state
+        mCachedMenu = menu;
         // Note: setVisible will decide whether an item is visible; while
         // setEnabled() will decide whether an item is enabled, which also means
         // whether the matching shortcut key will function.
@@ -1462,11 +1456,13 @@
         boolean canGoForward = false;
         boolean isHome = false;
         boolean isDesktopUa = false;
+        boolean isLive = false;
         if (tab != null) {
             canGoBack = tab.canGoBack();
             canGoForward = tab.canGoForward();
             isHome = mSettings.getHomePage().equals(tab.getUrl());
             isDesktopUa = mSettings.hasDesktopUseragent(tab.getWebView());
+            isLive = !tab.isSnapshot();
         }
         final MenuItem back = menu.findItem(R.id.back_menu_id);
         back.setEnabled(canGoBack);
@@ -1483,6 +1479,7 @@
             dest.setTitle(source.getTitle());
             dest.setIcon(source.getIcon());
         }
+        menu.setGroupVisible(R.id.NAV_MENU, isLive);
 
         // decide whether to show the share link option
         PackageManager pm = mActivity.getPackageManager();
@@ -1503,6 +1500,8 @@
         counter.setEnabled(showDebugSettings);
         final MenuItem uaSwitcher = menu.findItem(R.id.ua_desktop_menu_id);
         uaSwitcher.setChecked(isDesktopUa);
+        menu.setGroupVisible(R.id.LIVE_MENU, isLive);
+        menu.setGroupVisible(R.id.SNAPSHOT_MENU, !isLive);
 
         mUi.updateMenuState(tab, menu);
     }
@@ -1620,6 +1619,10 @@
                 mPageDialogsHandler.showPageInfo(mTabControl.getCurrentTab(), false, null);
                 break;
 
+            case R.id.snapshot_go_live:
+                goLive();
+                return true;
+
             case R.id.classic_history_menu_id:
                 bookmarksOrHistoryPicker(true);
                 break;
@@ -1687,6 +1690,11 @@
         return true;
     }
 
+    private void goLive() {
+        Tab t = getCurrentTab();
+        t.loadUrl(t.getUrl(), null);
+    }
+
     public boolean onContextItemSelected(MenuItem item) {
         // Let the History and Bookmark fragments handle menus they created.
         if (item.getGroupId() == R.id.CONTEXT_MENU) {
@@ -1805,15 +1813,6 @@
     void onActionModeStarted(ActionMode mode) {
         mUi.onActionModeStarted(mode);
         mActionMode = mode;
-        if (mSimulateActionBarOverlayMode && !mUi.isEditingUrl()) {
-            WebView web = getCurrentWebView();
-            // Simulate overlay mode by scrolling the webview the amount it will be
-            // pushed down. Actual overlay mode doesn't work for us as otherwise
-            // the CAB will, well, overlay the content, which breaks things like
-            // find on page.
-            int scrollBy = getActionModeHeight();
-            web.scrollBy(0, scrollBy);
-        }
     }
 
     /*
@@ -1842,11 +1841,6 @@
         if (!isInCustomActionMode()) return;
         mUi.onActionModeFinished(mInLoad);
         mActionMode = null;
-        if (mSimulateActionBarOverlayMode) {
-            WebView web = getCurrentWebView();
-            int scrollBy = getActionModeHeight();
-            web.scrollBy(0, -scrollBy);
-        }
     }
 
     boolean isInLoad() {
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index 768f9ba..1626183 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -37,9 +37,9 @@
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
-import com.android.browser.NavTabGallery.OnRemoveListener;
+import com.android.browser.NavTabScroller.OnLayoutListener;
+import com.android.browser.NavTabScroller.OnRemoveListener;
 import com.android.browser.TabControl.OnThumbnailUpdatedListener;
-import com.android.browser.view.Gallery.OnScrollFinishedListener;
 
 import java.util.HashMap;
 
@@ -47,9 +47,6 @@
         implements OnClickListener, OnMenuItemClickListener, OnThumbnailUpdatedListener {
 
 
-    private static final int SCROLL_MIN = 200;
-    private static final int SCROLL_FACTOR = 20;
-
     UiController mUiController;
     PhoneUi mUi;
     Tab mTab;
@@ -66,7 +63,7 @@
     ImageView mFavicon;
     ImageButton mCloseTab;
 
-    NavTabGallery mScroller;
+    NavTabScroller mScroller;
     TabAdapter mAdapter;
     int mOrientation;
     boolean mNeedsMenu;
@@ -81,22 +78,18 @@
         init();
     }
 
-    protected Tab getSelectedTab() {
-        return (Tab) mScroller.getSelectedItem();
-    }
-
     protected void showMenu() {
         PopupMenu popup = new PopupMenu(mContext, mMore);
         Menu menu = popup.getMenu();
         popup.getMenuInflater().inflate(R.menu.browser, menu);
-        mUiController.updateMenuState(mScroller.getSelectedItem(), menu);
+        mUiController.updateMenuState(mUiController.getCurrentTab(), menu);
         popup.setOnMenuItemClickListener(this);
         popup.show();
     }
 
     @Override
     public boolean onMenuItemClick(MenuItem item) {
-        mUi.hideNavScreen(false);
+        mUi.hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
         return mUiController.onOptionsItemSelected(item);
     }
 
@@ -104,15 +97,14 @@
         return mActivity.getResources().getDimension(R.dimen.toolbar_height);
     }
 
-    // for configuration changes
     @Override
     protected void onConfigurationChanged(Configuration newconfig) {
         if (newconfig.orientation != mOrientation) {
-            int selIx = mScroller.getSelectionIndex();
+            int sv = mScroller.getScrollValue();
             removeAllViews();
             mOrientation = newconfig.orientation;
             init();
-            mScroller.setSelection(selIx);
+            mScroller.setScrollValue(sv);
             mAdapter.notifyDataSetChanged();
         }
     }
@@ -127,7 +119,7 @@
         mBookmarks.setOnClickListener(this);
         mNewTab.setOnClickListener(this);
         mMore.setOnClickListener(this);
-        mScroller = (NavTabGallery) findViewById(R.id.scroller);
+        mScroller = (NavTabScroller) findViewById(R.id.scroller);
         TabControl tc = mUiController.getTabControl();
         mTabViews = new HashMap<Tab, View>(tc.getTabCount());
         mAdapter = new TabAdapter(mContext, tc);
@@ -150,28 +142,12 @@
 
     @Override
     public void onClick(View v) {
-        WebView web = (mTab != null) ? mTab.getWebView() : null;
-        if (web != null) {
-            if (mForward == v) {
-                mUi.hideNavScreen(true);
-                mTab.goForward();
-            } else if (mRefresh == v) {
-                mUi.hideNavScreen(true);
-                web.reload();
-            }
-        }
         if (mBookmarks == v) {
-            switchToSelected();
             mUiController.bookmarksOrHistoryPicker(false);
         } else if (mNewTab == v) {
             openNewTab();
         } else if (mMore == v) {
             showMenu();
-        } else if (mTitle == v) {
-            mUi.getTitleBar().setSkipTitleBarAnimations(true);
-            close(false);
-            mUi.editUrl(false);
-            mUi.getTitleBar().setSkipTitleBarAnimations(false);
         }
     }
 
@@ -182,49 +158,46 @@
             } else {
                 mUiController.closeTab(tab);
             }
-            mAdapter.notifyDataSetChanged();
+            mScroller.handleDataChanged();
         }
     }
 
     private void openNewTab() {
         // need to call openTab explicitely with setactive false
-        Tab tab = mUiController.openTab(BrowserSettings.getInstance().getHomePage(),
+        final Tab tab = mUiController.openTab(BrowserSettings.getInstance().getHomePage(),
                 false, false, false);
-        int duration = 0;
         if (tab != null) {
             mUiController.setBlockEvents(true);
-            int oldsel = mScroller.getSelectedItemPosition();
             final int tix = mUi.mTabControl.getTabPosition(tab);
-            duration = SCROLL_MIN + SCROLL_FACTOR * Math.abs(oldsel - tix);
-            mScroller.handleDataChanged();
-            mScroller.smoothScrollToPosition(tix, duration, new OnScrollFinishedListener() {
+            mScroller.setOnLayoutListener(new OnLayoutListener() {
+
                 @Override
-                public void onScrollFinished() {
-                    mUiController.setBlockEvents(false);
-                    mUi.hideNavScreen(true);
-                    switchToSelected();
+                public void onLayout(int l, int t, int r, int b) {
+                    mUi.hideNavScreen(tix, true);
+                    switchToTab(tab);
                 }
             });
+            mScroller.handleDataChanged(tix);
+            mUiController.setBlockEvents(false);
         }
     }
 
-    View getSelectedTabView() {
-        return mScroller.getSelectedTab();
-    }
-
-    private void switchToSelected() {
-        Tab tab = (Tab) mScroller.getSelectedItem();
+    private void switchToTab(Tab tab) {
         if (tab != mUi.getActiveTab()) {
             mUiController.setActiveTab(tab);
         }
     }
 
-    protected void close() {
-        close(true);
+    protected void close(int position) {
+        close(position, true);
     }
 
-    protected void close(boolean animate) {
-        mUi.hideNavScreen(animate);
+    protected void close(int position, boolean animate) {
+        mUi.hideNavScreen(position, animate);
+    }
+
+    protected NavTabView getTabView(int pos) {
+        return mScroller.getTabView(pos);
     }
 
     class TabAdapter extends BaseAdapter {
@@ -263,15 +236,13 @@
                     if (tabview.isClose(v)) {
                         mScroller.animateOut(tabview);
                     } else if (tabview.isTitle(v)) {
-                        mScroller.setSelection(position);
-                        switchToSelected();
+                        switchToTab(tab);
                         mUi.getTitleBar().setSkipTitleBarAnimations(true);
-                        close(false);
+                        close(position, false);
                         mUi.editUrl(false);
                         mUi.getTitleBar().setSkipTitleBarAnimations(false);
                     } else if (tabview.isWebView(v)) {
-                        mScroller.setSelection(position);
-                        close();
+                        close(position);
                     }
                 }
             });
@@ -285,7 +256,6 @@
         View v = mTabViews.get(t);
         if (v != null) {
             v.invalidate();
-            mScroller.invalidate();
         }
     }
 
diff --git a/src/com/android/browser/NavTabGallery.java b/src/com/android/browser/NavTabGallery.java
deleted file mode 100644
index af02e8d..0000000
--- a/src/com/android/browser/NavTabGallery.java
+++ /dev/null
@@ -1,164 +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.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-import com.android.browser.view.Gallery;
-
-/**
- * custom view for displaying tabs in the nav screen
- */
-public class NavTabGallery extends Gallery {
-
-    interface OnRemoveListener {
-        public void onRemovePosition(int position);
-    }
-
-    // after drag animation velocity in pixels/sec
-    private static final float MIN_VELOCITY = 1500;
-
-    private OnRemoveListener mRemoveListener;
-    private boolean mBlockUpCallback;
-    private Animator mAnimator;
-
-    public NavTabGallery(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public NavTabGallery(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public NavTabGallery(Context context) {
-        super(context);
-    }
-
-    public void setOnRemoveListener(OnRemoveListener l) {
-        mRemoveListener = l;
-    }
-
-    protected void setSelection(int ix) {
-        super.setSelectedPositionInt(ix);
-    }
-
-    protected int getSelectionIndex() {
-        return getSelectedItemPosition();
-    }
-
-    protected Tab getSelectedItem() {
-        return (Tab) mAdapter.getItem(getSelectedItemPosition());
-    }
-
-    View getSelectedTab() {
-        return getSelectedView();
-    }
-
-    @Override
-    protected void onOrthoDrag(View v, MotionEvent down, MotionEvent move,
-            float distance) {
-        if (mAnimator == null) {
-            offsetView(v, - distance);
-        }
-    }
-
-    @Override
-    protected void onOrthoFling(View v, MotionEvent down, MotionEvent move,
-            float velocity) {
-        if ((mAnimator == null) && (Math.abs(velocity) > MIN_VELOCITY)) {
-            mBlockUpCallback = true;
-            animateOut(v, velocity);
-        }
-    }
-
-    @Override
-    protected void onUp(View downView) {
-        if (mAnimator != null) return;
-        if (mBlockUpCallback) {
-            mBlockUpCallback = false;
-            return;
-        }
-        if (mIsOrthoDragged && downView != null) {
-            // offset
-            int diff = calculateTop(downView, false) - (mHorizontal ? downView.getTop()
-                    : downView.getLeft());
-            if (Math.abs(diff) > (mHorizontal ? downView.getHeight() : downView.getWidth()) / 2) {
-                // remove it
-                animateOut(downView, - Math.signum(diff) * MIN_VELOCITY);
-            } else {
-                // snap back
-                offsetView(downView, diff);
-            }
-        } else {
-            super.onUp(downView);
-        }
-    }
-
-    private void offsetView(View v, float distance) {
-        if (mHorizontal) {
-            v.offsetTopAndBottom((int) distance);
-        } else {
-            v.offsetLeftAndRight((int) distance);
-        }
-    }
-
-    protected void animateOut(View v) {
-        animateOut(v, -MIN_VELOCITY);
-    }
-
-    private void animateOut(final View v, float velocity) {
-        if ((v == null) || (mAnimator != null)) return;
-        final int position = mFirstPosition + indexOfChild(v);
-        int target = 0;
-        if (velocity < 0) {
-            target = mHorizontal ? -v.getHeight() :  - v.getWidth();
-        } else {
-            target = mHorizontal ? getHeight() : getWidth();
-        }
-        int distance = target - (mHorizontal ? v.getTop() : v.getLeft());
-        long duration = (long) (Math.abs(distance) * 1000 / Math.abs(velocity));
-        if (mHorizontal) {
-            mAnimator = ObjectAnimator.ofFloat(v, TRANSLATION_Y, 0, target);
-        } else {
-            mAnimator = ObjectAnimator.ofFloat(v, TRANSLATION_X, 0, target);
-        }
-        mAnimator.setDuration(duration);
-        mAnimator.addListener(new AnimatorListenerAdapter() {
-            public void onAnimationEnd(Animator a) {
-                if (mRemoveListener !=  null) {
-                    boolean needsGap = position < (mAdapter.getCount() - 1);
-                    if (needsGap) {
-                        setGapPosition(position, mHorizontal ? v.getWidth() : v.getHeight());
-                    }
-                    mRemoveListener.onRemovePosition(position);
-                    if (!needsGap && (position > 0) && (mAdapter.getCount() > 0)) {
-                        scrollToChild(position - 1);
-                    }
-                    mAnimator = null;
-                }
-            }
-        });
-        mAnimator.start();
-    }
-
-}
diff --git a/src/com/android/browser/NavTabScroller.java b/src/com/android/browser/NavTabScroller.java
new file mode 100644
index 0000000..8251928
--- /dev/null
+++ b/src/com/android/browser/NavTabScroller.java
@@ -0,0 +1,527 @@
+/*
+ * 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.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.database.DataSetObserver;
+import android.graphics.Canvas;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.DecelerateInterpolator;
+import android.widget.BaseAdapter;
+import android.widget.LinearLayout;
+
+import com.android.browser.view.ScrollerView;
+
+/**
+ * custom view for displaying tabs in the nav screen
+ */
+public class NavTabScroller extends ScrollerView {
+
+    static final int INVALID_POSITION = -1;
+    static final float[] PULL_FACTOR = { 2.5f, 0.9f };
+
+    interface OnRemoveListener {
+        public void onRemovePosition(int position);
+    }
+
+    interface OnLayoutListener {
+        public void onLayout(int l, int t, int r, int b);
+    }
+
+    private ContentLayout mContentView;
+    private BaseAdapter mAdapter;
+    private OnRemoveListener mRemoveListener;
+    private OnLayoutListener mLayoutListener;
+    private int mGap;
+    private int mGapPosition;
+    private ObjectAnimator mGapAnimator;
+
+    // after drag animation velocity in pixels/sec
+    private static final float MIN_VELOCITY = 1500;
+    private AnimatorSet mAnimator;
+
+    private float mFlingVelocity;
+    private boolean mNeedsScroll;
+    private int mScrollPosition;
+
+    DecelerateInterpolator mCubic;
+    int mPullValue;
+
+    public NavTabScroller(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(context);
+    }
+
+    public NavTabScroller(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(context);
+    }
+
+    public NavTabScroller(Context context) {
+        super(context);
+        init(context);
+    }
+
+    private void init(Context ctx) {
+        mCubic = new DecelerateInterpolator(1.5f);
+        mGapPosition = INVALID_POSITION;
+        setHorizontalScrollBarEnabled(false);
+        setVerticalScrollBarEnabled(false);
+        mContentView = new ContentLayout(ctx, this);
+        mContentView.setOrientation(LinearLayout.HORIZONTAL);
+        addView(mContentView);
+        mContentView.setLayoutParams(
+                new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
+        // ProGuard !
+        setGap(getGap());
+        mFlingVelocity = getContext().getResources().getDisplayMetrics().density
+                * MIN_VELOCITY;
+    }
+
+    protected int getScrollValue() {
+        return mHorizontal ? mScrollX : mScrollY;
+    }
+
+    protected void setScrollValue(int value) {
+        scrollTo(mHorizontal ? value : 0, mHorizontal ? 0 : value);
+    }
+
+    protected NavTabView getTabView(int pos) {
+        return (NavTabView) mContentView.getChildAt(pos);
+    }
+
+    /**
+     * define a visual gap in the list of items
+     * the gap is rendered in front (left or above)
+     * the given position
+     * @param position
+     * @param gap
+     */
+    public void setGapPosition(int position, int gap) {
+        mGapPosition = position;
+        mGap = gap;
+    }
+
+    public void setGap(int gap) {
+        if (mGapPosition != INVALID_POSITION) {
+            mGap = gap;
+            postInvalidate();
+        }
+    }
+
+    public int getGap() {
+        return mGap;
+    }
+
+    protected boolean isHorizontal() {
+        return mHorizontal;
+    }
+
+    public void setOrientation(int orientation) {
+        mContentView.setOrientation(orientation);
+        if (orientation == LinearLayout.HORIZONTAL) {
+            mContentView.setLayoutParams(
+                    new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
+        } else {
+            mContentView.setLayoutParams(
+                    new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+        }
+        super.setOrientation(orientation);
+    }
+
+    @Override
+    protected void onMeasure(int wspec, int hspec) {
+        super.onMeasure(wspec, hspec);
+        calcPadding();
+    }
+
+    private void calcPadding() {
+        if (mAdapter.getCount() > 0) {
+            View v = mContentView.getChildAt(0);
+            if (mHorizontal) {
+                int pad = (getMeasuredWidth() - v.getMeasuredWidth()) / 2 + 2;
+                mContentView.setPadding(pad, 0, pad, 0);
+            } else {
+                int pad = (getMeasuredHeight() - v.getMeasuredHeight()) / 2 + 2;
+                mContentView.setPadding(0, pad, 0, pad);
+            }
+        }
+    }
+
+    public void setAdapter(BaseAdapter adapter) {
+        setAdapter(adapter, 0);
+    }
+
+
+    public void setOnRemoveListener(OnRemoveListener l) {
+        mRemoveListener = l;
+    }
+
+    public void setOnLayoutListener(OnLayoutListener l) {
+        mLayoutListener = l;
+    }
+
+    protected void setAdapter(BaseAdapter adapter, int selection) {
+        mAdapter = adapter;
+        mAdapter.registerDataSetObserver(new DataSetObserver() {
+
+            @Override
+            public void onChanged() {
+                super.onChanged();
+                handleDataChanged();
+            }
+
+            @Override
+            public void onInvalidated() {
+                super.onInvalidated();
+            }
+        });
+        handleDataChanged(selection);
+    }
+
+    protected ViewGroup getContentView() {
+        return mContentView;
+    }
+
+    protected int getRelativeChildTop(int ix) {
+        return mContentView.getChildAt(ix).getTop() - mScrollY;
+    }
+
+    protected void handleDataChanged() {
+        handleDataChanged(INVALID_POSITION);
+    }
+
+    protected void handleDataChanged(int newscroll) {
+        int scroll = getScrollValue();
+        if (mGapAnimator != null) {
+            mGapAnimator.cancel();
+        }
+        mContentView.removeAllViews();
+        for (int i = 0; i < mAdapter.getCount(); i++) {
+            View v = mAdapter.getView(i, null, mContentView);
+            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
+                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+            lp.gravity = (mHorizontal ? Gravity.CENTER_VERTICAL : Gravity.CENTER_HORIZONTAL);
+            mContentView.addView(v, lp);
+            if ((mGapPosition > INVALID_POSITION) && (i >= mGapPosition)) {
+                adjustViewGap(v, mGap);
+            }
+        }
+        if (newscroll > INVALID_POSITION) {
+            newscroll = Math.min(mAdapter.getCount() - 1, newscroll);
+            mNeedsScroll = true;
+            mScrollPosition = newscroll;
+            requestLayout();
+        } else {
+            setScrollValue(scroll);
+        }
+        if (mGapPosition > INVALID_POSITION) {
+            mGapAnimator = ObjectAnimator.ofInt(this, "gap", mGap, 0);
+            mGapAnimator.setDuration(250);
+            mGapAnimator.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animator a) {
+                    mGap = 0;
+                    adjustGap();
+                    mGapPosition = INVALID_POSITION;
+                    mGapAnimator = null;
+                    mContentView.requestLayout();
+                }
+            });
+            mGapAnimator.start();
+        }
+
+    }
+
+    protected void finishScroller() {
+        mScroller.forceFinished(true);
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        super.onLayout(changed, l, t, r, b);
+        if (mNeedsScroll) {
+            mScroller.forceFinished(true);
+            snapToSelected(mScrollPosition, false);
+            mNeedsScroll = false;
+        }
+        if (mLayoutListener != null) {
+            mLayoutListener.onLayout(l, t, r, b);
+            mLayoutListener = null;
+        }
+    }
+
+    void adjustGap() {
+        for (int i = 0; i < mContentView.getChildCount(); i++) {
+            if (i >= mGapPosition) {
+                final View child = mContentView.getChildAt(i);
+                adjustViewGap(child, mGap);
+            }
+        }
+    }
+
+    private void adjustViewGap(View view, int gap) {
+        if (mHorizontal) {
+            view.setTranslationX(gap);
+        } else {
+            view.setTranslationY(gap);
+        }
+    }
+
+
+    void clearTabs() {
+        mContentView.removeAllViews();
+    }
+
+    void snapToSelected(int pos, boolean smooth) {
+        if (pos < 0) return;
+        View v = mContentView.getChildAt(pos);
+        int sx = 0;
+        int sy = 0;
+        if (mHorizontal) {
+            sx = (v.getLeft() + v.getRight() - getWidth()) / 2;
+        } else {
+            sy = (v.getTop() + v.getBottom() - getHeight()) / 2;
+        }
+        if ((sx != mScrollX) || (sy != mScrollY)) {
+            if (smooth) {
+                smoothScrollTo(sx,sy);
+            } else {
+                scrollTo(sx, sy);
+            }
+        }
+    }
+
+    protected void animateOut(View v) {
+        if (v == null) return;
+        animateOut(v, -mFlingVelocity);
+    }
+
+    private void animateOut(final View v, float velocity) {
+        float start = mHorizontal ? v.getTranslationY() : v.getTranslationX();
+        animateOut(v, velocity, start);
+    }
+
+    private void animateOut(final View v, float velocity, float start) {
+        if ((v == null) || (mAnimator != null)) return;
+        final int position = mContentView.indexOfChild(v);
+        int target = 0;
+        if (velocity < 0) {
+            target = mHorizontal ? -getHeight() :  -getWidth();
+        } else {
+            target = mHorizontal ? getHeight() : getWidth();
+        }
+        int distance = target - (mHorizontal ? v.getTop() : v.getLeft());
+        long duration = (long) (Math.abs(distance) * 1000 / Math.abs(velocity));
+        mAnimator = new AnimatorSet();
+        ObjectAnimator trans;
+        ObjectAnimator alpha = ObjectAnimator.ofFloat(v, ALPHA, getAlpha(v,start),
+                getAlpha(v,target));
+        if (mHorizontal) {
+            trans = ObjectAnimator.ofFloat(v, TRANSLATION_Y, start, target);
+        } else {
+            trans = ObjectAnimator.ofFloat(v, TRANSLATION_X, start, target);
+        }
+        mAnimator.playTogether(trans, alpha);
+        mAnimator.setDuration(duration);
+        mAnimator.addListener(new AnimatorListenerAdapter() {
+            public void onAnimationEnd(Animator a) {
+                if (mRemoveListener !=  null) {
+                    boolean needsGap = position < (mAdapter.getCount() - 1);
+                    if (needsGap) {
+                        setGapPosition(position, mHorizontal ? v.getWidth() : v.getHeight());
+                    }
+                    mRemoveListener.onRemovePosition(position);
+                    mAnimator = null;
+                }
+            }
+        });
+        mAnimator.start();
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        super.draw(canvas);
+        if (mGapPosition > INVALID_POSITION) {
+            adjustGap();
+        }
+    }
+
+    @Override
+    protected View findViewAt(int x, int y) {
+        x += mScrollX;
+        y += mScrollY;
+        final int count = mContentView.getChildCount();
+        for (int i = count - 1; i >= 0; i--) {
+            View child = mContentView.getChildAt(i);
+            if (child.getVisibility() == View.VISIBLE) {
+                if ((x >= child.getLeft()) && (x < child.getRight())
+                        && (y >= child.getTop()) && (y < child.getBottom())) {
+                    return child;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    protected void onOrthoDrag(View v, float distance) {
+        if ((v != null) && (mAnimator == null)) {
+            offsetView(v, distance);
+        }
+    }
+
+    @Override
+    protected void onOrthoDragFinished(View downView) {
+        if (mAnimator != null) return;
+        if (mIsOrthoDragged && downView != null) {
+            // offset
+            float diff = mHorizontal ? downView.getTranslationY() : downView.getTranslationX();
+            if (Math.abs(diff) > (mHorizontal ? downView.getHeight() : downView.getWidth()) / 2) {
+                // remove it
+                animateOut(downView, Math.signum(diff) * mFlingVelocity, diff);
+            } else {
+                // snap back
+                offsetView(downView, 0);
+            }
+        }
+    }
+
+    @Override
+    protected void onOrthoFling(View v, float velocity) {
+        if (v == null) return;
+        if (mAnimator == null && Math.abs(velocity) > mFlingVelocity / 2) {
+            animateOut(v, velocity);
+        } else {
+            offsetView(v, 0);
+        }
+    }
+
+    private void offsetView(View v, float distance) {
+        v.setAlpha(getAlpha(v, distance));
+        if (mHorizontal) {
+            v.setTranslationY(distance);
+        } else {
+            v.setTranslationX(distance);
+        }
+    }
+
+    private float getAlpha(View v, float distance) {
+        return 1 - (float) Math.abs(distance) / (mHorizontal ? v.getHeight() : v.getWidth());
+    }
+
+    private float ease(DecelerateInterpolator inter, float value, float start,
+            float dist, float duration) {
+        return start + dist * inter.getInterpolation(value / duration);
+    }
+
+    @Override
+    protected void onPull(int delta) {
+        boolean layer = false;
+        int count = 2;
+        if (delta == 0 && mPullValue == 0) return;
+        if (delta == 0 && mPullValue != 0) {
+            // reset
+            for (int i = 0; i < count; i++) {
+                View child = mContentView.getChildAt((mPullValue < 0)
+                        ? i
+                        : mContentView.getChildCount() - 1 - i);
+                if (child == null) break;
+                ObjectAnimator trans = ObjectAnimator.ofFloat(child,
+                        mHorizontal ? "translationX" : "translationY",
+                                mHorizontal ? getTranslationX() : getTranslationY(),
+                                0);
+                ObjectAnimator rot = ObjectAnimator.ofFloat(child,
+                        mHorizontal ? "rotationY" : "rotationX",
+                                mHorizontal ? getRotationY() : getRotationX(),
+                                0);
+                AnimatorSet set = new AnimatorSet();
+                set.playTogether(trans, rot);
+                set.setDuration(100);
+                set.start();
+            }
+            mPullValue = 0;
+        } else {
+            if (mPullValue == 0) {
+                layer = true;
+            }
+            mPullValue += delta;
+        }
+        final int height = mHorizontal ? getWidth() : getHeight();
+        int oscroll = Math.abs(mPullValue);
+        int factor = (mPullValue <= 0) ? 1 : -1;
+        for (int i = 0; i < count; i++) {
+            View child = mContentView.getChildAt((mPullValue < 0)
+                    ? i
+                    : mContentView.getChildCount() - 1 - i);
+            if (child == null) break;
+            if (layer) {
+            }
+            float k = PULL_FACTOR[i];
+            float rot = -factor * ease(mCubic, oscroll, 0, k * 2, height);
+            int y =  factor * (int) ease(mCubic, oscroll, 0, k*20, height);
+            if (mHorizontal) {
+                child.setTranslationX(y);
+            } else {
+                child.setTranslationY(y);
+            }
+            if (mHorizontal) {
+                child.setRotationY(-rot);
+            } else {
+                child.setRotationX(rot);
+            }
+        }
+    }
+
+    static class ContentLayout extends LinearLayout {
+
+        NavTabScroller mScroller;
+
+        public ContentLayout(Context context, NavTabScroller scroller) {
+            super(context);
+            mScroller = scroller;
+        }
+
+        @Override
+        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+            if (mScroller.getGap() > 0) {
+                View v = getChildAt(0);
+                if (v != null) {
+                    if (mScroller.isHorizontal()) {
+                        int total = v.getMeasuredWidth() + getMeasuredWidth();
+                        setMeasuredDimension(total, getMeasuredHeight());
+                    } else {
+                        int total = v.getMeasuredHeight() + getMeasuredHeight();
+                        setMeasuredDimension(getMeasuredWidth(), total);
+                    }
+                }
+
+            }
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index 7e8695b..a1e778d 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -15,6 +15,7 @@
  */
 package com.android.browser;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
@@ -174,14 +175,21 @@
     }
 
     void showMenu(View anchor) {
-        mOverflowMenuShowing = true;
-        mPopupMenu = new PopupMenu(mContext, anchor);
+        Activity activity = mUiController.getActivity();
+        if (mPopupMenu == null) {
+            mPopupMenu = new PopupMenu(mContext, anchor);
+            mPopupMenu.setOnMenuItemClickListener(this);
+            mPopupMenu.setOnDismissListener(this);
+            if (!activity.onCreateOptionsMenu(mPopupMenu.getMenu())) {
+                mPopupMenu = null;
+                return;
+            }
+        }
         Menu menu = mPopupMenu.getMenu();
-        mPopupMenu.getMenuInflater().inflate(R.menu.browser, menu);
-        mUiController.updateMenuState(mBaseUi.getActiveTab(), menu);
-        mPopupMenu.setOnMenuItemClickListener(this);
-        mPopupMenu.setOnDismissListener(this);
-        mPopupMenu.show();
+        if (activity.onPrepareOptionsMenu(menu)) {
+            mOverflowMenuShowing = true;
+            mPopupMenu.show();
+        }
     }
 
     @Override
@@ -193,7 +201,6 @@
 
     private void onMenuHidden() {
         mOverflowMenuShowing = false;
-        mPopupMenu = null;
         mBaseUi.showTitleBarForDuration();
     }
 
diff --git a/src/com/android/browser/NetworkStateHandler.java b/src/com/android/browser/NetworkStateHandler.java
index 37f4a2f..2fbd035 100644
--- a/src/com/android/browser/NetworkStateHandler.java
+++ b/src/com/android/browser/NetworkStateHandler.java
@@ -17,7 +17,6 @@
 package com.android.browser;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -39,9 +38,6 @@
     private BroadcastReceiver mNetworkStateIntentReceiver;
     private boolean mIsNetworkUp;
 
-    /* hold a ref so we can auto-cancel if necessary */
-    private AlertDialog mAlertDialog;
-
     public NetworkStateHandler(Activity activity, Controller controller) {
         mActivity = activity;
         mController = controller;
@@ -99,18 +95,8 @@
     void onNetworkToggle(boolean up) {
         if (up == mIsNetworkUp) {
             return;
-        } else if (up) {
-            mIsNetworkUp = true;
-            if (mAlertDialog != null) {
-                mAlertDialog.cancel();
-                mAlertDialog = null;
-            }
-        } else {
-            mIsNetworkUp = false;
-            if (mController.isInLoad()) {
-                createAndShowNetworkDialog();
-           }
         }
+        mIsNetworkUp = up;
         WebView w = mController.getCurrentWebView();
         if (w != null) {
             w.setNetworkAvailable(up);
@@ -121,18 +107,6 @@
         return mIsNetworkUp;
     }
 
-    // This method shows the network dialog alerting the user that the net is
-    // down. It will only show the dialog if mAlertDialog is null.
-    void createAndShowNetworkDialog() {
-        if (mAlertDialog == null) {
-            mAlertDialog = new AlertDialog.Builder(mActivity)
-                    .setTitle(R.string.loadSuspendedTitle)
-                    .setMessage(R.string.loadSuspended)
-                    .setPositiveButton(R.string.ok, null)
-                    .show();
-        }
-    }
-
     private void sendNetworkType(String type, String subtype) {
         WebView w = mController.getCurrentWebView();
         if (w != null) {
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index f5a76b9..4772ff1 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -26,6 +26,7 @@
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.util.Log;
+import android.util.TypedValue;
 import android.view.ActionMode;
 import android.view.Gravity;
 import android.view.KeyEvent;
@@ -35,7 +36,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
-import android.view.animation.DecelerateInterpolator;
 import android.webkit.WebView;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
@@ -52,6 +52,7 @@
     private PieControlPhone mPieControl;
     private NavScreen mNavScreen;
     private NavigationBarPhone mNavigationBar;
+    private int mActionBarHeight;
 
     boolean mExtendedMenuOpen;
     boolean mOptionsMenuOpen;
@@ -63,9 +64,13 @@
      */
     public PhoneUi(Activity browser, UiController controller) {
         super(browser, controller);
-        mActivity.getActionBar().hide();
         setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
         mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar();
+        TypedValue heightValue = new TypedValue();
+        browser.getTheme().resolveAttribute(
+                com.android.internal.R.attr.actionBarSize, heightValue, true);
+        mActionBarHeight = TypedValue.complexToDimensionPixelSize(heightValue.data,
+                browser.getResources().getDisplayMetrics());
     }
 
     @Override
@@ -84,7 +89,7 @@
     @Override
     public boolean onBackKey() {
         if (mNavScreen != null) {
-            mNavScreen.close();
+            mNavScreen.close(mUiController.getTabControl().getCurrentPosition());
             return true;
         }
         return super.onBackKey();
@@ -162,7 +167,6 @@
 
     @Override
     public void updateMenuState(Tab tab, Menu menu) {
-        menu.setGroupVisible(R.id.NAV_MENU, (mNavScreen == null));
         MenuItem bm = menu.findItem(R.id.bookmarks_menu_id);
         if (bm != null) {
             bm.setVisible(mNavScreen == null);
@@ -173,14 +177,20 @@
         }
         MenuItem abm = menu.findItem(R.id.add_bookmark_menu_id);
         if (abm != null) {
-            abm.setVisible((tab != null) && !tab.isSnapshot());
+            abm.setVisible((tab != null) && !tab.isSnapshot() && mNavScreen == null);
+        }
+        if (mNavScreen != null) {
+            menu.setGroupVisible(R.id.LIVE_MENU, false);
+            menu.setGroupVisible(R.id.SNAPSHOT_MENU, false);
+            menu.findItem(R.id.page_info_menu_id).setVisible(false);
+            menu.setGroupVisible(R.id.NAV_MENU, false);
         }
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (mNavScreen != null) {
-            hideNavScreen(false);
+            hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
         }
         return false;
     }
@@ -203,18 +213,20 @@
     public void onActionModeStarted(ActionMode mode) {
         if (!isEditingUrl()) {
             hideTitleBar();
+        } else {
+            mTitleBar.animate().translationY(mActionBarHeight);
         }
     }
 
     @Override
     public void onActionModeFinished(boolean inLoad) {
+        mTitleBar.animate().translationY(0);
         if (inLoad) {
             if (mUseQuickControls) {
                 mTitleBar.setShowProgressOnly(true);
             }
             showTitleBar();
         }
-        mActivity.getActionBar().hide();
     }
 
     @Override
@@ -265,7 +277,7 @@
     @Override
     public void showWeb(boolean animate) {
         super.showWeb(animate);
-        hideNavScreen(animate);
+        hideNavScreen(mUiController.getTabControl().getCurrentPosition(), animate);
     }
 
     void showNavScreen() {
@@ -279,20 +291,20 @@
         mCustomViewContainer.addView(animView, COVER_SCREEN_PARAMS);
         mCustomViewContainer.setVisibility(View.VISIBLE);
         mCustomViewContainer.bringToFront();
-        View target = ((NavTabView) mNavScreen.mScroller.getSelectedView()).mImage;
         int fromLeft = 0;
         int fromTop = getTitleBar().getHeight();
         int fromRight = mContentView.getWidth();
         int fromBottom = mContentView.getHeight();
-        int width = target.getWidth();
-        int height = target.getHeight();
+        int width = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_width);
+        int height = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_height);
         int toLeft = (mContentView.getWidth() - width) / 2;
-        int toTop = fromTop + (mContentView.getHeight() - fromTop - height) / 2;
+        int toTop = ((fromBottom - (fromTop + height)) / 2 + fromTop);
         int toRight = toLeft + width;
         int toBottom = toTop + height;
         float scaleFactor = width / (float) mContentView.getWidth();
         detachTab(mActiveTab);
         mContentView.setVisibility(View.GONE);
+        AnimatorSet set1 = new AnimatorSet();
         AnimatorSet inanim = new AnimatorSet();
         ObjectAnimator tx = ObjectAnimator.ofInt(ascreen.mContent, "left",
                 fromLeft, toLeft);
@@ -304,12 +316,14 @@
                 fromBottom, toBottom);
         ObjectAnimator title = ObjectAnimator.ofFloat(ascreen.mTitle, "alpha",
                 1f, 0f);
-        ObjectAnimator content = ObjectAnimator.ofFloat(ascreen.mContent, "alpha",
-                1f, 0f);
         ObjectAnimator sx = ObjectAnimator.ofFloat(ascreen, "scaleFactor",
                 1f, scaleFactor);
-        inanim.playTogether(tx, ty, tr, tb, title, content, sx);
-        inanim.addListener(new AnimatorListenerAdapter() {
+        ObjectAnimator blend1 = ObjectAnimator.ofFloat(ascreen.mMain, "alpha", 1, 0);
+        blend1.setDuration(100);
+
+        inanim.playTogether(tx, ty, tr, tb, sx, title);
+        inanim.setDuration(200);
+        set1.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator anim) {
                 mCustomViewContainer.removeView(animView);
@@ -317,9 +331,8 @@
                 mUiController.setBlockEvents(false);
             }
         });
-        inanim.setInterpolator(new DecelerateInterpolator(2f));
-        inanim.setDuration(300);
-        inanim.start();
+        set1.playSequentially(inanim, blend1);
+        set1.start();
     }
 
     private void finishAnimationIn() {
@@ -330,9 +343,9 @@
         }
     }
 
-    void hideNavScreen(boolean animate) {
+    void hideNavScreen(int position, boolean animate) {
         if (mNavScreen == null) return;
-        final Tab tab = mNavScreen.getSelectedTab();
+        final Tab tab = mUiController.getTabControl().getTab(position);
         if ((tab == null) || !animate) {
             if (tab != null) {
                 setActiveTab(tab);
@@ -344,7 +357,7 @@
             finishAnimateOut();
             return;
         }
-        NavTabView tabview = (NavTabView) mNavScreen.getSelectedTabView();
+        NavTabView tabview = (NavTabView) mNavScreen.getTabView(position);
         if (tabview == null) {
             if (mTabControl.getTabCount() > 0) {
                 // use a fallback tab
@@ -358,23 +371,36 @@
         mUiController.setActiveTab(tab);
         mContentView.setVisibility(View.VISIBLE);
         final AnimScreen screen = new AnimScreen(mActivity, tab.getScreenshot());
-        View target = ((NavTabView) mNavScreen.mScroller.getSelectedView()).mImage;
+        mCustomViewContainer.addView(screen.mMain, COVER_SCREEN_PARAMS);
+        screen.mMain.layout(0, 0, mContentView.getWidth(),
+                mContentView.getHeight());
+        mNavScreen.mScroller.finishScroller();
+        ImageView target = tabview.mImage;
         int toLeft = 0;
         int toTop = getTitleBar().getHeight();
         int toRight = mContentView.getWidth();
-        int width = target.getWidth();
-        int height = target.getHeight();
-        int[] pos = new int[2];
-        tabview.mImage.getLocationInWindow(pos);
-        int fromLeft = pos[0];
-        int fromTop = pos[1];
+        int width = target.getDrawable().getIntrinsicWidth();
+        int height = target.getDrawable().getIntrinsicHeight();
+        int fromLeft = tabview.getLeft() + target.getLeft() - mNavScreen.mScroller.getScrollX();
+        int fromTop = tabview.getTop() + target.getTop() - mNavScreen.mScroller.getScrollY();
         int fromRight = fromLeft + width;
         int fromBottom = fromTop + height;
         float scaleFactor = mContentView.getWidth() / (float) width;
-        int toBottom = (int) (height * scaleFactor);
-        screen.mMain.setAlpha(0f);
-        mCustomViewContainer.addView(screen.mMain, COVER_SCREEN_PARAMS);
-        AnimatorSet animSet = new AnimatorSet();
+        int toBottom = toTop + (int) (height * scaleFactor);
+        ObjectAnimator l1 = ObjectAnimator.ofInt(screen.mContent, "left",
+                fromLeft, fromLeft);
+        ObjectAnimator t1 = ObjectAnimator.ofInt(screen.mContent, "top",
+                fromTop, fromTop);
+        ObjectAnimator r1 = ObjectAnimator.ofInt(screen.mContent, "right",
+                fromRight, fromRight);
+        ObjectAnimator b1 = ObjectAnimator.ofInt(screen.mContent, "bottom",
+                fromBottom, fromBottom);
+        AnimatorSet set1 = new AnimatorSet();
+        ObjectAnimator fade2 = ObjectAnimator.ofFloat(screen.mMain, "alpha", 0f, 1f);
+        ObjectAnimator fade1 = ObjectAnimator.ofFloat(mNavScreen, "alpha", 1f, 0f);
+        set1.playTogether(l1, t1, r1, b1, fade1, fade2);
+        set1.setDuration(100);
+        AnimatorSet set2 = new AnimatorSet();
         ObjectAnimator l = ObjectAnimator.ofInt(screen.mContent, "left",
                 fromLeft, toLeft);
         ObjectAnimator t = ObjectAnimator.ofInt(screen.mContent, "top",
@@ -385,11 +411,13 @@
                 fromBottom, toBottom);
         ObjectAnimator scale = ObjectAnimator.ofFloat(screen, "scaleFactor",
                 1f, scaleFactor);
-        ObjectAnimator alpha = ObjectAnimator.ofFloat(screen.mMain, "alpha", 1f, 1f);
         ObjectAnimator otheralpha = ObjectAnimator.ofFloat(mCustomViewContainer, "alpha", 1f, 0f);
-        alpha.setStartDelay(100);
-        animSet.playTogether(l, t, r, b, scale, alpha, otheralpha);
-        animSet.addListener(new AnimatorListenerAdapter() {
+        otheralpha.setDuration(100);
+        set2.playTogether(l, t, r, b, scale);
+        set2.setDuration(200);
+        AnimatorSet combo = new AnimatorSet();
+        combo.playSequentially(set1, set2, otheralpha);
+        combo.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator anim) {
                 mCustomViewContainer.removeView(screen.mMain);
@@ -397,8 +425,7 @@
                 mUiController.setBlockEvents(false);
             }
         });
-        animSet.setDuration(250);
-        animSet.start();
+        combo.start();
     }
 
     private void finishAnimateOut() {
@@ -418,7 +445,7 @@
         if (mNavScreen == null) {
             showNavScreen();
         } else {
-            hideNavScreen(false);
+            hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
         }
     }
 
@@ -464,6 +491,8 @@
         public AnimScreen(Context ctx, Bitmap image) {
             mMain = LayoutInflater.from(ctx).inflate(R.layout.anim_screen,
                     null);
+            mTitle = (ImageView) mMain.findViewById(R.id.title);
+            mTitle.setVisibility(View.GONE);
             mContent = (ImageView) mMain.findViewById(R.id.content);
             mContent.setImageBitmap(image);
             mContent.setScaleType(ImageView.ScaleType.MATRIX);
diff --git a/src/com/android/browser/SnapshotBar.java b/src/com/android/browser/SnapshotBar.java
index 039afcf..2fb90d2 100644
--- a/src/com/android/browser/SnapshotBar.java
+++ b/src/com/android/browser/SnapshotBar.java
@@ -21,7 +21,6 @@
 import android.os.Message;
 import android.text.TextUtils;
 import android.util.AttributeSet;
-import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -29,21 +28,18 @@
 import android.view.ViewPropertyAnimator;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
-import android.widget.PopupMenu;
 import android.widget.PopupMenu.OnMenuItemClickListener;
 import android.widget.TextView;
 
 import java.text.DateFormat;
 import java.util.Date;
 
-public class SnapshotBar extends LinearLayout implements OnClickListener,
-        OnMenuItemClickListener {
+public class SnapshotBar extends LinearLayout implements OnClickListener {
 
     private static final int MSG_SHOW_TITLE = 1;
     private static final long DURATION_SHOW_DATE = BaseUi.HIDE_TITLEBAR_DELAY;
 
     private ImageView mFavicon;
-    private View mGoLive;
     private TextView mDate;
     private TextView mTitle;
     private View mBookmarks;
@@ -86,10 +82,7 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mGoLive = mFavicon = (ImageView) findViewById(R.id.favicon);
-        if (mGoLive == null) {
-            mGoLive = findViewById(R.id.date_icon);
-        }
+        mFavicon = (ImageView) findViewById(R.id.favicon);
         mDate = (TextView) findViewById(R.id.date);
         mTitle = (TextView) findViewById(R.id.title);
         mBookmarks = findViewById(R.id.all_btn);
@@ -113,7 +106,6 @@
             mToggleContainer.setOnClickListener(this);
             resetAnimation();
         }
-        mGoLive.setOnClickListener(this);
     }
 
     @Override
@@ -173,12 +165,6 @@
     public void onClick(View v) {
         if (mBookmarks == v) {
             mTitleBar.getUiController().bookmarksOrHistoryPicker(false);
-        } else if (mGoLive == v) {
-            PopupMenu popup = new PopupMenu(mContext, mGoLive);
-            Menu menu = popup.getMenu();
-            popup.getMenuInflater().inflate(R.menu.snapshot_go_live, menu);
-            popup.setOnMenuItemClickListener(this);
-            popup.show();
         } else if (mTabSwitcher == v) {
             ((PhoneUi) mTitleBar.getUi()).toggleNavScreen();
         } else if (mOverflowMenu == v) {
@@ -195,21 +181,6 @@
         }
     }
 
-    @Override
-    public boolean onMenuItemClick(MenuItem item) {
-        switch (item.getItemId()) {
-        case R.id.snapshot_go_live:
-            goLive();
-            return true;
-        }
-        return false;
-    }
-
-    private void goLive() {
-        Tab t = mTitleBar.getUi().getActiveTab();
-        t.loadUrl(t.getUrl(), null);
-    }
-
     public void onTabDataChanged(Tab tab) {
         if (!tab.isSnapshot()) return;
         SnapshotTab snapshot = (SnapshotTab) tab;
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 8c9dc02..96920a4 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -32,7 +32,10 @@
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.Paint;
 import android.graphics.Picture;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
 import android.net.Uri;
 import android.net.http.SslError;
 import android.os.Bundle;
@@ -66,8 +69,6 @@
 import android.webkit.WebView.PictureListener;
 import android.webkit.WebViewClient;
 import android.widget.CheckBox;
-import android.widget.LinearLayout;
-import android.widget.TextView;
 import android.widget.Toast;
 
 import com.android.browser.TabControl.OnThumbnailUpdatedListener;
@@ -105,6 +106,12 @@
 
     private static Bitmap sDefaultFavicon;
 
+    private static Paint sAlphaPaint = new Paint();
+    static {
+        sAlphaPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
+        sAlphaPaint.setColor(Color.TRANSPARENT);
+    }
+
     public enum LockIcon {
         LOCK_ICON_UNSECURE,
         LOCK_ICON_SECURE,
@@ -2050,6 +2057,7 @@
         Canvas c = new Canvas(mCapture);
         final int left = mMainView.getScrollX();
         final int top = mMainView.getScrollY() + mMainView.getVisibleTitleHeight();
+        int state = c.save();
         c.translate(-left, -top);
         float scale = mCaptureWidth / (float) mMainView.getWidth();
         c.scale(scale, scale, left, top);
@@ -2058,6 +2066,14 @@
         } else {
             mMainView.draw(c);
         }
+        c.restoreToCount(state);
+        // manually anti-alias the edges for the tilt
+        c.drawRect(0, 0, 1, mCapture.getHeight(), sAlphaPaint);
+        c.drawRect(mCapture.getWidth() - 1, 0, mCapture.getWidth(),
+                mCapture.getHeight(), sAlphaPaint);
+        c.drawRect(0, 0, mCapture.getWidth(), 1, sAlphaPaint);
+        c.drawRect(0, mCapture.getHeight() - 1, mCapture.getWidth(),
+                mCapture.getHeight(), sAlphaPaint);
         c.setBitmap(null);
         mHandler.removeMessages(MSG_CAPTURE);
         persistThumbnail();
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
index 0da523a..97e99a9 100644
--- a/src/com/android/browser/UiController.java
+++ b/src/com/android/browser/UiController.java
@@ -16,6 +16,7 @@
 
 package com.android.browser;
 
+import android.app.Activity;
 import android.content.Intent;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -100,4 +101,6 @@
 
     void setBlockEvents(boolean block);
 
+    Activity getActivity();
+
 }
diff --git a/src/com/android/browser/UrlBarAutoShowManager.java b/src/com/android/browser/UrlBarAutoShowManager.java
index b491e0b..f1bbe7f 100644
--- a/src/com/android/browser/UrlBarAutoShowManager.java
+++ b/src/com/android/browser/UrlBarAutoShowManager.java
@@ -103,7 +103,7 @@
         case MotionEvent.ACTION_DOWN:
             if (!mIsTracking && event.getPointerCount() == 1) {
                 long sinceLastScroll =
-                        System.currentTimeMillis() - mLastScrollTime;
+                        SystemClock.uptimeMillis() - mLastScrollTime;
                 if (sinceLastScroll < IGNORE_INTERVAL) {
                     break;
                 }
diff --git a/src/com/android/browser/WebStorageSizeManager.java b/src/com/android/browser/WebStorageSizeManager.java
index 109a02b..73a3bfb 100644
--- a/src/com/android/browser/WebStorageSizeManager.java
+++ b/src/com/android/browser/WebStorageSizeManager.java
@@ -392,10 +392,6 @@
         if(LOGV_ENABLED) {
             Log.v(LOGTAG, "scheduleOutOfSpaceNotification called.");
         }
-        if (mContext == null) {
-            // mContext can be null if we're running unit tests.
-            return;
-        }
         if ((mLastOutOfSpaceNotificationTime == -1) ||
             (System.currentTimeMillis() - mLastOutOfSpaceNotificationTime > NOTIFICATION_INTERVAL)) {
             // setup the notification boilerplate.
diff --git a/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java b/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
index 312a61e..6adfd23 100644
--- a/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
+++ b/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
@@ -76,7 +76,8 @@
                     .getAdjustedMinimumFontSize((Integer) objValue));
         }
         if (PreferenceKeys.PREF_TEXT_ZOOM.equals(pref.getKey())) {
-            updateTextZoomSummary(pref, BrowserSettings
+            BrowserSettings settings = BrowserSettings.getInstance();
+            updateTextZoomSummary(pref, settings
                     .getAdjustedTextZoom((Integer) objValue));
         }
         if (PreferenceKeys.PREF_INVERTED_CONTRAST.equals(pref.getKey())) {
diff --git a/src/com/android/browser/view/BookmarkExpandableView.java b/src/com/android/browser/view/BookmarkExpandableView.java
index 0bc6e62..0283448 100644
--- a/src/com/android/browser/view/BookmarkExpandableView.java
+++ b/src/com/android/browser/view/BookmarkExpandableView.java
@@ -502,6 +502,7 @@
                 crumbs.pushView(bookmarks, false,
                         BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
                 crumbs.setTag(R.id.group_position, groupPosition);
+                crumbs.setVisibility(View.GONE);
                 mBreadcrumbs.put(groupPosition, crumbs);
             }
             return crumbs;
diff --git a/src/com/android/browser/view/Gallery.java b/src/com/android/browser/view/Gallery.java
deleted file mode 100644
index 109044e..0000000
--- a/src/com/android/browser/view/Gallery.java
+++ /dev/null
@@ -1,1530 +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.view;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.database.DataSetObserver;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.GestureDetector;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.SoundEffectConstants;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.animation.BounceInterpolator;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Transformation;
-import android.widget.BaseAdapter;
-import android.widget.LinearLayout;
-import android.widget.Scroller;
-
-import com.android.internal.R;
-
-public class Gallery extends ViewGroup implements
-        GestureDetector.OnGestureListener {
-
-    private static final String TAG = "Gallery";
-
-    private static final boolean localLOGV = false;
-
-    private static final int INVALID_POSITION = -1;
-
-    /**
-     * Duration in milliseconds from the start of a scroll during which we're
-     * unsure whether the user is scrolling or flinging.
-     */
-    private static final int SCROLL_TO_FLING_UNCERTAINTY_TIMEOUT = 250;
-    private static final int INVALID_POINTER = -1;
-
-    private boolean mInLayout;
-    private int mWidthMeasureSpec;
-    private int mHeightMeasureSpec;
-    private boolean mBlockLayoutRequests;
-
-    private Rect mTouchFrame;
-
-    private RecycleBin mRecycler;
-
-    protected boolean mHorizontal;
-    protected int mFirstPosition;
-    private int mItemCount;
-    private boolean mDataChanged;
-
-    protected BaseAdapter mAdapter;
-
-    private int mSelectedPosition;
-    private int mOldSelectedPosition;
-
-    private int mSpacing = 0;
-    private int mAnimationDuration = 400;
-    private float mUnselectedAlpha;
-    private int mLeftMost;
-    private int mRightMost;
-    private int mGravity;
-
-    private GestureDetector mGestureDetector;
-
-    protected int mDownTouchPosition;
-    protected View mDownTouchView;
-    private FlingRunnable mFlingRunnable = new FlingRunnable();
-
-    private OnItemSelectedListener mOnItemSelectedListener;
-    private SelectionNotifier mSelectionNotifier;
-
-    private int mGapPosition;
-    private int mGap;
-    private Animator mGapAnimator;
-
-    /**
-     * Sets mSuppressSelectionChanged = false. This is used to set it to false
-     * in the future. It will also trigger a selection changed.
-     */
-    private Runnable mDisableSuppressSelectionChangedRunnable = new Runnable() {
-        public void run() {
-            mSuppressSelectionChanged = false;
-            selectionChanged();
-        }
-    };
-
-    private boolean mShouldStopFling;
-    private View mSelectedChild;
-    private boolean mShouldCallbackDuringFling = true;
-    private boolean mShouldCallbackOnUnselectedItemClick = true;
-    private boolean mSuppressSelectionChanged;
-    private boolean mReceivedInvokeKeyDown;
-
-    /**
-     * If true, this onScroll is the first for this user's drag (remember, a
-     * drag sends many onScrolls).
-     */
-    private boolean mIsFirstScroll;
-
-    private boolean mIsBeingDragged;
-    protected boolean mIsOrthoDragged;
-
-    private int mActivePointerId = INVALID_POINTER;
-
-    private int mTouchSlop;
-
-    private float mLastMotionCoord;
-    private float mLastOrthoCoord;
-
-    private int mScrollValue;
-
-    public Gallery(Context context) {
-        this(context, null);
-    }
-
-    public Gallery(Context context, AttributeSet attrs) {
-        this(context, attrs, R.attr.galleryStyle);
-    }
-
-    public Gallery(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        mRecycler = new RecycleBin();
-        mGestureDetector = new GestureDetector(context, this);
-        mGestureDetector.setIsLongpressEnabled(true);
-        TypedArray a = context.obtainStyledAttributes(attrs,
-                com.android.internal.R.styleable.Gallery, defStyle, 0);
-        int index = a.getInt(com.android.internal.R.styleable.Gallery_gravity,
-                -1);
-        if (index >= 0) {
-            setGravity(index);
-        }
-        int animationDuration = a.getInt(
-                com.android.internal.R.styleable.Gallery_animationDuration, -1);
-        if (animationDuration > 0) {
-            setAnimationDuration(animationDuration);
-        }
-        float unselectedAlpha = a.getFloat(
-                com.android.internal.R.styleable.Gallery_unselectedAlpha, 0.5f);
-        setUnselectedAlpha(unselectedAlpha);
-        mHorizontal = true;
-        a.recycle();
-        // We draw the selected item last (because otherwise the item to the
-        // right overlaps it)
-        mGroupFlags |= FLAG_USE_CHILD_DRAWING_ORDER;
-        mGroupFlags |= FLAG_SUPPORT_STATIC_TRANSFORMATIONS;
-        final ViewConfiguration configuration = ViewConfiguration.get(mContext);
-        mTouchSlop = configuration.getScaledTouchSlop();
-        setFocusable(true);
-        setWillNotDraw(false);
-        mGapPosition = INVALID_POSITION;
-        mGap = 0;
-        // proguard
-        setGap(getGap());
-        setScrollValue(getScrollValue());
-    }
-
-    /**
-     * Interface definition for a callback to be invoked when an item in this
-     * view has been selected.
-     */
-    public interface OnItemSelectedListener {
-        void onItemSelected(ViewGroup parent, View view, int position, long id);
-    }
-
-    public interface OnScrollFinishedListener {
-        void onScrollFinished();
-    }
-
-    /**
-     * Register a callback to be invoked when an item in this AdapterView has
-     * been selected.
-     *
-     * @param listener
-     *            The callback that will run
-     */
-    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
-        mOnItemSelectedListener = listener;
-    }
-
-    public final OnItemSelectedListener getOnItemSelectedListener() {
-        return mOnItemSelectedListener;
-    }
-
-    public void setOrientation(int orientation) {
-        mHorizontal = (orientation == LinearLayout.HORIZONTAL);
-        requestLayout();
-    }
-
-    /**
-     * define a visual gap in the list of items
-     * the gap is rendered in front (left or above)
-     * the given position
-     * @param position
-     * @param gap
-     */
-    public void setGapPosition(int position, int gap) {
-        mGapPosition = position;
-        mGap = gap;
-    }
-
-    public void setGap(int gap) {
-        if (mGapPosition != INVALID_POSITION) {
-            mGap = gap;
-            layout(0, false);
-        }
-    }
-
-    public int getGap() {
-        return mGap;
-    }
-
-    public void setAdapter(BaseAdapter adapter, int selpos) {
-        mSelectedPosition = selpos;
-        setAdapter(adapter);
-    }
-
-    public void setAdapter(BaseAdapter adapter) {
-        mAdapter = adapter;
-        if (mAdapter != null) {
-            mAdapter.registerDataSetObserver(new DataSetObserver() {
-                @Override
-                public void onChanged() {
-                    super.onChanged();
-                    mDataChanged = true;
-                    handleDataChanged();
-                }
-
-                @Override
-                public void onInvalidated() {
-                    super.onInvalidated();
-                }
-            });
-        }
-        handleDataChanged();
-    }
-
-    public void handleDataChanged() {
-        if (mAdapter != null) {
-            if (mGapAnimator != null) {
-                mGapAnimator.cancel();
-            }
-            resetList();
-            mItemCount = mAdapter.getCount();
-            // checkFocus();
-            if (mItemCount > 0) {
-                int position = 0;
-                if (mSelectedPosition >= 0) {
-                    position = Math.min(mItemCount - 1, mSelectedPosition);
-                }
-                setSelectedPositionInt(position);
-                if (mGapPosition > INVALID_POSITION) {
-                    mGapAnimator = ObjectAnimator.ofInt(this, "gap", mGap, 0);
-                    mGapAnimator.setDuration(250);
-                    mGapAnimator.addListener(new AnimatorListenerAdapter() {
-                        @Override
-                        public void onAnimationEnd(Animator a) {
-                            mGapPosition = INVALID_POSITION;
-                            mGap = 0;
-                            mGapAnimator = null;
-                        }
-                    });
-                    mGapAnimator.start();
-                } else {
-                    layout(0, false);
-                }
-            }
-        } else {
-            // checkFocus();
-            mOldSelectedPosition = INVALID_POSITION;
-            setSelectedPositionInt(INVALID_POSITION);
-            resetList();
-            // Nothing selected
-            checkSelectionChanged();
-            invalidate();
-        }
-    }
-
-    /**
-     * Clear out all children from the list
-     */
-    void resetList() {
-        mDataChanged = false;
-        removeAllViewsInLayout();
-    }
-
-    public void setCallbackDuringFling(boolean shouldCallback) {
-        mShouldCallbackDuringFling = shouldCallback;
-    }
-
-    public void setCallbackOnUnselectedItemClick(boolean shouldCallback) {
-        mShouldCallbackOnUnselectedItemClick = shouldCallback;
-    }
-
-    public void setAnimationDuration(int animationDurationMillis) {
-        mAnimationDuration = animationDurationMillis;
-    }
-
-    public void setUnselectedAlpha(float unselectedAlpha) {
-        mUnselectedAlpha = unselectedAlpha;
-    }
-
-    @Override
-    protected boolean getChildStaticTransformation(View child, Transformation t) {
-        return false;
-    }
-
-    @Override
-    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
-        return p instanceof LayoutParams;
-    }
-
-    @Override
-    protected ViewGroup.LayoutParams generateLayoutParams(
-            ViewGroup.LayoutParams p) {
-        return new LayoutParams(p);
-    }
-
-    @Override
-    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
-        return new LayoutParams(getContext(), attrs);
-    }
-
-    @Override
-    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
-        return new Gallery.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
-        int widthSize;
-        int heightSize;
-        if (mDataChanged) {
-            handleDataChanged();
-        }
-        int preferredHeight = 0;
-        int preferredWidth = 0;
-        boolean needsMeasuring = true;
-        int selectedPosition = getSelectedItemPosition();
-        if (selectedPosition >= 0 && mAdapter != null
-                && selectedPosition < mAdapter.getCount()) {
-            // Try looking in the recycler. (Maybe we were measured once
-            // already)
-            View view = mRecycler.get(selectedPosition);
-            if (view == null) {
-                // Make a new one
-                view = mAdapter.getView(selectedPosition, null, this);
-            }
-            if (view != null) {
-                // Put in recycler for re-measuring and/or layout
-                mRecycler.put(selectedPosition, view);
-            }
-            if (view != null) {
-                if (view.getLayoutParams() == null) {
-                    mBlockLayoutRequests = true;
-                    view.setLayoutParams(generateDefaultLayoutParams());
-                    mBlockLayoutRequests = false;
-                }
-                measureChild(view, widthMeasureSpec, heightMeasureSpec);
-                preferredHeight = getChildHeight(view);
-                preferredWidth = getChildWidth(view);
-                needsMeasuring = false;
-            }
-        }
-        if (needsMeasuring) {
-            // No views -- just use padding
-            preferredHeight = 0;
-            if (widthMode == MeasureSpec.UNSPECIFIED) {
-                preferredWidth = 0;
-            }
-        }
-        preferredHeight = Math
-                .max(preferredHeight, getSuggestedMinimumHeight());
-        preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth());
-        heightSize = resolveSizeAndState(preferredHeight, heightMeasureSpec, 0);
-        widthSize = resolveSizeAndState(preferredWidth, widthMeasureSpec, 0);
-        setMeasuredDimension(widthSize, heightSize);
-        mHeightMeasureSpec = heightMeasureSpec;
-        mWidthMeasureSpec = widthMeasureSpec;
-    }
-
-    @Override
-    public void requestLayout() {
-        if (!mBlockLayoutRequests) {
-            super.requestLayout();
-        }
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        mInLayout = true;
-        layout(0, false);
-        mInLayout = false;
-    }
-
-    int getChildHeight(View child) {
-        return child.getMeasuredHeight();
-    }
-
-    int getChildWidth(View child) {
-        return child.getMeasuredWidth();
-    }
-
-    /**
-     * Tracks a motion scroll. In reality, this is used to do just about any
-     * movement to items (touch scroll, arrow-key scroll, set an item as
-     * selected).
-     *
-     * @param deltaX
-     *            Change in X from the previous event.
-     */
-    protected void trackMotionScroll(int deltaX) {
-        if (getChildCount() == 0) {
-            return;
-        }
-        boolean toLeft = deltaX < 0;
-        int limitedDeltaX = getLimitedMotionScrollAmount(toLeft, deltaX);
-        if (limitedDeltaX != deltaX) {
-            // The above call returned a limited amount, so stop any
-            // scrolls/flings
-            mFlingRunnable.endFling(false);
-            onFinishedMovement();
-        }
-        offsetChildrenLeftAndRight(limitedDeltaX);
-        detachOffScreenChildren(toLeft);
-        if (toLeft) {
-            // If moved left, there will be empty space on the right
-            fillToGalleryRight();
-        } else {
-            // Similarly, empty space on the left
-            fillToGalleryLeft();
-        }
-        setSelectionToCenterChild();
-        invalidate();
-    }
-
-    int getLimitedMotionScrollAmount(boolean motionToLeft, int deltaX) {
-        int extremeItemPosition = motionToLeft ? mItemCount - 1 : 0;
-        View extremeChild = getChildAt(extremeItemPosition - mFirstPosition);
-        if (extremeChild == null) {
-            return deltaX;
-        }
-        int extremeChildCenter = getCenterOfView(extremeChild);
-        int galleryCenter = getCenterOfGallery();
-        if (motionToLeft) {
-            if (extremeChildCenter <= galleryCenter) {
-                return 0;
-            }
-        } else {
-            if (extremeChildCenter >= galleryCenter) {
-                return 0;
-            }
-        }
-        int centerDifference = galleryCenter - extremeChildCenter;
-        return motionToLeft ? Math.max(centerDifference, deltaX) : Math.min(
-                centerDifference, deltaX);
-    }
-
-    /**
-     * Offset the horizontal location of all children of this view by the
-     * specified number of pixels.
-     *
-     * @param offset
-     *            the number of pixels to offset
-     */
-    private void offsetChildrenLeftAndRight(int offset) {
-        for (int i = getChildCount() - 1; i >= 0; i--) {
-            if (mHorizontal) {
-                getChildAt(i).offsetLeftAndRight(offset);
-            } else {
-                getChildAt(i).offsetTopAndBottom(offset);
-            }
-        }
-    }
-
-    /**
-     * @return The center of this Gallery.
-     */
-    private int getCenterOfGallery() {
-        return (mHorizontal ? (getWidth() - mPaddingLeft - mPaddingRight) / 2
-                + mPaddingLeft : (getHeight() - mPaddingTop - mPaddingBottom)
-                / 2 + mPaddingTop);
-    }
-
-    /**
-     * @return The center of the given view.
-     */
-    private int getCenterOfView(View view) {
-        return (mHorizontal ? view.getLeft() + view.getWidth() / 2 : view
-                .getTop() + view.getHeight() / 2);
-    }
-
-    /**
-     * Detaches children that are off the screen (i.e.: Gallery bounds).
-     *
-     * @param toLeft
-     *            Whether to detach children to the left of the Gallery, or to
-     *            the right.
-     */
-    private void detachOffScreenChildren(boolean toLeft) {
-        int numChildren = getChildCount();
-        int firstPosition = mFirstPosition;
-        int start = 0;
-        int count = 0;
-        if (toLeft) {
-            final int galleryLeft = (mHorizontal ? mPaddingLeft : mPaddingTop);
-            for (int i = 0; i < numChildren; i++) {
-                final View child = getChildAt(i);
-                if ((mHorizontal && (child.getRight() >= galleryLeft))
-                        || (!mHorizontal && (child.getBottom() >= galleryLeft))) {
-                    break;
-                } else {
-                    count++;
-                    mRecycler.put(firstPosition + i, child);
-                }
-            }
-        } else {
-            final int galleryRight = (mHorizontal ? getWidth() - mPaddingRight
-                    : getHeight() - mPaddingBottom);
-            for (int i = numChildren - 1; i >= 0; i--) {
-                final View child = getChildAt(i);
-                if ((mHorizontal && (child.getLeft() <= galleryRight))
-                        || (!mHorizontal && (child.getTop() <= galleryRight))) {
-                    break;
-                } else {
-                    start = i;
-                    count++;
-                    mRecycler.put(firstPosition + i, child);
-                }
-            }
-        }
-        detachViewsFromParent(start, count);
-        if (toLeft) {
-            mFirstPosition += count;
-        }
-    }
-
-    private void scrollIntoSlots() {
-        if (getChildCount() == 0 || mSelectedChild == null)
-            return;
-        int selectedCenter = getCenterOfView(mSelectedChild);
-        int targetCenter = getCenterOfGallery();
-        int scrollAmount = targetCenter - selectedCenter;
-        if (scrollAmount != 0) {
-            mFlingRunnable.startUsingDistance(scrollAmount);
-        } else {
-            onFinishedMovement();
-        }
-    }
-
-    private void onFinishedMovement() {
-        if (mSuppressSelectionChanged) {
-            mSuppressSelectionChanged = false;
-            // We haven't sent callbacks during the fling, so do it now
-            selectionChanged();
-        }
-        invalidate();
-    }
-
-    protected void setSelectionToCenterChild() {
-        if (mSelectedChild == null)
-            return;
-        int galleryCenter = getCenterOfGallery();
-        int lastDistance = Integer.MAX_VALUE;
-        int newSelectedChildIndex = 0;
-        for (int i = getChildCount() - 1; i >= 0; i--) {
-            View child = getChildAt(i);
-            int distance = Math.abs(getCenterOfView(child) - galleryCenter);
-            if (distance > lastDistance) {
-                // we're moving away from the center, done
-                break;
-            } else {
-                newSelectedChildIndex = i;
-                lastDistance = distance;
-            }
-        }
-        int newPos = mFirstPosition + newSelectedChildIndex;
-        if (newPos != mSelectedPosition) {
-            setSelectedPositionInt(newPos);
-            checkSelectionChanged();
-        }
-    }
-
-    /**
-     * Creates and positions all views for this Gallery.
-     * <p>
-     * We layout rarely, most of the time {@link #trackMotionScroll(int)} takes
-     * care of repositioning, adding, and removing children.
-     *
-     * @param delta
-     *            Change in the selected position. +1 means the selection is
-     *            moving to the right, so views are scrolling to the left. -1
-     *            means the selection is moving to the left.
-     */
-    void layout(int delta, boolean animate) {
-        int childrenLeft = 0;
-        int childrenWidth = (mHorizontal ? mRight - mLeft : mBottom - mTop);
-        if (mDataChanged) {
-            handleDataChanged();
-        }
-        if (mItemCount == 0) {
-            mOldSelectedPosition = INVALID_POSITION;
-            setSelectedPositionInt(INVALID_POSITION);
-            resetList();
-            return;
-        }
-        if (mSelectedPosition >= 0) {
-            setSelectedPositionInt(mSelectedPosition);
-        }
-        recycleAllViews();
-        detachAllViewsFromParent();
-        mRightMost = 0;
-        mLeftMost = 0;
-        mFirstPosition = mSelectedPosition;
-        View sel = makeAndAddView(mSelectedPosition, 0, 0, true);
-        // Put the selected child in the center
-        int selectedOffset = childrenLeft + (childrenWidth / 2)
-                - (mHorizontal ? (sel.getWidth() / 2) : (sel.getHeight() / 2));
-        if (mHorizontal) {
-            sel.offsetLeftAndRight(selectedOffset);
-        } else {
-            sel.offsetTopAndBottom(selectedOffset);
-        }
-        fillToGalleryRight();
-        fillToGalleryLeft();
-        if (mGapPosition > INVALID_POSITION) {
-            adjustGap();
-        }
-        mRecycler.clear();
-        invalidate();
-        checkSelectionChanged();
-        mDataChanged = false;
-        updateSelectedItemMetadata();
-    }
-
-    void adjustGap() {
-        for (int i = 0; i < getChildCount(); i++) {
-            int pos = i + mFirstPosition;
-            if (pos >= mGapPosition) {
-                if (mHorizontal) {
-                    getChildAt(i).offsetLeftAndRight(mGap);
-                } else {
-                    getChildAt(i).offsetTopAndBottom(mGap);
-                }
-            }
-        }
-    }
-
-    void recycleAllViews() {
-        final int childCount = getChildCount();
-        final RecycleBin recycleBin = mRecycler;
-        final int position = mFirstPosition;
-        for (int i = 0; i < childCount; i++) {
-            View v = getChildAt(i);
-            int index = position + i;
-            recycleBin.put(index, v);
-        }
-    }
-
-    private void fillToGalleryLeft() {
-        int itemSpacing = mSpacing;
-        int galleryLeft = mHorizontal ? mPaddingLeft : mPaddingTop;
-        View prevIterationView = getChildAt(0);
-        int curPosition;
-        int curRightEdge;
-        if (prevIterationView != null) {
-            curPosition = mFirstPosition - 1;
-            curRightEdge = (mHorizontal ? prevIterationView.getLeft()
-                    : prevIterationView.getTop()) - itemSpacing;
-        } else {
-            // No children available!
-            curPosition = 0;
-            curRightEdge = (mHorizontal ? mRight - mLeft - mPaddingRight
-                    : mBottom - mTop - mPaddingBottom);
-            mShouldStopFling = true;
-        }
-        while (curRightEdge > galleryLeft && curPosition >= 0) {
-            prevIterationView = makeAndAddView(curPosition, curPosition
-                    - mSelectedPosition, curRightEdge, false);
-            // Remember some state
-            mFirstPosition = curPosition;
-            // Set state for next iteration
-            curRightEdge = (mHorizontal ? prevIterationView.getLeft()
-                    - itemSpacing : prevIterationView.getTop() - itemSpacing);
-            curPosition--;
-        }
-    }
-
-    private void fillToGalleryRight() {
-        int itemSpacing = mSpacing;
-        int galleryRight = (mHorizontal ? mRight - mLeft - mPaddingRight
-                : mBottom - mTop - mPaddingBottom);
-        int numChildren = getChildCount();
-        int numItems = mItemCount;
-        View prevIterationView = getChildAt(numChildren - 1);
-        int curPosition;
-        int curLeftEdge;
-        if (prevIterationView != null) {
-            curPosition = mFirstPosition + numChildren;
-            curLeftEdge = mHorizontal ? prevIterationView.getRight()
-                    + itemSpacing : prevIterationView.getBottom() + itemSpacing;
-        } else {
-            mFirstPosition = curPosition = mItemCount - 1;
-            curLeftEdge = mHorizontal ? mPaddingLeft : mPaddingTop;
-            mShouldStopFling = true;
-        }
-        while (curLeftEdge < galleryRight && curPosition < numItems) {
-            prevIterationView = makeAndAddView(curPosition, curPosition
-                    - mSelectedPosition, curLeftEdge, true);
-
-            // Set state for next iteration
-            curLeftEdge = mHorizontal ? prevIterationView.getRight()
-                    + itemSpacing : prevIterationView.getBottom() + itemSpacing;
-            curPosition++;
-        }
-    }
-
-    /**
-     * Obtain a view, either by pulling an existing view from the recycler or by
-     * getting a new one from the adapter. If we are animating, make sure there
-     * is enough information in the view's layout parameters to animate from the
-     * old to new positions.
-     *
-     * @param position
-     *            Position in the gallery for the view to obtain
-     * @param offset
-     *            Offset from the selected position
-     * @param x
-     *            X-coordintate indicating where this view should be placed.
-     *            This will either be the left or right edge of the view,
-     *            depending on the fromLeft paramter
-     * @param fromLeft
-     *            Are we positioning views based on the left edge? (i.e.,
-     *            building from left to right)?
-     * @return A view that has been added to the gallery
-     */
-    private View makeAndAddView(int position, int offset, int x,
-            boolean fromLeft) {
-        View child;
-        if (!mDataChanged) {
-            child = mRecycler.get(position);
-            if (child != null) {
-                // Can reuse an existing view
-                int childLeft = mHorizontal ? child.getLeft() : child.getTop();
-
-                // Remember left and right edges of where views have been placed
-                mRightMost = Math.max(mRightMost,
-                        childLeft
-                                + (mHorizontal ? child.getMeasuredWidth()
-                                        : child.getMeasuredHeight()));
-                mLeftMost = Math.min(mLeftMost, childLeft);
-
-                // Position the view
-                setUpChild(position, child, offset, x, fromLeft);
-
-                return child;
-            }
-        }
-        // Nothing found in the recycler -- ask the adapter for a view
-        child = mAdapter.getView(position, null, this);
-        // Position the view
-        setUpChild(position, child, offset, x, fromLeft);
-        return child;
-    }
-
-    /**
-     * Helper for makeAndAddView to set the position of a view and fill out its
-     * layout paramters.
-     *
-     * @param child
-     *            The view to position
-     * @param offset
-     *            Offset from the selected position
-     * @param x
-     *            X-coordintate indicating where this view should be placed.
-     *            This will either be the left or right edge of the view,
-     *            depending on the fromLeft paramter
-     * @param fromLeft
-     *            Are we positioning views based on the left edge? (i.e.,
-     *            building from left to right)?
-     */
-    private void setUpChild(int position, View child, int offset, int x,
-            boolean fromLeft) {
-        Gallery.LayoutParams lp = (Gallery.LayoutParams) child
-                .getLayoutParams();
-        if (lp == null) {
-            lp = (Gallery.LayoutParams) generateDefaultLayoutParams();
-        }
-        addViewInLayout(child, fromLeft ? -1 : 0, lp);
-        child.setSelected(offset == 0);
-        int childHeightSpec = ViewGroup.getChildMeasureSpec(mHeightMeasureSpec,
-                0, lp.height);
-        int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec,
-                0, lp.width);
-        child.measure(childWidthSpec, childHeightSpec);
-        int childLeft;
-        int childRight;
-        // Position vertically based on gravity setting
-        int childTop = calculateTop(child, true);
-        int childBottom = childTop
-                + (mHorizontal ? child.getMeasuredHeight() : child
-                        .getMeasuredWidth());
-        int width = mHorizontal ? child.getMeasuredWidth() : child
-                .getMeasuredHeight();
-        if (fromLeft) {
-            childLeft = x;
-            childRight = childLeft + width;
-        } else {
-            childLeft = x - width;
-            childRight = x;
-        }
-        if (mHorizontal) {
-            child.layout(childLeft, childTop, childRight, childBottom);
-        } else {
-            child.layout(childTop, childLeft, childBottom, childRight);
-        }
-    }
-
-    /**
-     * Figure out vertical placement based on mGravity
-     *
-     * @param child
-     *            Child to place
-     * @return Where the top of the child should be
-     */
-    protected int calculateTop(View child, boolean duringLayout) {
-        int myHeight = mHorizontal ? (duringLayout ? getMeasuredHeight()
-                : getHeight()) : (duringLayout ? getMeasuredWidth()
-                : getWidth());
-        int childHeight = mHorizontal ? (duringLayout ? child
-                .getMeasuredHeight() : child.getHeight())
-                : (duringLayout ? child.getMeasuredWidth() : child.getWidth());
-        int childTop = 0;
-        switch (mGravity) {
-        case Gravity.TOP:
-        case Gravity.LEFT:
-            childTop = 0;
-            break;
-        case Gravity.CENTER_VERTICAL:
-        case Gravity.CENTER_HORIZONTAL:
-            int availableSpace = myHeight - childHeight;
-            childTop = availableSpace / 2;
-            break;
-        case Gravity.BOTTOM:
-        case Gravity.RIGHT:
-            childTop = myHeight - childHeight;
-            break;
-        }
-        return childTop;
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        /*
-         * Shortcut the most recurring case: the user is in the dragging state
-         * and he is moving his finger. We want to intercept this motion.
-         */
-        final int action = ev.getAction();
-        if ((action == MotionEvent.ACTION_MOVE) && (mIsBeingDragged)) {
-            return true;
-        }
-        if ((action == MotionEvent.ACTION_MOVE) && (mIsOrthoDragged)) {
-            return true;
-        }
-        switch (action & MotionEvent.ACTION_MASK) {
-        case MotionEvent.ACTION_MOVE: {
-            /*
-             * mIsBeingDragged == false, otherwise the shortcut would have
-             * caught it. Check whether the user has moved far enough from his
-             * original down touch.
-             */
-            final int activePointerId = mActivePointerId;
-            if (activePointerId == INVALID_POINTER) {
-                // If we don't have a valid id, the touch down wasn't on
-                // content.
-                break;
-            }
-            final int pointerIndex = ev.findPointerIndex(activePointerId);
-            final float coord = mHorizontal ? ev.getX(pointerIndex) : ev
-                    .getY(pointerIndex);
-
-            final int diff = (int) Math.abs(coord - mLastMotionCoord);
-            if (diff > mTouchSlop) {
-                mIsBeingDragged = true;
-                mLastMotionCoord = coord;
-            } else {
-                final float ocoord = mHorizontal ? ev.getY(pointerIndex)
-                        : ev.getX(pointerIndex);
-                if (Math.abs(ocoord - mLastOrthoCoord) > mTouchSlop) {
-                    mIsOrthoDragged = true;
-                    mLastOrthoCoord = ocoord;
-                }
-            }
-            if (mIsBeingDragged || mIsOrthoDragged) {
-                if (mParent != null)
-                    mParent.requestDisallowInterceptTouchEvent(true);
-            }
-            break;
-        }
-        case MotionEvent.ACTION_DOWN: {
-            final float coord = mHorizontal ? ev.getX() : ev.getY();
-            /*
-             * Remember location of down touch. ACTION_DOWN always refers to
-             * pointer index 0.
-             */
-            mLastMotionCoord = coord;
-            mActivePointerId = ev.getPointerId(0);
-            /*
-             * If being flinged and user touches the screen, initiate drag;
-             * otherwise don't. mScroller.isFinished should be false when being
-             * flinged.
-             */
-            mIsBeingDragged = !mFlingRunnable.mScroller.isFinished();
-            mIsOrthoDragged = false;
-            final float ocoord = mHorizontal ? ev.getY() : ev.getX();
-            mLastOrthoCoord = ocoord;
-            mGestureDetector.onTouchEvent(ev);
-            break;
-        }
-        case MotionEvent.ACTION_CANCEL:
-        case MotionEvent.ACTION_UP:
-            /* Release the drag */
-            mIsBeingDragged = false;
-            mIsOrthoDragged = false;
-            mActivePointerId = INVALID_POINTER;
-            break;
-        case MotionEvent.ACTION_POINTER_DOWN: {
-            final int index = ev.getActionIndex();
-            mLastMotionCoord = mHorizontal ? ev.getX(index) : ev.getY(index);
-            mLastOrthoCoord = mHorizontal ? ev.getY(index) : ev.getX(index);
-            mActivePointerId = ev.getPointerId(index);
-            break;
-        }
-        case MotionEvent.ACTION_POINTER_UP:
-            mLastMotionCoord = mHorizontal ? ev.getX(ev.findPointerIndex(mActivePointerId))
-                    : ev.getY(ev.findPointerIndex(mActivePointerId));
-            mLastOrthoCoord = mHorizontal ? ev.getY(ev.findPointerIndex(mActivePointerId))
-                    : ev.getX(ev.findPointerIndex(mActivePointerId));
-            break;
-        }
-        return mIsBeingDragged || mIsOrthoDragged;
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        // Give everything to the gesture detector
-        boolean retValue = mGestureDetector.onTouchEvent(event);
-        int action = event.getAction();
-        if (action == MotionEvent.ACTION_UP) {
-            // Helper method for lifted finger
-            onUp(mDownTouchView);
-        } else if (action == MotionEvent.ACTION_CANCEL) {
-            onCancel();
-        }
-        return retValue;
-    }
-
-    public boolean onSingleTapUp(MotionEvent e) {
-        if (mDownTouchPosition >= 0) {
-            // An item tap should make it selected, so scroll to this child.
-            scrollToChild(mDownTouchPosition - mFirstPosition);
-            if (mShouldCallbackOnUnselectedItemClick
-                    || mDownTouchPosition == mSelectedPosition) {
-                performItemClick(mDownTouchView, mDownTouchPosition,
-                        mAdapter.getItemId(mDownTouchPosition));
-            }
-            return true;
-        }
-        return false;
-    }
-
-    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
-            float velocityY) {
-        if (!mShouldCallbackDuringFling) {
-            removeCallbacks(mDisableSuppressSelectionChangedRunnable);
-            if (!mSuppressSelectionChanged)
-                mSuppressSelectionChanged = true;
-        }
-        if (isOrthoMove(velocityX, velocityY)) {
-            onOrthoFling(mDownTouchView, e1, e2, mHorizontal ? velocityY : velocityX);
-            return true;
-        }
-        mFlingRunnable.startUsingVelocity(mHorizontal ? (int) -velocityX
-                : (int) -velocityY);
-        return true;
-    }
-
-    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
-            float distanceY) {
-        if (localLOGV)
-            Log.v(TAG, String.valueOf(e2.getX() - e1.getX()));
-        mParent.requestDisallowInterceptTouchEvent(true);
-        if (mIsOrthoDragged && isOrthoMove(distanceX, distanceY)) {
-            onOrthoDrag(mDownTouchView, e1, e2, mHorizontal ? distanceY : distanceX);
-        } else if (mIsBeingDragged) {
-            if (!mShouldCallbackDuringFling) {
-                if (mIsFirstScroll) {
-                    if (!mSuppressSelectionChanged) {
-                        mSuppressSelectionChanged = true;
-                    }
-                    postDelayed(mDisableSuppressSelectionChangedRunnable,
-                            SCROLL_TO_FLING_UNCERTAINTY_TIMEOUT);
-                }
-            } else {
-                if (mSuppressSelectionChanged) {
-                    mSuppressSelectionChanged = false;
-                }
-            }
-            trackMotionScroll(mHorizontal ? -1 * (int) distanceX : -1
-                                            * (int) distanceY);
-
-            mIsFirstScroll = false;
-        }
-        return true;
-    }
-
-    protected void onOrthoDrag(View draggedView, MotionEvent down,
-            MotionEvent move, float distance) {
-    }
-
-    protected void onOrthoFling(View draggedView, MotionEvent down,
-            MotionEvent move, float velocity) {
-    }
-
-    public boolean onDown(MotionEvent e) {
-        mFlingRunnable.stop(false);
-        mDownTouchPosition = pointToPosition((int) e.getX(), (int) e.getY());
-        if (mDownTouchPosition >= 0) {
-            mDownTouchView = getChildAt(mDownTouchPosition - mFirstPosition);
-        }
-        // Reset the multiple-scroll tracking state
-        mIsFirstScroll = true;
-        // Must return true to get matching events for this down event.
-        return true;
-    }
-
-    /**
-     * Called when a touch event's action is MotionEvent.ACTION_UP.
-     */
-    protected void onUp(View downView) {
-        if (mFlingRunnable.mScroller.isFinished()) {
-            scrollIntoSlots();
-        }
-        dispatchUnpress();
-    }
-
-    private boolean isOrthoMove(float moveX, float moveY) {
-        return mHorizontal && Math.abs(moveY) > Math.abs(moveX)
-                || !mHorizontal && Math.abs(moveX) > Math.abs(moveY);
-    }
-
-    /**
-     * Called when a touch event's action is MotionEvent.ACTION_CANCEL.
-     */
-    void onCancel() {
-        onUp(mDownTouchView);
-    }
-
-    public void onLongPress(MotionEvent e) {
-    }
-
-    public void onShowPress(MotionEvent e) {
-    }
-
-    private void dispatchPress(View child) {
-        if (child != null) {
-            child.setPressed(true);
-        }
-        setPressed(true);
-    }
-
-    private void dispatchUnpress() {
-        for (int i = getChildCount() - 1; i >= 0; i--) {
-            getChildAt(i).setPressed(false);
-        }
-        setPressed(false);
-    }
-
-    @Override
-    public void dispatchSetSelected(boolean selected) {
-    }
-
-    @Override
-    protected void dispatchSetPressed(boolean pressed) {
-    }
-
-    @Override
-    public boolean dispatchKeyEvent(KeyEvent event) {
-        return event.dispatch(this, null, null);
-    }
-
-    /**
-     * Handles left, right, and clicking
-     *
-     * @see android.view.View#onKeyDown
-     */
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        switch (keyCode) {
-
-        case KeyEvent.KEYCODE_DPAD_LEFT:
-            if (movePrevious()) {
-                playSoundEffect(SoundEffectConstants.NAVIGATION_LEFT);
-            }
-            return true;
-
-        case KeyEvent.KEYCODE_DPAD_RIGHT:
-            if (moveNext()) {
-                playSoundEffect(SoundEffectConstants.NAVIGATION_RIGHT);
-            }
-            return true;
-
-        case KeyEvent.KEYCODE_DPAD_CENTER:
-        case KeyEvent.KEYCODE_ENTER:
-            mReceivedInvokeKeyDown = true;
-            // fallthrough to default handling
-        }
-
-        return super.onKeyDown(keyCode, event);
-    }
-
-    @Override
-    public boolean onKeyUp(int keyCode, KeyEvent event) {
-        switch (keyCode) {
-        case KeyEvent.KEYCODE_DPAD_CENTER:
-        case KeyEvent.KEYCODE_ENTER: {
-
-            if (mReceivedInvokeKeyDown) {
-                if (mItemCount > 0) {
-
-                    dispatchPress(mSelectedChild);
-                    postDelayed(new Runnable() {
-                        public void run() {
-                            dispatchUnpress();
-                        }
-                    }, ViewConfiguration.getPressedStateDuration());
-
-                    int selectedIndex = mSelectedPosition - mFirstPosition;
-                    performItemClick(getChildAt(selectedIndex),
-                            mSelectedPosition,
-                            mAdapter.getItemId(mSelectedPosition));
-                }
-            }
-
-            // Clear the flag
-            mReceivedInvokeKeyDown = false;
-
-            return true;
-        }
-        }
-
-        return super.onKeyUp(keyCode, event);
-    }
-
-    private void performItemClick(View childAt, int mSelectedPosition2,
-            long itemId) {
-    }
-
-    protected boolean movePrevious() {
-        if (mItemCount > 0 && mSelectedPosition > 0) {
-            scrollToChild(mSelectedPosition - mFirstPosition - 1);
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    public boolean moveNext() {
-        if (mItemCount > 0 && mSelectedPosition < mItemCount - 1) {
-            scrollToChild(mSelectedPosition - mFirstPosition + 1);
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    public boolean scrollToChild(int childPosition) {
-        View child = getChildAt(childPosition);
-        if (child != null) {
-            int distance = getCenterOfGallery() - getCenterOfView(child);
-            mFlingRunnable.startUsingDistance(distance, 0);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * use the scroller to scroll to a new position, independent
-     * of whether attached or not
-     * this uses trackMotionScroll, which will set the selection
-     */
-    public void smoothScrollToPosition(int pos, int duration,
-            final OnScrollFinishedListener listener) {
-        if (pos >= mAdapter.getCount() || getChildCount() < 1) return;
-        int dist = (mSelectedPosition - pos) * (mHorizontal ? getChildHeight(getChildAt(0))
-                : getChildWidth(getChildAt(0)));
-        ObjectAnimator scroll = ObjectAnimator.ofInt(this, "scrollValue", 0, dist);
-        scroll.setDuration(duration);
-        scroll.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mScrollValue = 0;
-                listener.onScrollFinished();
-            }
-        });
-        scroll.setInterpolator(new BounceInterpolator());
-        scroll.start();
-    }
-
-    public void setScrollValue(int scroll) {
-        trackMotionScroll(scroll - mScrollValue);
-        mScrollValue = scroll;
-    }
-
-    public int getScrollValue() {
-        return mScrollValue;
-    }
-
-    protected void setSelectedPositionInt(int position) {
-        mSelectedPosition = position;
-        updateSelectedItemMetadata();
-    }
-
-    void checkSelectionChanged() {
-        if (mSelectedPosition != mOldSelectedPosition) {
-            selectionChanged();
-            mOldSelectedPosition = mSelectedPosition;
-        }
-    }
-
-    private class SelectionNotifier implements Runnable {
-        public void run() {
-            if (mDataChanged) {
-                // Data has changed between when this SelectionNotifier
-                // was posted and now. We need to wait until the AdapterView
-                // has been synched to the new data.
-                if (mAdapter != null) {
-                    post(this);
-                }
-            } else {
-                fireOnSelected();
-            }
-        }
-    }
-
-    void selectionChanged() {
-        if (mSuppressSelectionChanged)
-            return;
-        if (mOnItemSelectedListener != null) {
-            if (mInLayout || mBlockLayoutRequests) {
-                // If we are in a layout traversal, defer notification
-                if (mSelectionNotifier == null) {
-                    mSelectionNotifier = new SelectionNotifier();
-                }
-                post(mSelectionNotifier);
-            } else {
-                fireOnSelected();
-            }
-        }
-
-        // we fire selection events here not in View
-        // if (mSelectedPosition != ListView.INVALID_POSITION && isShown() &&
-        // !isInTouchMode()) {
-        // sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
-        // }
-    }
-
-    private void fireOnSelected() {
-        if (mOnItemSelectedListener == null)
-            return;
-
-        int selection = this.getSelectedItemPosition();
-        if (selection >= 0) {
-            View v = getSelectedView();
-            mOnItemSelectedListener.onItemSelected(this, v, selection,
-                    mAdapter.getItemId(selection));
-        }
-    }
-
-    public int getSelectedItemPosition() {
-        return mSelectedPosition;
-    }
-
-    public View getSelectedView() {
-        if (mItemCount > 0 && mSelectedPosition >= 0) {
-            return getChildAt(mSelectedPosition - mFirstPosition);
-        } else {
-            return null;
-        }
-    }
-
-    private void updateSelectedItemMetadata() {
-        View oldSelectedChild = mSelectedChild;
-        View child = mSelectedChild = getChildAt(mSelectedPosition
-                - mFirstPosition);
-        if (child == null) {
-            return;
-        }
-        child.setSelected(true);
-        child.setFocusable(true);
-
-        if (hasFocus()) {
-            child.requestFocus();
-        }
-        // We unfocus the old child down here so the above hasFocus check
-        // returns true
-        if (oldSelectedChild != null && oldSelectedChild != child) {
-            // Make sure its drawable state doesn't contain 'selected'
-            oldSelectedChild.setSelected(false);
-            // Make sure it is not focusable anymore, since otherwise arrow keys
-            // can make this one be focused
-            oldSelectedChild.setFocusable(false);
-        }
-    }
-
-    public void setGravity(int gravity) {
-        if (mGravity != gravity) {
-            mGravity = gravity;
-            requestLayout();
-        }
-    }
-
-    @Override
-    protected void onFocusChanged(boolean gainFocus, int direction,
-            Rect previouslyFocusedRect) {
-        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
-        /*
-         * The gallery shows focus by focusing the selected item. So, give focus
-         * to our selected item instead. We steal keys from our selected item
-         * elsewhere.
-         */
-        if (gainFocus && mSelectedChild != null) {
-            mSelectedChild.requestFocus(direction);
-            mSelectedChild.setSelected(true);
-        }
-    }
-
-    void setNextSelectedPositionInt(int position) {
-        mSelectedPosition = position;
-    }
-
-    public int pointToPosition(int x, int y) {
-        Rect frame = mTouchFrame;
-        if (frame == null) {
-            mTouchFrame = new Rect();
-            frame = mTouchFrame;
-        }
-        final int count = getChildCount();
-        for (int i = count - 1; i >= 0; i--) {
-            View child = getChildAt(i);
-            if (child.getVisibility() == View.VISIBLE) {
-                child.getHitRect(frame);
-                if (frame.contains(x, y)) {
-                    return mFirstPosition + i;
-                }
-            }
-        }
-        return INVALID_POSITION;
-    }
-
-    private class FlingRunnable implements Runnable {
-        private Scroller mScroller;
-
-        /**
-         * X value reported by mScroller on the previous fling
-         */
-        private int mLastFlingX;
-
-        public FlingRunnable() {
-            mScroller = new Scroller(getContext());
-        }
-
-        private void startCommon() {
-            // Remove any pending flings
-            removeCallbacks(this);
-        }
-
-        public void startUsingVelocity(int initialVelocity) {
-            if (initialVelocity == 0)
-                return;
-            startCommon();
-            int initialX = initialVelocity < 0 ? Integer.MAX_VALUE : 0;
-            mLastFlingX = initialX;
-            mScroller.fling(initialX, 0, initialVelocity, 0, 0,
-                    Integer.MAX_VALUE, 0, Integer.MAX_VALUE);
-            post(this);
-        }
-
-        public void startUsingDistance(int distance) {
-            startUsingDistance(distance, mAnimationDuration);
-        }
-
-        public void startUsingDistance(int distance, int duration) {
-            if (distance == 0)
-                return;
-            startCommon();
-            mLastFlingX = 0;
-            mScroller.startScroll(0, 0, -distance, 0, duration);
-            post(this);
-        }
-
-        public void stop(boolean scrollIntoSlots) {
-            removeCallbacks(this);
-            endFling(scrollIntoSlots);
-        }
-
-        private void endFling(boolean scrollIntoSlots) {
-            mScroller.forceFinished(true);
-            if (scrollIntoSlots)
-                scrollIntoSlots();
-        }
-
-        public void run() {
-            if (mItemCount == 0) {
-                endFling(true);
-                return;
-            }
-            mShouldStopFling = false;
-            final Scroller scroller = mScroller;
-            boolean more = scroller.computeScrollOffset();
-            final int x = scroller.getCurrX();
-            // Flip sign to convert finger direction to list items direction
-            // (e.g. finger moving down means list is moving towards the top)
-            int delta = mLastFlingX - x;
-            // Pretend that each frame of a fling scroll is a touch scroll
-            if (delta > 0) {
-                // Moving towards the left. Use first view as mDownTouchPosition
-                mDownTouchPosition = mFirstPosition;
-                // Don't fling more than 1 screen
-                delta = mHorizontal ? Math.min(getWidth() - mPaddingLeft
-                        - mPaddingRight - 1, delta) : Math.min(getHeight()
-                        - mPaddingTop - mPaddingBottom - 1, delta);
-            } else {
-                // Moving towards the right. Use last view as mDownTouchPosition
-                int offsetToLast = getChildCount() - 1;
-                mDownTouchPosition = mFirstPosition + offsetToLast;
-                // Don't fling more than 1 screen
-                delta = mHorizontal ? Math.max(-(getWidth() - mPaddingRight
-                        - mPaddingLeft - 1), delta) : Math.max(-(getHeight()
-                        - mPaddingBottom - mPaddingTop - 1), delta);
-            }
-            trackMotionScroll(delta);
-            if (more && !mShouldStopFling) {
-                mLastFlingX = x;
-                post(this);
-            } else {
-                endFling(true);
-            }
-        }
-    }
-
-    /**
-     * Gallery extends LayoutParams to provide a place to hold current
-     * Transformation information along with previous position/transformation
-     * info.
-     *
-     */
-    public static class LayoutParams extends ViewGroup.LayoutParams {
-        public LayoutParams(Context c, AttributeSet attrs) {
-            super(c, attrs);
-        }
-
-        public LayoutParams(int w, int h) {
-            super(w, h);
-        }
-
-        public LayoutParams(ViewGroup.LayoutParams source) {
-            super(source);
-        }
-    }
-
-    class RecycleBin {
-        private final SparseArray<View> mScrapHeap = new SparseArray<View>();
-
-        public void put(int position, View v) {
-            mScrapHeap.put(position, v);
-        }
-
-        View get(int position) {
-            // System.out.print("Looking for " + position);
-            View result = mScrapHeap.get(position);
-            if (result != null) {
-                // System.out.println(" HIT");
-                mScrapHeap.delete(position);
-            } else {
-                // System.out.println(" MISS");
-            }
-            return result;
-        }
-
-        void clear() {
-            final SparseArray<View> scrapHeap = mScrapHeap;
-            final int count = scrapHeap.size();
-            for (int i = 0; i < count; i++) {
-                final View view = scrapHeap.valueAt(i);
-                if (view != null) {
-                    removeDetachedView(view, true);
-                }
-            }
-            scrapHeap.clear();
-        }
-    }
-
-}
diff --git a/src/com/android/browser/view/ScrollerView.java b/src/com/android/browser/view/ScrollerView.java
new file mode 100644
index 0000000..545dd25
--- /dev/null
+++ b/src/com/android/browser/view/ScrollerView.java
@@ -0,0 +1,1869 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser.view;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.PointF;
+import android.graphics.Rect;
+import android.os.StrictMode;
+import android.util.AttributeSet;
+import android.view.FocusFinder;
+import android.view.InputDevice;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewDebug;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.animation.AnimationUtils;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.OverScroller;
+import android.widget.TextView;
+
+import com.android.internal.R;
+
+import java.util.List;
+
+/**
+ * Layout container for a view hierarchy that can be scrolled by the user,
+ * allowing it to be larger than the physical display.  A ScrollView
+ * is a {@link FrameLayout}, meaning you should place one child in it
+ * containing the entire contents to scroll; this child may itself be a layout
+ * manager with a complex hierarchy of objects.  A child that is often used
+ * is a {@link LinearLayout} in a vertical orientation, presenting a vertical
+ * array of top-level items that the user can scroll through.
+ *
+ * <p>The {@link TextView} class also
+ * takes care of its own scrolling, so does not require a ScrollView, but
+ * using the two together is possible to achieve the effect of a text view
+ * within a larger container.
+ *
+ * <p>ScrollView only supports vertical scrolling.
+ *
+ * @attr ref android.R.styleable#ScrollView_fillViewport
+ */
+public class ScrollerView extends FrameLayout {
+    static final int ANIMATED_SCROLL_GAP = 250;
+
+    static final float MAX_SCROLL_FACTOR = 0.5f;
+
+    private long mLastScroll;
+
+    private final Rect mTempRect = new Rect();
+    protected OverScroller mScroller;
+
+    /**
+     * Position of the last motion event.
+     */
+    private float mLastMotionY;
+
+    /**
+     * True when the layout has changed but the traversal has not come through yet.
+     * Ideally the view hierarchy would keep track of this for us.
+     */
+    private boolean mIsLayoutDirty = true;
+
+    /**
+     * The child to give focus to in the event that a child has requested focus while the
+     * layout is dirty. This prevents the scroll from being wrong if the child has not been
+     * laid out before requesting focus.
+     */
+    protected View mChildToScrollTo = null;
+
+    /**
+     * True if the user is currently dragging this ScrollView around. This is
+     * not the same as 'is being flinged', which can be checked by
+     * mScroller.isFinished() (flinging begins when the user lifts his finger).
+     */
+    protected boolean mIsBeingDragged = false;
+
+    /**
+     * Determines speed during touch scrolling
+     */
+    private VelocityTracker mVelocityTracker;
+
+    /**
+     * When set to true, the scroll view measure its child to make it fill the currently
+     * visible area.
+     */
+    @ViewDebug.ExportedProperty(category = "layout")
+    private boolean mFillViewport;
+
+    /**
+     * Whether arrow scrolling is animated.
+     */
+    private boolean mSmoothScrollingEnabled = true;
+
+    private int mTouchSlop;
+    protected int mMinimumVelocity;
+    private int mMaximumVelocity;
+
+    private int mOverscrollDistance;
+    private int mOverflingDistance;
+
+    /**
+     * ID of the active pointer. This is used to retain consistency during
+     * drags/flings if multiple pointers are used.
+     */
+    private int mActivePointerId = INVALID_POINTER;
+
+    /**
+     * The StrictMode "critical time span" objects to catch animation
+     * stutters.  Non-null when a time-sensitive animation is
+     * in-flight.  Must call finish() on them when done animating.
+     * These are no-ops on user builds.
+     */
+    private StrictMode.Span mScrollStrictSpan = null;  // aka "drag"
+    private StrictMode.Span mFlingStrictSpan = null;
+
+    /**
+     * Sentinel value for no current active pointer.
+     * Used by {@link #mActivePointerId}.
+     */
+    private static final int INVALID_POINTER = -1;
+
+    /**
+     * orientation of the scrollview
+     */
+    protected boolean mHorizontal;
+
+    protected boolean mIsOrthoDragged;
+    private float mLastOrthoCoord;
+    private View mDownView;
+    private PointF mDownCoords;
+
+
+    public ScrollerView(Context context) {
+        this(context, null);
+    }
+
+    public ScrollerView(Context context, AttributeSet attrs) {
+        this(context, attrs, com.android.internal.R.attr.scrollViewStyle);
+    }
+
+    public ScrollerView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        initScrollView();
+
+        TypedArray a =
+            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ScrollView, defStyle, 0);
+
+        setFillViewport(a.getBoolean(R.styleable.ScrollView_fillViewport, false));
+
+        a.recycle();
+    }
+
+    private void initScrollView() {
+        mScroller = new OverScroller(getContext());
+        setFocusable(true);
+        setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
+        setWillNotDraw(false);
+        final ViewConfiguration configuration = ViewConfiguration.get(mContext);
+        mTouchSlop = configuration.getScaledTouchSlop();
+        mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
+        mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
+        mOverscrollDistance = configuration.getScaledOverscrollDistance();
+        mOverflingDistance = configuration.getScaledOverflingDistance();
+        mDownCoords = new PointF();
+    }
+
+    public void setOrientation(int orientation) {
+        mHorizontal = (orientation == LinearLayout.HORIZONTAL);
+        requestLayout();
+    }
+
+    @Override
+    public boolean shouldDelayChildPressedState() {
+        return true;
+    }
+
+    @Override
+    protected float getTopFadingEdgeStrength() {
+        if (getChildCount() == 0) {
+            return 0.0f;
+        }
+        if (mHorizontal) {
+            final int length = getHorizontalFadingEdgeLength();
+            if (mScrollX < length) {
+                return mScrollX / (float) length;
+            }
+        } else {
+            final int length = getVerticalFadingEdgeLength();
+            if (mScrollY < length) {
+                return mScrollY / (float) length;
+            }
+        }
+        return 1.0f;
+    }
+
+    @Override
+    protected float getBottomFadingEdgeStrength() {
+        if (getChildCount() == 0) {
+            return 0.0f;
+        }
+        if (mHorizontal) {
+            final int length = getHorizontalFadingEdgeLength();
+            final int bottomEdge = getWidth() - mPaddingRight;
+            final int span = getChildAt(0).getRight() - mScrollX - bottomEdge;
+            if (span < length) {
+                return span / (float) length;
+            }
+        } else {
+            final int length = getVerticalFadingEdgeLength();
+            final int bottomEdge = getHeight() - mPaddingBottom;
+            final int span = getChildAt(0).getBottom() - mScrollY - bottomEdge;
+            if (span < length) {
+                return span / (float) length;
+            }
+        }
+        return 1.0f;
+    }
+
+    /**
+     * @return The maximum amount this scroll view will scroll in response to
+     *   an arrow event.
+     */
+    public int getMaxScrollAmount() {
+        return (int) (MAX_SCROLL_FACTOR * (mHorizontal
+                ? (mRight - mLeft) : (mBottom - mTop)));
+    }
+
+
+    @Override
+    public void addView(View child) {
+        if (getChildCount() > 0) {
+            throw new IllegalStateException("ScrollView can host only one direct child");
+        }
+
+        super.addView(child);
+    }
+
+    @Override
+    public void addView(View child, int index) {
+        if (getChildCount() > 0) {
+            throw new IllegalStateException("ScrollView can host only one direct child");
+        }
+
+        super.addView(child, index);
+    }
+
+    @Override
+    public void addView(View child, ViewGroup.LayoutParams params) {
+        if (getChildCount() > 0) {
+            throw new IllegalStateException("ScrollView can host only one direct child");
+        }
+
+        super.addView(child, params);
+    }
+
+    @Override
+    public void addView(View child, int index, ViewGroup.LayoutParams params) {
+        if (getChildCount() > 0) {
+            throw new IllegalStateException("ScrollView can host only one direct child");
+        }
+
+        super.addView(child, index, params);
+    }
+
+    /**
+     * @return Returns true this ScrollView can be scrolled
+     */
+    private boolean canScroll() {
+        View child = getChildAt(0);
+        if (child != null) {
+            if (mHorizontal) {
+                return getWidth() < child.getWidth() + mPaddingLeft + mPaddingRight;
+            } else {
+                return getHeight() < child.getHeight() + mPaddingTop + mPaddingBottom;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Indicates whether this ScrollView's content is stretched to fill the viewport.
+     *
+     * @return True if the content fills the viewport, false otherwise.
+     *
+     * @attr ref android.R.styleable#ScrollView_fillViewport
+     */
+    public boolean isFillViewport() {
+        return mFillViewport;
+    }
+
+    /**
+     * Indicates this ScrollView whether it should stretch its content height to fill
+     * the viewport or not.
+     *
+     * @param fillViewport True to stretch the content's height to the viewport's
+     *        boundaries, false otherwise.
+     *
+     * @attr ref android.R.styleable#ScrollView_fillViewport
+     */
+    public void setFillViewport(boolean fillViewport) {
+        if (fillViewport != mFillViewport) {
+            mFillViewport = fillViewport;
+            requestLayout();
+        }
+    }
+
+    /**
+     * @return Whether arrow scrolling will animate its transition.
+     */
+    public boolean isSmoothScrollingEnabled() {
+        return mSmoothScrollingEnabled;
+    }
+
+    /**
+     * Set whether arrow scrolling will animate its transition.
+     * @param smoothScrollingEnabled whether arrow scrolling will animate its transition
+     */
+    public void setSmoothScrollingEnabled(boolean smoothScrollingEnabled) {
+        mSmoothScrollingEnabled = smoothScrollingEnabled;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        if (!mFillViewport) {
+            return;
+        }
+
+        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+        if (heightMode == MeasureSpec.UNSPECIFIED) {
+            return;
+        }
+
+        if (getChildCount() > 0) {
+            final View child = getChildAt(0);
+            if (mHorizontal) {
+                int width = getMeasuredWidth();
+                if (child.getMeasuredWidth() < width) {
+                    final FrameLayout.LayoutParams lp = (LayoutParams) child
+                            .getLayoutParams();
+
+                    int childHeightMeasureSpec = getChildMeasureSpec(
+                            heightMeasureSpec, mPaddingTop + mPaddingBottom,
+                            lp.height);
+                    width -= mPaddingLeft;
+                    width -= mPaddingRight;
+                    int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
+                            width, MeasureSpec.EXACTLY);
+
+                    child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+                }
+            } else {
+                int height = getMeasuredHeight();
+                if (child.getMeasuredHeight() < height) {
+                    final FrameLayout.LayoutParams lp = (LayoutParams) child
+                            .getLayoutParams();
+
+                    int childWidthMeasureSpec = getChildMeasureSpec(
+                            widthMeasureSpec, mPaddingLeft + mPaddingRight,
+                            lp.width);
+                    height -= mPaddingTop;
+                    height -= mPaddingBottom;
+                    int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
+                            height, MeasureSpec.EXACTLY);
+
+                    child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        // Let the focused view and/or our descendants get the key first
+        return super.dispatchKeyEvent(event) || executeKeyEvent(event);
+    }
+
+    /**
+     * You can call this function yourself to have the scroll view perform
+     * scrolling from a key event, just as if the event had been dispatched to
+     * it by the view hierarchy.
+     *
+     * @param event The key event to execute.
+     * @return Return true if the event was handled, else false.
+     */
+    public boolean executeKeyEvent(KeyEvent event) {
+        mTempRect.setEmpty();
+
+        if (!canScroll()) {
+            if (isFocused() && event.getKeyCode() != KeyEvent.KEYCODE_BACK) {
+                View currentFocused = findFocus();
+                if (currentFocused == this) currentFocused = null;
+                View nextFocused = FocusFinder.getInstance().findNextFocus(this,
+                        currentFocused, View.FOCUS_DOWN);
+                return nextFocused != null
+                        && nextFocused != this
+                        && nextFocused.requestFocus(View.FOCUS_DOWN);
+            }
+            return false;
+        }
+
+        boolean handled = false;
+        if (event.getAction() == KeyEvent.ACTION_DOWN) {
+            switch (event.getKeyCode()) {
+                case KeyEvent.KEYCODE_DPAD_UP:
+                    if (!event.isAltPressed()) {
+                        handled = arrowScroll(View.FOCUS_UP);
+                    } else {
+                        handled = fullScroll(View.FOCUS_UP);
+                    }
+                    break;
+                case KeyEvent.KEYCODE_DPAD_DOWN:
+                    if (!event.isAltPressed()) {
+                        handled = arrowScroll(View.FOCUS_DOWN);
+                    } else {
+                        handled = fullScroll(View.FOCUS_DOWN);
+                    }
+                    break;
+                case KeyEvent.KEYCODE_SPACE:
+                    pageScroll(event.isShiftPressed() ? View.FOCUS_UP : View.FOCUS_DOWN);
+                    break;
+            }
+        }
+
+        return handled;
+    }
+
+    private boolean inChild(int x, int y) {
+        if (getChildCount() > 0) {
+            final int scrollY = mScrollY;
+            final View child = getChildAt(0);
+            return !(y < child.getTop() - scrollY
+                    || y >= child.getBottom() - scrollY
+                    || x < child.getLeft()
+                    || x >= child.getRight());
+        }
+        return false;
+    }
+
+    private void initOrResetVelocityTracker() {
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        } else {
+            mVelocityTracker.clear();
+        }
+    }
+
+    private void initVelocityTrackerIfNotExists() {
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+    }
+
+    private void recycleVelocityTracker() {
+        if (mVelocityTracker != null) {
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+        }
+    }
+
+    @Override
+    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+        if (disallowIntercept) {
+            recycleVelocityTracker();
+        }
+        super.requestDisallowInterceptTouchEvent(disallowIntercept);
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        /*
+         * This method JUST determines whether we want to intercept the motion.
+         * If we return true, onMotionEvent will be called and we do the actual
+         * scrolling there.
+         */
+
+        /*
+         * Shortcut the most recurring case: the user is in the dragging state
+         * and he is moving his finger. We want to intercept this motion.
+         */
+        final int action = ev.getAction();
+        if ((action == MotionEvent.ACTION_MOVE) && (mIsBeingDragged)) {
+            return true;
+        }
+        if ((action == MotionEvent.ACTION_MOVE) && (mIsOrthoDragged)) {
+            return true;
+        }
+        switch (action & MotionEvent.ACTION_MASK) {
+        case MotionEvent.ACTION_MOVE: {
+            /*
+             * mIsBeingDragged == false, otherwise the shortcut would have
+             * caught it. Check whether the user has moved far enough from his
+             * original down touch.
+             */
+
+            /*
+             * Locally do absolute value. mLastMotionY is set to the y value of
+             * the down event.
+             */
+            final int activePointerId = mActivePointerId;
+            if (activePointerId == INVALID_POINTER) {
+                // If we don't have a valid id, the touch down wasn't on
+                // content.
+                break;
+            }
+
+            final int pointerIndex = ev.findPointerIndex(activePointerId);
+            final float y = mHorizontal ? ev.getX(pointerIndex) : ev
+                    .getY(pointerIndex);
+            final int yDiff = (int) Math.abs(y - mLastMotionY);
+            if (yDiff > mTouchSlop) {
+                mIsBeingDragged = true;
+                mLastMotionY = y;
+                initVelocityTrackerIfNotExists();
+                mVelocityTracker.addMovement(ev);
+                if (mScrollStrictSpan == null) {
+                    mScrollStrictSpan = StrictMode
+                            .enterCriticalSpan("ScrollView-scroll");
+                }
+            } else {
+                final float ocoord = mHorizontal ? ev.getY(pointerIndex) : ev
+                        .getX(pointerIndex);
+                if (Math.abs(ocoord - mLastOrthoCoord) > mTouchSlop) {
+                    mIsOrthoDragged = true;
+                    mLastOrthoCoord = ocoord;
+                    initVelocityTrackerIfNotExists();
+                    mVelocityTracker.addMovement(ev);
+                }
+            }
+            break;
+        }
+
+        case MotionEvent.ACTION_DOWN: {
+            final float y = mHorizontal ? ev.getX() : ev.getY();
+            mDownCoords.x = ev.getX();
+            mDownCoords.y = ev.getY();
+            if (!inChild((int) ev.getX(), (int) ev.getY())) {
+                mIsBeingDragged = false;
+                recycleVelocityTracker();
+                break;
+            }
+
+            /*
+             * Remember location of down touch. ACTION_DOWN always refers to
+             * pointer index 0.
+             */
+            mLastMotionY = y;
+            mActivePointerId = ev.getPointerId(0);
+
+            initOrResetVelocityTracker();
+            mVelocityTracker.addMovement(ev);
+            /*
+             * If being flinged and user touches the screen, initiate drag;
+             * otherwise don't. mScroller.isFinished should be false when being
+             * flinged.
+             */
+            mIsBeingDragged = !mScroller.isFinished();
+            if (mIsBeingDragged && mScrollStrictSpan == null) {
+                mScrollStrictSpan = StrictMode
+                        .enterCriticalSpan("ScrollView-scroll");
+            }
+            mIsOrthoDragged = false;
+            final float ocoord = mHorizontal ? ev.getY() : ev.getX();
+            mLastOrthoCoord = ocoord;
+            mDownView = findViewAt((int) ev.getX(), (int) ev.getY());
+            break;
+        }
+
+        case MotionEvent.ACTION_CANCEL:
+        case MotionEvent.ACTION_UP:
+            /* Release the drag */
+            mIsBeingDragged = false;
+            mIsOrthoDragged = false;
+            mActivePointerId = INVALID_POINTER;
+            recycleVelocityTracker();
+            if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0,
+                    getScrollRange())) {
+                invalidate();
+            }
+            break;
+        case MotionEvent.ACTION_POINTER_UP:
+            onSecondaryPointerUp(ev);
+            break;
+        }
+
+        /*
+         * The only time we want to intercept motion events is if we are in the
+         * drag mode.
+         */
+        return mIsBeingDragged || mIsOrthoDragged;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        initVelocityTrackerIfNotExists();
+        mVelocityTracker.addMovement(ev);
+
+        final int action = ev.getAction();
+        switch (action & MotionEvent.ACTION_MASK) {
+            case MotionEvent.ACTION_DOWN: {
+                mIsBeingDragged = getChildCount() != 0;
+                if (!mIsBeingDragged) {
+                    return false;
+                }
+
+                /*
+                 * If being flinged and user touches, stop the fling. isFinished
+                 * will be false if being flinged.
+                 */
+                if (!mScroller.isFinished()) {
+                    mScroller.abortAnimation();
+                    if (mFlingStrictSpan != null) {
+                        mFlingStrictSpan.finish();
+                        mFlingStrictSpan = null;
+                    }
+                }
+
+                // Remember where the motion event started
+                mLastMotionY = mHorizontal ? ev.getX() : ev.getY();
+                mActivePointerId = ev.getPointerId(0);
+                break;
+            }
+            case MotionEvent.ACTION_MOVE:
+                if (mIsOrthoDragged) {
+                    // Scroll to follow the motion event
+                    final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
+                    final float x = ev.getX(activePointerIndex);
+                    final float y = ev.getY(activePointerIndex);
+                    if (isOrthoMove(x - mDownCoords.x, y - mDownCoords.y)) {
+                        onOrthoDrag(mDownView, mHorizontal
+                                ? y - mDownCoords.y
+                                : x - mDownCoords.x);
+                    }
+                } else if (mIsBeingDragged) {
+                    // Scroll to follow the motion event
+                    final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
+                    final float y = mHorizontal ? ev.getX(activePointerIndex)
+                            : ev.getY(activePointerIndex);
+                    final int deltaY = (int) (mLastMotionY - y);
+                    mLastMotionY = y;
+
+                    final int oldX = mScrollX;
+                    final int oldY = mScrollY;
+                    final int range = getScrollRange();
+                    if (mHorizontal) {
+                        if (overScrollBy(deltaY, 0, mScrollX, 0, range, 0,
+                                mOverscrollDistance, 0, true)) {
+                            // Break our velocity if we hit a scroll barrier.
+                            mVelocityTracker.clear();
+                        }
+                    } else {
+                        if (overScrollBy(0, deltaY, 0, mScrollY, 0, range,
+                                0, mOverscrollDistance, true)) {
+                            // Break our velocity if we hit a scroll barrier.
+                            mVelocityTracker.clear();
+                        }
+                    }
+                    onScrollChanged(mScrollX, mScrollY, oldX, oldY);
+
+                    final int overscrollMode = getOverScrollMode();
+                    if (overscrollMode == OVER_SCROLL_ALWAYS ||
+                            (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) {
+                        final int pulledToY = mHorizontal ? oldX + deltaY : oldY + deltaY;
+                        if (pulledToY < 0) {
+                            onPull(pulledToY);
+                        } else if (pulledToY > range) {
+                            onPull(pulledToY - range);
+                        } else {
+                            onPull(0);
+                        }
+                    }
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+                final VelocityTracker vtracker = mVelocityTracker;
+                vtracker.computeCurrentVelocity(1000, mMaximumVelocity);
+                if (isOrthoMove(vtracker.getXVelocity(mActivePointerId),
+                        vtracker.getYVelocity(mActivePointerId))
+                        && mMinimumVelocity < Math.abs((mHorizontal ? vtracker.getYVelocity()
+                                : vtracker.getXVelocity()))) {
+                    onOrthoFling(mDownView, mHorizontal ? vtracker.getYVelocity()
+                            : vtracker.getXVelocity());
+                    break;
+                }
+                if (mIsOrthoDragged) {
+                    onOrthoDragFinished(mDownView);
+                    mActivePointerId = INVALID_POINTER;
+                    endDrag();
+                } else if (mIsBeingDragged) {
+                    final VelocityTracker velocityTracker = mVelocityTracker;
+                    velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+                    int initialVelocity = mHorizontal
+                            ? (int) velocityTracker.getXVelocity(mActivePointerId)
+                            : (int) velocityTracker.getYVelocity(mActivePointerId);
+
+                    if (getChildCount() > 0) {
+                        if ((Math.abs(initialVelocity) > mMinimumVelocity)) {
+                            fling(-initialVelocity);
+                        } else {
+                            final int bottom = getScrollRange();
+                            if (mHorizontal) {
+                                if (mScroller.springBack(mScrollX, mScrollY, 0, bottom, 0, 0)) {
+                                    invalidate();
+                                }
+                            } else {
+                                if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, bottom)) {
+                                    invalidate();
+                                }
+                            }
+                        }
+                        onPull(0);
+                    }
+
+                    mActivePointerId = INVALID_POINTER;
+                    endDrag();
+                }
+                break;
+            case MotionEvent.ACTION_CANCEL:
+                if (mIsOrthoDragged) {
+                    onOrthoDragFinished(mDownView);
+                    mActivePointerId = INVALID_POINTER;
+                    endDrag();
+                } else if (mIsBeingDragged && getChildCount() > 0) {
+                    if (mHorizontal) {
+                        if (mScroller.springBack(mScrollX, mScrollY, 0, getScrollRange(), 0, 0)) {
+                            invalidate();
+                        }
+                    } else {
+                        if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, getScrollRange())) {
+                            invalidate();
+                        }
+                    }
+                    mActivePointerId = INVALID_POINTER;
+                    endDrag();
+                }
+                break;
+            case MotionEvent.ACTION_POINTER_DOWN: {
+                final int index = ev.getActionIndex();
+                final float y = mHorizontal ? ev.getX(index) : ev.getY(index);
+                mLastMotionY = y;
+                mLastOrthoCoord = mHorizontal ? ev.getY(index) : ev.getX(index);
+                mActivePointerId = ev.getPointerId(index);
+                break;
+            }
+            case MotionEvent.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                mLastMotionY = mHorizontal
+                        ? ev.getX(ev.findPointerIndex(mActivePointerId))
+                        : ev.getY(ev.findPointerIndex(mActivePointerId));
+                break;
+        }
+        return true;
+    }
+
+    protected View findViewAt(int x, int y) {
+        // subclass responsibility
+        return null;
+    }
+
+    protected void onPull(int delta) {
+    }
+
+    private void onSecondaryPointerUp(MotionEvent ev) {
+        final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >>
+                MotionEvent.ACTION_POINTER_INDEX_SHIFT;
+        final int pointerId = ev.getPointerId(pointerIndex);
+        if (pointerId == mActivePointerId) {
+            // This was our active pointer going up. Choose a new
+            // active pointer and adjust accordingly.
+            // TODO: Make this decision more intelligent.
+            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+            mLastMotionY = mHorizontal ? ev.getX(newPointerIndex) : ev.getY(newPointerIndex);
+            mActivePointerId = ev.getPointerId(newPointerIndex);
+            if (mVelocityTracker != null) {
+                mVelocityTracker.clear();
+            }
+            mLastOrthoCoord = mHorizontal ? ev.getY(newPointerIndex)
+                    : ev.getX(newPointerIndex);
+        }
+    }
+
+    @Override
+    public boolean onGenericMotionEvent(MotionEvent event) {
+        if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
+            switch (event.getAction()) {
+            case MotionEvent.ACTION_SCROLL: {
+                if (!mIsBeingDragged) {
+                    if (mHorizontal) {
+                        final float hscroll = event
+                                .getAxisValue(MotionEvent.AXIS_HSCROLL);
+                        if (hscroll != 0) {
+                            final int delta = (int) (hscroll * getHorizontalScrollFactor());
+                            final int range = getScrollRange();
+                            int oldScrollX = mScrollX;
+                            int newScrollX = oldScrollX - delta;
+                            if (newScrollX < 0) {
+                                newScrollX = 0;
+                            } else if (newScrollX > range) {
+                                newScrollX = range;
+                            }
+                            if (newScrollX != oldScrollX) {
+                                super.scrollTo(newScrollX, mScrollY);
+                                return true;
+                            }
+                        }
+                    } else {
+                        final float vscroll = event
+                                .getAxisValue(MotionEvent.AXIS_VSCROLL);
+                        if (vscroll != 0) {
+                            final int delta = (int) (vscroll * getVerticalScrollFactor());
+                            final int range = getScrollRange();
+                            int oldScrollY = mScrollY;
+                            int newScrollY = oldScrollY - delta;
+                            if (newScrollY < 0) {
+                                newScrollY = 0;
+                            } else if (newScrollY > range) {
+                                newScrollY = range;
+                            }
+                            if (newScrollY != oldScrollY) {
+                                super.scrollTo(mScrollX, newScrollY);
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+            }
+        }
+        return super.onGenericMotionEvent(event);
+    }
+
+    protected void onOrthoDrag(View draggedView, float distance) {
+    }
+
+    protected void onOrthoDragFinished(View draggedView) {
+    }
+
+    protected void onOrthoFling(View draggedView, float velocity) {
+    }
+
+    @Override
+    protected void onOverScrolled(int scrollX, int scrollY,
+            boolean clampedX, boolean clampedY) {
+        // Treat animating scrolls differently; see #computeScroll() for why.
+        if (!mScroller.isFinished()) {
+            mScrollX = scrollX;
+            mScrollY = scrollY;
+            invalidateParentIfNeeded();
+            if (mHorizontal && clampedX) {
+                mScroller.springBack(mScrollX, mScrollY, 0, getScrollRange(), 0, 0);
+            } else if (!mHorizontal && clampedY) {
+                mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, getScrollRange());
+            }
+        } else {
+            super.scrollTo(scrollX, scrollY);
+        }
+        awakenScrollBars();
+    }
+
+    @Override
+    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+        super.onInitializeAccessibilityNodeInfo(info);
+        info.setScrollable(true);
+    }
+
+    @Override
+    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+        super.onInitializeAccessibilityEvent(event);
+        event.setScrollable(true);
+    }
+
+    @Override
+    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+        // Do not append text content to scroll events they are fired frequently
+        // and the client has already received another event type with the text.
+        if (event.getEventType() != AccessibilityEvent.TYPE_VIEW_SCROLLED) {
+            super.dispatchPopulateAccessibilityEvent(event);
+        }
+        return false;
+    }
+
+    private int getScrollRange() {
+        int scrollRange = 0;
+        if (getChildCount() > 0) {
+            View child = getChildAt(0);
+            if (mHorizontal) {
+                scrollRange = Math.max(0,
+                        child.getWidth() - (getWidth() - mPaddingRight - mPaddingLeft));
+            } else {
+                scrollRange = Math.max(0,
+                        child.getHeight() - (getHeight() - mPaddingBottom - mPaddingTop));
+            }
+        }
+        return scrollRange;
+    }
+
+    /**
+     * <p>
+     * Finds the next focusable component that fits in this View's bounds
+     * (excluding fading edges) pretending that this View's top is located at
+     * the parameter top.
+     * </p>
+     *
+     * @param topFocus           look for a candidate at the top of the bounds if topFocus is true,
+     *                           or at the bottom of the bounds if topFocus is false
+     * @param top                the top offset of the bounds in which a focusable must be
+     *                           found (the fading edge is assumed to start at this position)
+     * @param preferredFocusable the View that has highest priority and will be
+     *                           returned if it is within my bounds (null is valid)
+     * @return the next focusable component in the bounds or null if none can be found
+     */
+    private View findFocusableViewInMyBounds(final boolean topFocus,
+            final int top, View preferredFocusable) {
+        /*
+         * The fading edge's transparent side should be considered for focus
+         * since it's mostly visible, so we divide the actual fading edge length
+         * by 2.
+         */
+        final int fadingEdgeLength = (mHorizontal
+                ? getHorizontalFadingEdgeLength()
+                : getVerticalFadingEdgeLength()) / 2;
+        final int topWithoutFadingEdge = top + fadingEdgeLength;
+        final int bottomWithoutFadingEdge = top + (mHorizontal ? getWidth() : getHeight()) - fadingEdgeLength;
+
+        if ((preferredFocusable != null)
+                && ((mHorizontal ? preferredFocusable.getLeft() : preferredFocusable.getTop())
+                        < bottomWithoutFadingEdge)
+                && ((mHorizontal ? preferredFocusable.getRight() : preferredFocusable.getBottom()) > topWithoutFadingEdge)) {
+            return preferredFocusable;
+        }
+
+        return findFocusableViewInBounds(topFocus, topWithoutFadingEdge,
+                bottomWithoutFadingEdge);
+    }
+
+    /**
+     * <p>
+     * Finds the next focusable component that fits in the specified bounds.
+     * </p>
+     *
+     * @param topFocus look for a candidate is the one at the top of the bounds
+     *                 if topFocus is true, or at the bottom of the bounds if topFocus is
+     *                 false
+     * @param top      the top offset of the bounds in which a focusable must be
+     *                 found
+     * @param bottom   the bottom offset of the bounds in which a focusable must
+     *                 be found
+     * @return the next focusable component in the bounds or null if none can
+     *         be found
+     */
+    private View findFocusableViewInBounds(boolean topFocus, int top, int bottom) {
+
+        List<View> focusables = getFocusables(View.FOCUS_FORWARD);
+        View focusCandidate = null;
+
+        /*
+         * A fully contained focusable is one where its top is below the bound's
+         * top, and its bottom is above the bound's bottom. A partially
+         * contained focusable is one where some part of it is within the
+         * bounds, but it also has some part that is not within bounds.  A fully contained
+         * focusable is preferred to a partially contained focusable.
+         */
+        boolean foundFullyContainedFocusable = false;
+
+        int count = focusables.size();
+        for (int i = 0; i < count; i++) {
+            View view = focusables.get(i);
+            int viewTop = mHorizontal ? view.getLeft() : view.getTop();
+            int viewBottom = mHorizontal ? view.getRight() : view.getBottom();
+
+            if (top < viewBottom && viewTop < bottom) {
+                /*
+                 * the focusable is in the target area, it is a candidate for
+                 * focusing
+                 */
+
+                final boolean viewIsFullyContained = (top < viewTop) &&
+                        (viewBottom < bottom);
+
+                if (focusCandidate == null) {
+                    /* No candidate, take this one */
+                    focusCandidate = view;
+                    foundFullyContainedFocusable = viewIsFullyContained;
+                } else {
+                    final int ctop = mHorizontal ? focusCandidate.getLeft() : focusCandidate.getTop();
+                    final int cbot = mHorizontal ? focusCandidate.getRight() : focusCandidate.getBottom();
+                    final boolean viewIsCloserToBoundary =
+                            (topFocus && viewTop < ctop) ||
+                                    (!topFocus && viewBottom > cbot);
+
+                    if (foundFullyContainedFocusable) {
+                        if (viewIsFullyContained && viewIsCloserToBoundary) {
+                            /*
+                             * We're dealing with only fully contained views, so
+                             * it has to be closer to the boundary to beat our
+                             * candidate
+                             */
+                            focusCandidate = view;
+                        }
+                    } else {
+                        if (viewIsFullyContained) {
+                            /* Any fully contained view beats a partially contained view */
+                            focusCandidate = view;
+                            foundFullyContainedFocusable = true;
+                        } else if (viewIsCloserToBoundary) {
+                            /*
+                             * Partially contained view beats another partially
+                             * contained view if it's closer
+                             */
+                            focusCandidate = view;
+                        }
+                    }
+                }
+            }
+        }
+
+        return focusCandidate;
+    }
+
+    // i was here
+
+    /**
+     * <p>Handles scrolling in response to a "page up/down" shortcut press. This
+     * method will scroll the view by one page up or down and give the focus
+     * to the topmost/bottommost component in the new visible area. If no
+     * component is a good candidate for focus, this scrollview reclaims the
+     * focus.</p>
+     *
+     * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
+     *                  to go one page up or
+     *                  {@link android.view.View#FOCUS_DOWN} to go one page down
+     * @return true if the key event is consumed by this method, false otherwise
+     */
+    public boolean pageScroll(int direction) {
+        boolean down = direction == View.FOCUS_DOWN;
+        int height = getHeight();
+
+        if (down) {
+            mTempRect.top = getScrollY() + height;
+            int count = getChildCount();
+            if (count > 0) {
+                View view = getChildAt(count - 1);
+                if (mTempRect.top + height > view.getBottom()) {
+                    mTempRect.top = view.getBottom() - height;
+                }
+            }
+        } else {
+            mTempRect.top = getScrollY() - height;
+            if (mTempRect.top < 0) {
+                mTempRect.top = 0;
+            }
+        }
+        mTempRect.bottom = mTempRect.top + height;
+
+        return scrollAndFocus(direction, mTempRect.top, mTempRect.bottom);
+    }
+
+    /**
+     * <p>Handles scrolling in response to a "home/end" shortcut press. This
+     * method will scroll the view to the top or bottom and give the focus
+     * to the topmost/bottommost component in the new visible area. If no
+     * component is a good candidate for focus, this scrollview reclaims the
+     * focus.</p>
+     *
+     * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
+     *                  to go the top of the view or
+     *                  {@link android.view.View#FOCUS_DOWN} to go the bottom
+     * @return true if the key event is consumed by this method, false otherwise
+     */
+    public boolean fullScroll(int direction) {
+        boolean down = direction == View.FOCUS_DOWN;
+        int height = getHeight();
+
+        mTempRect.top = 0;
+        mTempRect.bottom = height;
+
+        if (down) {
+            int count = getChildCount();
+            if (count > 0) {
+                View view = getChildAt(count - 1);
+                mTempRect.bottom = view.getBottom() + mPaddingBottom;
+                mTempRect.top = mTempRect.bottom - height;
+            }
+        }
+
+        return scrollAndFocus(direction, mTempRect.top, mTempRect.bottom);
+    }
+
+    /**
+     * <p>Scrolls the view to make the area defined by <code>top</code> and
+     * <code>bottom</code> visible. This method attempts to give the focus
+     * to a component visible in this area. If no component can be focused in
+     * the new visible area, the focus is reclaimed by this ScrollView.</p>
+     *
+     * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
+     *                  to go upward, {@link android.view.View#FOCUS_DOWN} to downward
+     * @param top       the top offset of the new area to be made visible
+     * @param bottom    the bottom offset of the new area to be made visible
+     * @return true if the key event is consumed by this method, false otherwise
+     */
+    private boolean scrollAndFocus(int direction, int top, int bottom) {
+        boolean handled = true;
+
+        int height = getHeight();
+        int containerTop = getScrollY();
+        int containerBottom = containerTop + height;
+        boolean up = direction == View.FOCUS_UP;
+
+        View newFocused = findFocusableViewInBounds(up, top, bottom);
+        if (newFocused == null) {
+            newFocused = this;
+        }
+
+        if (top >= containerTop && bottom <= containerBottom) {
+            handled = false;
+        } else {
+            int delta = up ? (top - containerTop) : (bottom - containerBottom);
+            doScrollY(delta);
+        }
+
+        if (newFocused != findFocus()) newFocused.requestFocus(direction);
+
+        return handled;
+    }
+
+    /**
+     * Handle scrolling in response to an up or down arrow click.
+     *
+     * @param direction The direction corresponding to the arrow key that was
+     *                  pressed
+     * @return True if we consumed the event, false otherwise
+     */
+    public boolean arrowScroll(int direction) {
+
+        View currentFocused = findFocus();
+        if (currentFocused == this) currentFocused = null;
+
+        View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused, direction);
+
+        final int maxJump = getMaxScrollAmount();
+
+        if (nextFocused != null && isWithinDeltaOfScreen(nextFocused, maxJump, getHeight())) {
+            nextFocused.getDrawingRect(mTempRect);
+            offsetDescendantRectToMyCoords(nextFocused, mTempRect);
+            int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);
+            doScrollY(scrollDelta);
+            nextFocused.requestFocus(direction);
+        } else {
+            // no new focus
+            int scrollDelta = maxJump;
+
+            if (direction == View.FOCUS_UP && getScrollY() < scrollDelta) {
+                scrollDelta = getScrollY();
+            } else if (direction == View.FOCUS_DOWN) {
+                if (getChildCount() > 0) {
+                    int daBottom = getChildAt(0).getBottom();
+                    int screenBottom = getScrollY() + getHeight() - mPaddingBottom;
+                    if (daBottom - screenBottom < maxJump) {
+                        scrollDelta = daBottom - screenBottom;
+                    }
+                }
+            }
+            if (scrollDelta == 0) {
+                return false;
+            }
+            doScrollY(direction == View.FOCUS_DOWN ? scrollDelta : -scrollDelta);
+        }
+
+        if (currentFocused != null && currentFocused.isFocused()
+                && isOffScreen(currentFocused)) {
+            // previously focused item still has focus and is off screen, give
+            // it up (take it back to ourselves)
+            // (also, need to temporarily force FOCUS_BEFORE_DESCENDANTS so we are
+            // sure to
+            // get it)
+            final int descendantFocusability = getDescendantFocusability();  // save
+            setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
+            requestFocus();
+            setDescendantFocusability(descendantFocusability);  // restore
+        }
+        return true;
+    }
+
+    private boolean isOrthoMove(float moveX, float moveY) {
+        return mHorizontal && Math.abs(moveY) > Math.abs(moveX)
+                || !mHorizontal && Math.abs(moveX) > Math.abs(moveY);
+    }
+
+    /**
+     * @return whether the descendant of this scroll view is scrolled off
+     *  screen.
+     */
+    private boolean isOffScreen(View descendant) {
+        if (mHorizontal) {
+            return !isWithinDeltaOfScreen(descendant, getWidth(), 0);
+        } else {
+            return !isWithinDeltaOfScreen(descendant, 0, getHeight());
+        }
+    }
+
+    /**
+     * @return whether the descendant of this scroll view is within delta
+     *  pixels of being on the screen.
+     */
+    private boolean isWithinDeltaOfScreen(View descendant, int delta, int height) {
+        descendant.getDrawingRect(mTempRect);
+        offsetDescendantRectToMyCoords(descendant, mTempRect);
+        if (mHorizontal) {
+            return (mTempRect.right + delta) >= getScrollX()
+            && (mTempRect.left - delta) <= (getScrollX() + height);
+        } else {
+            return (mTempRect.bottom + delta) >= getScrollY()
+            && (mTempRect.top - delta) <= (getScrollY() + height);
+        }
+    }
+
+    /**
+     * Smooth scroll by a Y delta
+     *
+     * @param delta the number of pixels to scroll by on the Y axis
+     */
+    private void doScrollY(int delta) {
+        if (delta != 0) {
+            if (mSmoothScrollingEnabled) {
+                if (mHorizontal) {
+                    smoothScrollBy(0, delta);
+                } else {
+                    smoothScrollBy(delta, 0);
+                }
+            } else {
+                if (mHorizontal) {
+                    scrollBy(0, delta);
+                } else {
+                    scrollBy(delta, 0);
+                }
+            }
+        }
+    }
+
+    /**
+     * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
+     *
+     * @param dx the number of pixels to scroll by on the X axis
+     * @param dy the number of pixels to scroll by on the Y axis
+     */
+    public final void smoothScrollBy(int dx, int dy) {
+        if (getChildCount() == 0) {
+            // Nothing to do.
+            return;
+        }
+        long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
+        if (duration > ANIMATED_SCROLL_GAP) {
+            if (mHorizontal) {
+                final int width = getWidth() - mPaddingRight - mPaddingLeft;
+                final int right = getChildAt(0).getWidth();
+                final int maxX = Math.max(0, right - width);
+                final int scrollX = mScrollX;
+                dx = Math.max(0, Math.min(scrollX + dx, maxX)) - scrollX;
+                mScroller.startScroll(scrollX, mScrollY, dx, 0);
+            } else {
+                final int height = getHeight() - mPaddingBottom - mPaddingTop;
+                final int bottom = getChildAt(0).getHeight();
+                final int maxY = Math.max(0, bottom - height);
+                final int scrollY = mScrollY;
+                dy = Math.max(0, Math.min(scrollY + dy, maxY)) - scrollY;
+                mScroller.startScroll(mScrollX, scrollY, 0, dy);
+            }
+            invalidate();
+        } else {
+            if (!mScroller.isFinished()) {
+                mScroller.abortAnimation();
+                if (mFlingStrictSpan != null) {
+                    mFlingStrictSpan.finish();
+                    mFlingStrictSpan = null;
+                }
+            }
+            scrollBy(dx, dy);
+        }
+        mLastScroll = AnimationUtils.currentAnimationTimeMillis();
+    }
+
+    /**
+     * Like {@link #scrollTo}, but scroll smoothly instead of immediately.
+     *
+     * @param x the position where to scroll on the X axis
+     * @param y the position where to scroll on the Y axis
+     */
+    public final void smoothScrollTo(int x, int y) {
+        smoothScrollBy(x - mScrollX, y - mScrollY);
+    }
+
+    /**
+     * <p>
+     * The scroll range of a scroll view is the overall height of all of its
+     * children.
+     * </p>
+     */
+    @Override
+    protected int computeVerticalScrollRange() {
+        if (mHorizontal) {
+            return super.computeVerticalScrollRange();
+        }
+        final int count = getChildCount();
+        final int contentHeight = getHeight() - mPaddingBottom - mPaddingTop;
+        if (count == 0) {
+            return contentHeight;
+        }
+
+        int scrollRange = getChildAt(0).getBottom();
+        final int scrollY = mScrollY;
+        final int overscrollBottom = Math.max(0, scrollRange - contentHeight);
+        if (scrollY < 0) {
+            scrollRange -= scrollY;
+        } else if (scrollY > overscrollBottom) {
+            scrollRange += scrollY - overscrollBottom;
+        }
+
+        return scrollRange;
+    }
+
+    /**
+     * <p>
+     * The scroll range of a scroll view is the overall height of all of its
+     * children.
+     * </p>
+     */
+    @Override
+    protected int computeHorizontalScrollRange() {
+        if (!mHorizontal) {
+            return super.computeHorizontalScrollRange();
+        }
+        final int count = getChildCount();
+        final int contentWidth = getWidth() - mPaddingRight - mPaddingLeft;
+        if (count == 0) {
+            return contentWidth;
+        }
+
+        int scrollRange = getChildAt(0).getRight();
+        final int scrollX = mScrollX;
+        final int overscrollBottom = Math.max(0, scrollRange - contentWidth);
+        if (scrollX < 0) {
+            scrollRange -= scrollX;
+        } else if (scrollX > overscrollBottom) {
+            scrollRange += scrollX - overscrollBottom;
+        }
+
+        return scrollRange;
+    }
+
+    @Override
+    protected int computeVerticalScrollOffset() {
+        return Math.max(0, super.computeVerticalScrollOffset());
+    }
+
+    @Override
+    protected int computeHorizontalScrollOffset() {
+        return Math.max(0, super.computeHorizontalScrollOffset());
+    }
+
+    @Override
+    protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) {
+        ViewGroup.LayoutParams lp = child.getLayoutParams();
+
+        int childWidthMeasureSpec;
+        int childHeightMeasureSpec;
+
+        if (mHorizontal) {
+            childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, mPaddingTop
+                    + mPaddingBottom, lp.height);
+
+            childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+        } else {
+            childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, mPaddingLeft
+                    + mPaddingRight, lp.width);
+
+            childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+        }
+
+        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+    }
+
+    @Override
+    protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,
+            int parentHeightMeasureSpec, int heightUsed) {
+        final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
+
+        int childWidthMeasureSpec;
+        int childHeightMeasureSpec;
+        if (mHorizontal) {
+            childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
+                    mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin
+                            + heightUsed, lp.height);
+            childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
+                    lp.leftMargin + lp.rightMargin, MeasureSpec.UNSPECIFIED);
+        } else {
+            childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
+                    mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin
+                            + widthUsed, lp.width);
+            childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
+                    lp.topMargin + lp.bottomMargin, MeasureSpec.UNSPECIFIED);
+        }
+        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+    }
+
+    @Override
+    public void computeScroll() {
+        if (mScroller.computeScrollOffset()) {
+            // This is called at drawing time by ViewGroup.  We don't want to
+            // re-show the scrollbars at this point, which scrollTo will do,
+            // so we replicate most of scrollTo here.
+            //
+            //         It's a little odd to call onScrollChanged from inside the drawing.
+            //
+            //         It is, except when you remember that computeScroll() is used to
+            //         animate scrolling. So unless we want to defer the onScrollChanged()
+            //         until the end of the animated scrolling, we don't really have a
+            //         choice here.
+            //
+            //         I agree.  The alternative, which I think would be worse, is to post
+            //         something and tell the subclasses later.  This is bad because there
+            //         will be a window where mScrollX/Y is different from what the app
+            //         thinks it is.
+            //
+            int oldX = mScrollX;
+            int oldY = mScrollY;
+            int x = mScroller.getCurrX();
+            int y = mScroller.getCurrY();
+
+            if (oldX != x || oldY != y) {
+                if (mHorizontal) {
+                    overScrollBy(x - oldX, y - oldY, oldX, oldY, getScrollRange(), 0,
+                            mOverflingDistance, 0, false);
+                } else {
+                    overScrollBy(x - oldX, y - oldY, oldX, oldY, 0, getScrollRange(),
+                            0, mOverflingDistance, false);
+                }
+                onScrollChanged(mScrollX, mScrollY, oldX, oldY);
+            }
+            awakenScrollBars();
+
+            // Keep on drawing until the animation has finished.
+            postInvalidate();
+        } else {
+            if (mFlingStrictSpan != null) {
+                mFlingStrictSpan.finish();
+                mFlingStrictSpan = null;
+            }
+        }
+    }
+
+    /**
+     * Scrolls the view to the given child.
+     *
+     * @param child the View to scroll to
+     */
+    private void scrollToChild(View child) {
+        child.getDrawingRect(mTempRect);
+
+        /* Offset from child's local coordinates to ScrollView coordinates */
+        offsetDescendantRectToMyCoords(child, mTempRect);
+        scrollToChildRect(mTempRect, true);
+    }
+
+    /**
+     * If rect is off screen, scroll just enough to get it (or at least the
+     * first screen size chunk of it) on screen.
+     *
+     * @param rect      The rectangle.
+     * @param immediate True to scroll immediately without animation
+     * @return true if scrolling was performed
+     */
+    private boolean scrollToChildRect(Rect rect, boolean immediate) {
+        final int delta = computeScrollDeltaToGetChildRectOnScreen(rect);
+        final boolean scroll = delta != 0;
+        if (scroll) {
+            if (immediate) {
+                if (mHorizontal) {
+                    scrollBy(delta, 0);
+                } else {
+                    scrollBy(0, delta);
+                }
+            } else {
+                if (mHorizontal) {
+                    smoothScrollBy(delta, 0);
+                } else {
+                    smoothScrollBy(0, delta);
+                }
+            }
+        }
+        return scroll;
+    }
+
+    /**
+     * Compute the amount to scroll in the Y direction in order to get
+     * a rectangle completely on the screen (or, if taller than the screen,
+     * at least the first screen size chunk of it).
+     *
+     * @param rect The rect.
+     * @return The scroll delta.
+     */
+    protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
+        if (mHorizontal) {
+            return computeScrollDeltaToGetChildRectOnScreenHorizontal(rect);
+        } else {
+            return computeScrollDeltaToGetChildRectOnScreenVertical(rect);
+        }
+    }
+
+    private int computeScrollDeltaToGetChildRectOnScreenVertical(Rect rect) {
+        if (getChildCount() == 0) return 0;
+
+        int height = getHeight();
+        int screenTop = getScrollY();
+        int screenBottom = screenTop + height;
+
+        int fadingEdge = getVerticalFadingEdgeLength();
+
+        // leave room for top fading edge as long as rect isn't at very top
+        if (rect.top > 0) {
+            screenTop += fadingEdge;
+        }
+
+        // leave room for bottom fading edge as long as rect isn't at very bottom
+        if (rect.bottom < getChildAt(0).getHeight()) {
+            screenBottom -= fadingEdge;
+        }
+
+        int scrollYDelta = 0;
+
+        if (rect.bottom > screenBottom && rect.top > screenTop) {
+            // need to move down to get it in view: move down just enough so
+            // that the entire rectangle is in view (or at least the first
+            // screen size chunk).
+
+            if (rect.height() > height) {
+                // just enough to get screen size chunk on
+                scrollYDelta += (rect.top - screenTop);
+            } else {
+                // get entire rect at bottom of screen
+                scrollYDelta += (rect.bottom - screenBottom);
+            }
+
+            // make sure we aren't scrolling beyond the end of our content
+            int bottom = getChildAt(0).getBottom();
+            int distanceToBottom = bottom - screenBottom;
+            scrollYDelta = Math.min(scrollYDelta, distanceToBottom);
+
+        } else if (rect.top < screenTop && rect.bottom < screenBottom) {
+            // need to move up to get it in view: move up just enough so that
+            // entire rectangle is in view (or at least the first screen
+            // size chunk of it).
+
+            if (rect.height() > height) {
+                // screen size chunk
+                scrollYDelta -= (screenBottom - rect.bottom);
+            } else {
+                // entire rect at top
+                scrollYDelta -= (screenTop - rect.top);
+            }
+
+            // make sure we aren't scrolling any further than the top our content
+            scrollYDelta = Math.max(scrollYDelta, -getScrollY());
+        }
+        return scrollYDelta;
+    }
+
+    private int computeScrollDeltaToGetChildRectOnScreenHorizontal(Rect rect) {
+        if (getChildCount() == 0) return 0;
+
+        int width = getWidth();
+        int screenLeft = getScrollX();
+        int screenRight = screenLeft + width;
+
+        int fadingEdge = getHorizontalFadingEdgeLength();
+
+        // leave room for left fading edge as long as rect isn't at very left
+        if (rect.left > 0) {
+            screenLeft += fadingEdge;
+        }
+
+        // leave room for right fading edge as long as rect isn't at very right
+        if (rect.right < getChildAt(0).getWidth()) {
+            screenRight -= fadingEdge;
+        }
+
+        int scrollXDelta = 0;
+
+        if (rect.right > screenRight && rect.left > screenLeft) {
+            // need to move right to get it in view: move right just enough so
+            // that the entire rectangle is in view (or at least the first
+            // screen size chunk).
+
+            if (rect.width() > width) {
+                // just enough to get screen size chunk on
+                scrollXDelta += (rect.left - screenLeft);
+            } else {
+                // get entire rect at right of screen
+                scrollXDelta += (rect.right - screenRight);
+            }
+
+            // make sure we aren't scrolling beyond the end of our content
+            int right = getChildAt(0).getRight();
+            int distanceToRight = right - screenRight;
+            scrollXDelta = Math.min(scrollXDelta, distanceToRight);
+
+        } else if (rect.left < screenLeft && rect.right < screenRight) {
+            // need to move right to get it in view: move right just enough so that
+            // entire rectangle is in view (or at least the first screen
+            // size chunk of it).
+
+            if (rect.width() > width) {
+                // screen size chunk
+                scrollXDelta -= (screenRight - rect.right);
+            } else {
+                // entire rect at left
+                scrollXDelta -= (screenLeft - rect.left);
+            }
+
+            // make sure we aren't scrolling any further than the left our content
+            scrollXDelta = Math.max(scrollXDelta, -getScrollX());
+        }
+        return scrollXDelta;
+    }
+
+
+    @Override
+    public void requestChildFocus(View child, View focused) {
+        if (!mIsLayoutDirty) {
+            scrollToChild(focused);
+        } else {
+            // The child may not be laid out yet, we can't compute the scroll yet
+            mChildToScrollTo = focused;
+        }
+        super.requestChildFocus(child, focused);
+    }
+
+
+    /**
+     * When looking for focus in children of a scroll view, need to be a little
+     * more careful not to give focus to something that is scrolled off screen.
+     *
+     * This is more expensive than the default {@link android.view.ViewGroup}
+     * implementation, otherwise this behavior might have been made the default.
+     */
+    @Override
+    protected boolean onRequestFocusInDescendants(int direction,
+            Rect previouslyFocusedRect) {
+
+        // convert from forward / backward notation to up / down / left / right
+        // (ugh).
+        if (mHorizontal) {
+            if (direction == View.FOCUS_FORWARD) {
+                direction = View.FOCUS_RIGHT;
+            } else if (direction == View.FOCUS_BACKWARD) {
+                direction = View.FOCUS_LEFT;
+            }
+        } else {
+            if (direction == View.FOCUS_FORWARD) {
+                direction = View.FOCUS_DOWN;
+            } else if (direction == View.FOCUS_BACKWARD) {
+                direction = View.FOCUS_UP;
+            }
+        }
+
+        final View nextFocus = previouslyFocusedRect == null ?
+                FocusFinder.getInstance().findNextFocus(this, null, direction) :
+                FocusFinder.getInstance().findNextFocusFromRect(this,
+                        previouslyFocusedRect, direction);
+
+        if (nextFocus == null) {
+            return false;
+        }
+
+        if (isOffScreen(nextFocus)) {
+            return false;
+        }
+
+        return nextFocus.requestFocus(direction, previouslyFocusedRect);
+    }
+
+    @Override
+    public boolean requestChildRectangleOnScreen(View child, Rect rectangle,
+            boolean immediate) {
+        // offset into coordinate space of this scroll view
+        rectangle.offset(child.getLeft() - child.getScrollX(),
+                child.getTop() - child.getScrollY());
+
+        return scrollToChildRect(rectangle, immediate);
+    }
+
+    @Override
+    public void requestLayout() {
+        mIsLayoutDirty = true;
+        super.requestLayout();
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+
+        if (mScrollStrictSpan != null) {
+            mScrollStrictSpan.finish();
+            mScrollStrictSpan = null;
+        }
+        if (mFlingStrictSpan != null) {
+            mFlingStrictSpan.finish();
+            mFlingStrictSpan = null;
+        }
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        super.onLayout(changed, l, t, r, b);
+        mIsLayoutDirty = false;
+        // Give a child focus if it needs it
+        if (mChildToScrollTo != null && isViewDescendantOf(mChildToScrollTo, this)) {
+            scrollToChild(mChildToScrollTo);
+        }
+        mChildToScrollTo = null;
+
+        // Calling this with the present values causes it to re-clam them
+        scrollTo(mScrollX, mScrollY);
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+
+        View currentFocused = findFocus();
+        if (null == currentFocused || this == currentFocused)
+            return;
+
+        // If the currently-focused view was visible on the screen when the
+        // screen was at the old height, then scroll the screen to make that
+        // view visible with the new screen height.
+        if (isWithinDeltaOfScreen(currentFocused, 0, oldh)) {
+            currentFocused.getDrawingRect(mTempRect);
+            offsetDescendantRectToMyCoords(currentFocused, mTempRect);
+            int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);
+            doScrollY(scrollDelta);
+        }
+    }
+
+    /**
+     * Return true if child is an descendant of parent, (or equal to the parent).
+     */
+    private boolean isViewDescendantOf(View child, View parent) {
+        if (child == parent) {
+            return true;
+        }
+
+        final ViewParent theParent = child.getParent();
+        return (theParent instanceof ViewGroup) && isViewDescendantOf((View) theParent, parent);
+    }
+
+    /**
+     * Fling the scroll view
+     *
+     * @param velocityY The initial velocity in the Y direction. Positive
+     *                  numbers mean that the finger/cursor is moving down the screen,
+     *                  which means we want to scroll towards the top.
+     */
+    public void fling(int velocityY) {
+        if (getChildCount() > 0) {
+            if (mHorizontal) {
+                int width = getWidth() - mPaddingRight - mPaddingLeft;
+                int right = getChildAt(0).getWidth();
+
+                mScroller.fling(mScrollX, mScrollY, velocityY, 0,
+                        0, Math.max(0, right - width), 0, 0, width/2, 0);
+            } else {
+                int height = getHeight() - mPaddingBottom - mPaddingTop;
+                int bottom = getChildAt(0).getHeight();
+
+                mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0,
+                        Math.max(0, bottom - height), 0, height/2);
+            }
+            if (mFlingStrictSpan == null) {
+                mFlingStrictSpan = StrictMode.enterCriticalSpan("ScrollView-fling");
+            }
+
+            invalidate();
+        }
+    }
+
+    private void endDrag() {
+        mIsBeingDragged = false;
+        mIsOrthoDragged = false;
+        mDownView = null;
+        recycleVelocityTracker();
+        if (mScrollStrictSpan != null) {
+            mScrollStrictSpan.finish();
+            mScrollStrictSpan = null;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>This version also clamps the scrolling to the bounds of our child.
+     */
+    @Override
+    public void scrollTo(int x, int y) {
+        // we rely on the fact the View.scrollBy calls scrollTo.
+        if (getChildCount() > 0) {
+            View child = getChildAt(0);
+            x = clamp(x, getWidth() - mPaddingRight - mPaddingLeft, child.getWidth());
+            y = clamp(y, getHeight() - mPaddingBottom - mPaddingTop, child.getHeight());
+            if (x != mScrollX || y != mScrollY) {
+                super.scrollTo(x, y);
+            }
+        }
+    }
+
+    private int clamp(int n, int my, int child) {
+        if (my >= child || n < 0) {
+            /* my >= child is this case:
+             *                    |--------------- me ---------------|
+             *     |------ child ------|
+             * or
+             *     |--------------- me ---------------|
+             *            |------ child ------|
+             * or
+             *     |--------------- me ---------------|
+             *                                  |------ child ------|
+             *
+             * n < 0 is this case:
+             *     |------ me ------|
+             *                    |-------- child --------|
+             *     |-- mScrollX --|
+             */
+            return 0;
+        }
+        if ((my+n) > child) {
+            /* this case:
+             *                    |------ me ------|
+             *     |------ child ------|
+             *     |-- mScrollX --|
+             */
+            return child-my;
+        }
+        return n;
+    }
+
+}
diff --git a/tests/src/com/android/browser/WebStorageSizeManagerUnitTests.java b/tests/src/com/android/browser/WebStorageSizeManagerUnitTests.java
index 354c4da..2beedf8 100644
--- a/tests/src/com/android/browser/WebStorageSizeManagerUnitTests.java
+++ b/tests/src/com/android/browser/WebStorageSizeManagerUnitTests.java
@@ -90,7 +90,8 @@
         // We have an appcache file size of 0 MB.
         mAppCacheInfo.setAppCacheSizeBytes(0);
         // Create the manager.
-        WebStorageSizeManager manager = new WebStorageSizeManager(null, mDiskInfo, mAppCacheInfo);
+        WebStorageSizeManager manager = new WebStorageSizeManager(getContext(), mDiskInfo,
+                mAppCacheInfo);
         // We add origin 1.
         long origin1Quota = 0;
         long origin1EstimatedSize = bytes(3.5);
@@ -247,7 +248,8 @@
         mAppCacheInfo.setAppCacheSizeBytes(0);
 
         // Create the manager.
-        WebStorageSizeManager manager = new WebStorageSizeManager(null, mDiskInfo, mAppCacheInfo);
+        WebStorageSizeManager manager = new WebStorageSizeManager(getContext(), mDiskInfo,
+                mAppCacheInfo);
 
         // We add an origin.
         long originQuota = 0;
