diff --git a/res/drawable-hdpi/browser_background_holo.9.png b/res/drawable-hdpi/browser_background_holo.9.png
deleted file mode 100644
index 840ed27..0000000
--- a/res/drawable-hdpi/browser_background_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_bookmarks_history_holo_dark.png b/res/drawable-hdpi/ic_bookmarks_history_holo_dark.png
index df527a2..afd5c16 100644
--- a/res/drawable-hdpi/ic_bookmarks_history_holo_dark.png
+++ b/res/drawable-hdpi/ic_bookmarks_history_holo_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_new_window_holo_dark.png b/res/drawable-hdpi/ic_new_window_holo_dark.png
index 0a2218b..70cc97d 100644
--- a/res/drawable-hdpi/ic_new_window_holo_dark.png
+++ b/res/drawable-hdpi/ic_new_window_holo_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_search_category_suggest.png b/res/drawable-hdpi/ic_search_category_suggest.png
index 9ee751c..165a11d 100644
--- a/res/drawable-hdpi/ic_search_category_suggest.png
+++ b/res/drawable-hdpi/ic_search_category_suggest.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_close.png b/res/drawable-hdpi/ic_tab_close.png
index d48e0e7..199af9a 100644
--- a/res/drawable-hdpi/ic_tab_close.png
+++ b/res/drawable-hdpi/ic_tab_close.png
Binary files differ
diff --git a/res/drawable-hdpi/nav_tab_bg.9.png b/res/drawable-hdpi/nav_tab_bg.9.png
index b110633..bccdbdc 100644
--- a/res/drawable-hdpi/nav_tab_bg.9.png
+++ b/res/drawable-hdpi/nav_tab_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi/overlay_url_bookmark_widget_holo.9.png b/res/drawable-hdpi/overlay_url_bookmark_widget_holo.9.png
index f678d8e..aeb978d 100644
--- a/res/drawable-hdpi/overlay_url_bookmark_widget_holo.9.png
+++ b/res/drawable-hdpi/overlay_url_bookmark_widget_holo.9.png
Binary files differ
diff --git a/res/drawable-hdpi/progress.9.png b/res/drawable-hdpi/progress.9.png
index 26918ac..da3ce0a 100644
--- a/res/drawable-hdpi/progress.9.png
+++ b/res/drawable-hdpi/progress.9.png
Binary files differ
diff --git a/res/drawable-hdpi/textfield_active_holo_dark.9.png b/res/drawable-hdpi/textfield_active_holo_dark.9.png
index d91c613..dd223c7 100644
--- a/res/drawable-hdpi/textfield_active_holo_dark.9.png
+++ b/res/drawable-hdpi/textfield_active_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-hdpi/textfield_default_holo_dark.9.png b/res/drawable-hdpi/textfield_default_holo_dark.9.png
index 9a4e0d8..7ea6c26 100644
--- a/res/drawable-hdpi/textfield_default_holo_dark.9.png
+++ b/res/drawable-hdpi/textfield_default_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-hdpi/thumb_bookmark_widget_folder_back_holo.png b/res/drawable-hdpi/thumb_bookmark_widget_folder_back_holo.png
index 4e43329..0504254 100644
--- a/res/drawable-hdpi/thumb_bookmark_widget_folder_back_holo.png
+++ b/res/drawable-hdpi/thumb_bookmark_widget_folder_back_holo.png
Binary files differ
diff --git a/res/drawable-hdpi/thumb_bookmark_widget_folder_holo.png b/res/drawable-hdpi/thumb_bookmark_widget_folder_holo.png
index e491eab..6ea442a 100644
--- a/res/drawable-hdpi/thumb_bookmark_widget_folder_holo.png
+++ b/res/drawable-hdpi/thumb_bookmark_widget_folder_holo.png
Binary files differ
diff --git a/res/drawable-mdpi/browser_background_holo.9.png b/res/drawable-mdpi/browser_background_holo.9.png
deleted file mode 100644
index f84e6a3..0000000
--- a/res/drawable-mdpi/browser_background_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_bookmarks_history_holo_dark.png b/res/drawable-mdpi/ic_bookmarks_history_holo_dark.png
index 4933165..f4953e5 100644
--- a/res/drawable-mdpi/ic_bookmarks_history_holo_dark.png
+++ b/res/drawable-mdpi/ic_bookmarks_history_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_new_window_holo_dark.png b/res/drawable-mdpi/ic_new_window_holo_dark.png
index 2f441d9..026afd0 100644
--- a/res/drawable-mdpi/ic_new_window_holo_dark.png
+++ b/res/drawable-mdpi/ic_new_window_holo_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_search_category_suggest.png b/res/drawable-mdpi/ic_search_category_suggest.png
index b9c374b..0f04fc4 100644
--- a/res/drawable-mdpi/ic_search_category_suggest.png
+++ b/res/drawable-mdpi/ic_search_category_suggest.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_tab_close.png b/res/drawable-mdpi/ic_tab_close.png
index d6e01c0..33f5c43 100644
--- a/res/drawable-mdpi/ic_tab_close.png
+++ b/res/drawable-mdpi/ic_tab_close.png
Binary files differ
diff --git a/res/drawable-mdpi/nav_tab_bg.9.png b/res/drawable-mdpi/nav_tab_bg.9.png
index e8657be..e539b66 100644
--- a/res/drawable-mdpi/nav_tab_bg.9.png
+++ b/res/drawable-mdpi/nav_tab_bg.9.png
Binary files differ
diff --git a/res/drawable-mdpi/overlay_url_bookmark_widget_holo.9.png b/res/drawable-mdpi/overlay_url_bookmark_widget_holo.9.png
index 59d8859..391b98d 100644
--- a/res/drawable-mdpi/overlay_url_bookmark_widget_holo.9.png
+++ b/res/drawable-mdpi/overlay_url_bookmark_widget_holo.9.png
Binary files differ
diff --git a/res/drawable-mdpi/progress.9.png b/res/drawable-mdpi/progress.9.png
index 9f1f543..9ccee66 100644
--- a/res/drawable-mdpi/progress.9.png
+++ b/res/drawable-mdpi/progress.9.png
Binary files differ
diff --git a/res/drawable-mdpi/textfield_active_holo_dark.9.png b/res/drawable-mdpi/textfield_active_holo_dark.9.png
index 06eed05..296760d 100644
--- a/res/drawable-mdpi/textfield_active_holo_dark.9.png
+++ b/res/drawable-mdpi/textfield_active_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-mdpi/textfield_default_holo_dark.9.png b/res/drawable-mdpi/textfield_default_holo_dark.9.png
index ce63553..eb88c4d 100644
--- a/res/drawable-mdpi/textfield_default_holo_dark.9.png
+++ b/res/drawable-mdpi/textfield_default_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-mdpi/thumb_bookmark_widget_folder_back_holo.png b/res/drawable-mdpi/thumb_bookmark_widget_folder_back_holo.png
index d72f631..2d9b5f8 100644
--- a/res/drawable-mdpi/thumb_bookmark_widget_folder_back_holo.png
+++ b/res/drawable-mdpi/thumb_bookmark_widget_folder_back_holo.png
Binary files differ
diff --git a/res/drawable-mdpi/thumb_bookmark_widget_folder_holo.png b/res/drawable-mdpi/thumb_bookmark_widget_folder_holo.png
index 22603fe..eba5c53 100644
--- a/res/drawable-mdpi/thumb_bookmark_widget_folder_holo.png
+++ b/res/drawable-mdpi/thumb_bookmark_widget_folder_holo.png
Binary files differ
diff --git a/res/drawable-nodpi/bg_urlbar.png b/res/drawable-nodpi/bg_urlbar.png
index 51e95e0..325aad7 100644
--- a/res/drawable-nodpi/bg_urlbar.png
+++ b/res/drawable-nodpi/bg_urlbar.png
Binary files differ
diff --git a/res/drawable-nodpi/browser_background_holo.png b/res/drawable-nodpi/browser_background_holo.png
new file mode 100644
index 0000000..62ee0ef
--- /dev/null
+++ b/res/drawable-nodpi/browser_background_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/browser_background_holo.9.png b/res/drawable-xhdpi/browser_background_holo.9.png
deleted file mode 100644
index 0853b34..0000000
--- a/res/drawable-xhdpi/browser_background_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_bookmarks_history_holo_dark.png b/res/drawable-xhdpi/ic_bookmarks_history_holo_dark.png
index 702379b..71fdd09 100644
--- a/res/drawable-xhdpi/ic_bookmarks_history_holo_dark.png
+++ b/res/drawable-xhdpi/ic_bookmarks_history_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_new_window_holo_dark.png b/res/drawable-xhdpi/ic_new_window_holo_dark.png
index c2da72f..69420f7 100644
--- a/res/drawable-xhdpi/ic_new_window_holo_dark.png
+++ b/res/drawable-xhdpi/ic_new_window_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_search_category_suggest.png b/res/drawable-xhdpi/ic_search_category_suggest.png
index d663b1b..be0388c 100644
--- a/res/drawable-xhdpi/ic_search_category_suggest.png
+++ b/res/drawable-xhdpi/ic_search_category_suggest.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_search_holo_dark.png b/res/drawable-xhdpi/ic_search_holo_dark.png
index 4a06c2e..fbc62cf 100644
--- a/res/drawable-xhdpi/ic_search_holo_dark.png
+++ b/res/drawable-xhdpi/ic_search_holo_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tab_close.png b/res/drawable-xhdpi/ic_tab_close.png
index fa63021..65f09dd 100644
--- a/res/drawable-xhdpi/ic_tab_close.png
+++ b/res/drawable-xhdpi/ic_tab_close.png
Binary files differ
diff --git a/res/drawable-xhdpi/nav_tab_bg.9.png b/res/drawable-xhdpi/nav_tab_bg.9.png
index 336b17d..299f8d4 100644
--- a/res/drawable-xhdpi/nav_tab_bg.9.png
+++ b/res/drawable-xhdpi/nav_tab_bg.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/overlay_url_bookmark_widget_holo.9.png b/res/drawable-xhdpi/overlay_url_bookmark_widget_holo.9.png
index d4e4e7f..8bfaa63 100644
--- a/res/drawable-xhdpi/overlay_url_bookmark_widget_holo.9.png
+++ b/res/drawable-xhdpi/overlay_url_bookmark_widget_holo.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/progress.9.png b/res/drawable-xhdpi/progress.9.png
index 6d99976..f6f8d8d 100644
--- a/res/drawable-xhdpi/progress.9.png
+++ b/res/drawable-xhdpi/progress.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/textfield_active_holo_dark.9.png b/res/drawable-xhdpi/textfield_active_holo_dark.9.png
index 5a4c062..97687e5 100644
--- a/res/drawable-xhdpi/textfield_active_holo_dark.9.png
+++ b/res/drawable-xhdpi/textfield_active_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/textfield_default_holo_dark.9.png b/res/drawable-xhdpi/textfield_default_holo_dark.9.png
index 3d3bb21..c3e59fc 100644
--- a/res/drawable-xhdpi/textfield_default_holo_dark.9.png
+++ b/res/drawable-xhdpi/textfield_default_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/thumb_bookmark_widget_folder_back_holo.png b/res/drawable-xhdpi/thumb_bookmark_widget_folder_back_holo.png
index 6216ef1..f1e6d36 100644
--- a/res/drawable-xhdpi/thumb_bookmark_widget_folder_back_holo.png
+++ b/res/drawable-xhdpi/thumb_bookmark_widget_folder_back_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/thumb_bookmark_widget_folder_holo.png b/res/drawable-xhdpi/thumb_bookmark_widget_folder_holo.png
index 7e56f0f..5c3cfd2 100644
--- a/res/drawable-xhdpi/thumb_bookmark_widget_folder_holo.png
+++ b/res/drawable-xhdpi/thumb_bookmark_widget_folder_holo.png
Binary files differ
diff --git a/res/layout-land/nav_screen.xml b/res/layout-land/nav_screen.xml
index 885bfd1..fdadd6a 100644
--- a/res/layout-land/nav_screen.xml
+++ b/res/layout-land/nav_screen.xml
@@ -19,15 +19,19 @@
     android:id="@+id/nav_screen"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@drawable/browser_background_holo" >
+    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">
+        android:background="#CC0d0d0d">
         <ImageButton
             android:id="@+id/newtab"
             android:layout_width="wrap_content"
@@ -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/browser_add_bookmark.xml b/res/layout/browser_add_bookmark.xml
index 4b84ff2..66950f4 100644
--- a/res/layout/browser_add_bookmark.xml
+++ b/res/layout/browser_add_bookmark.xml
@@ -14,16 +14,13 @@
      limitations under the License.
 -->
 
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:divider="?android:attr/dividerHorizontal"
+    android:showDividers="middle">
 
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        >
-        <include layout="@layout/browser_add_bookmark_content" />
+    <include layout="@layout/browser_add_bookmark_content" />
 
-    </LinearLayout>
-</ScrollView>
+</LinearLayout>
diff --git a/res/layout/browser_add_bookmark_content.xml b/res/layout/browser_add_bookmark_content.xml
index 03936c3..58db8a5 100644
--- a/res/layout/browser_add_bookmark_content.xml
+++ b/res/layout/browser_add_bookmark_content.xml
@@ -17,11 +17,12 @@
 <merge xmlns:android="http://schemas.android.com/apk/res/android">
     <LinearLayout android:id="@+id/crumb_holder"
         android:layout_width="match_parent"
-        android:layout_height="?android:attr/listPreferredItemHeight"
+        android:layout_height="wrap_content"
         android:visibility="gone"
         android:paddingLeft="5dip"
         android:paddingRight="5dip"
         android:orientation="horizontal"
+        android:minHeight="?android:attr/listPreferredItemHeightSmall"
         >
         <com.android.browser.BreadCrumbView android:id="@+id/crumbs"
             android:layout_width="0dip"
@@ -35,21 +36,24 @@
         <TextView
             android:id="@+id/add_new_folder"
             android:layout_width="wrap_content"
-            android:layout_height="match_parent"
+            android:layout_height="wrap_content"
             android:drawableLeft="@drawable/ic_add_string"
             android:text="@string/new_folder"
             android:visibility="gone"
             android:focusable="true"
             android:background="?android:attr/selectableItemBackground"
             android:textAppearance="?android:attr/textAppearanceMedium"
-            android:gravity="center_vertical" />
+            android:gravity="center_vertical"
+            android:layout_gravity="center_vertical"
+            android:paddingRight="8dip" />
     </LinearLayout>
     <LinearLayout android:id="@+id/title_holder"
         android:layout_width="match_parent"
-        android:layout_height="?android:attr/listPreferredItemHeight"
+        android:layout_height="wrap_content"
         android:orientation="horizontal"
         android:paddingLeft="5dip"
         android:paddingRight="5dip"
+        android:minHeight="?android:attr/listPreferredItemHeightSmall"
         >
         <TextView android:id="@+id/fake_title"
             android:layout_width="0dip"
@@ -76,141 +80,146 @@
             android:visibility="gone"
             android:textAppearance="?android:attr/textAppearanceMedium" />
     </LinearLayout>
-    <View android:layout_width="match_parent"
-        android:layout_height="1dip"
-        android:background="?android:attr/dividerHorizontal"
-        />
 
-    <TableLayout android:id="@+id/default_view"
+    <FrameLayout
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:stretchColumns="1"
-        android:shrinkColumns="1"
-        android:paddingTop="10dip"
-        android:paddingLeft="20dip"
-        android:paddingRight="20dip" >
-      <TableRow android:layout_marginBottom="10dip">
-        <TextView
-            android:id="@+id/titleText"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:text="@string/name"
-            android:textAppearance="?android:attr/textAppearanceMedium" />
-
-        <EditText
-            android:id="@+id/title"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_marginLeft="20dip"
-            android:inputType="textCapSentences"
-            android:ellipsize="end"
-            android:textAppearance="?android:attr/textAppearanceMedium" />
-      </TableRow>
-
-      <TableRow
-          android:layout_marginBottom="10dip"
-          android:id="@+id/row_address">
-        <TextView
-            android:id="@+id/addressText"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:text="@string/location"
-            android:textAppearance="?android:attr/textAppearanceMedium" />
-
-        <EditText
-            android:id="@+id/address"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_marginLeft="20dip"
-            android:hint="@string/http"
-            android:inputType="textUri"
-            android:ellipsize="end"
-            android:textAppearance="?android:attr/textAppearanceMedium" />
-      </TableRow>
-      <TableRow android:layout_marginBottom="10dip">
-        <TextView
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:text="@string/account"
-            android:textAppearance="?android:attr/textAppearanceMedium" />
-
-        <Spinner
-            android:id="@+id/accounts"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_marginLeft="20dip"
-            android:spinnerMode="dropdown"
-            />
-      </TableRow>
-      <TableRow android:layout_marginBottom="10dip">
-        <TextView
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:text="@string/containing_folder"
-            android:textAppearance="?android:attr/textAppearanceMedium" />
-
-        <view class="com.android.browser.addbookmark.FolderSpinner"
-            android:id="@+id/folder"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:layout_marginLeft="20dip"
-            android:spinnerMode="dropdown"
-            />
-      </TableRow>
-    </TableLayout>
-
-    <LinearLayout android:id="@+id/folder_selector"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/folder_selector_height"
-        android:orientation="vertical"
-        android:visibility="gone"
-        >
-
-        <view class="com.android.browser.AddBookmarkPage$CustomListView"
-            android:id="@+id/list"
-            android:layout_marginLeft="16dip"
-            android:layout_marginRight="16dip"
+        android:layout_height="0dip"
+        android:layout_weight="1">
+        <ScrollView
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            />
-        <TextView
-            android:id="@+id/empty"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_height="match_parent">
+            <TableLayout android:id="@+id/default_view"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:stretchColumns="1"
+                android:shrinkColumns="1"
+                android:paddingTop="10dip"
+                android:paddingLeft="20dip"
+                android:paddingRight="20dip" >
+              <TableRow android:layout_marginBottom="10dip">
+                <TextView
+                    android:id="@+id/titleText"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_gravity="center_vertical"
+                    android:text="@string/name"
+                    android:textAppearance="?android:attr/textAppearanceMedium" />
+
+                <EditText
+                    android:id="@+id/title"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_marginLeft="20dip"
+                    android:inputType="textCapSentences|textNoSuggestions"
+                    android:ellipsize="end"
+                    android:textAppearance="?android:attr/textAppearanceMedium" />
+              </TableRow>
+
+              <TableRow
+                  android:layout_marginBottom="10dip"
+                  android:id="@+id/row_address">
+                <TextView
+                    android:id="@+id/addressText"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_gravity="center_vertical"
+                    android:text="@string/location"
+                    android:textAppearance="?android:attr/textAppearanceMedium" />
+
+                <EditText
+                    android:id="@+id/address"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_marginLeft="20dip"
+                    android:hint="@string/http"
+                    android:inputType="textUri"
+                    android:ellipsize="end"
+                    android:textAppearance="?android:attr/textAppearanceMedium" />
+              </TableRow>
+              <TableRow android:layout_marginBottom="10dip">
+                <TextView
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_gravity="center_vertical"
+                    android:text="@string/account"
+                    android:textAppearance="?android:attr/textAppearanceMedium" />
+
+                <Spinner
+                    android:id="@+id/accounts"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_marginLeft="20dip"
+                    android:spinnerMode="dropdown"
+                    />
+              </TableRow>
+              <TableRow android:layout_marginBottom="10dip">
+                <TextView
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_gravity="center_vertical"
+                    android:text="@string/containing_folder"
+                    android:textAppearance="?android:attr/textAppearanceMedium" />
+
+                <view class="com.android.browser.addbookmark.FolderSpinner"
+                    android:id="@+id/folder"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:layout_marginLeft="20dip"
+                    android:spinnerMode="dropdown"
+                    />
+              </TableRow>
+            </TableLayout>
+        </ScrollView>
+
+        <LinearLayout android:id="@+id/folder_selector"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
             android:visibility="gone"
-            android:layout_marginLeft="16dip"
-            android:layout_marginTop="16dip"
-            android:text="@string/no_subfolders"
-            android:textStyle="italic"
-            android:textAppearance="?android:attr/textAppearanceMedium" />
-    </LinearLayout>
+            >
+
+            <view class="com.android.browser.AddBookmarkPage$CustomListView"
+                android:id="@+id/list"
+                android:layout_marginLeft="16dip"
+                android:layout_marginRight="16dip"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                />
+            <TextView
+                android:id="@+id/empty"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:visibility="gone"
+                android:layout_marginLeft="16dip"
+                android:layout_marginTop="16dip"
+                android:text="@string/no_subfolders"
+                android:textStyle="italic"
+                android:textAppearance="?android:attr/textAppearanceMedium" />
+        </LinearLayout>
+
+    </FrameLayout>
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:minHeight="54dip"
         android:orientation="horizontal"
-        android:paddingTop="4dip"
-        android:paddingLeft="2dip"
-        android:paddingRight="2dip" >
+        style="?android:attr/buttonBarStyle">
         <Button android:id="@+id/cancel"
             android:text="@string/do_not_save"
             android:layout_width="0dip"
             android:layout_gravity="right"
             android:layout_weight="1"
             android:maxLines="2"
-            android:layout_height="wrap_content" />
+            android:layout_height="wrap_content"
+            style="?android:attr/buttonBarButtonStyle" />
         <Button android:id="@+id/OK"
             android:text="@string/save"
             android:layout_width="0dip"
             android:layout_gravity="left"
             android:layout_weight="1"
             android:maxLines="2"
-            android:layout_height="wrap_content" />
+            android:layout_height="wrap_content"
+            style="?android:attr/buttonBarButtonStyle" />
     </LinearLayout>
 
 </merge>
diff --git a/res/layout/nav_screen.xml b/res/layout/nav_screen.xml
index baabcc7..c655727 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,9 +29,10 @@
         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">
+        android:background="#CC0d0d0d">
         <ImageButton
             android:id="@+id/newtab"
             android:layout_width="wrap_content"
diff --git a/res/layout/nav_tab_view.xml b/res/layout/nav_tab_view.xml
index cdfcda7..d1205f0 100644
--- a/res/layout/nav_tab_view.xml
+++ b/res/layout/nav_tab_view.xml
@@ -26,7 +26,7 @@
         android:id="@+id/titlebar"
         android:orientation="horizontal"
         android:layout_width="match_parent"
-        android:layout_height="48dip"
+        android:layout_height="@dimen/nav_tab_titleheight"
         android:layout_gravity="center_horizontal"
         android:paddingLeft="8dip" >
         <TextView
@@ -43,7 +43,7 @@
             android:drawablePadding="8dip" />
         <ImageView
             android:id="@+id/closetab"
-            android:src="@drawable/ic_stop_holo_dark"
+            android:src="@drawable/ic_tab_close"
             android:layout_gravity="center_vertical"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
diff --git a/res/layout/title_bar_nav.xml b/res/layout/title_bar_nav.xml
index 8ed6331..15568c3 100644
--- a/res/layout/title_bar_nav.xml
+++ b/res/layout/title_bar_nav.xml
@@ -24,12 +24,14 @@
         android:layout_weight="1.0"
         android:layout_height="match_parent"
         android:gravity="center_vertical"
+        android:layout_marginLeft="8dip"
+        android:layout_marginRight="8dip"
         android:orientation="horizontal">
         <ImageView
             android:id="@+id/magnify"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:paddingLeft="8dip"
+            android:paddingLeft="4dip"
             android:paddingRight="8dip"
             android:visibility="gone"
             android:src="@drawable/ic_search_category_suggest" />
@@ -37,23 +39,25 @@
             android:id="@+id/incognito_icon"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:paddingLeft="8dip"
+            android:paddingLeft="4dip"
             android:visibility="gone"
             android:src="@drawable/ic_incognito_holo_dark" />
         <FrameLayout
             android:id="@+id/iconcombo"
-            android:layout_width="52dip"
+            android:layout_width="44dip"
             android:layout_height="match_parent"
             style="@style/HoloButton">
             <ImageView
                 android:id="@+id/favicon"
-                android:layout_width="20dip"
-                android:layout_height="20dip"
+                android:layout_width="32dip"
+                android:layout_height="32dip"
+                android:paddingLeft="4dip"
+                android:paddingRight="8dip"
                 android:layout_gravity="center" />
             <ImageView
                 android:id="@+id/lock"
                 android:layout_width="32dip"
-                android:layout_height="33dip"
+                android:layout_height="32dip"
                 android:layout_gravity="center"
                 android:visibility="gone" />
         </FrameLayout>
@@ -62,6 +66,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
+            android:paddingLeft="4dip"
             android:contentDescription="@string/accessibility_button_stop"
             android:src="@drawable/ic_stop_holo_dark"
             style="@style/HoloButton" />
@@ -87,6 +92,7 @@
             android:id="@+id/voice"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
+            android:paddingRight="4dip"
             android:contentDescription="@string/accessibility_button_voice"
             android:src="@drawable/ic_voice_search_holo_dark"
             style="@style/HoloButton"
@@ -95,6 +101,7 @@
             android:id="@+id/clear"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
+            android:paddingRight="4dip"
             android:contentDescription="@string/accessibility_button_clear"
             android:src="@drawable/ic_close_window_holo_dark"
             style="@style/HoloButton"
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/mipmap-hdpi/ic_launcher_browser.png b/res/mipmap-hdpi/ic_launcher_browser.png
index 03a08e5..5680416 100644
--- a/res/mipmap-hdpi/ic_launcher_browser.png
+++ b/res/mipmap-hdpi/ic_launcher_browser.png
Binary files differ
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 7d16413..3cf5c6f 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -103,7 +103,7 @@
     <string name="copy_page_url" msgid="7635062169011319208">"Копировать URL страницы"</string>
     <string name="share_page" msgid="593756995297268343">"Отправить страницу"</string>
     <string name="menu_save_snapshot" msgid="6935080344031126139">"Сохранить для чтения офлайн"</string>
-    <string name="snapshot_failed" msgid="4584580873565876033">"Не удалось сохранить страницу для офлайн-доступа."</string>
+    <string name="snapshot_failed" msgid="4584580873565876033">"Не удалось сохранить страницу для чтения офлайн."</string>
     <string name="contextheader_folder_bookmarkcount" msgid="353987136645619089">"Закладок: <xliff:g id="BOOKMARK_COUNT">%d</xliff:g>"</string>
     <string name="contextheader_folder_empty" msgid="974171637803391651">"Папка пуста"</string>
     <string name="contextmenu_openlink" msgid="7237961252214188935">"Открыть"</string>
@@ -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>
@@ -393,7 +393,7 @@
     <string name="instant_search_label" msgid="8769284297650716935">"Google с Живым поиском (Лаборатория Google)"</string>
     <string name="preview" msgid="6450823514561689038">"Предварительный просмотр"</string>
     <string name="local_bookmarks" msgid="533816851415228520">"Локальные"</string>
-    <string name="ua_switcher_desktop" msgid="220097077327558435">"Запросить версию веб-сайта для ПК"</string>
+    <string name="ua_switcher_desktop" msgid="220097077327558435">"Запросить версию веб-сайта для компьютера"</string>
     <string name="permission_preload_label" msgid="4856971662337877316">"Загрузить результаты"</string>
     <string name="empty_snapshots_folder" msgid="5788256228290785444">"Нет сохраненных страниц."</string>
     <string name="remove_snapshot" msgid="1624447424544976849">"Удалить сохраненную страницу"</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..8844f6b 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>
@@ -69,6 +69,7 @@
     <dimen name="tab_thumbnail_height">160dip</dimen>
     <dimen name="nav_tab_width">240dip</dimen>
     <dimen name="nav_tab_height">160dip</dimen>
+    <dimen name="nav_tab_titleheight">32dip</dimen>
     <dimen name="nav_tab_text_normal">18sp</dimen>
     <dimen name="nav_tab_text_small">14sp</dimen>
     <dimen name="suggest_item_padding">8dp</dimen>
diff --git a/res/values/integers.xml b/res/values/integers.xml
index fe92a79..5f75723 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -20,7 +20,6 @@
     <integer name="max_tabs">16</integer>
     <!--  The duration of the tab animations in millisecs  -->
     <integer name="tab_animation_duration">200</integer>
-    <integer name="max_width_crumb">200</integer>
     <!-- The maximum number of most visited URLs in the history tab -->
     <integer name="most_visits_limit">10</integer>
     <!-- Animation durations -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 307459c..47f217b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -567,6 +567,8 @@
     <!-- Do not tranlsate.  Development option -->
     <string name="pref_development_visual_indicator" translatable="false">Enable Visual Indicator</string>
     <!-- Do not tranlsate.  Development option -->
+    <string name="pref_development_cpu_upload_path" translatable="false">Enable Cpu Upload Path</string>
+    <!-- Do not tranlsate.  Development option -->
     <string name="js_engine_flags" translatable="false">Set JS flags</string>
     <!-- Do not tranlsate.  Development option -->
     <string name="pref_development_uastring" translatable="false">UAString</string>
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/res/xml/debug_preferences.xml b/res/xml/debug_preferences.xml
index 2d15ab2..abbd07e 100644
--- a/res/xml/debug_preferences.xml
+++ b/res/xml/debug_preferences.xml
@@ -39,6 +39,11 @@
         android:defaultValue="false"
         android:title="@string/pref_development_visual_indicator" />
 
+    <CheckBoxPreference
+        android:key="enable_cpu_upload_path"
+        android:defaultValue="true"
+        android:title="@string/pref_development_cpu_upload_path" />
+
     <!-- The javascript console is enabled by default when the user has
          also enabled debug mode by navigating to about:debug. -->
     <CheckBoxPreference
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index 903c363..71af567 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -367,6 +367,8 @@
         mFakeTitleHolder.setVisibility(View.GONE);
         mAddNewFolder.setVisibility(View.VISIBLE);
         mAddSeparator.setVisibility(View.VISIBLE);
+        getInputMethodManager().hideSoftInputFromWindow(
+                mListView.getWindowToken(), 0);
     }
 
     private void descendInto(String foldername, long id) {
diff --git a/src/com/android/browser/BreadCrumbView.java b/src/com/android/browser/BreadCrumbView.java
index 6706deb..aa77744 100644
--- a/src/com/android/browser/BreadCrumbView.java
+++ b/src/com/android/browser/BreadCrumbView.java
@@ -40,6 +40,7 @@
  */
 public class BreadCrumbView extends LinearLayout implements OnClickListener {
     private static final int DIVIDER_PADDING = 12; // dips
+    private static final int CRUMB_PADDING = 8; // dips
 
     public interface Controller {
         public void onTop(BreadCrumbView view, int level, Object data);
@@ -53,6 +54,7 @@
     private float mDividerPadding;
     private int mMaxVisible = -1;
     private Context mContext;
+    private int mCrumbPadding;
 
     /**
      * @param context
@@ -89,7 +91,9 @@
         TypedArray a = mContext.obtainStyledAttributes(com.android.internal.R.styleable.Theme);
         mSeparatorDrawable = a.getDrawable(com.android.internal.R.styleable.Theme_dividerVertical);
         a.recycle();
-        mDividerPadding = DIVIDER_PADDING * mContext.getResources().getDisplayMetrics().density;
+        float density = mContext.getResources().getDisplayMetrics().density;
+        mDividerPadding = DIVIDER_PADDING * density;
+        mCrumbPadding = (int) (CRUMB_PADDING * density);
         addBackButton();
     }
 
@@ -359,14 +363,12 @@
         private TextView makeCrumbView(String name) {
             TextView tv = new TextView(mContext);
             tv.setTextAppearance(mContext, android.R.style.TextAppearance_Medium);
-            tv.setPadding(16, 0, 16, 0);
+            tv.setPadding(mCrumbPadding, 0, mCrumbPadding, 0);
             tv.setGravity(Gravity.CENTER_VERTICAL);
             tv.setText(name);
             tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                     LayoutParams.MATCH_PARENT));
-            tv.setMaxWidth(mContext.getResources().getInteger(
-                    R.integer.max_width_crumb));
-            tv.setMaxLines(1);
+            tv.setSingleLine();
             tv.setEllipsize(TextUtils.TruncateAt.END);
             return tv;
         }
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..2c0b2ec 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.
@@ -264,6 +268,9 @@
 
         settings.setProperty(WebViewProperties.gfxInvertedScreenContrast,
                 Float.toString(getInvertedContrast()));
+
+        settings.setProperty(WebViewProperties.gfxEnableCpuUploadPath,
+                enableCpuUploadPath() ? "true" : "false");
     }
 
     /**
@@ -522,9 +529,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) {
@@ -668,6 +675,13 @@
         return mPrefs.getBoolean(PREF_ENABLE_VISUAL_INDICATOR, false);
     }
 
+    public boolean enableCpuUploadPath() {
+        if (!isDebugEnabled()) {
+            return true;
+        }
+        return mPrefs.getBoolean(PREF_ENABLE_CPU_UPLOAD_PATH, true);
+    }
+
     public boolean enableJavascriptConsole() {
         if (!isDebugEnabled()) {
             return false;
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..25a7d4a 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,21 @@
         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 ntth = mActivity.getResources().getDimensionPixelSize(R.dimen.nav_tab_titleheight);
         int toLeft = (mContentView.getWidth() - width) / 2;
-        int toTop = fromTop + (mContentView.getHeight() - fromTop - height) / 2;
+        int toTop = ((fromBottom - (ntth + height)) / 2 + ntth);
         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 +317,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 +332,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 +344,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 +358,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 +372,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 +412,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 +426,7 @@
                 mUiController.setBlockEvents(false);
             }
         });
-        animSet.setDuration(250);
-        animSet.start();
+        combo.start();
     }
 
     private void finishAnimateOut() {
@@ -418,7 +446,7 @@
         if (mNavScreen == null) {
             showNavScreen();
         } else {
-            hideNavScreen(false);
+            hideNavScreen(mUiController.getTabControl().getCurrentPosition(), false);
         }
     }
 
@@ -464,6 +492,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/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index f3da937..89fcbfc 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -68,6 +68,7 @@
     static final String PREF_ENABLE_NAV_DUMP = "enable_nav_dump";
     static final String PREF_ENABLE_TRACING = "enable_tracing";
     static final String PREF_ENABLE_VISUAL_INDICATOR = "enable_visual_indicator";
+    static final String PREF_ENABLE_CPU_UPLOAD_PATH = "enable_cpu_upload_path";
     static final String PREF_JAVASCRIPT_CONSOLE = "javascript_console";
     static final String PREF_JS_ENGINE_FLAGS = "js_engine_flags";
     static final String PREF_NORMAL_LAYOUT = "normal_layout";
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/WebViewProperties.java b/src/com/android/browser/WebViewProperties.java
index 9a656d7..c410038 100644
--- a/src/com/android/browser/WebViewProperties.java
+++ b/src/com/android/browser/WebViewProperties.java
@@ -18,4 +18,5 @@
 public interface WebViewProperties {
     static final String gfxInvertedScreen = "inverted";
     static final String gfxInvertedScreenContrast = "inverted_contrast";
+    static final String gfxEnableCpuUploadPath = "enable_cpu_upload_path";
 }
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;
