Merge commit 'remotes/korg/cupcake' into merge

Conflicts:
	src/com/android/browser/BrowserActivity.java
diff --git a/Android.mk b/Android.mk
index f8cfafe..ccda1eb 100644
--- a/Android.mk
+++ b/Android.mk
@@ -1,7 +1,7 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_MODULE_TAGS := user development
+LOCAL_MODULE_TAGS := user
 
 # TODO: Remove dependency of application on the test runner (android.test.runner) 
 # library.
@@ -9,8 +9,7 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := googlelogin-client
 
-LOCAL_SRC_FILES := $(call all-subdir-java-files) \
-	src/com/android/browser/IGearsDialogService.aidl
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
 
 LOCAL_PACKAGE_NAME := Browser
 
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4f28ef0..110bda4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -28,6 +28,9 @@
     <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
+    <!-- Needed by the ZoomRingController to set the bit saying we've already shown the
+         tutorial toast. -->
+    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
     <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>
     <uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/>
 
@@ -127,10 +130,17 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="CombinedBookmarkHistoryActivity" android:label=""
+                  android:launchMode="singleTop" android:configChanges="orientation|keyboardHidden">
+        </activity>
+
         <activity android:name="BrowserBookmarksPage" android:label="@string/bookmarks"
                   android:launchMode="singleTop" android:configChanges="orientation|keyboardHidden">
         </activity>
 
+        <activity android:name="MostVisitedActivity" android:label=""
+                android:launchMode="singleTop" android:configChanges="orientation|keyboardHidden"/>
+
         <activity-alias android:name="ShortcutBookmarksPage"
             android:targetActivity="BrowserBookmarksPage"
             android:label="@string/shortcut_bookmark">
@@ -146,7 +156,7 @@
                   android:configChanges="orientation|keyboardHidden">
         </activity>
 
-        <activity android:name="BrowserPreferencesPage" android:label=""
+        <activity android:name="BrowserPreferencesPage" android:label="@string/menu_preferences"
                   android:configChanges="orientation|keyboardHidden">
         </activity>
 
@@ -177,7 +187,7 @@
         </service>
 
         <activity android:name="AddBookmarkPage" android:label="Save bookmark" android:theme="@android:style/Theme.Dialog"
-                  android:configChanges="orientation|keyboardHidden">
+                  android:configChanges="orientation|keyboardHidden" android:windowSoftInputMode="stateHidden">
             <intent-filter>
                 <action android:name="android.intent.action.INSERT" />
                 <category android:name="android.intent.category.DEFAULT" />
diff --git a/assets/html/plugin.html b/assets/html/plugin.html
deleted file mode 100755
index f112a4b..0000000
--- a/assets/html/plugin.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<html>
-<head>
-<title>Plugin test</title>
-</head>
-<body>
-<h1>Plugin test page</h1>
-This is text above the plugin
-<a href="http://www.google.com">Google</a>
-<br>
-lhs
-<object type="application/x-testplugin" height=40 width=64>
-    <param name="DrawingModel" value="Bitmap" />
-</object>
-<object type="application/x-testplugin" height=40 width=64>
-    <param name="DrawingModel" value="Canvas" />
-</object>
-rhs
-<br>
-
-This is some the text and more text and more text and more text and more text and more text and more text and more text and more text and more text and more text
-<ol>
-<li><a href="http://www.google.com">Google</a></li>
-<li><a href="http://www.gmail.com">Gmail</a></li>
-<li><a href="http://maps.google.com/">Google Maps</a></li>
-<li><a href="http://news.google.com">Google News</a></li>
-<li><a href="http://www.yahoo.com">Yahoo!</a></li>
-<li><a href="http://www.yahoomail.com">Yahoo! Mail</a></li>
-<li><a href="http://www.msn.com">MSN</a></li>
-<li><a href="http://www.hotmail.com">Hotmail</a></li>
-<li><a href="http://www.aol.com">AOL</a></li>
-<li><a href="http://mail.aol.com">AOL Mail</a></li>
-<li><a href="http://www.ebay.com">eBay</a></li>
-<li><a href="http://www.ask.com">Ask.com</a></li>
-<li><a href="http://www.amazon.com">Amazon</a></li>
-<li><a href="http://www.myspace.com">MySpace</a></li>
-<li><a href="http://www.nytimes.com">New York Times</a></li>
-<li><a href="http://www.weather.com">Weather Channel</a></li>
-<li><a href="http://www.wikipedia.org/">Wikipedia</a></li>
-<li><a href="http://www.cnet.com">CNET</a></li>
-<li><a href="http://www.apple.com">Apple</a></li>
-</ol>
-</body>
-</html>
diff --git a/assets/plugins/gears-0.5.7.0/dummy b/assets/plugins/gears-0.5.15.0/dummy
similarity index 100%
rename from assets/plugins/gears-0.5.7.0/dummy
rename to assets/plugins/gears-0.5.15.0/dummy
diff --git a/assets/plugins/gears.so b/assets/plugins/gears.so
index 9ae2a87..1fa4264 100644
--- a/assets/plugins/gears.so
+++ b/assets/plugins/gears.so
Binary files differ
diff --git a/res/drawable/browser_bookmark_tab.xml b/res/drawable/browser_bookmark_tab.xml
new file mode 100644
index 0000000..76684cb
--- /dev/null
+++ b/res/drawable/browser_bookmark_tab.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true" android:drawable="@drawable/ic_tab_browser_bookmark_selected"/>
+    <item android:state_selected="false" android:drawable="@drawable/ic_tab_browser_bookmark_unselected"/>
+</selector>
+    
diff --git a/res/drawable/browser_history_tab.xml b/res/drawable/browser_history_tab.xml
new file mode 100644
index 0000000..b5329ea
--- /dev/null
+++ b/res/drawable/browser_history_tab.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true" android:drawable="@drawable/ic_tab_browser_history_selected"/>
+    <item android:state_selected="false" android:drawable="@drawable/ic_tab_browser_history_unselected"/>
+</selector>
+
diff --git a/res/drawable/browser_visited_tab.xml b/res/drawable/browser_visited_tab.xml
new file mode 100644
index 0000000..d1b4404
--- /dev/null
+++ b/res/drawable/browser_visited_tab.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true" android:drawable="@drawable/ic_tab_browser_visited_selected"/>
+    <item android:state_selected="false" android:drawable="@drawable/ic_tab_browser_visited_unselected"/>
+</selector>
+
diff --git a/res/drawable/dialog_divider_horizontal_light.9.png b/res/drawable/dialog_divider_horizontal_light.9.png
new file mode 100755
index 0000000..b69619b
--- /dev/null
+++ b/res/drawable/dialog_divider_horizontal_light.9.png
Binary files differ
diff --git a/res/drawable/gears_file_audio.png b/res/drawable/gears_file_audio.png
deleted file mode 100755
index ce897b6..0000000
--- a/res/drawable/gears_file_audio.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/gears_file_image.png b/res/drawable/gears_file_image.png
deleted file mode 100755
index b140f84..0000000
--- a/res/drawable/gears_file_image.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/gears_file_unknown.png b/res/drawable/gears_file_unknown.png
deleted file mode 100755
index 23386f4..0000000
--- a/res/drawable/gears_file_unknown.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/gears_file_video.png b/res/drawable/gears_file_video.png
deleted file mode 100755
index d876afb..0000000
--- a/res/drawable/gears_file_video.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/gears_folder.png b/res/drawable/gears_folder.png
deleted file mode 100755
index ed31ba5..0000000
--- a/res/drawable/gears_folder.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_dialog_menu_generic.png b/res/drawable/ic_dialog_menu_generic.png
new file mode 100755
index 0000000..de07bda
--- /dev/null
+++ b/res/drawable/ic_dialog_menu_generic.png
Binary files differ
diff --git a/res/drawable/ic_launcher_browser.png b/res/drawable/ic_launcher_browser.png
index 63f5d8f..f58b84a 100755
--- a/res/drawable/ic_launcher_browser.png
+++ b/res/drawable/ic_launcher_browser.png
Binary files differ
diff --git a/res/drawable/ic_search_category_bookmark.png b/res/drawable/ic_search_category_bookmark.png
new file mode 100755
index 0000000..08b5e74
--- /dev/null
+++ b/res/drawable/ic_search_category_bookmark.png
Binary files differ
diff --git a/res/drawable/ic_search_category_history.png b/res/drawable/ic_search_category_history.png
new file mode 100755
index 0000000..894c254
--- /dev/null
+++ b/res/drawable/ic_search_category_history.png
Binary files differ
diff --git a/res/drawable/ic_search_category_suggest.png b/res/drawable/ic_search_category_suggest.png
new file mode 100755
index 0000000..ada07e6
--- /dev/null
+++ b/res/drawable/ic_search_category_suggest.png
Binary files differ
diff --git a/res/drawable/ic_tab_browser_bookmark_selected.png b/res/drawable/ic_tab_browser_bookmark_selected.png
new file mode 100644
index 0000000..184885e
--- /dev/null
+++ b/res/drawable/ic_tab_browser_bookmark_selected.png
Binary files differ
diff --git a/res/drawable/ic_tab_browser_bookmark_unselected.png b/res/drawable/ic_tab_browser_bookmark_unselected.png
new file mode 100644
index 0000000..25ddf18
--- /dev/null
+++ b/res/drawable/ic_tab_browser_bookmark_unselected.png
Binary files differ
diff --git a/res/drawable/ic_tab_browser_history_selected.png b/res/drawable/ic_tab_browser_history_selected.png
new file mode 100644
index 0000000..b39c21a
--- /dev/null
+++ b/res/drawable/ic_tab_browser_history_selected.png
Binary files differ
diff --git a/res/drawable/ic_tab_browser_history_unselected.png b/res/drawable/ic_tab_browser_history_unselected.png
new file mode 100644
index 0000000..c0847d0
--- /dev/null
+++ b/res/drawable/ic_tab_browser_history_unselected.png
Binary files differ
diff --git a/res/drawable/ic_tab_browser_visited_selected.png b/res/drawable/ic_tab_browser_visited_selected.png
new file mode 100644
index 0000000..f2cc55c
--- /dev/null
+++ b/res/drawable/ic_tab_browser_visited_selected.png
Binary files differ
diff --git a/res/drawable/ic_tab_browser_visited_unselected.png b/res/drawable/ic_tab_browser_visited_unselected.png
new file mode 100644
index 0000000..b808fbd
--- /dev/null
+++ b/res/drawable/ic_tab_browser_visited_unselected.png
Binary files differ
diff --git a/res/layout-land/gears_dialog.xml b/res/layout-land/gears_dialog.xml
deleted file mode 100644
index 5536fed..0000000
--- a/res/layout-land/gears_dialog.xml
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2008, 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.
- */
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  android:drawingCacheQuality="auto"
-  android:layout_width="fill_parent"
-  android:layout_height="wrap_content"
-  android:orientation="vertical"
-  android:padding="10dip"
-  android:background="@color/white">
-
-  <LinearLayout
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:paddingBottom="10dip">
-
-    <LinearLayout
-      android:layout_width="fill_parent"
-      android:layout_height="wrap_content"
-      android:orientation="vertical">
-
-      <LinearLayout
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal">
-
-        <ImageView
-          android:id="@+id/icon"
-          android:paddingRight="10dip"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_centerHorizontal="true" />
-
-        <TextView
-          android:id="@+id/dialog_title"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_centerVertical="true"
-          android:paddingRight="10dip"
-          android:gravity="center_vertical"
-          android:visibility="gone"
-          android:textSize="16dip"
-          android:textStyle="bold"
-          android:textColor="@color/black"/>
-
-        <TextView
-          android:id="@+id/dialog_subtitle"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:paddingTop="10dip"
-          android:paddingRight="10dip"
-          android:gravity="center_vertical"
-          android:visibility="gone"
-          android:textSize="13dip"
-          android:textColor="@color/black"/>
-
-        <TextView
-          android:id="@+id/dialog_message"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:visibility="gone"
-          android:gravity="center_vertical"
-          android:textSize="13dip"
-          android:textColor="@color/black"/>
-
-      </LinearLayout>
-
-    </LinearLayout>
-
-  </LinearLayout>
-
-  <LinearLayout
-    android:id="@+id/panel_content"
-    android:layout_width="fill_parent"
-    android:layout_height="0dip"
-    android:layout_weight="1"/>
-
-  <RelativeLayout
-    android:background="@color/white"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:paddingTop="2dip">
-
-    <LinearLayout 
-      android:orientation="vertical"
-      android:layout_width="fill_parent"
-      android:layout_height="wrap_content">
-
-       <TextView
-         android:id="@+id/selection"
-         android:layout_width="fill_parent"
-         android:layout_height="wrap_content"
-         android:textSize="13dip"
-         android:gravity="right"
-         android:textColor="@color/black"/>
-
-       <RelativeLayout
-         android:background="@color/white"
-         android:layout_width="fill_parent"
-         android:layout_height="wrap_content"
-         android:paddingTop="2dip">
-
-         <LinearLayout
-           android:orientation="horizontal"
-           android:layout_width="wrap_content"
-           android:layout_height="wrap_content"
-           android:background="@color/white">
-
-           <Button
-             android:id="@+id/button_alwaysdeny"
-             android:layout_width="wrap_content"
-             android:layout_height="48px"
-             android:layout_alignParentLeft="true"
-             style="@style/gears_button"
-             android:textSize="13dip"/>
-
-         </LinearLayout>
-
-         <LinearLayout
-           android:layout_width="wrap_content"
-           android:layout_alignParentRight="true"
-           android:layout_height="wrap_content">
-
-           <Button
-             android:id="@+id/button_allow"
-             android:layout_width="wrap_content"
-             android:layout_height="48px"
-             android:textSize="13dip"/>
-
-           <Button
-             android:id="@+id/button_deny"
-             android:layout_width="wrap_content"
-             android:layout_height="48px"
-             android:textSize="13dip"/>
-
-         </LinearLayout>
-
-       </RelativeLayout>
-
-    </LinearLayout>
-
-  </RelativeLayout>
-
-</LinearLayout>
diff --git a/res/layout/add_new_bookmark.xml b/res/layout/add_new_bookmark.xml
index c8eb220..bb56b93 100644
--- a/res/layout/add_new_bookmark.xml
+++ b/res/layout/add_new_bookmark.xml
@@ -17,36 +17,43 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content"
+        android:minHeight="?android:attr/listPreferredItemHeight"
         android:orientation="horizontal"
-        android:paddingTop="0dip"
-        android:paddingBottom="0dip"
+        android:paddingRight="6dip"
+        android:paddingLeft="6dip"
+        android:paddingTop="5dip"
+        android:paddingBottom="5dip"
+        android:gravity="center_vertical"
         >
     <ImageView android:id="@+id/favicon"
-            android:layout_width="48dip"
-            android:layout_height="48dip"
-            android:layout_marginRight="6dip"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="5dip"
+            android:layout_marginRight="11dip"
             android:focusable="false"
-            android:src="@android:drawable/ic_menu_add"
+            android:src="@*android:drawable/sym_action_add"
             android:scaleType="fitCenter"
             />
     <LinearLayout
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"
-            android:gravity="center_vertical"
             >
         <TextView android:id="@+id/title" 
                 android:text="@string/add_new_bookmark"
-                android:textAppearance="?android:attr/textAppearanceLarge" 
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:textStyle="bold" 
                 android:layout_width="wrap_content" 
                 android:layout_height="wrap_content"
+                android:layout_marginBottom="2dip"
                 />
         <TextView android:id="@+id/url" 
                 android:textAppearance="?android:attr/textAppearanceSmall"
                 android:maxLines="1"
-                android:scrollHorizontally="true"
                 android:layout_width="wrap_content" 
                 android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:ellipsize="end"
                 />
     </LinearLayout>
 </LinearLayout>
diff --git a/res/layout/bookmark_item.xml b/res/layout/bookmark_item.xml
deleted file mode 100644
index 7d54447..0000000
--- a/res/layout/bookmark_item.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
-        android:layout_width="fill_parent" 
-        android:layout_height="wrap_content"
-        android:paddingLeft="10dip"
-        android:paddingTop="5dip"
-        android:paddingBottom="5dip"
-        >
-
-    <!-- note: to center icon vertically, replace the alignParentTop
-         below with android:layout_centerVertical="true" -->
-
-    <ImageView android:id="@+id/favicon"
-            android:layout_width="20dip"
-            android:layout_height="20dip"
-            android:focusable="false"
-            android:padding="2dip"
-            android:layout_marginTop="4dip"
-            android:layout_marginRight="6dip"
-            android:layout_alignParentTop="true"
-            android:background="@drawable/fav_icn_background"
-            android:src="@drawable/app_web_browser_sm"
-            android:layout_alignParentLeft="true"
-            />
-    <TextView android:id="@+id/title" 
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:maxLines="1"
-            android:layout_width="wrap_content" 
-            android:layout_height="wrap_content"
-            android:layout_toRightOf="@+id/favicon"
-            android:ellipsize="end"
-            />
-    <TextView android:id="@+id/url" 
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:maxLines="1"
-            android:layout_width="wrap_content" 
-            android:layout_height="wrap_content"
-            android:layout_below="@+id/title"
-            android:layout_toRightOf="@+id/favicon"
-            android:ellipsize="end"
-            />
-</RelativeLayout>
diff --git a/res/layout/browser_add_bookmark.xml b/res/layout/browser_add_bookmark.xml
index 92ae627..ca84f30 100644
--- a/res/layout/browser_add_bookmark.xml
+++ b/res/layout/browser_add_bookmark.xml
@@ -42,10 +42,8 @@
             android:id="@+id/title"
             android:layout_height="wrap_content"
             android:layout_width="250dip"
-            android:singleLine="true"
-            android:autoText="false"
-            android:capitalize="sentences"
             android:gravity="fill_horizontal"
+            android:inputType="textCapSentences"
             android:selectAllOnFocus="true"
             android:textAppearance="?android:attr/textAppearanceMedium" />
                 
@@ -63,11 +61,9 @@
             android:id="@+id/address"
             android:layout_height="wrap_content"
             android:layout_width="250dip"
-            android:singleLine="true"
-            android:autoText="false"
-            android:capitalize="none"
             android:hint="@string/http"
             android:gravity="fill_horizontal"
+            android:inputType="textUri"
             android:selectAllOnFocus="true"
             android:textAppearance="?android:attr/textAppearanceMedium" />
     </LinearLayout>
diff --git a/res/layout/browser_find.xml b/res/layout/browser_find.xml
index 7e587c1..000799f 100644
--- a/res/layout/browser_find.xml
+++ b/res/layout/browser_find.xml
@@ -18,9 +18,11 @@
     android:id="@+id/findControls"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
-    android:background="@android:drawable/bottom_bar"
-    android:paddingTop="12dip"
-    >
+    android:paddingTop="5dip"
+    android:paddingLeft="4dip"
+    android:paddingRight="4dip"
+    android:paddingBottom="1dip"
+    android:background="@android:drawable/bottom_bar">
     <ImageButton 
         android:src="@drawable/ic_btn_find_prev"
         android:id="@+id/previous"
@@ -46,8 +48,7 @@
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:scrollHorizontally="true"
-            android:autoText="false"
-            android:capitalize="none"
+            android:inputType="text"
             android:hint="@string/find_dot"
             />
         <LinearLayout android:id="@+id/matches_view"
diff --git a/res/layout/gears_dialog.xml b/res/layout/gears_dialog.xml
index 0d834f3..57d4f0b 100644
--- a/res/layout/gears_dialog.xml
+++ b/res/layout/gears_dialog.xml
@@ -22,14 +22,13 @@
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical"
-  android:padding="10dip"
-  android:background="@color/white">
+  android:padding="0dip">
 
   <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
-    android:paddingBottom="10dip">
+    android:padding="10dip">
 
     <LinearLayout
       android:layout_width="fill_parent"
@@ -46,7 +45,7 @@
           android:paddingRight="10dip"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
-          android:layout_centerHorizontal="true" />
+          android:layout_centerHorizontal="true"/>
 
         <TextView
           android:id="@+id/dialog_title"
@@ -57,7 +56,7 @@
           android:visibility="gone"
           android:textSize="16dip"
           android:textStyle="bold"
-          android:textColor="@color/black"/>
+          android:textColor="@color/white"/>
 
         <TextView
           android:id="@+id/dialog_message"
@@ -65,95 +64,112 @@
           android:layout_height="wrap_content"
           android:visibility="gone"
           android:gravity="center_vertical"
-          android:textSize="13dip"
-          android:textColor="@color/black"/>
+          android:textSize="20dip"
+          android:textColor="@color/white"/>
 
       </LinearLayout>
 
-      <TextView
-        android:id="@+id/dialog_subtitle"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:paddingTop="10dip"
-        android:gravity="center_vertical"
-        android:visibility="gone"
-        android:textSize="13dip"
-        android:textColor="@color/black"/>
-
     </LinearLayout>
 
   </LinearLayout>
 
   <LinearLayout
-    android:id="@+id/panel_content"
-    android:layout_width="fill_parent"
-    android:layout_height="0dip"
-    android:layout_weight="1"/>
-
-  <RelativeLayout
-    android:background="@color/white"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
-    android:paddingTop="2dip">
+    android:orientation="vertical">
 
-    <LinearLayout 
+    <ImageView android:id="@+id/titleDivider"
+        android:layout_width="fill_parent"
+        android:layout_height="1dip"
+        android:scaleType="fitXY"
+        android:gravity="fill_horizontal"
+        android:src="@drawable/dialog_divider_horizontal_light"
+        android:layout_marginLeft="10dip"
+        android:layout_marginRight="10dip"/>
+
+  </LinearLayout>
+
+  <LinearLayout
+    android:id="@+id/panel_content"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:padding="0dip"
+    android:layout_weight="1" />
+
+  <RelativeLayout
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:paddingLeft="10dip"
+    android:paddingRight="10dip"
+    android:paddingTop="0dip">
+
+    <LinearLayout
       android:orientation="vertical"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content">
 
-       <TextView
-         android:id="@+id/selection"
-         android:layout_width="fill_parent"
-         android:layout_height="wrap_content"
-         android:textSize="13dip"
-         android:gravity="right"
-         android:textColor="@color/black"/>
-
-       <RelativeLayout
-         android:background="@color/white"
-         android:layout_width="fill_parent"
-         android:layout_height="wrap_content"
-         android:paddingTop="2dip">
-
-         <LinearLayout
-           android:orientation="horizontal"
-           android:layout_width="wrap_content"
-           android:layout_height="wrap_content"
-           android:background="@color/white">
- 
-           <Button
-             android:id="@+id/button_alwaysdeny"
-             android:layout_width="wrap_content"
-             android:layout_height="48px"
-             android:layout_alignParentLeft="true"
-             style="@style/gears_button"
-             android:textSize="13dip"/>
-
-         </LinearLayout>
-
-         <LinearLayout
-           android:layout_width="wrap_content"
-           android:layout_alignParentRight="true"
-           android:layout_height="wrap_content">
-
-           <Button
-             android:id="@+id/button_allow"
-             android:layout_width="wrap_content"
-             android:layout_height="48px"
-             android:textSize="13dip"/>
-
-           <Button
-             android:id="@+id/button_deny"
-             android:layout_width="wrap_content"
-             android:layout_height="48px"
-             android:textSize="13dip"/>
-
-         </LinearLayout>
-
-       </RelativeLayout>
+      <TextView
+        android:id="@+id/selection"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:textSize="13dip"
+        android:gravity="right"
+        android:visibility="gone"
+        android:textColor="@color/white"/>
 
     </LinearLayout>
 
   </RelativeLayout>
 
+  <LinearLayout
+    android:layout_width="fill_parent"
+    android:background="@color/gray"
+    android:layout_height="wrap_content"
+    android:paddingTop="4dip"
+    android:paddingLeft="0dip"
+    android:paddingRight="0dip">
+
+    <LinearLayout android:id="@+id/leftSpacer"
+       android:layout_weight="0.25"
+       android:layout_width="0dip"
+       android:layout_height="wrap_content"
+       android:orientation="horizontal"
+       android:visibility="gone"/>
+
+    <Button
+      android:id="@+id/button_allow"
+      android:layout_width="96px"
+      android:layout_height="48px"
+      android:layout_gravity="left"
+      android:layout_weight="1"
+      android:maxLines="2"
+      android:textSize="13dip"/>
+
+    <Button
+      android:id="@+id/button_alwaysdeny"
+      android:layout_width="96px"
+      android:layout_height="48px"
+      android:layout_gravity="left"
+      android:layout_weight="1"
+      android:maxLines="2"
+      android:textSize="13dip"/>
+
+    <Button
+      android:id="@+id/button_deny"
+      android:layout_width="96px"
+      android:layout_height="48px"
+      android:layout_gravity="right"
+      android:layout_weight="1"
+      android:maxLines="2"
+      android:textSize="13dip"/>
+
+    <LinearLayout android:id="@+id/rightSpacer"
+      android:layout_width="0dip"
+      android:layout_weight="0.25"
+      android:layout_height="wrap_content"
+      android:orientation="horizontal"
+      android:visibility="gone" />
+
+  </LinearLayout>
+
 </LinearLayout>
diff --git a/res/layout/gears_dialog_filepicker.xml b/res/layout/gears_dialog_filepicker.xml
deleted file mode 100644
index b1c1646..0000000
--- a/res/layout/gears_dialog_filepicker.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2008, 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.
- */
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  android:orientation="vertical"
-  android:layout_width="fill_parent"
-  android:layout_height="wrap_content">
-
-  <LinearLayout
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:background="@color/white" >
-
-    <GridView android:id="@+id/paths_list"
-      android:padding="4dip"
-      android:layout_width="fill_parent"
-      android:layout_height="wrap_content" />
-  </LinearLayout>
-
-  <LinearLayout
-    android:orientation="horizontal"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:background="@color/white">
-
-    <TextView
-      android:id="@+id/path_name"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:textSize="13dip"
-      android:textColor="@color/dark_gray"/>
- 
-    <TextView
-      android:id="@+id/current_path"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:textSize="13dip"
-      android:textColor="@color/black"/>
-
-  </LinearLayout>
-
-  <LinearLayout
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:background="@color/gray"
-    android:padding="1px">
-
-    <LinearLayout
-      android:orientation="vertical"
-      android:layout_width="fill_parent"
-      android:layout_height="wrap_content"
-      android:background="@color/white">
-
-      <LinearLayout
-        android:orientation="horizontal"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:background="@color/white">
-
-        <ImageView
-          android:id="@+id/image"
-          android:padding="10dip"
-          android:layout_centerHorizontal="true"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:adjustViewBounds="true"
-          android:visibility="gone"
-          android:gravity="center"
-          android:src="@drawable/gears"/>
-
-        <LinearLayout
-          android:orientation="vertical"
-          android:layout_width="fill_parent"
-          android:layout_height="wrap_content"
-          android:background="@color/white">
- 
-          <GridView android:id="@+id/files_list"
-            android:padding="4px"
-            android:layout_width="fill_parent"
-            android:layout_height="fill_parent"
-            android:horizontalSpacing="2px"
-            android:verticalSpacing="2px"
-            android:numColumns="3"
-            style="@android:style/Widget.ListView.White" />
-
-        </LinearLayout>
-
-      </LinearLayout>
-
-    </LinearLayout>
-
-  </LinearLayout>
-
-</LinearLayout>
diff --git a/res/layout/gears_dialog_filepicker_cell.xml b/res/layout/gears_dialog_filepicker_cell.xml
deleted file mode 100644
index 0440e1f..0000000
--- a/res/layout/gears_dialog_filepicker_cell.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2008, 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.
- */
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  android:orientation="vertical"
-  android:layout_width="wrap_content"
-  android:layout_height="wrap_content"
-  android:gravity="center_horizontal"
-  android:padding="4px" >
-
-  <ImageView
-    android:id="@+id/icon"
-    android:scaleType="fitCenter"
-    android:layout_width="64px"
-    android:layout_height="64px" />
-
-  <TextView
-    android:id="@+id/name"
-    android:textColor="@color/black"
-    android:textSize="13dip"
-    android:shadowColor="@color/white"
-    android:shadowRadius="2.0"
-    android:singleLine="true"
-    android:ellipsize="middle"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content" />
-
-</LinearLayout>
diff --git a/res/layout/gears_dialog_permission.xml b/res/layout/gears_dialog_permission.xml
index 3852f83..01914e2 100644
--- a/res/layout/gears_dialog_permission.xml
+++ b/res/layout/gears_dialog_permission.xml
@@ -17,22 +17,23 @@
  */
 -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  android:orientation="vertical"
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
-  android:layout_height="wrap_content">
+  android:layout_height="wrap_content"
+  android:paddingBottom="10dip">
 
   <LinearLayout
+    android:orientation="vertical"
     android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:id="@+id/content_border"
-    android:padding="1px">
+    android:paddingTop="10dip"
+    android:paddingLeft="10dip"
+    android:paddingRight="10dip"
+    android:layout_height="wrap_content">
 
     <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
-      android:id="@+id/content_background"
-      android:padding="4dip">
+      android:orientation="horizontal">
 
       <ImageView
         android:id="@+id/origin_icon"
@@ -57,8 +58,8 @@
           android:visibility="gone"
           android:textStyle="bold"
           android:gravity="left"
-          android:textSize="13dip"
-          android:textColor="@color/black"/>
+          android:textSize="16dip"
+          android:textColor="@color/white"/>
 
         <TextView
           android:id="@+id/origin_subtitle"
@@ -67,7 +68,7 @@
           android:visibility="gone"
           android:gravity="left"
           android:textSize="13dip"
-          android:textColor="@color/black"/>
+          android:textColor="@color/white"/>
 
         <TextView
           android:id="@+id/origin_message"
@@ -77,24 +78,34 @@
           android:paddingTop="10dip"
           android:gravity="left"
           android:textSize="13dip"
-          android:textColor="@color/black"/>
+          android:textColor="@color/white"/>
 
       </LinearLayout>
 
     </LinearLayout>
 
+    <TextView
+      android:id="@+id/privacy_policy_label"
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content"
+      android:paddingTop="10dip"
+      android:gravity="center_horizontal"
+      android:textSize="13dip"
+      android:textStyle="italic"
+      android:textColor="@color/white"
+      android:visibility="gone"
+      android:text="@string/privacy_policy" />
+
+    <TextView
+      android:id="@+id/permission_dialog_message"
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content"
+      android:paddingLeft="4dip"
+      android:paddingTop="10dip"
+      android:gravity="left"
+      android:textSize="16dip"
+      android:textColor="@color/white"/>
+
   </LinearLayout>
 
-  <TextView
-    android:id="@+id/privacy_policy_label"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:paddingTop="10dip"
-    android:gravity="center_horizontal"
-    android:textSize="13dip"
-    android:textStyle="italic"
-    android:textColor="@color/black"
-    android:visibility="gone"
-    android:text="@string/privacy_policy" />
-
-</LinearLayout>
+</ScrollView>
diff --git a/res/layout/gears_dialog_settings.xml b/res/layout/gears_dialog_settings.xml
index 07b08ab..a9026db 100644
--- a/res/layout/gears_dialog_settings.xml
+++ b/res/layout/gears_dialog_settings.xml
@@ -36,7 +36,7 @@
       android:background="@color/white">
 
       <ListView android:id="@+id/sites_list"
-        android:padding="2dip"
+        android:padding="4dip"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         style="@android:style/Widget.ListView.White" />
diff --git a/res/layout/gears_settings.xml b/res/layout/gears_settings.xml
new file mode 100644
index 0000000..e3a4cbe
--- /dev/null
+++ b/res/layout/gears_settings.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, 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.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:drawingCacheQuality="auto"
+  android:layout_width="fill_parent"
+  android:layout_height="wrap_content"
+  android:orientation="vertical"
+  android:padding="0dip">
+
+  <ListView android:id="@+id/sites_list"
+    android:padding="4dip"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content" />
+
+  <LinearLayout
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <ImageView android:id="@+id/titleDivider"
+        android:layout_width="fill_parent"
+        android:layout_height="1dip"
+        android:scaleType="fitXY"
+        android:gravity="fill_horizontal"
+        android:src="@drawable/dialog_divider_horizontal_light"
+        android:layout_marginLeft="10dip"
+        android:layout_marginRight="10dip"/>
+
+  </LinearLayout>
+
+</LinearLayout>
diff --git a/res/layout/gears_settings_row.xml b/res/layout/gears_settings_row.xml
new file mode 100644
index 0000000..6a1e851
--- /dev/null
+++ b/res/layout/gears_settings_row.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, 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.
+ */
+-->
+
+<com.android.internal.view.menu.ListMenuItemView
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="fill_parent"
+  android:layout_height="?android:attr/listPreferredItemHeight">
+
+  <RelativeLayout
+    android:layout_width="0dip"
+    android:layout_weight="1"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center_vertical"
+    android:layout_marginLeft="6dip"
+    android:layout_marginRight="6dip"
+    android:duplicateParentState="true">
+
+    <TextView
+      android:id="@+id/title"
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content"
+      android:layout_alignParentTop="true"
+      android:layout_alignParentLeft="true"
+      android:textAppearance="?android:attr/textAppearanceMedium"
+      android:singleLine="true"
+      android:duplicateParentState="true"
+      android:ellipsize="start"
+      android:fadingEdge="none"/>
+
+    <TextView
+      android:id="@+id/subtitle"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_below="@id/title"
+      android:layout_alignParentLeft="true"
+      android:textAppearance="?android:attr/textAppearanceSmall"
+      android:singleLine="false"
+      android:duplicateParentState="true"/>
+
+    <TextView
+      android:id="@+id/info"
+      android:visibility="gone"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_below="@id/subtitle"
+      android:textAppearance="?android:attr/textAppearanceMedium"
+      android:singleLine="true"
+      android:layout_centerHorizontal="true"
+      android:duplicateParentState="true"
+      android:ellipsize="marquee"
+      android:fadingEdge="horizontal"/>
+
+  </RelativeLayout>
+
+  <LinearLayout
+    android:layout_width="wrap_content"
+    android:layout_height="fill_parent"
+    android:paddingLeft="10dip"
+    android:gravity="center_vertical"
+    android:orientation="horizontal">
+
+    <ImageView
+      android:id="@+id/icon"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:visibility="gone"
+      android:src="@drawable/ic_dialog_menu_generic" />
+
+    <CheckBox
+      android:id="@+id/checkbox"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_alignParentLeft="true"
+      android:drawablePadding="10dip"
+      android:focusable="false"
+      android:clickable="false"
+      android:duplicateParentState="true"
+      android:visibility="gone"
+      android:textSize="16dip"/>
+
+  </LinearLayout>
+
+</com.android.internal.view.menu.ListMenuItemView>
diff --git a/res/layout/history_header.xml b/res/layout/history_header.xml
new file mode 100644
index 0000000..a390c37
--- /dev/null
+++ b/res/layout/history_header.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
+        android:layout_width="fill_parent" 
+        android:layout_height="wrap_content"
+        android:minHeight="?android:attr/listPreferredItemHeight"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:paddingLeft="35dip"
+        android:gravity="center_vertical"
+        />
\ No newline at end of file
diff --git a/res/layout/history_item.xml b/res/layout/history_item.xml
index 1d51ad1..50903a4 100644
--- a/res/layout/history_item.xml
+++ b/res/layout/history_item.xml
@@ -16,27 +16,50 @@
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
         android:layout_width="fill_parent" 
-        android:layout_height="64dip"
-        android:orientation="vertical"
+        android:layout_height="wrap_content"
+        android:minHeight="?android:attr/listPreferredItemHeight"
+        android:orientation="horizontal"
         android:paddingRight="6dip"
-        android:paddingTop="8dip"
-        android:paddingLeft="4dip"
-        android:background="@color/translucent_white"
+        android:paddingLeft="6dip"
+        android:paddingTop="5dip"
+        android:paddingBottom="5dip"
+        android:gravity="center_vertical"
         >
-    <TextView android:id="@+id/title"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:maxLines="1"
-            android:layout_width="wrap_content" 
+    <ImageView android:id="@+id/favicon"
+        android:layout_width="20dip"
+        android:layout_height="20dip"
+        android:layout_marginLeft="5dip"
+        android:layout_marginRight="11dip"
+        android:padding="2dip"
+        android:background="@drawable/fav_icn_background"
+        android:src="@drawable/app_web_browser_sm"
+        />
+    <LinearLayout android:layout_width="0dip"
+            android:layout_weight="1"
             android:layout_height="wrap_content"
-            android:ellipsize="end"
-            android:drawablePadding="4dip"
-            />
-    <TextView android:id="@+id/url" 
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:maxLines="1"
-            android:layout_width="wrap_content" 
+            android:orientation="vertical"
+            >
+        <TextView android:id="@+id/title"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:maxLines="1"
+                android:layout_width="wrap_content" 
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:ellipsize="end"
+                />
+        <TextView android:id="@+id/url" 
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:maxLines="1"
+                android:layout_width="wrap_content" 
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:ellipsize="end"
+                />
+    </LinearLayout>
+    <CheckBox android:id="@+id/star"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="24dip"
-            android:ellipsize="end"
+            android:focusable="false"
+            android:button="@android:drawable/btn_star"
             />
 </LinearLayout>
diff --git a/res/layout/http_authentication.xml b/res/layout/http_authentication.xml
index 125095e..01cd3af 100644
--- a/res/layout/http_authentication.xml
+++ b/res/layout/http_authentication.xml
@@ -37,8 +37,7 @@
         android:textSize="18sp"
         android:textColor="@color/username_edit"
         android:scrollHorizontally="true"
-        android:autoText="false"
-        android:capitalize="none"
+        android:inputType="text"
         android:gravity="fill_horizontal"
         android:layout_weight="1"
         android:layout_marginLeft="20dip"
@@ -61,12 +60,10 @@
         android:textSize="18sp"
         android:textColor="@color/password_edit"
         android:scrollHorizontally="true"
-        android:autoText="false"
-        android:capitalize="none"
+        android:inputType="textPassword"
         android:gravity="fill_horizontal"
         android:layout_weight="1"
         android:layout_marginLeft="20dip"
         android:layout_marginRight="20dip"
-        android:layout_marginBottom="12dip" 
-        android:password="true" />
+        android:layout_marginBottom="12dip" />
 </TableLayout>
diff --git a/res/layout/search_bar.xml b/res/layout/search_bar.xml
deleted file mode 100644
index fe5647e..0000000
--- a/res/layout/search_bar.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* apps/common/res/layout/SearchBar.xml
-**
-** Copyright 2007, 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.
-*/
--->
-    <!-- Outer layout defines the entire search bar at the top of the screen -->
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/search_bar"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:paddingLeft="15dip"
-        android:paddingRight="15dip"
-        android:paddingTop="10dip"
-        android:paddingBottom="20dip"
-        android:baselineAligned="false"
-        android:background="@android:drawable/alert_dark_frame" >
-
-        <!-- TextView or ImageView at top shows searched application -->
-        <!-- Code will display one-or-the-other (or neither) -->
-        <FrameLayout 
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="3dip">
-
-            <TextView 
-                android:id="@+id/search_badge_label"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="?android:attr/textAppearanceSmall" />
-        </FrameLayout>
-
-        <!-- Inner layout contains the button(s) and EditText -->
-        <LinearLayout
-            android:id="@+id/search_edit_frame"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:gravity="center_vertical"
-            android:baselineAligned="false" >
-
-            <EditText
-                android:id="@+id/search_src_text"
-                android:layout_height="wrap_content"
-                android:layout_width="0dip"
-                android:layout_weight="1.0"
-                android:paddingLeft="6dip"
-                android:paddingRight="6dip"
-                android:singleLine="true"
-                android:textSize="14sp" />
-                
-            <Button
-                android:id="@+id/search_go_btn"
-                android:text="@android:string/search_go"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
-        </LinearLayout>
-        
-    </LinearLayout>
diff --git a/res/layout/tabs.xml b/res/layout/tabs.xml
new file mode 100644
index 0000000..7cf5b5d
--- /dev/null
+++ b/res/layout/tabs.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@android:id/tabhost"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent">
+
+        <TabWidget android:id="@android:id/tabs"
+            android:layout_width="fill_parent"
+            android:layout_height="68dip"
+            android:paddingLeft="1dip"
+            android:paddingRight="1dip"
+            android:paddingTop="4dip"
+        />
+
+        <FrameLayout android:id="@android:id/tabcontent"
+            android:layout_width="fill_parent"
+            android:layout_height="0dip"
+            android:layout_weight="1"
+        />
+    </LinearLayout>
+</TabHost>
\ No newline at end of file
diff --git a/res/menu/browser.xml b/res/menu/browser.xml
index 21049d9..088fb6e 100644
--- a/res/menu/browser.xml
+++ b/res/menu/browser.xml
@@ -19,9 +19,6 @@
         <item android:id="@+id/goto_menu_id"
             android:title="@string/goto_dot" 
             android:alphabeticShortcut="l" 
-            android:icon="@*android:drawable/ic_menu_goto" />
-        <item android:id="@+id/search_menu_id"
-            android:title="@string/search"
             android:icon="@android:drawable/ic_menu_search"/>
         <item android:id="@+id/bookmarks_menu_id"
             android:title="@string/bookmarks" 
@@ -34,44 +31,40 @@
             android:icon="@drawable/ic_menu_windows" />
         <item android:id="@+id/stop_reload_menu_id"
             android:alphabeticShortcut="r" />
-        <item android:id="@+id/back_menu_id"
-            android:title="@string/back" 
-            android:alphabeticShortcut="j" 
-            android:icon="@*android:drawable/ic_menu_back" />
-        <item android:id="@+id/close_menu_id"
-            android:title="@string/close" 
-            android:alphabeticShortcut="w" 
-            android:icon="@android:drawable/ic_menu_close_clear_cancel" />
         <item android:id="@+id/forward_menu_id"
             android:title="@string/forward" 
-            android:alphabeticShortcut="k" />
-        <item android:id="@+id/homepage_menu_id"
-            android:title="@string/homepage" 
-            android:alphabeticShortcut="&#32;" 
-            android:icon="@*android:drawable/ic_menu_home" />
-        <item android:id="@+id/classic_history_menu_id"
-            android:icon="@android:drawable/ic_menu_recent_history" 
-            android:alphabeticShortcut="h" 
-            android:title="@string/history" />
-        <item android:id="@+id/view_downloads_menu_id"
-            android:title="@string/menu_view_download" /> 
+            android:alphabeticShortcut="k"
+            android:icon="@*android:drawable/ic_menu_forward" />
         <item android:id="@+id/find_menu_id"
             android:title="@string/find_dot" 
             android:alphabeticShortcut="f" />
         <item android:id="@+id/select_text_id"
             android:title="@string/select_dot" />
         <item android:id="@+id/page_info_menu_id"
-            android:title="@string/page_info" />
-        <item android:id="@+id/bookmark_page_menu_id"
-            android:title="@string/menu_bookmark_page"/>
+            android:title="@string/page_info"
+            android:alphabeticShortcut="g" />
         <item android:id="@+id/share_page_menu_id"
             android:title="@string/share_page"/>
-        <item android:id="@+id/flip_orientation_menu_id"
-            android:title="@string/menu_flip_orientation" /> 
-        <item android:id="@+id/zoom_menu_id"
-            android:title="@string/menu_zoom" />
+        <item android:id="@+id/view_downloads_menu_id"
+            android:title="@string/menu_view_download"
+            android:alphabeticShortcut="d" />
         <item android:id="@+id/preferences_menu_id"
-            android:title="@string/menu_preferences" />
+            android:title="@string/menu_preferences"
+            android:alphabeticShortcut="p" />
+        <!-- followings are debug only -->
+        <item android:id="@+id/dump_nav_menu_id"
+            android:title="@string/dump_nav"
+            android:visible="false" />
+    </group>
+    <group android:id="@+id/MAIN_SHORTCUT_MENU" android:visible="false">
+        <item android:id="@+id/back_menu_id"
+            android:alphabeticShortcut="j" />
+        <item android:id="@+id/close_menu_id"
+            android:alphabeticShortcut="w" />
+        <item android:id="@+id/homepage_menu_id"
+            android:alphabeticShortcut="&#32;" />
+        <item android:id="@+id/classic_history_menu_id"
+            android:alphabeticShortcut="h" />
         <item android:id="@+id/zoom_in_menu_id"
             android:alphabeticShortcut="i" />
         <item android:id="@+id/zoom_out_menu_id"
@@ -92,9 +85,6 @@
             android:alphabeticShortcut="7" />
         <item android:id="@+id/window_eight_menu_id"
             android:alphabeticShortcut="8" />
-        <item android:id="@+id/dump_nav_menu_id"
-            android:title="@string/dump_nav"
-            android:visible="false" />
     </group>
     <group android:id="@+id/TAB_MENU">
         <item android:id="@+id/new_tab_menu_id"
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 334d148..5f6677e 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"Prohlížeč"</string>
+    <string name="tab_bookmarks">"Záložky"</string>
+    <string name="tab_most_visited">"Nejčastěji navštěvované"</string>
+    <string name="tab_history">"Historie"</string>
+    <string name="added_to_bookmarks">"Přidáno k záložkám"</string>
+    <string name="removed_from_bookmarks">"Odstraněno ze záložek"</string>
     <string name="sign_in_to">"Přihlásit se: <xliff:g id="HOSTNAME">%s1</xliff:g> <xliff:g id="REALM">%s2</xliff:g>"</string>
     <string name="username">"Název"</string>
     <string name="password">"Heslo"</string>
     <string name="action">"Přihlásit se"</string>
     <string name="cancel">"Zrušit"</string>
     <string name="ok">"OK"</string>
-    <string name="matches_found">"shod"</string>
+    <string name="matches_found">" shod"</string>
     <string name="zero">"Ne"</string>
     <string name="page_info">"Informace o stránce"</string>
     <string name="page_info_view">"Zobrazit informace o stránce"</string>
@@ -47,12 +51,9 @@
     <string name="issued_on">"Datum vydání:"</string>
     <string name="expires_on">"Platnost vyprší:"</string>
     <string name="retrieving_creds_dlg_msg">"Načítání podrobností pro přihlášení..."</string>
-    <string name="close">"Zavřít"</string>
-    <string name="close_window">"Toto okno bude zavřeno."</string>
     <string name="stopping">"Zastavuji..."</string>
     <string name="stop">"Zastavit"</string>
     <string name="reload">"Obnovit"</string>
-    <string name="back">"Zpět"</string>
     <string name="forward">"Předat dál"</string>
     <string name="save">"OK"</string>
     <string name="do_not_save">"Zrušit"</string>
@@ -72,15 +73,13 @@
     <string name="bookmark_url_not_valid">"Adresa URL není platná."</string>
     <string name="delete_bookmark">"Smazat"</string>
     <string name="bookmark_page">"Přidat poslední zobrazenou stránku do záložek"</string>
-    <string name="current_page">"Aktuální stránka:"</string>
+    <string name="current_page">"od "</string>
     <string name="delete_bookmark_warning">"Záložka <xliff:g id="BOOKMARK">%s</xliff:g> bude smazána."</string>
     <string name="open_in_new_window">"Otevřít v novém okně"</string>
     <string name="new_window">"Nové okno"</string>
-    <string name="goto_dot">"Přejít na adresu URL"</string>
+    <string name="goto_dot">"Přejít"</string>
     <string name="find_dot">"Vyhledat na stránce"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"Plocha"</string>
+    <string name="select_dot">"Označit text"</string>
     <string name="view_tabs">"Přehled okna"</string>
     <string name="view_tabs_condensed">"Windows"</string>
     <string name="tab_picker_title">"Aktuální okna"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"Přidat do záložek"</string>
     <string name="history">"Historie"</string>
     <string name="menu_view_download">"Stahování"</string>
-    <string name="menu_bookmark_page">"Stránka Záložky"</string>
     <string name="share_page">"Sdílet stránku"</string>
-    <string name="menu_zoom">"Přiblížení"</string>
-    <string name="menu_flip_orientation">"Změnit orientaci"</string>
     <string name="contextmenu_openlink">"Otevřít"</string>
     <string name="contextmenu_openlink_newwindow">"Otevřít v novém okně"</string>
     <string name="contextmenu_bookmark_thislink">"Přidat odkaz do záložek"</string>
@@ -208,10 +204,9 @@
     <string name="clear_history">"Vymazat historii"</string>
     <string name="browser_history">"Nedávno navštívené stránky"</string>
     <string name="empty_history">"Historie prohlížeče je prázdná."</string>
-    <string name="add_new_bookmark">"Nová záložka"</string>
+    <string name="add_new_bookmark">"Přidat záložku..."</string>
     <string name="no_database">"Databáze neexistuje."</string>
     <string name="search_hint">"Zadejte webovou adresu"</string>
-    <string name="search">"Hledat"</string>
     <string name="search_button_text">"Přejít"</string>
     <string name="attention">"Upozornění"</string>
     <string name="popup_window_attempt">"Tato stránka se pokouší otevřít vyskakovací okno."</string>
@@ -238,7 +233,8 @@
     <string name="download_no_sdcard_dlg_title">"Žádná karta SD není dostupná."</string>
     <string name="download_no_sdcard_dlg_msg">"Na kartu SD je třeba stáhnout soubor <xliff:g id="FILENAME">%s</xliff:g>."</string>
     <string name="download_sdcard_busy_dlg_title">"Karta SD není dostupná"</string>
-    <string name="download_sdcard_busy_dlg_msg">"Karta SD je zaneprázdněná. Chcete-li povolit stahování, přejděte na Plochu &gt; Nastavení &gt; Karta SD a paměť telefonu a zrušte zaškrtnutí políčka Použít jako paměťové zařízení USB."</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"Nebyla nalezena žádná aplikace, ve které lze tento soubor otevřít."</string>
     <string name="retry">"Zkusit znovu"</string>
     <string name="no_downloads">"Historie stahování je prázdná."</string>
@@ -254,22 +250,68 @@
     <string name="download_length_required">"Nelze stáhnout. Velikost položky nelze určit."</string>
     <string name="download_precondition_failed">"Stahování bylo přerušeno a nelze v něm pokračovat."</string>
     <string name="activity_instrumentation_test_runner">"Testovací verze prohlížeče"</string>
+    <string name="search_google">"Prohledat Google"</string>
     <string name="permlab_readHistoryBookmarks">"čtení historie a záložek prohlížeče"</string>
     <string name="permdesc_readHistoryBookmarks">"Umožňuje aplikaci číst všechny navštívené adresy URL a záložky prohlížeče."</string>
     <string name="permlab_writeHistoryBookmarks">"zápis historie a záložek prohlížeče"</string>
     <string name="permdesc_writeHistoryBookmarks">"Umožní aplikaci změnit historii či záložky prohlížeče uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit data prohlížeče."</string>
-    <string name="query_data_message">"Níže uvedený web se pokouší do vašeho počítače uložit informace pomocí služby Gears."</string>
-    <string name="location_message">"Níže uvedený web se pomocí služby Gears pokouší získat přístup k informacím o vaší poloze."</string>
-    <string name="shortcut_message">"Tento web se na vašem počítači pokouší vytvořit zástupce. Chcete to povolit?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"Níže uvedená tabulka zobrazuje oprávnění, která jste udělili jednotlivým webům, které se pokusily použít službu Gears."</string>
-    <string name="filepicker_message">"Vybírání souborů služby Gears"</string>
-    <string name="image_message">"Vybraný obrázek"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"Nastavení služby Gears"</string>
     <string name="privacy_policy">"Chcete-li zjistit, jak bude vaše poloha využita, přečtěte si zásady ochrany osobních údajů těchto stránek."</string>
-    <string name="permission_button_alwaysdeny">"Nikdy nepovolit tento web"</string>
-    <string name="permission_button_allow">"Povolit"</string>
-    <string name="permission_button_deny">"Odepřít"</string>
-    <string name="shortcut_button_alwaysdeny">"Nikdy nepovolovat tento odkaz"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"OK"</string>
     <string name="shortcut_button_deny">"Zrušit"</string>
     <string name="settings_button_allow">"Použít"</string>
@@ -286,4 +328,5 @@
     <string name="denied">"Odepřeno"</string>
     <string name="unrecognized_dialog_message">"Nerozpoznaný typ dialogu"</string>
     <string name="default_button">"OK"</string>
+    <string name="zoom_overview_button_text">"Přehled"</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 6f17c99..ec0ae34 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"Browser"</string>
+    <string name="tab_bookmarks">"Lesezeichen"</string>
+    <string name="tab_most_visited">"Meistbesucht"</string>
+    <string name="tab_history">"Verlauf"</string>
+    <string name="added_to_bookmarks">"Zu Lesezeichen hinzugefügt"</string>
+    <string name="removed_from_bookmarks">"Aus Lesezeichen entfernt"</string>
     <string name="sign_in_to">"Bei <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\" anmelden"</string>
     <string name="username">"Name"</string>
     <string name="password">"Passwort"</string>
     <string name="action">"Anmelden"</string>
     <string name="cancel">"Abbrechen"</string>
     <string name="ok">"OK"</string>
-    <string name="matches_found">"Treffer"</string>
+    <string name="matches_found">" Treffer"</string>
     <string name="zero">"Nein"</string>
     <string name="page_info">"Seiten-Info"</string>
     <string name="page_info_view">"Seiten-Info anzeigen"</string>
@@ -47,12 +51,9 @@
     <string name="issued_on">"Ausgegeben am:"</string>
     <string name="expires_on">"Läuft ab am:"</string>
     <string name="retrieving_creds_dlg_msg">"Anmeldedetails werden abgerufen…"</string>
-    <string name="close">"Schließen"</string>
-    <string name="close_window">"Dieses Fenster wird geschlossen."</string>
     <string name="stopping">"Wird angehalten..."</string>
     <string name="stop">"Anhalten"</string>
     <string name="reload">"Aktualisieren"</string>
-    <string name="back">"Zurück"</string>
     <string name="forward">"Weiter"</string>
     <string name="save">"OK"</string>
     <string name="do_not_save">"Abbrechen"</string>
@@ -72,15 +73,13 @@
     <string name="bookmark_url_not_valid">"URL ist nicht gültig."</string>
     <string name="delete_bookmark">"Löschen"</string>
     <string name="bookmark_page">"Lesezeichen für zuletzt besuchte Seite"</string>
-    <string name="current_page">"Aktuelle Seite:"</string>
+    <string name="current_page">"von "</string>
     <string name="delete_bookmark_warning">"Lesezeichen \"<xliff:g id="BOOKMARK">%s</xliff:g>\" wird gelöscht."</string>
     <string name="open_in_new_window">"In neuem Fenster öffnen"</string>
     <string name="new_window">"Neues Fenster"</string>
-    <string name="goto_dot">"Gehe zu URL"</string>
+    <string name="goto_dot">"Los"</string>
     <string name="find_dot">"Auf Seite suchen"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"Startseite"</string>
+    <string name="select_dot">"Text auswählen"</string>
     <string name="view_tabs">"Fensterübersicht"</string>
     <string name="view_tabs_condensed">"Windows"</string>
     <string name="tab_picker_title">"Aktuelle Fenster"</string>
@@ -91,12 +90,9 @@
     <string name="tab_picker_send_url">"Link weiterleiten"</string>
     <string name="bookmarks">"Lesezeichen"</string>
     <string name="shortcut_bookmark">"Lesezeichen"</string>
-    <string name="history">"Suchverlauf"</string>
+    <string name="history">"Verlauf"</string>
     <string name="menu_view_download">"Downloads"</string>
-    <string name="menu_bookmark_page">"Lesezeichen-Seite"</string>
     <string name="share_page">"Seitenlink weiterleiten"</string>
-    <string name="menu_zoom">"Zoom"</string>
-    <string name="menu_flip_orientation">"Ausrichtung drehen"</string>
     <string name="contextmenu_openlink">"Öffnen"</string>
     <string name="contextmenu_openlink_newwindow">"In neuem Fenster öffnen"</string>
     <string name="contextmenu_bookmark_thislink">"Lesezeichen-Link"</string>
@@ -208,10 +204,9 @@
     <string name="clear_history">"Verlauf löschen"</string>
     <string name="browser_history">"Zuletzt besuchte Seiten"</string>
     <string name="empty_history">"Browserverlauf ist leer."</string>
-    <string name="add_new_bookmark">"Neues Lesezeichen"</string>
+    <string name="add_new_bookmark">"Lesezeichen hinzufügen..."</string>
     <string name="no_database">"Keine Datenbank!"</string>
     <string name="search_hint">"Webadresse eingeben"</string>
-    <string name="search">"Suche"</string>
     <string name="search_button_text">"Los"</string>
     <string name="attention">"Achtung"</string>
     <string name="popup_window_attempt">"Diese Website versucht, ein Pop-up-Fenster zu öffnen."</string>
@@ -238,7 +233,8 @@
     <string name="download_no_sdcard_dlg_title">"Keine SD-Karte"</string>
     <string name="download_no_sdcard_dlg_msg">"Zum Download von <xliff:g id="FILENAME">%s</xliff:g> ist eine SD-Karte erforderlich."</string>
     <string name="download_sdcard_busy_dlg_title">"SD-Karte nicht verfügbar"</string>
-    <string name="download_sdcard_busy_dlg_msg">"Die SD-Karte ist ausgelastet. Um Downloads zuzulassen, gehen Sie zur Startseite &gt; Einstellungen &gt; SD-Karte &amp; Telefonspeicher und deaktivieren Sie das Kontrollkästchen \"Für USB-Speicher verwenden\"."</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"Es kann keine Anwendung gefunden werden, um diese Datei zu öffnen."</string>
     <string name="retry">"Wiederholen"</string>
     <string name="no_downloads">"Downloadverlauf ist leer."</string>
@@ -254,22 +250,68 @@
     <string name="download_length_required">"Download kann nicht gestartet werden, da die Größe des Elements nicht bestimmt werden kann."</string>
     <string name="download_precondition_failed">"Download wurde unterbrochen und kann nicht fortgesetzt werden."</string>
     <string name="activity_instrumentation_test_runner">"Browser Test Runner"</string>
+    <string name="search_google">"In Google suchen"</string>
     <string name="permlab_readHistoryBookmarks">"Browserverlauf und Lesezeichen lesen"</string>
     <string name="permdesc_readHistoryBookmarks">"Ermöglicht der Anwendung, alle URLs, die mit dem Browser besucht wurden, sowie alle Lesezeichen des Browsers zu lesen."</string>
     <string name="permlab_writeHistoryBookmarks">"Browserverlauf und Lesezeichen schreiben"</string>
     <string name="permdesc_writeHistoryBookmarks">"Ermöglicht einer Anwendung, den auf Ihrem Telefon gespeicherten Browserverlauf und die Lesezeichen zu ändern. Schädliche Anwendungen können so Ihre Browserdaten löschen oder ändern."</string>
-    <string name="query_data_message">"Die folgende Website möchte mit Gears Informationen auf Ihrem Computer speichern."</string>
-    <string name="location_message">"Die folgende Website möchte mit Gears auf Informationen zu Ihrem Ort zugreifen."</string>
-    <string name="shortcut_message">"Diese Website möchte einen Shortcut auf Ihrem Computer erstellen. Sind Sie damit einverstanden?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"Die folgende Tabelle zeigt die Berechtigungen, die Sie jeder Website erteilt haben, die versucht hat, Gears zu verwenden."</string>
-    <string name="filepicker_message">"Gears File Picker"</string>
-    <string name="image_message">"Ausgewähltes Bild"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"Gears-Einstellungen"</string>
     <string name="privacy_policy">"Lesen Sie die Datenschutzbestimmungen dieser Website, um herauszufinden, wie Ihr Ort verwendet wird."</string>
-    <string name="permission_button_alwaysdeny">"Diese Website niemals zulassen"</string>
-    <string name="permission_button_allow">"Zulassen"</string>
-    <string name="permission_button_deny">"Ablehnen"</string>
-    <string name="shortcut_button_alwaysdeny">"Diesen Shortcut niemals zulassen"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"OK"</string>
     <string name="shortcut_button_deny">"Abbrechen"</string>
     <string name="settings_button_allow">"Anwenden"</string>
@@ -286,4 +328,5 @@
     <string name="denied">"Abgelehnt"</string>
     <string name="unrecognized_dialog_message">"Unbekannter Dialogtyp"</string>
     <string name="default_button">"OK"</string>
+    <string name="zoom_overview_button_text">"Übersicht"</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index c729504..cbef856 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"Navegador"</string>
+    <string name="tab_bookmarks">"Marcadores"</string>
+    <string name="tab_most_visited">"Más visitados"</string>
+    <string name="tab_history">"Historial"</string>
+    <string name="added_to_bookmarks">"Añadido a marcadores"</string>
+    <string name="removed_from_bookmarks">"Eliminado de marcadores"</string>
     <string name="sign_in_to">"Acceder a <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
     <string name="username">"Nombre"</string>
     <string name="password">"Contraseña"</string>
     <string name="action">"Acceder"</string>
     <string name="cancel">"Cancelar"</string>
     <string name="ok">"Aceptar"</string>
-    <string name="matches_found">"coincidencias"</string>
+    <string name="matches_found">" coincidencias"</string>
     <string name="zero">"No"</string>
     <string name="page_info">"Información de página"</string>
     <string name="page_info_view">"Ver información de página"</string>
@@ -47,12 +51,9 @@
     <string name="issued_on">"Fecha de emisión:"</string>
     <string name="expires_on">"Fecha de caducidad:"</string>
     <string name="retrieving_creds_dlg_msg">"Recuperando detalles de acceso..."</string>
-    <string name="close">"Cerrar"</string>
-    <string name="close_window">"Se cerrará esta ventana."</string>
     <string name="stopping">"Deteniendo..."</string>
     <string name="stop">"Detener"</string>
     <string name="reload">"Actualizar"</string>
-    <string name="back">"Anterior"</string>
     <string name="forward">"Siguiente"</string>
     <string name="save">"Aceptar"</string>
     <string name="do_not_save">"Cancelar"</string>
@@ -72,17 +73,15 @@
     <string name="bookmark_url_not_valid">"La URL no es válida."</string>
     <string name="delete_bookmark">"Suprimir"</string>
     <string name="bookmark_page">"Marcar como última página vista"</string>
-    <string name="current_page">"Página actual:"</string>
+    <string name="current_page">"de "</string>
     <string name="delete_bookmark_warning">"Se eliminará el marcador \"<xliff:g id="BOOKMARK">%s</xliff:g>\"."</string>
     <string name="open_in_new_window">"Abrir en ventana nueva"</string>
     <string name="new_window">"Nueva ventana"</string>
-    <string name="goto_dot">"Ir a URL"</string>
+    <string name="goto_dot">"Ir"</string>
     <string name="find_dot">"Buscar en la página"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"Página principal"</string>
+    <string name="select_dot">"Seleccionar texto"</string>
     <string name="view_tabs">"Visión general de ventanas"</string>
-    <string name="view_tabs_condensed">"Windows"</string>
+    <string name="view_tabs_condensed">"Ventanas"</string>
     <string name="tab_picker_title">"Ventanas actuales"</string>
     <string name="tab_picker_view_tab">"Ver"</string>
     <string name="tab_picker_new_tab">"Nueva ventana"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"Marcar"</string>
     <string name="history">"Historial"</string>
     <string name="menu_view_download">"Descargas"</string>
-    <string name="menu_bookmark_page">"Marcar página"</string>
     <string name="share_page">"Compartir página"</string>
-    <string name="menu_zoom">"Zoom"</string>
-    <string name="menu_flip_orientation">"Cambiar orientación"</string>
     <string name="contextmenu_openlink">"Abrir"</string>
     <string name="contextmenu_openlink_newwindow">"Abrir en ventana nueva"</string>
     <string name="contextmenu_bookmark_thislink">"Marcar enlace"</string>
@@ -106,14 +102,14 @@
     <string name="contextmenu_copylink">"Copiar URL de enlace"</string>
     <string name="contextmenu_download_image">"Guardar imagen"</string>
     <string name="contextmenu_view_image">"Ver imagen"</string>
-    <string name="contextmenu_dial_dot">"Marcar…"</string>
+    <string name="contextmenu_dial_dot">"Llamar…"</string>
     <string name="contextmenu_add_contact">"Añadir contacto"</string>
     <string name="contextmenu_send_mail">"Enviar mensaje de correo electrónico"</string>
     <string name="contextmenu_map">"Mapa"</string>
     <string name="clear">"Borrar"</string>
     <string name="replace">"Sustituir"</string>
     <string name="browser_bookmarks_page_bookmarks_text">"Marcadores"</string>
-    <string name="menu_preferences">"Configuración"</string>
+    <string name="menu_preferences">"Ajustes"</string>
     <string name="pref_content_title">"Configuración de contenido de la página"</string>
     <string name="pref_content_load_images">"Cargar imágenes"</string>
     <string name="pref_content_load_images_summary">"Mostrar imágenes en páginas web"</string>
@@ -128,7 +124,7 @@
     <string name="pref_privacy_clear_cache">"Borrar caché"</string>
     <string name="pref_privacy_clear_cache_summary">"Eliminar todo el contenido de la página almacenado en caché"</string>
     <string name="pref_privacy_clear_cache_dlg">"Se borrará la caché."</string>
-    <string name="pref_privacy_clear_cookies">"Borrar todos los datos de cookies"</string>
+    <string name="pref_privacy_clear_cookies">"Borrar los datos de cookies"</string>
     <string name="pref_privacy_clear_cookies_summary">"Borrar todas las cookies del navegador"</string>
     <string name="pref_privacy_clear_cookies_dlg">"Se borrarán todas las cookies."</string>
     <string name="pref_privacy_clear_history">"Borrar historial"</string>
@@ -144,14 +140,14 @@
     <string name="pref_security_remember_passwords">"Recordar contraseñas"</string>
     <string name="pref_security_remember_passwords_summary">"Guardar nombres de usuario y contraseñas de sitios web"</string>
     <string name="pref_security_save_form_data">"Recordar datos de formulario"</string>
-    <string name="pref_security_save_form_data_summary">"Recordar datos introducidos en formularios para utilizarlos más adelante"</string>
+    <string name="pref_security_save_form_data_summary">"Recordar datos introducidos en formularios"</string>
     <string name="pref_security_show_security_warning">"Mostrar advertencias de seguridad"</string>
     <string name="pref_security_show_security_warning_summary">"Mostrar advertencia si hay algún problema con la seguridad del sitio"</string>
     <string name="pref_security_accept_cookies">"Aceptar cookies"</string>
     <string name="pref_security_accept_cookies_summary">"Permitir que los sitios guarden y lean datos de cookies"</string>
     <string name="pref_text_size">"Establecer tamaño de texto"</string>
   <string-array name="pref_text_size_choices">
-    <item>"Tiny"</item>
+    <item>"Muy pequeño"</item>
     <item>"Pequeño"</item>
     <item>"Normal"</item>
     <item>"Grande"</item>
@@ -201,17 +197,16 @@
     <string name="browserFrame307Post">"Esta página web se ha redirigido a otra ubicación. ¿Quieres enviar los datos del formulario cumplimentado a la nueva ubicación?"</string>
     <string name="browserFrameNetworkErrorLabel">"Problema de conectividad de datos"</string>
     <string name="browserFrameFileErrorLabel">"Problema con archivo"</string>
-    <string name="browserFrameFormResubmitLabel">"Confirmar"</string>
+    <string name="browserFrameFormResubmitLabel">"OK"</string>
     <string name="browserFrameFormResubmitMessage">"La página que intentas ver contiene datos que ya se han enviado (\"POSTDATA\"). Si reenvías los datos, se repetirá cualquier acción realizada por el formulario de la página (como las búsquedas o las compras online)."</string>
     <string name="loadSuspendedTitle">"Sin conexión de red"</string>
     <string name="loadSuspended">"La página seguirá cargándose una vez que se restablezca la conexión."</string>
     <string name="clear_history">"Borrar historial"</string>
     <string name="browser_history">"Páginas visitadas recientemente"</string>
     <string name="empty_history">"El historial del navegador está vacío."</string>
-    <string name="add_new_bookmark">"Marcador nuevo"</string>
+    <string name="add_new_bookmark">"Añadir marcador…"</string>
     <string name="no_database">"No hay ninguna base de datos."</string>
     <string name="search_hint">"Introduce la dirección web."</string>
-    <string name="search">"Buscar"</string>
     <string name="search_button_text">"Ir"</string>
     <string name="attention">"Atención"</string>
     <string name="popup_window_attempt">"Este sitio está intentando mostrar una ventana emergente."</string>
@@ -235,10 +230,11 @@
     <string name="download_file_error_dlg_title">"Sin espacio"</string>
     <string name="download_file_error_dlg_msg">"No se ha podido descargar el archivo <xliff:g id="FILENAME">%s</xliff:g>."\n"Libera espacio en el teléfono e inténtalo de nuevo."</string>
     <string name="download_failed_generic_dlg_title">"Descarga incorrecta"</string>
-    <string name="download_no_sdcard_dlg_title">"Ninguna tarjeta SD"</string>
+    <string name="download_no_sdcard_dlg_title">"Falta la tarjeta SD"</string>
     <string name="download_no_sdcard_dlg_msg">"Para descargar <xliff:g id="FILENAME">%s</xliff:g> se necesita una tarjeta SD."</string>
     <string name="download_sdcard_busy_dlg_title">"Tarjeta SD no disponible"</string>
-    <string name="download_sdcard_busy_dlg_msg">"La tarjeta SD está ocupada. Para permitir descargas, accede a \"Página principal &gt; Configuración &gt; Almacenamiento en teléfono y en tarjeta SD\" y desactiva la casilla de verificación \"Utilizar para almacenamiento USB\"."</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"No se ha encontrado ninguna aplicación que permita abrir este archivo."</string>
     <string name="retry">"Reintentar"</string>
     <string name="no_downloads">"El historial de descargas está vacío."</string>
@@ -254,50 +250,68 @@
     <string name="download_length_required">"No se puede realizar la descarga, porque no es posible determinar el tamaño del elemento."</string>
     <string name="download_precondition_failed">"La descarga se ha interrumpido y no se puede reanudar."</string>
     <string name="activity_instrumentation_test_runner">"Realizador de pruebas del navegador"</string>
-  <string-array name="bookmarks">
-    <item>"Google"</item>
-    <item>"http://www.google.com/"</item>
-    <item>"Yahoo!"</item>
-    <item>"http://www.yahoo.com/"</item>
-    <item>"MSN"</item>
-    <item>"http://www.msn.com/"</item>
-    <item>"MySpace"</item>
-    <item>"http://www.myspace.com/"</item>
-    <item>"Facebook"</item>
-    <item>"http://www.facebook.com/"</item>
-    <item>"Wikipedia"</item>
-    <item>"http://www.wikipedia.org/"</item>
-    <item>"eBay"</item>
-    <item>"http://www.ebay.com/"</item>
-    <item>"CNN"</item>
-    <item>"http://www.cnn.com/"</item>
-    <item>"New York Times"</item>
-    <item>"http://www.nytimes.com/"</item>
-    <item>"ESPN"</item>
-    <item>"http://espn.go.com/"</item>
-    <item>"Amazon"</item>
-    <item>"http://www.amazon.com/"</item>
-    <item>"Weather Channel"</item>
-    <item>"http://www.weather.com/"</item>
-    <item>"BBC"</item>
-    <item>"http://www.bbc.co.uk/"</item>
-  </string-array>
+    <string name="search_google">"Búsqueda de Google"</string>
     <string name="permlab_readHistoryBookmarks">"leer información de marcadores y del historial del navegador"</string>
     <string name="permdesc_readHistoryBookmarks">"Permite que la aplicación lea todas las URL que ha visitado el navegador y todos sus marcadores."</string>
     <string name="permlab_writeHistoryBookmarks">"escribir en marcadores y en el historial del navegador"</string>
     <string name="permdesc_writeHistoryBookmarks">"Permite que una aplicación modifique la información de los marcadores o del historial del navegador almacenada en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar los datos del navegador."</string>
-    <string name="query_data_message">"El sitio web especificado a continuación desea almacenar información en tu equipo mediante Gears."</string>
-    <string name="location_message">"El sitio web especificado a continuación desea acceder a información sobre tu ubicación mediante Gears."</string>
-    <string name="shortcut_message">"¿Quieres permitir que este sitio web cree un acceso directo en tu equipo?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"En la tabla que aparece a continuación se muestran los permisos que has concedido a los distintos sitios web que han intentado utilizar Gears."</string>
-    <string name="filepicker_message">"Selector de archivos de Gears"</string>
-    <string name="image_message">"Imagen seleccionada"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"Configuración de Gears"</string>
     <string name="privacy_policy">"Lee la política de privacidad del sitio para saber cómo se utilizará tu ubicación."</string>
-    <string name="permission_button_alwaysdeny">"No permitir nunca este sitio"</string>
-    <string name="permission_button_allow">"Permitir"</string>
-    <string name="permission_button_deny">"Denegar"</string>
-    <string name="shortcut_button_alwaysdeny">"No permitir nunca este acceso directo"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"Aceptar"</string>
     <string name="shortcut_button_deny">"Cancelar"</string>
     <string name="settings_button_allow">"Aplicar"</string>
@@ -314,4 +328,5 @@
     <string name="denied">"Denegado"</string>
     <string name="unrecognized_dialog_message">"Tipo de cuadro de diálogo no reconocido"</string>
     <string name="default_button">"Aceptar"</string>
+    <string name="zoom_overview_button_text">"Información general"</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 2a05c4a..56f865a 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"Navigateur"</string>
+    <string name="tab_bookmarks">"Favoris"</string>
+    <string name="tab_most_visited">"Les + visités"</string>
+    <string name="tab_history">"Historique"</string>
+    <string name="added_to_bookmarks">"Ajouté aux favoris"</string>
+    <string name="removed_from_bookmarks">"Supprimé des favoris"</string>
     <string name="sign_in_to">"Connectez-vous à <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
     <string name="username">"Nom"</string>
     <string name="password">"Mot de passe"</string>
     <string name="action">"Se connecter"</string>
     <string name="cancel">"Annuler"</string>
     <string name="ok">"OK"</string>
-    <string name="matches_found">"résultats correspondants"</string>
+    <string name="matches_found">" résultat(s) correspondant(s )"</string>
     <string name="zero">"Non"</string>
     <string name="page_info">"Infos sur la page"</string>
     <string name="page_info_view">"Afficher les infos sur la page"</string>
@@ -47,12 +51,9 @@
     <string name="issued_on">"Émis le :"</string>
     <string name="expires_on">"Expire le :"</string>
     <string name="retrieving_creds_dlg_msg">"Récupération des données de connexion..."</string>
-    <string name="close">"Fermer"</string>
-    <string name="close_window">"La fenêtre sera fermée."</string>
     <string name="stopping">"Arrêt..."</string>
     <string name="stop">"Interrompre"</string>
     <string name="reload">"Actualiser"</string>
-    <string name="back">"Précédent"</string>
     <string name="forward">"Suivant"</string>
     <string name="save">"OK"</string>
     <string name="do_not_save">"Annuler"</string>
@@ -61,7 +62,7 @@
     <string name="http">"http://"</string>
     <string name="save_to_bookmarks">"Favori"</string>
     <string name="edit_bookmark">"Modifier le favori"</string>
-    <string name="create_shortcut_bookmark">"Ajouter un raccourci sur la page d\'accueil"</string>
+    <string name="create_shortcut_bookmark">"Raccourci sur la page d\'accueil"</string>
     <string name="open_bookmark">"Ouverture"</string>
     <string name="remove_bookmark">"Supprimer le favori"</string>
     <string name="remove_history_item">"Supprimer de l\'historique"</string>
@@ -71,21 +72,19 @@
     <string name="empty_bookmark">"Impossible de créer un favori vide."</string>
     <string name="bookmark_url_not_valid">"L\'URL est incorrecte."</string>
     <string name="delete_bookmark">"Supprimer"</string>
-    <string name="bookmark_page">"Dernière page de favori consultée"</string>
-    <string name="current_page">"Page actuelle :"</string>
+    <string name="bookmark_page">"Ajouter la dernière page consultée"</string>
+    <string name="current_page">"de "</string>
     <string name="delete_bookmark_warning">"Le favori \"<xliff:g id="BOOKMARK">%s</xliff:g>\" sera supprimé."</string>
-    <string name="open_in_new_window">"Ouvrir dans une nouvelle fenêtre"</string>
+    <string name="open_in_new_window">"Nouvelle fenêtre"</string>
     <string name="new_window">"Nouvelle fenêtre"</string>
-    <string name="goto_dot">"Accéder à l\'URL"</string>
+    <string name="goto_dot">"Recherche"</string>
     <string name="find_dot">"Rechercher sur la page"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"Page d\'accueil"</string>
+    <string name="select_dot">"Sélectionner le texte"</string>
     <string name="view_tabs">"Vue d\'ensemble des fenêtres"</string>
-    <string name="view_tabs_condensed">"Windows"</string>
+    <string name="view_tabs_condensed">"Fenêtres"</string>
     <string name="tab_picker_title">"Fenêtres actuelles"</string>
     <string name="tab_picker_view_tab">"Afficher"</string>
-    <string name="tab_picker_new_tab">"Nouvelle fenêtre"</string>
+    <string name="tab_picker_new_tab">"Nouv. fenêtre"</string>
     <string name="tab_picker_remove_tab">"Fermer"</string>
     <string name="tab_picker_bookmark">"Favori"</string>
     <string name="tab_picker_send_url">"Partager le lien"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"Favori"</string>
     <string name="history">"Historique"</string>
     <string name="menu_view_download">"Téléchargements"</string>
-    <string name="menu_bookmark_page">"Page de favori"</string>
     <string name="share_page">"Partager la page"</string>
-    <string name="menu_zoom">"Zoom"</string>
-    <string name="menu_flip_orientation">"Changer l\'orientation"</string>
     <string name="contextmenu_openlink">"Ouvrir"</string>
     <string name="contextmenu_openlink_newwindow">"Ouvrir une nouvelle fenêtre"</string>
     <string name="contextmenu_bookmark_thislink">"Lien du favori"</string>
@@ -117,24 +113,24 @@
     <string name="pref_content_title">"Paramètres du contenu de la page"</string>
     <string name="pref_content_load_images">"Charger les images"</string>
     <string name="pref_content_load_images_summary">"Afficher les images des pages Web"</string>
-    <string name="pref_content_block_popups">"Bloquer les fenêtres contextuelles"</string>
+    <string name="pref_content_block_popups">"Bloquer les pop-up"</string>
     <string name="pref_content_javascript">"Activer JavaScript"</string>
-    <string name="pref_content_open_in_background">"Ouvrir à l\'arrière-plan"</string>
+    <string name="pref_content_open_in_background">"Ouvrir en arrière-plan"</string>
     <string name="pref_content_open_in_background_summary">"Les nouvelles fenêtres s\'ouvrent derrière la fenêtre actuelle"</string>
     <string name="pref_content_homepage">"Configurer la page d\'accueil"</string>
-    <string name="pref_content_autofit">"Ajustement automatique des pages"</string>
+    <string name="pref_content_autofit">"Redimensionner les pages"</string>
     <string name="pref_content_autofit_summary">"Configurer les pages Web pour qu\'elles s\'ajustent à l\'écran"</string>
     <string name="pref_privacy_title">"Paramètres de confidentialité"</string>
     <string name="pref_privacy_clear_cache">"Effacer le cache"</string>
     <string name="pref_privacy_clear_cache_summary">"Supprimer tout le contenu de la page en cache"</string>
     <string name="pref_privacy_clear_cache_dlg">"Le cache sera effacé."</string>
-    <string name="pref_privacy_clear_cookies">"Effacer toutes les données de cookies"</string>
+    <string name="pref_privacy_clear_cookies">"Effacer tous les cookies"</string>
     <string name="pref_privacy_clear_cookies_summary">"Effacer tous les cookies du navigateur"</string>
     <string name="pref_privacy_clear_cookies_dlg">"Tous les cookies seront effacés."</string>
     <string name="pref_privacy_clear_history">"Effacer l\'historique"</string>
     <string name="pref_privacy_clear_history_summary">"Effacer l\'historique du navigateur"</string>
     <string name="pref_privacy_clear_history_dlg">"L\'historique du navigateur sera effacé."</string>
-    <string name="pref_privacy_clear_form_data">"Effacer les données du formulaire"</string>
+    <string name="pref_privacy_clear_form_data">"Effacer données formulaire"</string>
     <string name="pref_privacy_clear_form_data_summary">"Effacer toutes les données de formulaire enregistrées"</string>
     <string name="pref_privacy_clear_form_data_dlg">"Toutes les données de formulaire enregistrées seront effacées."</string>
     <string name="pref_privacy_clear_passwords">"Effacer les mots de passe"</string>
@@ -143,10 +139,10 @@
     <string name="pref_security_title">"Paramètres de sécurité"</string>
     <string name="pref_security_remember_passwords">"Mémoriser les mots de passe"</string>
     <string name="pref_security_remember_passwords_summary">"Enregistrer les noms d\'utilisateur et les mots de passe pour les sites Web"</string>
-    <string name="pref_security_save_form_data">"Mémoriser les données de formulaire"</string>
+    <string name="pref_security_save_form_data">"Mémoriser données formulaire"</string>
     <string name="pref_security_save_form_data_summary">"Mémoriser les données saisies dans les formulaires pour les utiliser ultérieurement"</string>
-    <string name="pref_security_show_security_warning">"Afficher les avertissements de sécurité"</string>
-    <string name="pref_security_show_security_warning_summary">"Afficher un avertissement lorsqu\'un site présente des problèmes de sécurité"</string>
+    <string name="pref_security_show_security_warning">"Avertissements de sécurité"</string>
+    <string name="pref_security_show_security_warning_summary">"Afficher un avertissement en cas de problème de sécurité d\'un site"</string>
     <string name="pref_security_accept_cookies">"Accepter les cookies"</string>
     <string name="pref_security_accept_cookies_summary">"Autoriser les sites à enregistrer et lire les données \"cookie\""</string>
     <string name="pref_text_size">"Définir la taille du texte"</string>
@@ -165,7 +161,7 @@
     <string name="pref_plugin_installed">"Liste des plug-ins"</string>
     <string name="pref_plugin_installed_empty_list">"Aucun plug-in installé."</string>
     <string name="pref_extras_gears_settings_summary">"Applications étendant les fonctionnalités du navigateur"</string>
-    <string name="pref_extras_reset_default">"Rétablir les valeurs par défaut"</string>
+    <string name="pref_extras_reset_default">"Rétablir valeurs par défaut"</string>
     <string name="pref_extras_reset_default_summary">"Effacer toutes les données du navigateur et rétablir les paramètres par défaut"</string>
     <string name="pref_extras_reset_default_dlg">"Toutes les données du navigateur seront effacées et les paramètres par défaut rétablis."</string>
     <string name="pref_extras_reset_default_dlg_title">"Rétablir les valeurs par défaut"</string>
@@ -202,16 +198,15 @@
     <string name="browserFrameNetworkErrorLabel">"Problème de connectivité des données"</string>
     <string name="browserFrameFileErrorLabel">"Problème de fichier"</string>
     <string name="browserFrameFormResubmitLabel">"Confirmer"</string>
-    <string name="browserFrameFormResubmitMessage">"La page que vous tentez d\'afficher contient des données qui ont déjà été envoyées (\"POSTDATA\"). Si vous renvoyez les données, toute action effectuée par le formulaire sur la page exécutée (notamment les lancements de recherche ou les achats en ligne) seront répétés."</string>
+    <string name="browserFrameFormResubmitMessage">"La page que vous tentez d\'afficher contient des données qui ont déjà été envoyées (\"POSTDATA\"). Si vous renvoyez les données, toute action effectuée par le formulaire sur la page exécutée (notamment les lancements de recherche ou les achats en ligne) sera répétée."</string>
     <string name="loadSuspendedTitle">"Aucune connexion réseau"</string>
     <string name="loadSuspended">"Une fois la connexion rétablie, le chargement de la page reprendra."</string>
     <string name="clear_history">"Effacer l\'historique"</string>
     <string name="browser_history">"Dernières pages consultées"</string>
     <string name="empty_history">"L\'historique du navigateur est vide."</string>
-    <string name="add_new_bookmark">"Nouveau favori"</string>
+    <string name="add_new_bookmark">"Ajouter aux favoris..."</string>
     <string name="no_database">"Aucune base de données !"</string>
     <string name="search_hint">"Saisir l\'adresse Web"</string>
-    <string name="search">"Rechercher"</string>
     <string name="search_button_text">"Aller"</string>
     <string name="attention">"Attention"</string>
     <string name="popup_window_attempt">"Le site tente d\'ouvrir une fenêtre contextuelle."</string>
@@ -238,13 +233,14 @@
     <string name="download_no_sdcard_dlg_title">"Aucune carte SD"</string>
     <string name="download_no_sdcard_dlg_msg">"Le téléchargement de <xliff:g id="FILENAME">%s</xliff:g> requiert une carte SD."</string>
     <string name="download_sdcard_busy_dlg_title">"Carte SD non disponible"</string>
-    <string name="download_sdcard_busy_dlg_msg">"La carte SD est occupée. Pour permettre les téléchargements, allez sur Page d\'accueil &gt; Paramètres &gt; Carte SD et stockage téléphone et décochez la case \"Utiliser pour le stockage USB\"."</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"Impossible de trouver une application permettant d\'ouvrir ce fichier."</string>
     <string name="retry">"Réessayer"</string>
     <string name="no_downloads">"L\'historique de téléchargement est vide."</string>
     <string name="download_error">"Échec du téléchargement"</string>
     <string name="download_success">"Téléchargement de <xliff:g id="FILE">%s</xliff:g> terminé."</string>
-    <string name="download_running">"Téléchargement en cours..."</string>
+    <string name="download_running">"Téléchargement..."</string>
     <string name="download_pending">"Début du téléchargement..."</string>
     <string name="download_pending_network">"En attente d\'une connexion de données..."</string>
     <string name="download_running_paused">"En attente d\'une connexion de données..."</string>
@@ -254,50 +250,68 @@
     <string name="download_length_required">"Téléchargement impossible. La taille de l\'élément n\'a pas pu être déterminée."</string>
     <string name="download_precondition_failed">"Téléchargement interrompu. Impossible de reprendre le téléchargement."</string>
     <string name="activity_instrumentation_test_runner">"Testeur de navigateur"</string>
-  <string-array name="bookmarks">
-    <item>"Google"</item>
-    <item>"http://www.google.com/"</item>
-    <item>"Yahoo!"</item>
-    <item>"http://www.yahoo.com/"</item>
-    <item>"MSN"</item>
-    <item>"http://www.msn.com/"</item>
-    <item>"MySpace"</item>
-    <item>"http://www.myspace.com/"</item>
-    <item>"Facebook"</item>
-    <item>"http://www.facebook.com/"</item>
-    <item>"Wikipédia"</item>
-    <item>"http://www.wikipedia.org/"</item>
-    <item>"eBay"</item>
-    <item>"http://www.ebay.com/"</item>
-    <item>"CNN"</item>
-    <item>"http://www.cnn.com/"</item>
-    <item>"New York Times"</item>
-    <item>"http://www.nytimes.com/"</item>
-    <item>"ESPN"</item>
-    <item>"http://espn.go.com/"</item>
-    <item>"Amazon"</item>
-    <item>"http://www.amazon.com/"</item>
-    <item>"Météo"</item>
-    <item>"http://www.weather.com/"</item>
-    <item>"BBC"</item>
-    <item>"http://www.bbc.co.uk/"</item>
-  </string-array>
-    <string name="permlab_readHistoryBookmarks">"lire l\'historique du navigateur et les favoris"</string>
+    <string name="search_google">"Recherche Google"</string>
+    <string name="permlab_readHistoryBookmarks">"Lecture de l\'historique du navigateur et des favoris"</string>
     <string name="permdesc_readHistoryBookmarks">"Permet à l\'application de lire toutes les URL visitées par le navigateur et tous les favoris."</string>
-    <string name="permlab_writeHistoryBookmarks">"écrire l\'historique du navigateur et les favoris"</string>
+    <string name="permlab_writeHistoryBookmarks">"Enregistrement de l\'historique du navigateur et des favoris"</string>
     <string name="permdesc_writeHistoryBookmarks">"Permet à une application de modifier l\'historique du navigateur ou les favoris enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonction pour effacer ou modifier les données de votre navigateur."</string>
-    <string name="query_data_message">"Le site Web ci-dessous tente d\'enregistrer des informations sur votre ordinateur avec Google Gears."</string>
-    <string name="location_message">"Le site Web ci-dessous tente d\'accéder à des informations sur votre emplacement avec Google Gears."</string>
-    <string name="shortcut_message">"Voulez-vous autoriser ce site Web à créer un raccourci sur votre ordinateur ?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"Le tableau ci-dessous indique les fonctions que vous avez autorisées pour chaque site ayant tenté d\'utiliser Google Gears."</string>
-    <string name="filepicker_message">"Sélecteur de fichiers Google Gears"</string>
-    <string name="image_message">"Image sélectionnée"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"Paramètres Google Gears"</string>
-    <string name="privacy_policy">"Lisez la politique de confidentialité du site pour voir comment votre emplacement sera utilisé."</string>
-    <string name="permission_button_alwaysdeny">"Ne jamais autoriser ce site"</string>
-    <string name="permission_button_allow">"Autoriser"</string>
-    <string name="permission_button_deny">"Refuser"</string>
-    <string name="shortcut_button_alwaysdeny">"Ne jamais autoriser ce raccourci"</string>
+    <string name="privacy_policy">"Lisez les règles de confidentialité du site pour voir comment votre emplacement sera utilisé."</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"OK"</string>
     <string name="shortcut_button_deny">"Annuler"</string>
     <string name="settings_button_allow">"Appliquer"</string>
@@ -314,4 +328,5 @@
     <string name="denied">"Refusé"</string>
     <string name="unrecognized_dialog_message">"Type de boîte de dialogue inconnu"</string>
     <string name="default_button">"OK"</string>
+    <string name="zoom_overview_button_text">"Présentation"</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 61f00e3..dd3b6ee 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"Browser"</string>
+    <string name="tab_bookmarks">"Segnalibri"</string>
+    <string name="tab_most_visited">"I più visitati"</string>
+    <string name="tab_history">"Cronologia"</string>
+    <string name="added_to_bookmarks">"Aggiunto a segnalibri"</string>
+    <string name="removed_from_bookmarks">"Rimosso da segnalibri"</string>
     <string name="sign_in_to">"Accedi a <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
     <string name="username">"Nome"</string>
     <string name="password">"Password"</string>
     <string name="action">"Accedi"</string>
     <string name="cancel">"Annulla"</string>
     <string name="ok">"OK"</string>
-    <string name="matches_found">"corrispondenze"</string>
+    <string name="matches_found">" corrispondenze"</string>
     <string name="zero">"No"</string>
     <string name="page_info">"Info pagina"</string>
     <string name="page_info_view">"Visualizza info pagina"</string>
@@ -47,40 +51,35 @@
     <string name="issued_on">"Rilasciato il:"</string>
     <string name="expires_on">"Scade il:"</string>
     <string name="retrieving_creds_dlg_msg">"Recupero dettagli di accesso..."</string>
-    <string name="close">"Chiudi"</string>
-    <string name="close_window">"Questa finestra verrà chiusa."</string>
     <string name="stopping">"Interruzione..."</string>
     <string name="stop">"Interrompi"</string>
     <string name="reload">"Aggiorna"</string>
-    <string name="back">"Indietro"</string>
     <string name="forward">"Avanti"</string>
     <string name="save">"OK"</string>
     <string name="do_not_save">"Annulla"</string>
-    <string name="location">"Posizione"</string>
+    <string name="location">"URL"</string>
     <string name="name">"Nome"</string>
     <string name="http">"http://"</string>
     <string name="save_to_bookmarks">"Segnalibro"</string>
     <string name="edit_bookmark">"Modifica segnalibro"</string>
-    <string name="create_shortcut_bookmark">"Aggiungi collegamento a Home"</string>
+    <string name="create_shortcut_bookmark">"Aggiungi scorciatoia Home"</string>
     <string name="open_bookmark">"Apri"</string>
     <string name="remove_bookmark">"Elimina segnalibro"</string>
     <string name="remove_history_item">"Rimuovi da cronologia"</string>
     <string name="bookmark_saved">"Salvato nei segnalibri."</string>
     <string name="bookmark_needs_title">"Inserisci un nome per il segnalibro."</string>
-    <string name="bookmark_needs_url">"Inserisci una posizione per il segnalibro."</string>
+    <string name="bookmark_needs_url">"Inserisci un URL per il segnalibro."</string>
     <string name="empty_bookmark">"Impossibile creare un segnalibro vuoto."</string>
     <string name="bookmark_url_not_valid">"URL non valido."</string>
     <string name="delete_bookmark">"Elimina"</string>
     <string name="bookmark_page">"Aggiungi ultima pagina visualizzata in segnalibri"</string>
-    <string name="current_page">"Pagina corrente:"</string>
+    <string name="current_page">"da "</string>
     <string name="delete_bookmark_warning">"Il segnalibro \"<xliff:g id="BOOKMARK">%s</xliff:g>\" verrà eliminato."</string>
     <string name="open_in_new_window">"Apri in nuova finestra"</string>
     <string name="new_window">"Nuova finestra"</string>
-    <string name="goto_dot">"Vai a URL"</string>
+    <string name="goto_dot">"Vai"</string>
     <string name="find_dot">"Trova nella pagina"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"Home page"</string>
+    <string name="select_dot">"Seleziona testo"</string>
     <string name="view_tabs">"Anteprima finestre"</string>
     <string name="view_tabs_condensed">"Finestre"</string>
     <string name="tab_picker_title">"Finestre correnti"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"Segnalibro"</string>
     <string name="history">"Cronologia"</string>
     <string name="menu_view_download">"Download"</string>
-    <string name="menu_bookmark_page">"Pagina segnalibri"</string>
     <string name="share_page">"Condividi pagina"</string>
-    <string name="menu_zoom">"Zoom"</string>
-    <string name="menu_flip_orientation">"Capovolgi orientamento"</string>
     <string name="contextmenu_openlink">"Apri"</string>
     <string name="contextmenu_openlink_newwindow">"Apri in nuova finestra"</string>
     <string name="contextmenu_bookmark_thislink">"Aggiungi link in segnalibri"</string>
@@ -208,10 +204,9 @@
     <string name="clear_history">"Cancella cronologia"</string>
     <string name="browser_history">"Pagine visitate di recente"</string>
     <string name="empty_history">"La cronologia del browser è vuota."</string>
-    <string name="add_new_bookmark">"Nuovo segnalibro"</string>
+    <string name="add_new_bookmark">"Aggiungi segnalibro…"</string>
     <string name="no_database">"Nessun database"</string>
     <string name="search_hint">"Digita l\'indirizzo web"</string>
-    <string name="search">"Cerca"</string>
     <string name="search_button_text">"Vai"</string>
     <string name="attention">"Attenzione"</string>
     <string name="popup_window_attempt">"Il sito sta tentando di aprire una finestra pop-up."</string>
@@ -238,7 +233,8 @@
     <string name="download_no_sdcard_dlg_title">"Nessuna scheda SD"</string>
     <string name="download_no_sdcard_dlg_msg">"Per scaricare <xliff:g id="FILENAME">%s</xliff:g> occorre una scheda SD."</string>
     <string name="download_sdcard_busy_dlg_title">"Scheda SD non disponibile"</string>
-    <string name="download_sdcard_busy_dlg_msg">"La scheda SD è già in uso. Per consentire i download, vai a Home &gt; Impostazioni &gt; Scheda SD e archiviazione telefono e deseleziona la casella \"Usa per archiviazione USB\"."</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"Impossibile trovare un\'applicazione in cui aprire questo file."</string>
     <string name="retry">"Riprova"</string>
     <string name="no_downloads">"La cronologia download è vuota."</string>
@@ -249,55 +245,73 @@
     <string name="download_pending_network">"In attesa di connessione dati..."</string>
     <string name="download_running_paused">"In attesa di connessione dati..."</string>
     <string name="download_canceled">"Download annullato."</string>
-    <string name="download_not_acceptable">"Impossibile effettuare il download. Il contenuto non è supportato dal telefono."</string>
+    <string name="download_not_acceptable">"Impossibile effettuare il download. I contenuti non sono supportati dal telefono."</string>
     <string name="download_file_error">"Impossibile terminare il download. Spazio insufficiente."</string>
     <string name="download_length_required">"Impossibile effettuare il download. Impossibile determinare le dimensioni dell\'elemento."</string>
     <string name="download_precondition_failed">"Download interrotto. Impossibile ripristinarlo."</string>
     <string name="activity_instrumentation_test_runner">"Browser Test Runner"</string>
-  <string-array name="bookmarks">
-    <item>"Google"</item>
-    <item>"http://www.google.com/"</item>
-    <item>"Yahoo!"</item>
-    <item>"http://www.yahoo.com/"</item>
-    <item>"MSN"</item>
-    <item>"http://www.msn.com/"</item>
-    <item>"MySpace"</item>
-    <item>"http://www.myspace.com/"</item>
-    <item>"Facebook"</item>
-    <item>"http://www.facebook.com/"</item>
-    <item>"Wikipedia"</item>
-    <item>"http://www.wikipedia.org/"</item>
-    <item>"eBay"</item>
-    <item>"http://www.ebay.com/"</item>
-    <item>"CNN"</item>
-    <item>"http://www.cnn.com/"</item>
-    <item>"New York Times"</item>
-    <item>"http://www.nytimes.com/"</item>
-    <item>"ESPN"</item>
-    <item>"http://espn.go.com/"</item>
-    <item>"Amazon"</item>
-    <item>"http://www.amazon.com/"</item>
-    <item>"Weather Channel"</item>
-    <item>"http://www.weather.com/"</item>
-    <item>"BBC"</item>
-    <item>"http://www.bbc.co.uk/"</item>
-  </string-array>
-    <string name="permlab_readHistoryBookmarks">"leggere cronologia e segnalibri del browser"</string>
+    <string name="search_google">"Cerca su Google"</string>
+    <string name="permlab_readHistoryBookmarks">"lettura cronologia e segnalibri del browser"</string>
     <string name="permdesc_readHistoryBookmarks">"Consente all\'applicazione di leggere tutti gli URL visitati e tutti i segnalibri del browser."</string>
-    <string name="permlab_writeHistoryBookmarks">"creare cronologia e segnalibri del browser"</string>
+    <string name="permlab_writeHistoryBookmarks">"creazione cronologia e segnalibri del browser"</string>
     <string name="permdesc_writeHistoryBookmarks">"Consente a un\'applicazione di modificare la cronologia o i segnalibri del browser memorizzati sul telefono. Le applicazioni dannose possono sfruttare questa possibilità per cancellare o modificare i dati del browser."</string>
-    <string name="query_data_message">"Il sito web sotto desidera memorizzare informazioni sul computer tramite Gears."</string>
-    <string name="location_message">"Il sito web sotto desidera accedere alle informazioni sulla tua posizione tramite Gears."</string>
-    <string name="shortcut_message">"Il sito web desidera creare un collegamento sul computer. Consenti questa operazione?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"Nella tabella che segue vengono riportate le autorizzazioni concesse a ogni sito che ha provato a usare Gears."</string>
-    <string name="filepicker_message">"Selettore file Gears"</string>
-    <string name="image_message">"Immagine selezionata"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"Impostazioni Gears"</string>
     <string name="privacy_policy">"Per conoscere la modalità di utilizzo della tua posizione, leggi le norme sulla privacy del sito."</string>
-    <string name="permission_button_alwaysdeny">"Non consentire mai il sito"</string>
-    <string name="permission_button_allow">"Consenti"</string>
-    <string name="permission_button_deny">"Nega"</string>
-    <string name="shortcut_button_alwaysdeny">"Non consentire mai il collegamento"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"OK"</string>
     <string name="shortcut_button_deny">"Annulla"</string>
     <string name="settings_button_allow">"Applica"</string>
@@ -314,4 +328,5 @@
     <string name="denied">"Negato"</string>
     <string name="unrecognized_dialog_message">"Tipo di finestra non riconosciuto"</string>
     <string name="default_button">"OK"</string>
+    <string name="zoom_overview_button_text">"Panoramica"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 01274d9..bd19f84 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"ブラウザ"</string>
+    <string name="tab_bookmarks">"ブックマーク"</string>
+    <string name="tab_most_visited">"よくアクセスするサイト"</string>
+    <string name="tab_history">"履歴"</string>
+    <string name="added_to_bookmarks">"ブックマークに追加しました"</string>
+    <string name="removed_from_bookmarks">"ブックマークから削除しました"</string>
     <string name="sign_in_to">"<xliff:g id="HOSTNAME">%s1</xliff:g>に「<xliff:g id="REALM">%s2</xliff:g>」でログイン"</string>
     <string name="username">"名前"</string>
     <string name="password">"パスワード"</string>
     <string name="action">"ログイン"</string>
     <string name="cancel">"キャンセル"</string>
     <string name="ok">"OK"</string>
-    <string name="matches_found">"件一致"</string>
+    <string name="matches_found">" 件一致"</string>
     <string name="zero">"いいえ"</string>
     <string name="page_info">"ページ情報"</string>
     <string name="page_info_view">"ページ情報を表示"</string>
@@ -44,15 +48,12 @@
     <string name="org_unit">"組織単位:"</string>
     <string name="issued_by">"発行者:"</string>
     <string name="validity_period">"有効期間:"</string>
-    <string name="issued_on">"発行日:"</string>
+    <string name="issued_on">"発行:"</string>
     <string name="expires_on">"有効期限:"</string>
     <string name="retrieving_creds_dlg_msg">"ログイン詳細を取得中..."</string>
-    <string name="close">"閉じる"</string>
-    <string name="close_window">"このウィンドウを閉じます。"</string>
     <string name="stopping">"停止中..."</string>
     <string name="stop">"停止"</string>
-    <string name="reload">"リフレッシュ"</string>
-    <string name="back">"戻る"</string>
+    <string name="reload">"再読み込み"</string>
     <string name="forward">"進む"</string>
     <string name="save">"OK"</string>
     <string name="do_not_save">"キャンセル"</string>
@@ -64,28 +65,26 @@
     <string name="create_shortcut_bookmark">"ショートカットをホームに追加"</string>
     <string name="open_bookmark">"開く"</string>
     <string name="remove_bookmark">"ブックマークを削除"</string>
-    <string name="remove_history_item">"履歴から削除"</string>
+    <string name="remove_history_item">"履歴から消去"</string>
     <string name="bookmark_saved">"ブックマークを保存しました。"</string>
-    <string name="bookmark_needs_title">"ブックマークには名前を指定する必要があります。"</string>
-    <string name="bookmark_needs_url">"ブックマークには場所を指定する必要があります。"</string>
+    <string name="bookmark_needs_title">"名前を指定してください。"</string>
+    <string name="bookmark_needs_url">"場所を指定してください。"</string>
     <string name="empty_bookmark">"空のブックマークは作成できません。"</string>
     <string name="bookmark_url_not_valid">"無効なURLです。"</string>
     <string name="delete_bookmark">"削除"</string>
     <string name="bookmark_page">"最後に表示したページをブックマークする"</string>
-    <string name="current_page">"現在のページ:"</string>
+    <string name="current_page">"ブックマークするページ "</string>
     <string name="delete_bookmark_warning">"ブックマーク「<xliff:g id="BOOKMARK">%s</xliff:g>」を削除します。"</string>
     <string name="open_in_new_window">"新しいウィンドウで開く"</string>
-    <string name="new_window">"新しいウィンドウ"</string>
-    <string name="goto_dot">"URLに移動"</string>
+    <string name="new_window">"新規ウィンドウ"</string>
+    <string name="goto_dot">"移動"</string>
     <string name="find_dot">"このページの検索"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"ホームページ"</string>
+    <string name="select_dot">"テキストを選択"</string>
     <string name="view_tabs">"ウィンドウリスト"</string>
     <string name="view_tabs_condensed">"ウィンドウ"</string>
     <string name="tab_picker_title">"現在のウィンドウ"</string>
     <string name="tab_picker_view_tab">"表示"</string>
-    <string name="tab_picker_new_tab">"新しいウィンドウ"</string>
+    <string name="tab_picker_new_tab">"新規ウィンドウ"</string>
     <string name="tab_picker_remove_tab">"閉じる"</string>
     <string name="tab_picker_bookmark">"ブックマーク"</string>
     <string name="tab_picker_send_url">"リンクを共有"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"ブックマーク"</string>
     <string name="history">"履歴"</string>
     <string name="menu_view_download">"ダウンロード"</string>
-    <string name="menu_bookmark_page">"ページをブックマーク"</string>
     <string name="share_page">"ページを共有"</string>
-    <string name="menu_zoom">"ズーム"</string>
-    <string name="menu_flip_orientation">"画面の向きを変更"</string>
     <string name="contextmenu_openlink">"開く"</string>
     <string name="contextmenu_openlink_newwindow">"新しいウィンドウで開く"</string>
     <string name="contextmenu_bookmark_thislink">"リンクをブックマーク"</string>
@@ -110,7 +106,7 @@
     <string name="contextmenu_add_contact">"連絡先を追加"</string>
     <string name="contextmenu_send_mail">"メールを送信"</string>
     <string name="contextmenu_map">"地図"</string>
-    <string name="clear">"クリア"</string>
+    <string name="clear">"消去"</string>
     <string name="replace">"入れ替え"</string>
     <string name="browser_bookmarks_page_bookmarks_text">"ブックマーク"</string>
     <string name="menu_preferences">"設定"</string>
@@ -118,33 +114,33 @@
     <string name="pref_content_load_images">"画像のロード"</string>
     <string name="pref_content_load_images_summary">"ウェブページに画像を表示"</string>
     <string name="pref_content_block_popups">"ポップアップウィンドウをブロック"</string>
-    <string name="pref_content_javascript">"JavaScriptを有効化"</string>
+    <string name="pref_content_javascript">"JavaScript有効"</string>
     <string name="pref_content_open_in_background">"バックグラウンドで開く"</string>
-    <string name="pref_content_open_in_background_summary">"現在のウィンドウの後ろに新しいウィンドウを開く"</string>
+    <string name="pref_content_open_in_background_summary">"新しいウィンドウを現在のウィンドウの後ろに開きます"</string>
     <string name="pref_content_homepage">"ホームページ設定"</string>
     <string name="pref_content_autofit">"ページの自動調整"</string>
     <string name="pref_content_autofit_summary">"ウェブページの大きさを画面に合わせて表示します"</string>
     <string name="pref_privacy_title">"プライバシー設定"</string>
-    <string name="pref_privacy_clear_cache">"キャッシュをクリア"</string>
-    <string name="pref_privacy_clear_cache_summary">"キャッシュされたページコンテンツをすべて削除"</string>
-    <string name="pref_privacy_clear_cache_dlg">"キャッシュをクリアします。"</string>
-    <string name="pref_privacy_clear_cookies">"全Cookieデータをクリア"</string>
-    <string name="pref_privacy_clear_cookies_summary">"ブラウザのCookieをすべてクリア"</string>
-    <string name="pref_privacy_clear_cookies_dlg">"Cookieをすべてクリアします。"</string>
-    <string name="pref_privacy_clear_history">"履歴をクリア"</string>
-    <string name="pref_privacy_clear_history_summary">"ブラウザの閲覧履歴をクリア"</string>
-    <string name="pref_privacy_clear_history_dlg">"ブラウザの閲覧履歴をクリアします。"</string>
+    <string name="pref_privacy_clear_cache">"キャッシュを消去"</string>
+    <string name="pref_privacy_clear_cache_summary">"キャッシュされたページコンテンツをすべて削除します"</string>
+    <string name="pref_privacy_clear_cache_dlg">"キャッシュを消去します。"</string>
+    <string name="pref_privacy_clear_cookies">"Cookieデータを全消去"</string>
+    <string name="pref_privacy_clear_cookies_summary">"ブラウザのCookieをすべて消去します"</string>
+    <string name="pref_privacy_clear_cookies_dlg">"Cookieをすべて消去します。"</string>
+    <string name="pref_privacy_clear_history">"履歴消去"</string>
+    <string name="pref_privacy_clear_history_summary">"ブラウザの閲覧履歴を消去します"</string>
+    <string name="pref_privacy_clear_history_dlg">"ブラウザの閲覧履歴を消去します。"</string>
     <string name="pref_privacy_clear_form_data">"フォームデータをクリア"</string>
-    <string name="pref_privacy_clear_form_data_summary">"保存されているフォームデータをすべてクリア"</string>
-    <string name="pref_privacy_clear_form_data_dlg">"保存されているフォームデータをすべてクリアします。"</string>
-    <string name="pref_privacy_clear_passwords">"パスワードをクリア"</string>
-    <string name="pref_privacy_clear_passwords_summary">"保存されているパスワードをすべてクリア"</string>
-    <string name="pref_privacy_clear_passwords_dlg">"保存されているパスワードをすべてクリアします。"</string>
+    <string name="pref_privacy_clear_form_data_summary">"保存されているフォームデータをすべて消去します"</string>
+    <string name="pref_privacy_clear_form_data_dlg">"保存されているフォームデータをすべて消去します。"</string>
+    <string name="pref_privacy_clear_passwords">"パスワードを消去"</string>
+    <string name="pref_privacy_clear_passwords_summary">"保存されているパスワードをすべて消去します"</string>
+    <string name="pref_privacy_clear_passwords_dlg">"保存されているパスワードをすべて消去します。"</string>
     <string name="pref_security_title">"セキュリティ設定"</string>
     <string name="pref_security_remember_passwords">"パスワードを保存"</string>
-    <string name="pref_security_remember_passwords_summary">"ウェブサイト用のユーザー名とパスワードを保存"</string>
+    <string name="pref_security_remember_passwords_summary">"ウェブサイトのユーザー名とパスワードを保存します"</string>
     <string name="pref_security_save_form_data">"フォームデータを保存"</string>
-    <string name="pref_security_save_form_data_summary">"フォームに入力したデータを保存して後で再利用する"</string>
+    <string name="pref_security_save_form_data_summary">"フォームに入力したデータを保存して後で再利用します"</string>
     <string name="pref_security_show_security_warning">"セキュリティ警告を表示"</string>
     <string name="pref_security_show_security_warning_summary">"サイトの安全性に問題がある場合に警告を表示"</string>
     <string name="pref_security_accept_cookies">"Cookieの受け入れ"</string>
@@ -157,18 +153,18 @@
     <item>"大"</item>
     <item>"最大"</item>
   </string-array>
-    <string name="pref_text_size_dialogtitle">"テキストサイズ"</string>
+    <string name="pref_text_size_dialogtitle">"文字サイズ"</string>
     <string name="pref_extras_title">"詳細な設定"</string>
-    <string name="pref_extras_gears_enable">"Gearsを有効化"</string>
-    <string name="pref_extras_gears_enable_summary">"ブラウザの機能を拡張するアプリケーション"</string>
+    <string name="pref_extras_gears_enable">"Gears有効"</string>
+    <string name="pref_extras_gears_enable_summary">"ブラウザの機能を拡張するアプリケーションです"</string>
     <string name="pref_extras_gears_settings">"Gears設定"</string>
     <string name="pref_plugin_installed">"プラグインリスト"</string>
-    <string name="pref_plugin_installed_empty_list">"プラグインがインストールされていません。"</string>
+    <string name="pref_plugin_installed_empty_list">"プラグインはインストールされていません。"</string>
     <string name="pref_extras_gears_settings_summary">"ブラウザの機能を拡張するアプリケーション"</string>
-    <string name="pref_extras_reset_default">"設定のリセット"</string>
-    <string name="pref_extras_reset_default_summary">"全ブラウザデータをクリアし、設定をすべてデフォルトに戻す"</string>
-    <string name="pref_extras_reset_default_dlg">"全ブラウザデータをクリアし、設定をデフォルト値に戻します。"</string>
-    <string name="pref_extras_reset_default_dlg_title">"設定をリセット"</string>
+    <string name="pref_extras_reset_default">"初期設定にリセット"</string>
+    <string name="pref_extras_reset_default_summary">"ブラウザデータを消去して初期設定に戻します"</string>
+    <string name="pref_extras_reset_default_dlg">"ブラウザデータをすべて消去して初期設定に戻します。"</string>
+    <string name="pref_extras_reset_default_dlg_title">"初期設定にリセット"</string>
     <string name="pref_development_title">"デバッグ"</string>
     <string name="pref_development_viewport">"Use wide viewport"</string>
     <string name="pref_development_single_column_rendering">"Single column rendering"</string>
@@ -205,13 +201,12 @@
     <string name="browserFrameFormResubmitMessage">"表示しようとしているページには、送信済みのデータ (「POSTDATA」) があります。データを再送すると、以前このページのフォームで実行した操作 (検索やオンライン購入など) が繰り返されます。"</string>
     <string name="loadSuspendedTitle">"ネットワークに接続していません"</string>
     <string name="loadSuspended">"再接続時にロードを続行します。"</string>
-    <string name="clear_history">"履歴をクリア"</string>
+    <string name="clear_history">"履歴消去"</string>
     <string name="browser_history">"最近閲覧したページ"</string>
     <string name="empty_history">"ブラウザ履歴はありません。"</string>
-    <string name="add_new_bookmark">"新しいブックマーク"</string>
+    <string name="add_new_bookmark">"ブックマークを追加..."</string>
     <string name="no_database">"データベースがありません。"</string>
     <string name="search_hint">"ウェブアドレスを入力してください"</string>
-    <string name="search">"検索"</string>
     <string name="search_button_text">"移動"</string>
     <string name="attention">"注意"</string>
     <string name="popup_window_attempt">"このサイトはポップアップウィンドウを開こうとしています。"</string>
@@ -224,23 +219,24 @@
     <string name="download_title">"ダウンロード履歴"</string>
     <string name="download_unknown_filename">"&lt;不明&gt;"</string>
     <string name="download_menu_open">"開く"</string>
-    <string name="download_menu_clear">"リストからクリア"</string>
+    <string name="download_menu_clear">"リストから消去"</string>
     <string name="download_menu_cancel">"ダウンロードをキャンセル"</string>
     <string name="download_menu_cancel_all">"全ダウンロードをキャンセル"</string>
-    <string name="download_menu_clear_all">"リストをクリア"</string>
-    <string name="download_clear_dlg_title">"クリア"</string>
-    <string name="download_clear_dlg_msg">"リストの項目をすべてクリアし、ブラウザのキャッシュから削除します。"</string>
+    <string name="download_menu_clear_all">"リストを消去"</string>
+    <string name="download_clear_dlg_title">"消去"</string>
+    <string name="download_clear_dlg_msg">"リストの項目をすべて消去し、ブラウザのキャッシュから削除します。"</string>
     <string name="download_cancel_dlg_title">"ダウンロードをキャンセル"</string>
-    <string name="download_cancel_dlg_msg">"全<xliff:g id="DOWNLOAD_COUNT">%d</xliff:g>件のダウンロードをキャンセルし、ダウンロード履歴からクリアします。"</string>
+    <string name="download_cancel_dlg_msg">"全<xliff:g id="DOWNLOAD_COUNT">%d</xliff:g>件のダウンロードをキャンセルし、ダウンロード履歴から消去します。"</string>
     <string name="download_file_error_dlg_title">"容量不足です"</string>
-    <string name="download_file_error_dlg_msg">"<xliff:g id="FILENAME">%s</xliff:g>をダウンロードできませんでした。"\n"携帯電話の空き領域を増やしてもう一度試してください。"</string>
+    <string name="download_file_error_dlg_msg">"<xliff:g id="FILENAME">%s</xliff:g>をダウンロードできませんでした。"\n"端末の空き領域を増やしてからやり直してください。"</string>
     <string name="download_failed_generic_dlg_title">"ダウンロードに失敗しました"</string>
     <string name="download_no_sdcard_dlg_title">"SDカードがありません"</string>
     <string name="download_no_sdcard_dlg_msg">"<xliff:g id="FILENAME">%s</xliff:g>をダウンロードするにはSDカードが必要です。"</string>
     <string name="download_sdcard_busy_dlg_title">"SDカードは利用できません"</string>
-    <string name="download_sdcard_busy_dlg_msg">"SDカードはビジーです。ダウンロードできるようにするには、[ホーム]&gt;[設定]&gt;[SDカードと携帯電話のメモリ]の順に選択して[USBメモリに使用]をオフにします。"</string>
-    <string name="download_no_application">"このファイルを開けるアプリケーションがありません。"</string>
-    <string name="retry">"再試行"</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
+    <string name="download_no_application">"このファイルを開くアプリケーションがありません。"</string>
+    <string name="retry">"やり直す"</string>
     <string name="no_downloads">"ダウンロード履歴はありません。"</string>
     <string name="download_error">"ダウンロードできませんでした。"</string>
     <string name="download_success">"<xliff:g id="FILE">%s</xliff:g>のダウンロードが終了しました。"</string>
@@ -254,50 +250,68 @@
     <string name="download_length_required">"項目のサイズを特定できないため、ダウンロードできません。"</string>
     <string name="download_precondition_failed">"ダウンロードが中断されました。再開できません。"</string>
     <string name="activity_instrumentation_test_runner">"Browser Test Runner"</string>
-  <string-array name="bookmarks">
-    <item>"Google"</item>
-    <item>"http://www.google.com/"</item>
-    <item>"Yahoo!"</item>
-    <item>"http://www.yahoo.com/"</item>
-    <item>"MSN"</item>
-    <item>"http://www.msn.com/"</item>
-    <item>"MySpace"</item>
-    <item>"http://www.myspace.com/"</item>
-    <item>"Facebook"</item>
-    <item>"http://www.facebook.com/"</item>
-    <item>"ウィキペディア"</item>
-    <item>"http://www.wikipedia.org/"</item>
-    <item>"eBay"</item>
-    <item>"http://www.ebay.com/"</item>
-    <item>"CNN"</item>
-    <item>"http://www.cnn.com/"</item>
-    <item>"New York Times"</item>
-    <item>"http://www.nytimes.com/"</item>
-    <item>"ESPN"</item>
-    <item>"http://espn.go.com/"</item>
-    <item>"Amazon"</item>
-    <item>"http://www.amazon.com/"</item>
-    <item>"Weather Channel"</item>
-    <item>"http://www.weather.com/"</item>
-    <item>"BBC"</item>
-    <item>"http://www.bbc.co.uk/"</item>
-  </string-array>
+    <string name="search_google">"Google検索"</string>
     <string name="permlab_readHistoryBookmarks">"ブラウザの履歴とブックマークの読み取り"</string>
     <string name="permdesc_readHistoryBookmarks">"ブラウザでアクセスしたすべてのURLとブックマークの読み取りをアプリケーションに許可します。"</string>
     <string name="permlab_writeHistoryBookmarks">"ブラウザの履歴とブックマークの書き込み"</string>
     <string name="permdesc_writeHistoryBookmarks">"携帯電話に保存されたブラウザの履歴やブックマークの変更をアプリケーションに許可します。これにより悪意のあるアプリケーションが、ブラウザのデータを消去または変更する恐れがあります。"</string>
-    <string name="query_data_message">"下記のウェブサイトがGearsを使用してコンピュータに情報を保存しようとしています。"</string>
-    <string name="location_message">"下記のウェブサイトがGearsを使用して、現在地に関する情報にアクセスしようとしています。"</string>
-    <string name="shortcut_message">"このウェブサイトはコンピュータ上にショートカットを作成しようとしています。作成を許可しますか?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"Gearsを使用しようとしたサイトに許可した権限は、以下の表のとおりです。"</string>
-    <string name="filepicker_message">"Gears File Picker"</string>
-    <string name="image_message">"選択した画像"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"Gears設定"</string>
     <string name="privacy_policy">"サイトのプライバシーポリシーを読んで、現在地の情報がどのように使用されるのか確認してください。"</string>
-    <string name="permission_button_alwaysdeny">"このサイトを常に拒否する"</string>
-    <string name="permission_button_allow">"許可"</string>
-    <string name="permission_button_deny">"拒否"</string>
-    <string name="shortcut_button_alwaysdeny">"このショートカットを常に拒否する"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"OK"</string>
     <string name="shortcut_button_deny">"キャンセル"</string>
     <string name="settings_button_allow">"適用"</string>
@@ -314,4 +328,5 @@
     <string name="denied">"拒否されました"</string>
     <string name="unrecognized_dialog_message">"不明な種類のダイアログです"</string>
     <string name="default_button">"OK"</string>
+    <string name="zoom_overview_button_text">"全体表示"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
new file mode 100644
index 0000000..d85caee
--- /dev/null
+++ b/res/values-ko/strings.xml
@@ -0,0 +1,332 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name">"브라우저"</string>
+    <string name="tab_bookmarks">"북마크"</string>
+    <string name="tab_most_visited">"최다 방문 웹사이트"</string>
+    <string name="tab_history">"기록"</string>
+    <string name="added_to_bookmarks">"북마크에 추가되었습니다."</string>
+    <string name="removed_from_bookmarks">"북마크에서 삭제"</string>
+    <string name="sign_in_to">"<xliff:g id="HOSTNAME">%s1</xliff:g> \'<xliff:g id="REALM">%s2</xliff:g>\'에 로그인"</string>
+    <string name="username">"이름"</string>
+    <string name="password">"비밀번호"</string>
+    <string name="action">"로그인"</string>
+    <string name="cancel">"취소"</string>
+    <string name="ok">"확인"</string>
+    <string name="matches_found">" 개 일치"</string>
+    <string name="zero">"없음"</string>
+    <string name="page_info">"페이지 정보"</string>
+    <string name="page_info_view">"페이지 정보 보기"</string>
+    <string name="page_info_address">"주소:"</string>
+    <string name="ssl_warnings_header">"사이트의 보안 인증서에 문제가 있습니다."</string>
+    <string name="ssl_continue">"계속"</string>
+    <string name="security_warning">"보안 경고"</string>
+    <string name="view_certificate">"인증서 보기"</string>
+    <string name="ssl_untrusted">"신뢰된 인증기관에서 발급된 인증서가 아닙니다."</string>
+    <string name="ssl_mismatch">"사이트의 이름이 인증서에 있는 이름과 일치하지 않습니다."</string>
+    <string name="ssl_expired">"만료된 인증서입니다."</string>
+    <string name="ssl_not_yet_valid">"아직 유효하지 않은 인증서입니다."</string>
+    <string name="ssl_certificate">"보안 인증서"</string>
+    <string name="ssl_certificate_is_valid">"유효한 인증서입니다."</string>
+    <string name="issued_to">"발급 대상:"</string>
+    <string name="common_name">"일반 이름:"</string>
+    <string name="org_name">"조직:"</string>
+    <string name="org_unit">"조직 구성 단위:"</string>
+    <string name="issued_by">"발급자:"</string>
+    <string name="validity_period">"유효성:"</string>
+    <string name="issued_on">"발급일:"</string>
+    <string name="expires_on">"만료일:"</string>
+    <string name="retrieving_creds_dlg_msg">"로그인 세부정보를 가져오는 중..."</string>
+    <string name="stopping">"중지하는 중..."</string>
+    <string name="stop">"중지"</string>
+    <string name="reload">"새로고침"</string>
+    <string name="forward">"앞으로"</string>
+    <string name="save">"확인"</string>
+    <string name="do_not_save">"취소"</string>
+    <string name="location">"위치"</string>
+    <string name="name">"이름"</string>
+    <string name="http">"http://"</string>
+    <string name="save_to_bookmarks">"북마크"</string>
+    <string name="edit_bookmark">"북마크 수정"</string>
+    <string name="create_shortcut_bookmark">"홈에 바로가기 추가"</string>
+    <string name="open_bookmark">"열기"</string>
+    <string name="remove_bookmark">"북마크 삭제"</string>
+    <string name="remove_history_item">"기록에서 제거"</string>
+    <string name="bookmark_saved">"북마크에 저장되었습니다."</string>
+    <string name="bookmark_needs_title">"북마크에는 이름이 있어야 합니다."</string>
+    <string name="bookmark_needs_url">"북마크에는 위치가 있어야 합니다."</string>
+    <string name="empty_bookmark">"빈 북마크는 만들 수 없습니다."</string>
+    <string name="bookmark_url_not_valid">"URL이 올바르지 않습니다."</string>
+    <string name="delete_bookmark">"삭제"</string>
+    <string name="bookmark_page">"마지막으로 본 페이지를 북마크 설정"</string>
+    <string name="current_page">"북마크할 페이지 "</string>
+    <string name="delete_bookmark_warning">"\'<xliff:g id="BOOKMARK">%s</xliff:g>\' 북마크가 삭제됩니다."</string>
+    <string name="open_in_new_window">"새 창에서 열기"</string>
+    <string name="new_window">"새 창"</string>
+    <string name="goto_dot">"실행"</string>
+    <string name="find_dot">"검색 페이지"</string>
+    <string name="select_dot">"텍스트 선택"</string>
+    <string name="view_tabs">"창 세부정보"</string>
+    <string name="view_tabs_condensed">"Windows"</string>
+    <string name="tab_picker_title">"현재 창"</string>
+    <string name="tab_picker_view_tab">"보기"</string>
+    <string name="tab_picker_new_tab">"새 창"</string>
+    <string name="tab_picker_remove_tab">"닫기"</string>
+    <string name="tab_picker_bookmark">"북마크"</string>
+    <string name="tab_picker_send_url">"링크 공유"</string>
+    <string name="bookmarks">"북마크"</string>
+    <string name="shortcut_bookmark">"북마크"</string>
+    <string name="history">"기록"</string>
+    <string name="menu_view_download">"다운로드"</string>
+    <string name="share_page">"페이지 공유"</string>
+    <string name="contextmenu_openlink">"열기"</string>
+    <string name="contextmenu_openlink_newwindow">"새 창에서 열기"</string>
+    <string name="contextmenu_bookmark_thislink">"북마크 링크"</string>
+    <string name="contextmenu_savelink">"링크 저장"</string>
+    <string name="contextmenu_sharelink">"링크 공유"</string>
+    <string name="contextmenu_copy">"복사"</string>
+    <string name="contextmenu_copylink">"링크 URL 복사"</string>
+    <string name="contextmenu_download_image">"이미지 저장"</string>
+    <string name="contextmenu_view_image">"이미지 보기"</string>
+    <string name="contextmenu_dial_dot">"전화 걸기..."</string>
+    <string name="contextmenu_add_contact">"연락처 추가"</string>
+    <string name="contextmenu_send_mail">"이메일 보내기"</string>
+    <string name="contextmenu_map">"지도"</string>
+    <string name="clear">"지우기"</string>
+    <string name="replace">"기존 URL"</string>
+    <string name="browser_bookmarks_page_bookmarks_text">"북마크"</string>
+    <string name="menu_preferences">"설정"</string>
+    <string name="pref_content_title">"페이지 내용 설정"</string>
+    <string name="pref_content_load_images">"이미지 로드"</string>
+    <string name="pref_content_load_images_summary">"웹페이지에 이미지 표시"</string>
+    <string name="pref_content_block_popups">"팝업 창 차단"</string>
+    <string name="pref_content_javascript">"자바스크립트 활성화"</string>
+    <string name="pref_content_open_in_background">"배경에서 열기"</string>
+    <string name="pref_content_open_in_background_summary">"새 창이 현재 창 뒤쪽에 열립니다."</string>
+    <string name="pref_content_homepage">"홈페이지 설정"</string>
+    <string name="pref_content_autofit">"페이지 자동 맞춤"</string>
+    <string name="pref_content_autofit_summary">"화면에 맞게 웹페이지의 형식 조정"</string>
+    <string name="pref_privacy_title">"개인정보보호 설정"</string>
+    <string name="pref_privacy_clear_cache">"캐시 지우기"</string>
+    <string name="pref_privacy_clear_cache_summary">"캐시된 모든 페이지 콘텐츠 삭제"</string>
+    <string name="pref_privacy_clear_cache_dlg">"캐시가 지워집니다."</string>
+    <string name="pref_privacy_clear_cookies">"모든 쿠키 데이터 지우기"</string>
+    <string name="pref_privacy_clear_cookies_summary">"모든 브라우저 쿠키 지우기"</string>
+    <string name="pref_privacy_clear_cookies_dlg">"모든 쿠키가 지워집니다."</string>
+    <string name="pref_privacy_clear_history">"기록 지우기"</string>
+    <string name="pref_privacy_clear_history_summary">"브라우저 탐색 기록 지우기"</string>
+    <string name="pref_privacy_clear_history_dlg">"브라우저 탐색 기록이 지워집니다."</string>
+    <string name="pref_privacy_clear_form_data">"양식 데이터 지우기"</string>
+    <string name="pref_privacy_clear_form_data_summary">"저장된 양식 데이터 모두 지우기"</string>
+    <string name="pref_privacy_clear_form_data_dlg">"저장된 양식 데이터가 모두 지워집니다."</string>
+    <string name="pref_privacy_clear_passwords">"비밀번호 지우기"</string>
+    <string name="pref_privacy_clear_passwords_summary">"저장된 비밀번호 모두 지우기"</string>
+    <string name="pref_privacy_clear_passwords_dlg">"저장된 비밀번호가 모두 지워집니다."</string>
+    <string name="pref_security_title">"보안 설정"</string>
+    <string name="pref_security_remember_passwords">"비밀번호 기억"</string>
+    <string name="pref_security_remember_passwords_summary">"웹사이트의 사용자 이름과 비밀번호 저장"</string>
+    <string name="pref_security_save_form_data">"양식 데이터 기억"</string>
+    <string name="pref_security_save_form_data_summary">"나중에 사용할 수 있도록 양식에 입력한 데이터 기억"</string>
+    <string name="pref_security_show_security_warning">"보안 경고 표시"</string>
+    <string name="pref_security_show_security_warning_summary">"사이트의 보안에 문제가 있는 경우 경고 표시"</string>
+    <string name="pref_security_accept_cookies">"쿠키 허용"</string>
+    <string name="pref_security_accept_cookies_summary">"사이트에서 \'쿠키\' 데이터를 저장하고 읽을 수 있도록 허용"</string>
+    <string name="pref_text_size">"텍스트 크기 설정"</string>
+  <string-array name="pref_text_size_choices">
+    <item>"매우 작게"</item>
+    <item>"작게"</item>
+    <item>"보통"</item>
+    <item>"크게"</item>
+    <item>"매우 크게"</item>
+  </string-array>
+    <string name="pref_text_size_dialogtitle">"텍스트 크기"</string>
+    <string name="pref_extras_title">"고급 설정"</string>
+    <string name="pref_extras_gears_enable">"Gears 활성화"</string>
+    <string name="pref_extras_gears_enable_summary">"브라우저 기능을 확장하는 응용프로그램"</string>
+    <string name="pref_extras_gears_settings">"Gears 설정"</string>
+    <string name="pref_plugin_installed">"플러그인 목록"</string>
+    <string name="pref_plugin_installed_empty_list">"설치된 플러그인이 없습니다."</string>
+    <string name="pref_extras_gears_settings_summary">"브라우저 기능을 확장하는 응용프로그램"</string>
+    <string name="pref_extras_reset_default">"기본값으로 재설정"</string>
+    <string name="pref_extras_reset_default_summary">"모든 브라우저 데이터를 지우고 모든 설정을 기본값으로 재설정"</string>
+    <string name="pref_extras_reset_default_dlg">"모든 브라우저 데이터가 지워지고 설정이 기본값으로 돌아갑니다."</string>
+    <string name="pref_extras_reset_default_dlg_title">"기본값으로 재설정"</string>
+    <string name="pref_development_title">"디버그"</string>
+    <string name="pref_development_viewport">"Use wide viewport"</string>
+    <string name="pref_development_single_column_rendering">"Single column rendering"</string>
+    <string name="pref_development_normal_rendering">"Normal rendering"</string>
+    <string name="pref_development_trace">"Enable tracing"</string>
+    <string name="pref_development_nav_dump">"Enable nav cache dump"</string>
+    <string name="pref_development_search_url">"검색 URL 설정"</string>
+    <string name="pref_development_uastring">"UAString"</string>
+  <string-array name="pref_development_ua_choices">
+    <item>"Android"</item>
+    <item>"Desktop"</item>
+    <item>"iPhone"</item>
+  </string-array>
+  <string-array name="pref_development_ua_values">
+    <item>"0"</item>
+    <item>"1"</item>
+    <item>"2"</item>
+  </string-array>
+    <string name="pref_default_text_encoding">"텍스트 인코딩 설정"</string>
+  <string-array name="pref_default_text_encoding_choices">
+    <item>"라틴어-1(ISO-8859-1)"</item>
+    <item>"유니코드(UTF-8)"</item>
+    <item>"일본어(ISO-2022-JP)"</item>
+    <item>"일본어(SHIFT_JIS)"</item>
+    <item>"일본어(EUC-JP)"</item>
+  </string-array>
+    <string name="pref_default_text_encoding_dialogtitle">"텍스트 인코딩"</string>
+    <string name="pref_default_text_encoding_default">"라틴어-1"</string>
+    <string name="browserFrameRedirect">"리디렉션"</string>
+    <string name="browserFrame307Post">"웹페이지가 리디렉션됩니다. 입력한 양식 데이터를 새 위치로 다시 보내시겠습니까?"</string>
+    <string name="browserFrameNetworkErrorLabel">"데이터 연결 문제"</string>
+    <string name="browserFrameFileErrorLabel">"파일 문제 발생"</string>
+    <string name="browserFrameFormResubmitLabel">"확인"</string>
+    <string name="browserFrameFormResubmitMessage">"보려는 페이지에 이미 제출된 데이터(\'POSTDATA\')가 포함되어 있습니다. 데이터를 다시 보내면 페이지의 양식에서 수행한 작업(예: 검색 또는 온라인 구매)이 반복됩니다."</string>
+    <string name="loadSuspendedTitle">"네트워크 연결 없음"</string>
+    <string name="loadSuspended">"연결이 복원된 후에 페이지 로드가 계속됩니다."</string>
+    <string name="clear_history">"기록 지우기"</string>
+    <string name="browser_history">"최근에 방문한 페이지"</string>
+    <string name="empty_history">"브라우저 기록이 비어 있습니다."</string>
+    <string name="add_new_bookmark">"북마크에 추가..."</string>
+    <string name="no_database">"데이터베이스 없음"</string>
+    <string name="search_hint">"웹 주소 입력"</string>
+    <string name="search_button_text">"이동"</string>
+    <string name="attention">"주의"</string>
+    <string name="popup_window_attempt">"사이트에서 팝업 창을 열려고 합니다."</string>
+    <string name="allow">"허용"</string>
+    <string name="block">"차단"</string>
+    <string name="too_many_windows_dialog_title">"창 개수 제한에 도달했습니다."</string>
+    <string name="too_many_windows_dialog_message">"이미 최대 개수의 창을 열었기 때문에 새 창을 열 수 없습니다."</string>
+    <string name="too_many_subwindows_dialog_title">"팝업이 이미 열려 있습니다."</string>
+    <string name="too_many_subwindows_dialog_message">"팝업 창은 하나만 열 수 있기 때문에 새 팝업 창을 열 수 없습니다."</string>
+    <string name="download_title">"다운로드 기록"</string>
+    <string name="download_unknown_filename">"&lt;알 수 없음&gt;"</string>
+    <string name="download_menu_open">"열기"</string>
+    <string name="download_menu_clear">"목록에서 지우기"</string>
+    <string name="download_menu_cancel">"다운로드 취소"</string>
+    <string name="download_menu_cancel_all">"모든 다운로드 취소"</string>
+    <string name="download_menu_clear_all">"목록 지우기"</string>
+    <string name="download_clear_dlg_title">"지우기"</string>
+    <string name="download_clear_dlg_msg">"목록에서 모든 항목이 지워지고 브라우저 캐시에서 제거됩니다."</string>
+    <string name="download_cancel_dlg_title">"다운로드 취소"</string>
+    <string name="download_cancel_dlg_msg">"<xliff:g id="DOWNLOAD_COUNT">%d</xliff:g>개의 다운로드가 모두 취소되고 다운로드 기록에서 지워집니다."</string>
+    <string name="download_file_error_dlg_title">"공간 부족"</string>
+    <string name="download_file_error_dlg_msg">"<xliff:g id="FILENAME">%s</xliff:g>을(를) 다운로드하지 못했습니다."\n"전화기에서 여유 공간을 늘린 후에 다시 시도하세요."</string>
+    <string name="download_failed_generic_dlg_title">"다운로드 실패"</string>
+    <string name="download_no_sdcard_dlg_title">"SD 카드 없음"</string>
+    <string name="download_no_sdcard_dlg_msg">"<xliff:g id="FILENAME">%s</xliff:g>을(를) 다운로드하려면 SD 카드가 필요합니다."</string>
+    <string name="download_sdcard_busy_dlg_title">"SD 카드를 사용할 수 없음"</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
+    <string name="download_no_application">"파일을 열 수 있는 응용프로그램이 없습니다."</string>
+    <string name="retry">"다시 시도"</string>
+    <string name="no_downloads">"다운로드 기록이 비어 있습니다."</string>
+    <string name="download_error">"다운로드 실패"</string>
+    <string name="download_success">"<xliff:g id="FILE">%s</xliff:g> 다운로드 완료"</string>
+    <string name="download_running">"다운로드 중..."</string>
+    <string name="download_pending">"다운로드 시작 중..."</string>
+    <string name="download_pending_network">"데이터 연결을 기다리는 중..."</string>
+    <string name="download_running_paused">"데이터 연결을 기다리는 중..."</string>
+    <string name="download_canceled">"다운로드가 취소되었습니다."</string>
+    <string name="download_not_acceptable">"다운로드할 수 없습니다. 전화기에서 지원하지 않는 콘텐츠입니다."</string>
+    <string name="download_file_error">"공간이 부족하여 다운로드를 완료할 수 없습니다."</string>
+    <string name="download_length_required">"항목의 크기를 확인할 수 없으므로 다운로드할 수 없습니다."</string>
+    <string name="download_precondition_failed">"다운로드 중단됨. 다시 시작할 수 없습니다."</string>
+    <string name="activity_instrumentation_test_runner">"브라우저 테스트 실행기"</string>
+    <string name="search_google">"Google 검색"</string>
+    <string name="permlab_readHistoryBookmarks">"브라우저의 기록 및 북마크 읽기"</string>
+    <string name="permdesc_readHistoryBookmarks">"응용프로그램이 브라우저에서 방문한 모든 URL과 브라우저의 북마크를 모두 읽을 수 있습니다."</string>
+    <string name="permlab_writeHistoryBookmarks">"브라우저의 기록 및 북마크 쓰기"</string>
+    <string name="permdesc_writeHistoryBookmarks">"응용프로그램이 전화기에 저장된 브라우저의 기록 또는 북마크를 수정할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 브라우저의 데이터를 지우거나 수정할 수 있습니다."</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
+    <string name="settings_message">"아래 표는 Gears를 사용하려고 시도한 각 사이트에 부여한 권한을 보여줍니다."</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
+    <string name="settings_title">"Gears 설정"</string>
+    <string name="privacy_policy">"위치가 어떻게 사용되는지 보려면 사이트의 개인정보 보호정책을 읽어보세요."</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
+    <string name="shortcut_button_allow">"확인"</string>
+    <string name="shortcut_button_deny">"취소"</string>
+    <string name="settings_button_allow">"적용"</string>
+    <string name="settings_button_deny">"취소"</string>
+    <string name="filepicker_button_allow">"확인"</string>
+    <string name="filepicker_button_deny">"취소"</string>
+    <string name="filepicker_path">"경로:"</string>
+    <string name="filepicker_no_files_selected">"선택한 파일이 없습니다."</string>
+    <string name="filepicker_one_file_selected">"1개 파일 선택됨"</string>
+    <string name="filepicker_some_files_selected">"개 파일 선택됨"</string>
+    <string name="remove">"제거"</string>
+    <string name="local_storage">"로컬 저장공간"</string>
+    <string name="allowed">"허용됨"</string>
+    <string name="denied">"거부됨"</string>
+    <string name="unrecognized_dialog_message">"인식할 수 없는 대화상자 유형"</string>
+    <string name="default_button">"확인"</string>
+    <string name="zoom_overview_button_text">"전체보기"</string>
+</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
new file mode 100644
index 0000000..3c149fb
--- /dev/null
+++ b/res/values-nb/strings.xml
@@ -0,0 +1,324 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name">"Nettleser"</string>
+    <string name="tab_bookmarks">"Bokmerker"</string>
+    <string name="tab_most_visited">"Mest besøkt"</string>
+    <string name="tab_history">"Historie"</string>
+    <string name="added_to_bookmarks">"Lagt til bokmerker"</string>
+    <string name="removed_from_bookmarks">"Fjernet fra bokmerker"</string>
+    <string name="sign_in_to">"Logg inn på <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+    <string name="username">"Brukernavn"</string>
+    <string name="password">"Passord"</string>
+    <string name="action">"Logg inn"</string>
+    <string name="cancel">"Avbryt"</string>
+    <string name="ok">"OK"</string>
+    <string name="matches_found">" treff"</string>
+    <string name="zero">"Ingen"</string>
+    <string name="page_info">"Sideinformasjon"</string>
+    <string name="page_info_view">"Vis sideinformasjon"</string>
+    <string name="page_info_address">"Adresse:"</string>
+    <string name="ssl_warnings_header">"Det er problemer med sertifikatet for denne siden."</string>
+    <string name="ssl_continue">"Fortsett"</string>
+    <string name="security_warning">"Sikkerhetsadvarsel"</string>
+    <string name="view_certificate">"Se på sertifikat"</string>
+    <string name="ssl_untrusted">"Dette sertifikatet er ikke fra en autoritet du stoler på."</string>
+    <string name="ssl_mismatch">"Navnet på siden stemmer ikke med navnet på sertifikatet."</string>
+    <string name="ssl_expired">"Sertifikatet har gått ut."</string>
+    <string name="ssl_not_yet_valid">"Sertifikatet er ikke gyldig ennå."</string>
+    <string name="ssl_certificate">"Sikkerhetssertifikat"</string>
+    <string name="ssl_certificate_is_valid">"Sertifikatet er gyldig."</string>
+    <string name="issued_to">"Utstedt til:"</string>
+    <string name="common_name">"Navn:"</string>
+    <string name="org_name">"Organisasjon:"</string>
+    <string name="org_unit">"Organisasjonsenhet:"</string>
+    <string name="issued_by">"Utstedt av:"</string>
+    <string name="validity_period">"Gyldighet:"</string>
+    <string name="issued_on">"Utstedt:"</string>
+    <string name="expires_on">"Går ut:"</string>
+    <string name="retrieving_creds_dlg_msg">"Henter innloggingsinformasjon…"</string>
+    <string name="stopping">"Avbryter…"</string>
+    <string name="stop">"Avbryt"</string>
+    <string name="reload">"Last på nytt"</string>
+    <string name="forward">"Forover"</string>
+    <string name="save">"OK"</string>
+    <string name="do_not_save">"Avbryt"</string>
+    <string name="location">"Adresse"</string>
+    <string name="name">"Navn"</string>
+    <string name="http">"http://"</string>
+    <string name="save_to_bookmarks">"Bokmerke"</string>
+    <string name="edit_bookmark">"Rediger bokmerke"</string>
+    <string name="create_shortcut_bookmark">"Lag snarvei på skrivebordet"</string>
+    <string name="open_bookmark">"Åpne"</string>
+    <string name="remove_bookmark">"Slett bokmerke"</string>
+    <string name="remove_history_item">"Fjern fra loggen"</string>
+    <string name="bookmark_saved">"Bokmerke lagret."</string>
+    <string name="bookmark_needs_title">"Bokmerket må ha et navn."</string>
+    <string name="bookmark_needs_url">"Bokmerket må ha en adresse."</string>
+    <string name="empty_bookmark">"Kan ikke lage tomt bokmerke."</string>
+    <string name="bookmark_url_not_valid">"Adressen er ikke gyldig."</string>
+    <string name="delete_bookmark">"Slett"</string>
+    <string name="bookmark_page">"Legg til bokmerke for sist sette side"</string>
+    <string name="current_page">"Gjeldende side: "</string>
+    <string name="delete_bookmark_warning">"Bokmerket \"<xliff:g id="BOOKMARK">%s</xliff:g>\" vil bli slettet."</string>
+    <string name="open_in_new_window">"Åpne i nytt vindu"</string>
+    <string name="new_window">"Nytt vindu"</string>
+    <string name="goto_dot">"Gå til URL"</string>
+    <string name="find_dot">"Finn på siden"</string>
+    <string name="select_dot">"Velg tekst"</string>
+    <string name="view_tabs">"Vindusoversikt"</string>
+    <string name="view_tabs_condensed">"Vinduer"</string>
+    <string name="tab_picker_title">"Gjeldende vinduer"</string>
+    <string name="tab_picker_view_tab">"Vis"</string>
+    <string name="tab_picker_new_tab">"Nytt vindu"</string>
+    <string name="tab_picker_remove_tab">"Lukk"</string>
+    <string name="tab_picker_bookmark">"Legg til bokmerke"</string>
+    <string name="tab_picker_send_url">"Del lenke"</string>
+    <string name="bookmarks">"Bokmerker"</string>
+    <string name="shortcut_bookmark">"Bokmerker"</string>
+    <string name="history">"Logg"</string>
+    <string name="menu_view_download">"Nedlastinger"</string>
+    <string name="share_page">"Del side"</string>
+    <string name="contextmenu_openlink">"Åpne"</string>
+    <string name="contextmenu_openlink_newwindow">"Åpne i nytt vindu"</string>
+    <string name="contextmenu_bookmark_thislink">"Legg til lenke i bokmerker"</string>
+    <string name="contextmenu_savelink">"Lagre lenke"</string>
+    <string name="contextmenu_sharelink">"Del lenke"</string>
+    <string name="contextmenu_copy">"Kopier"</string>
+    <string name="contextmenu_copylink">"Kopier lenke-URL"</string>
+    <string name="contextmenu_download_image">"Lagre bilde"</string>
+    <string name="contextmenu_view_image">"Vis bilde"</string>
+    <string name="contextmenu_dial_dot">"Ring…"</string>
+    <string name="contextmenu_add_contact">"Legg til kontakt"</string>
+    <string name="contextmenu_send_mail">"Send e-post"</string>
+    <string name="contextmenu_map">"Kart"</string>
+    <string name="clear">"Nullstill"</string>
+    <string name="replace">"Erstatt"</string>
+    <string name="browser_bookmarks_page_bookmarks_text">"Bokmerker"</string>
+    <string name="menu_preferences">"Innstillinger"</string>
+    <string name="pref_content_title">"Sideinnhold"</string>
+    <string name="pref_content_load_images">"Last bilder"</string>
+    <string name="pref_content_load_images_summary">"Vis bilder på nettsider"</string>
+    <string name="pref_content_block_popups">"Blokker sprettoppvinduer"</string>
+    <string name="pref_content_javascript">"Slå på JavaScript"</string>
+    <string name="pref_content_open_in_background">"Åpne i bakgrunnen"</string>
+    <string name="pref_content_open_in_background_summary">"La vinduer åpnes bak dette"</string>
+    <string name="pref_content_homepage">"Sett hjemmeside"</string>
+    <string name="pref_content_autofit">"Tilpass sider"</string>
+    <string name="pref_content_autofit_summary">"Tilpass nettsider så de passer på skjermen"</string>
+    <string name="pref_privacy_title">"Personvernsinnstillinger"</string>
+    <string name="pref_privacy_clear_cache">"Nullstill hurtiglager"</string>
+    <string name="pref_privacy_clear_cache_summary">"Slett alt hurtiglagret nettinnhold"</string>
+    <string name="pref_privacy_clear_cache_dlg">"Hurtiglageret vil nullstilles."</string>
+    <string name="pref_privacy_clear_cookies">"Fjern alle informasjonskapsler"</string>
+    <string name="pref_privacy_clear_cookies_summary">"Fjern alle informasjonskapsler lagret i nettleseren"</string>
+    <string name="pref_privacy_clear_cookies_dlg">"Alle informasjonskapsler vil bli slettet."</string>
+    <string name="pref_privacy_clear_history">"Slett loggen"</string>
+    <string name="pref_privacy_clear_history_summary">"Slett navigeringsloggen"</string>
+    <string name="pref_privacy_clear_history_dlg">"Nettleserens navigeringslogg vil bli slettet."</string>
+    <string name="pref_privacy_clear_form_data">"Slett skjemadata"</string>
+    <string name="pref_privacy_clear_form_data_summary">"Slett alt lagret skjemadata"</string>
+    <string name="pref_privacy_clear_form_data_dlg">"Alt lagret skjemadata vil bli slettet."</string>
+    <string name="pref_privacy_clear_passwords">"Slett passord"</string>
+    <string name="pref_privacy_clear_passwords_summary">"Slett alle lagrede passord"</string>
+    <string name="pref_privacy_clear_passwords_dlg">"Alle lagrede passord vil bli slettet."</string>
+    <string name="pref_security_title">"Sikkerhetsinnstillinger"</string>
+    <string name="pref_security_remember_passwords">"Husk passord"</string>
+    <string name="pref_security_remember_passwords_summary">"Lagre brukernavn og passord for nettsider"</string>
+    <string name="pref_security_save_form_data">"Husk skjemadata"</string>
+    <string name="pref_security_save_form_data_summary">"Husk data skrevet inn i skjemaer til senere"</string>
+    <string name="pref_security_show_security_warning">"Vis sikkerhetsadvarsler"</string>
+    <string name="pref_security_show_security_warning_summary">"Vis advarsel hvis det er et problem med sikkerheten på en side"</string>
+    <string name="pref_security_accept_cookies">"Godta informasjonskapsler"</string>
+    <string name="pref_security_accept_cookies_summary">"Tillat nettsteder å lagre og lese informasjonskapsler"</string>
+    <string name="pref_text_size">"Sett tekststørrelse"</string>
+  <string-array name="pref_text_size_choices">
+    <item>"Bitteliten"</item>
+    <item>"Liten"</item>
+    <item>"Vanlig"</item>
+    <item>"Stor"</item>
+    <item>"Kjempestor"</item>
+  </string-array>
+    <string name="pref_text_size_dialogtitle">"Tekststørrelse"</string>
+    <string name="pref_extras_title">"Avanserte innstillinger"</string>
+    <string name="pref_extras_gears_enable">"Aktiver Gears"</string>
+    <string name="pref_extras_gears_enable_summary">"Applikasjoner som utvider nettleserfunksjonaliteten"</string>
+    <string name="pref_extras_gears_settings">"Gears-innstillinger"</string>
+    <string name="pref_plugin_installed">"Liste over utvidelser"</string>
+    <string name="pref_plugin_installed_empty_list">"Ingen installerte utvidelser."</string>
+    <string name="pref_extras_gears_settings_summary">"Applikasjoner som utvider nettleserfunksjonaliteten"</string>
+    <string name="pref_extras_reset_default">"Nullstill"</string>
+    <string name="pref_extras_reset_default_summary">"Fjern alle data fra nettleseren og nullstill alle innstillinger"</string>
+    <string name="pref_extras_reset_default_dlg">"Alle data vil bli fjernet fra nettleseren, og alle innstillinger vil bli nullstilt."</string>
+    <string name="pref_extras_reset_default_dlg_title">"Nullstill"</string>
+    <string name="pref_development_title">"Avlusing"</string>
+    <string name="pref_development_viewport">"Use wide viewport"</string>
+    <string name="pref_development_single_column_rendering">"Single column rendering"</string>
+    <string name="pref_development_normal_rendering">"Normal rendering"</string>
+    <string name="pref_development_trace">"Enable tracing"</string>
+    <string name="pref_development_nav_dump">"Enable nav cache dump"</string>
+    <string name="pref_development_search_url">"Set search URL"</string>
+    <string name="pref_development_uastring">"UAString"</string>
+  <string-array name="pref_development_ua_choices">
+    <item>"Android"</item>
+    <item>"Desktop"</item>
+    <item>"iPhone"</item>
+  </string-array>
+  <string-array name="pref_development_ua_values">
+    <item>"0"</item>
+    <item>"1"</item>
+    <item>"2"</item>
+  </string-array>
+    <string name="pref_default_text_encoding">"Velg tekstkoding"</string>
+  <string-array name="pref_default_text_encoding_choices">
+    <item>"Latin-1 (ISO-8859-1)"</item>
+    <item>"Unicode (UTF-8)"</item>
+    <item>"Japansk (ISO-2022-JP)"</item>
+    <item>"Japansk (SHIFT_JIS)"</item>
+    <item>"Japansk (EUC-JP)"</item>
+  </string-array>
+    <string name="pref_default_text_encoding_dialogtitle">"Tekstkoding"</string>
+    <string name="pref_default_text_encoding_default">"Latin-1"</string>
+    <string name="browserFrameRedirect">"Videresending"</string>
+    <string name="browserFrame307Post">"Denne nettsiden blir videresendt. Send skjemadataene videre til den nye siden?"</string>
+    <string name="browserFrameNetworkErrorLabel">"Tilkoblingsproblem"</string>
+    <string name="browserFrameFileErrorLabel">"Problem med fil"</string>
+    <string name="browserFrameFormResubmitLabel">"Bekreft"</string>
+    <string name="browserFrameFormResubmitMessage">"Siden du prøver å se, inneholder data som allerede er blitt sendt inn (\"POSTDATA\"). Hvis du sender dataene på nytt, kan det skjemaet på siden gjorde bli gjort på nytt."</string>
+    <string name="loadSuspendedTitle">"Ingen nettverkstilkobling"</string>
+    <string name="loadSuspended">"Siden vil fortsette å laste etter at tilkoblingen er blitt gjenopprettet."</string>
+    <string name="clear_history">"Slett logg"</string>
+    <string name="browser_history">"Nylig besøkte sider"</string>
+    <string name="empty_history">"Nettleserens logg er tom."</string>
+    <string name="add_new_bookmark">"Nytt bokmerke"</string>
+    <string name="no_database">"Ingen database!"</string>
+    <string name="search_hint">"Skriv inn nettadresse"</string>
+    <string name="search_button_text">"Gå"</string>
+    <string name="attention">"Obs"</string>
+    <string name="popup_window_attempt">"Denne siden prøver å åpne et sprettoppvindu."</string>
+    <string name="allow">"Tillat"</string>
+    <string name="block">"Blokker"</string>
+    <string name="too_many_windows_dialog_title">"Vindusgrense nådd"</string>
+    <string name="too_many_windows_dialog_message">"Kunne ikke åpne et nytt vindu fordi du allerede har maksialt antall åpnet."</string>
+    <string name="too_many_subwindows_dialog_title">"Sprettoppvindu allerede åpnet"</string>
+    <string name="too_many_subwindows_dialog_message">"Kunne ikke åpne et nytt sprettoppvindu, fordi det bare kan være ett åpent av gangen."</string>
+    <string name="download_title">"Nedlastingslogg"</string>
+    <string name="download_unknown_filename">"&lt;Ukjent&gt;"</string>
+    <string name="download_menu_open">"Åpne"</string>
+    <string name="download_menu_clear">"Fjern fra listen"</string>
+    <string name="download_menu_cancel">"Avbryt nedlasting"</string>
+    <string name="download_menu_cancel_all">"Avbryt alle nedlastinger"</string>
+    <string name="download_menu_clear_all">"Tøm listen"</string>
+    <string name="download_clear_dlg_title">"Tøm"</string>
+    <string name="download_clear_dlg_msg">"Alle nedlastinger vil bli fjernet fra listen samt fjernet fra nettleserens hurtiglager."</string>
+    <string name="download_cancel_dlg_title">"Avbryt nedlastinger"</string>
+    <string name="download_cancel_dlg_msg">"Alle <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> nedlastinger vil bli avbrutt og fjernet fra nedlastingsloggen."</string>
+    <string name="download_file_error_dlg_title">"Tom for plass"</string>
+    <string name="download_file_error_dlg_msg">"Kunne ikke laste ned <xliff:g id="FILENAME">%s</xliff:g>."\n"Frigjør plass på telefonen og prøv igjen."</string>
+    <string name="download_failed_generic_dlg_title">"Feil ved nedlasting"</string>
+    <string name="download_no_sdcard_dlg_title">"Mangler minnekort"</string>
+    <string name="download_no_sdcard_dlg_msg">"Du trenger et minnekort for å laste ned <xliff:g id="FILENAME">%s</xliff:g>."</string>
+    <string name="download_sdcard_busy_dlg_title">"Minnekort utilgjengelig"</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
+    <string name="download_no_application">"Fant ingen applikasjon som kunne åpne denne filen."</string>
+    <string name="retry">"Prøv igjen"</string>
+    <string name="no_downloads">"Nedlastingsloggen er tom."</string>
+    <string name="download_error">"Feil ved nedlasting."</string>
+    <string name="download_success">"<xliff:g id="FILE">%s</xliff:g> Nedlasting ferdig."</string>
+    <string name="download_running">"Laster ned…"</string>
+    <string name="download_pending">"Starter nedlasting…"</string>
+    <string name="download_pending_network">"Venter på datatilkobling…"</string>
+    <string name="download_running_paused">"Venter på datatilkobling…"</string>
+    <string name="download_canceled">"Nedlastingen ble avbrutt."</string>
+    <string name="download_not_acceptable">"Kan ikke laste ned. Innholdet er ikke støttet av telefonen."</string>
+    <string name="download_file_error">"Kan ikke fullføre nedlastingen. Det er ikke nok plass."</string>
+    <string name="download_length_required">"Kan ikke laste ned. Klarte ikke bestemme størrelsen på filen."</string>
+    <string name="download_precondition_failed">"Nedlastingen ble avbrutt. Den kan ikke fortsettes."</string>
+    <string name="activity_instrumentation_test_runner">"Browser Test Runner"</string>
+    <string name="search_google">"Søk på Google"</string>
+    <string name="permlab_readHistoryBookmarks">"read Browser\'s history and bookmarks"</string>
+    <string name="permdesc_readHistoryBookmarks">"Allows the application to read all the URLs that the Browser has visited, and all of the Browser\'s bookmarks."</string>
+    <string name="permlab_writeHistoryBookmarks">"write Browser\'s history and bookmarks"</string>
+    <string name="permdesc_writeHistoryBookmarks">"Allows an application to modify the Browser\'s history or bookmarks stored on your phone. Malicious applications can use this to erase or modify your Browser\'s data."</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <string name="query_data_message">"Nettsiden under ønsker å lagre informasjon på datamaskinen ved hjelp av Gears."</string>
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <string name="location_message">"Nettsiden under ønsker å finne ut hvor du er ved hjelp av Gears."</string>
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <string name="shortcut_message">"Denne nettsiden ønsker å lage en snarvei på datamaskinen. Ønsker du å tillate dette?"</string>
+    <string name="settings_message">"Tabellen under viser rettighetent du har gitt til hver side som har prøvd å bruke Gears."</string>
+    <string name="filepicker_message">"Gears filplukker"</string>
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
+    <string name="settings_title">"Gears-innstillinger"</string>
+    <string name="privacy_policy">"Les sidens personvernspolicy for å se hvordan informasjonen vil bli brukt."</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <string name="permission_button_alwaysdeny">"Aldri tillat for denne siden"</string>
+    <string name="permission_button_allow">"Tillat"</string>
+    <string name="permission_button_deny">"Nekt"</string>
+    <string name="shortcut_button_alwaysdeny">"Aldri tillat denne snarveien"</string>
+    <string name="shortcut_button_allow">"OK"</string>
+    <string name="shortcut_button_deny">"Avbryt"</string>
+    <string name="settings_button_allow">"Bruk"</string>
+    <string name="settings_button_deny">"Avbryt"</string>
+    <string name="filepicker_button_allow">"OK"</string>
+    <string name="filepicker_button_deny">"Avbryt"</string>
+    <string name="filepicker_path">"sti:"</string>
+    <string name="filepicker_no_files_selected">"Ingen fil valgt"</string>
+    <string name="filepicker_one_file_selected">"En fil valgt"</string>
+    <string name="filepicker_some_files_selected">"filer valgt"</string>
+    <string name="remove">"Fjern"</string>
+    <string name="local_storage">"Lokal lagring"</string>
+    <string name="allowed">"Tillatt"</string>
+    <string name="denied">"Nektet"</string>
+    <string name="unrecognized_dialog_message">"Ukjent meldingstype"</string>
+    <string name="default_button">"OK"</string>
+    <string name="zoom_overview_button_text">"Oversikt"</string>
+</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 38a4258..58b6a97 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"Browser"</string>
+    <string name="tab_bookmarks">"Bladwijzers"</string>
+    <string name="tab_most_visited">"Meest bezocht"</string>
+    <string name="tab_history">"Geschiedenis"</string>
+    <string name="added_to_bookmarks">"Toegevoegd aan bladwijzers"</string>
+    <string name="removed_from_bookmarks">"Verwijderd uit bladwijzers"</string>
     <string name="sign_in_to">"Aanmelden bij <xliff:g id="HOSTNAME">%s1</xliff:g> \'<xliff:g id="REALM">%s2</xliff:g>\'"</string>
     <string name="username">"Naam"</string>
     <string name="password">"Wachtwoord"</string>
     <string name="action">"Aanmelden"</string>
     <string name="cancel">"Annuleren"</string>
     <string name="ok">"OK"</string>
-    <string name="matches_found">"overeenkomsten"</string>
+    <string name="matches_found">" overeenkomsten"</string>
     <string name="zero">"Nee"</string>
     <string name="page_info">"Pagina-informatie"</string>
     <string name="page_info_view">"Pagina-informatie weergeven"</string>
@@ -47,12 +51,9 @@
     <string name="issued_on">"Uitgegeven op:"</string>
     <string name="expires_on">"Verloopt op:"</string>
     <string name="retrieving_creds_dlg_msg">"Aanmeldingsgegevens ophalen..."</string>
-    <string name="close">"Sluiten"</string>
-    <string name="close_window">"Dit venster wordt gesloten."</string>
     <string name="stopping">"Stoppen..."</string>
     <string name="stop">"Stoppen"</string>
     <string name="reload">"Vernieuwen"</string>
-    <string name="back">"Terug"</string>
     <string name="forward">"Volgende"</string>
     <string name="save">"OK"</string>
     <string name="do_not_save">"Annuleren"</string>
@@ -72,15 +73,13 @@
     <string name="bookmark_url_not_valid">"URL is ongeldig."</string>
     <string name="delete_bookmark">"Verwijderen"</string>
     <string name="bookmark_page">"Bladwijzer maken voor de laatst weergegeven pagina"</string>
-    <string name="current_page">"Huidige pagina:"</string>
+    <string name="current_page">"van "</string>
     <string name="delete_bookmark_warning">"Bladwijzer \'<xliff:g id="BOOKMARK">%s</xliff:g>\' wordt verwijderd."</string>
     <string name="open_in_new_window">"Openen in een nieuw venster"</string>
     <string name="new_window">"Nieuw venster"</string>
-    <string name="goto_dot">"Ga naar URL"</string>
+    <string name="goto_dot">"Ga"</string>
     <string name="find_dot">"Zoeken op pagina"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"Startpagina"</string>
+    <string name="select_dot">"Tekst selecteren"</string>
     <string name="view_tabs">"Vensteroverzicht"</string>
     <string name="view_tabs_condensed">"Windows"</string>
     <string name="tab_picker_title">"Huidige vensters"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"Bladwijzer"</string>
     <string name="history">"Geschiedenis"</string>
     <string name="menu_view_download">"Downloads"</string>
-    <string name="menu_bookmark_page">"Bladwijzerpagina"</string>
     <string name="share_page">"Pagina delen"</string>
-    <string name="menu_zoom">"Zoomen"</string>
-    <string name="menu_flip_orientation">"Stand draaien"</string>
     <string name="contextmenu_openlink">"Openen"</string>
     <string name="contextmenu_openlink_newwindow">"Openen in een nieuw venster"</string>
     <string name="contextmenu_bookmark_thislink">"Bladwijzer maken van link"</string>
@@ -202,16 +198,15 @@
     <string name="browserFrameNetworkErrorLabel">"Probleem met gegevensverbinding"</string>
     <string name="browserFrameFileErrorLabel">"Probleem met bestand"</string>
     <string name="browserFrameFormResubmitLabel">"Bevestigen"</string>
-    <string name="browserFrameFormResubmitMessage">"De pagina die u probeert te openen, bevat gegevens die al verzonden zijn (\'POSTDATA\'). Als u de gegevens opnieuw verzendt, wordt elke actie herhaald die het formulier op de pagina heeft uitgevoerd (zoals een zoekopdracht of online aankoop)."</string>
+    <string name="browserFrameFormResubmitMessage">"De pagina die u probeert te openen, bevat gegevens die al verzonden zijn (\'POSTDATA\'). Als u de gegevens opnieuw verzendt, wordt elke actie herhaald die het formulier op de pagina heeft uitgevoerd (zoals een zoekopdracht of online aanschaf)."</string>
     <string name="loadSuspendedTitle">"Geen netwerkverbinding"</string>
     <string name="loadSuspended">"De pagina wordt verder geladen zodra de verbinding is hersteld."</string>
     <string name="clear_history">"Geschiedenis wissen"</string>
     <string name="browser_history">"Onlangs bezochte pagina\'s"</string>
     <string name="empty_history">"Browsergeschiedenis is leeg."</string>
-    <string name="add_new_bookmark">"Nieuwe bladwijzer"</string>
+    <string name="add_new_bookmark">"Bladwijzer toevoegen…"</string>
     <string name="no_database">"Geen database."</string>
     <string name="search_hint">"Typ het webadres"</string>
-    <string name="search">"Zoeken"</string>
     <string name="search_button_text">"Ga"</string>
     <string name="attention">"Opgelet"</string>
     <string name="popup_window_attempt">"Deze site probeert een pop-upvenster te openen."</string>
@@ -238,7 +233,8 @@
     <string name="download_no_sdcard_dlg_title">"Geen SD-kaart"</string>
     <string name="download_no_sdcard_dlg_msg">"Een SD-kaart is vereist om <xliff:g id="FILENAME">%s</xliff:g> te kunnen downloaden."</string>
     <string name="download_sdcard_busy_dlg_title">"SD-kaart niet beschikbaar"</string>
-    <string name="download_sdcard_busy_dlg_msg">"De SD-kaart is in gebruik. Als u downloads wilt toestaan, gaat u naar de spartpagina en selecteert u \'Instellingen\' &gt; \'SD-kaart en telefoongeheugen\' en verwijdert u het vinkje uit het selectievakje \'Gebruiken voor USB-opslag\'."</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"Er is geen toepassing gevonden waarmee dit bestand kan worden geopend."</string>
     <string name="retry">"Opnieuw proberen"</string>
     <string name="no_downloads">"Downloadgeschiedenis is leeg."</string>
@@ -254,50 +250,68 @@
     <string name="download_length_required">"Kan niet downloaden. De grootte van het item kan niet worden vastgesteld."</string>
     <string name="download_precondition_failed">"Download is onderbroken. Deze kan niet worden voortgezet."</string>
     <string name="activity_instrumentation_test_runner">"Browser Test Runner"</string>
-  <string-array name="bookmarks">
-    <item>"Google"</item>
-    <item>"http://www.google.com/"</item>
-    <item>"Yahoo!"</item>
-    <item>"http://www.yahoo.com/"</item>
-    <item>"MSN"</item>
-    <item>"http://www.msn.com/"</item>
-    <item>"MySpace"</item>
-    <item>"http://www.myspace.com"</item>
-    <item>"Facebook"</item>
-    <item>"http://www.facebook.com/"</item>
-    <item>"Wikipedia"</item>
-    <item>"http://www.wikipedia.org/"</item>
-    <item>"eBay"</item>
-    <item>"http://www.ebay.com/"</item>
-    <item>"CNN"</item>
-    <item>"http://www.cnn.com/"</item>
-    <item>"New York Times"</item>
-    <item>"http://www.nytimes.com/"</item>
-    <item>"ESPN"</item>
-    <item>"http://espn.go.com/"</item>
-    <item>"Amazon"</item>
-    <item>"http://www.amazon.com/"</item>
-    <item>"Weather Channel"</item>
-    <item>"http://www.weather.com/"</item>
-    <item>"BBC"</item>
-    <item>"http://www.bbc.co.uk/"</item>
-  </string-array>
+    <string name="search_google">"Zoeken met Google"</string>
     <string name="permlab_readHistoryBookmarks">"browsergeschiedenis en bladwijzers lezen"</string>
     <string name="permdesc_readHistoryBookmarks">"Hiermee kan een toepassing de URL\'s lezen die u via de browser heeft bezocht, evenals alle bladwijzers van de browser."</string>
     <string name="permlab_writeHistoryBookmarks">"browsergeschiedenis en bladwijzers schrijven"</string>
     <string name="permdesc_writeHistoryBookmarks">"Hiermee kan een toepassing de op uw telefoon opgeslagen browsergeschiedenis of bladwijzers wijzigen. Schadelijke toepassingen kunnen hiermee uw browsergegevens verwijderen of wijzigen."</string>
-    <string name="query_data_message">"De onderstaande website probeer gegevens op uw computer op te slaan met Google Gears."</string>
-    <string name="location_message">"De onderstaande website probeert via Gears informatie over uw locatie te krijgen."</string>
-    <string name="shortcut_message">"Deze website probeert een snelkoppeling te maken op uw computer. Wilt u dit toestaan?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"De onderstaande tabel geeft de toestemming weer die u heeft verleend aan elke site die Gears heeft geprobeerd te gebruiken."</string>
-    <string name="filepicker_message">"Bestandenkiezer van Google Gears"</string>
-    <string name="image_message">"Geselecteerde foto"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"Instellingen van Gears"</string>
     <string name="privacy_policy">"U kunt het privacybeleid van de site raadplegen voor meer informatie over hoe uw locatie wordt gebruikt."</string>
-    <string name="permission_button_alwaysdeny">"Deze site nooit toestaan"</string>
-    <string name="permission_button_allow">"Toestaan"</string>
-    <string name="permission_button_deny">"Weigeren"</string>
-    <string name="shortcut_button_alwaysdeny">"Deze snelkoppeling nooit toestaan"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"OK"</string>
     <string name="shortcut_button_deny">"Annuleren"</string>
     <string name="settings_button_allow">"Toepassen"</string>
@@ -314,4 +328,5 @@
     <string name="denied">"Geweigerd"</string>
     <string name="unrecognized_dialog_message">"Dialoogtype wordt niet herkend"</string>
     <string name="default_button">"OK"</string>
+    <string name="zoom_overview_button_text">"Overzicht"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 496f2a0..186128b 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -15,21 +15,25 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"Internet"</string>
+    <string name="tab_bookmarks">"Zakładki"</string>
+    <string name="tab_most_visited">"Najczęściej odwiedzane"</string>
+    <string name="tab_history">"Historia"</string>
+    <string name="added_to_bookmarks">"Dodano do zakładek"</string>
+    <string name="removed_from_bookmarks">"Usunięto z zakładek"</string>
     <string name="sign_in_to">"Zaloguj się w witrynie <xliff:g id="HOSTNAME">%s1</xliff:g> „<xliff:g id="REALM">%s2</xliff:g>”"</string>
     <string name="username">"Nazwa"</string>
     <string name="password">"Hasło"</string>
     <string name="action">"Zaloguj się"</string>
     <string name="cancel">"Anuluj"</string>
     <string name="ok">"OK"</string>
-    <string name="matches_found">"dopasowania"</string>
+    <string name="matches_found">" dopasowania"</string>
     <string name="zero">"Nie"</string>
     <string name="page_info">"Informacje o stronie"</string>
     <string name="page_info_view">"Informacje o stronie"</string>
     <string name="page_info_address">"Adres:"</string>
     <string name="ssl_warnings_header">"Są problemy z certyfikatem zabezpieczeń tej strony."</string>
-    <string name="ssl_continue">"Kontynuuj"</string>
+    <string name="ssl_continue">"Dalej"</string>
     <string name="security_warning">"Ostrzeżenie zabezpieczeń"</string>
     <string name="view_certificate">"Wyświetl certyfikat"</string>
     <string name="ssl_untrusted">"Ten certyfikat nie pochodzi od zaufanego urzędu."</string>
@@ -47,12 +51,9 @@
     <string name="issued_on">"Data wystawienia:"</string>
     <string name="expires_on">"Wygasa:"</string>
     <string name="retrieving_creds_dlg_msg">"Pobieranie szczegółów logowania…"</string>
-    <string name="close">"Zamknij"</string>
-    <string name="close_window">"To okno zostanie zamknięte."</string>
     <string name="stopping">"Trwa zatrzymywanie…"</string>
     <string name="stop">"Zatrzymaj"</string>
     <string name="reload">"Odśwież"</string>
-    <string name="back">"Wstecz"</string>
     <string name="forward">"Dalej"</string>
     <string name="save">"OK"</string>
     <string name="do_not_save">"Anuluj"</string>
@@ -72,17 +73,15 @@
     <string name="bookmark_url_not_valid">"Adres URL jest nieprawidłowy."</string>
     <string name="delete_bookmark">"Usuń"</string>
     <string name="bookmark_page">"Dodaj do zakładek ostatnio wyświetlaną stronę"</string>
-    <string name="current_page">"Bieżąca strona:"</string>
+    <string name="current_page">"z "</string>
     <string name="delete_bookmark_warning">"Zakładka „<xliff:g id="BOOKMARK">%s</xliff:g>” zostanie usunięta."</string>
     <string name="open_in_new_window">"Otwórz w nowym oknie"</string>
     <string name="new_window">"Nowe okno"</string>
-    <string name="goto_dot">"Przejdź pod adres URL"</string>
+    <string name="goto_dot">"Idź"</string>
     <string name="find_dot">"Znajdź na stronie"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"Strona główna"</string>
+    <string name="select_dot">"Zaznacz tekst"</string>
     <string name="view_tabs">"Przegląd okien"</string>
-    <string name="view_tabs_condensed">"Windows"</string>
+    <string name="view_tabs_condensed">"Okna"</string>
     <string name="tab_picker_title">"Bieżące okna"</string>
     <string name="tab_picker_view_tab">"Wyświetl"</string>
     <string name="tab_picker_new_tab">"Nowe okno"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"Utwórz zakładkę"</string>
     <string name="history">"Historia"</string>
     <string name="menu_view_download">"Pobrane pliki"</string>
-    <string name="menu_bookmark_page">"Strona zakładek"</string>
     <string name="share_page">"Udostępnij stronę"</string>
-    <string name="menu_zoom">"Powiększenie"</string>
-    <string name="menu_flip_orientation">"Zmień orientację"</string>
     <string name="contextmenu_openlink">"Otwórz"</string>
     <string name="contextmenu_openlink_newwindow">"Otwórz w nowym oknie"</string>
     <string name="contextmenu_bookmark_thislink">"Dodaj link do zakładek"</string>
@@ -117,18 +113,18 @@
     <string name="pref_content_title">"Ustawienia zawartości stron"</string>
     <string name="pref_content_load_images">"Wczytuj obrazy"</string>
     <string name="pref_content_load_images_summary">"Wyświetlaj obrazy na stronach WWW"</string>
-    <string name="pref_content_block_popups">"Blokuj okienka wyskakujące"</string>
+    <string name="pref_content_block_popups">"Blokuj wyskakujące okna"</string>
     <string name="pref_content_javascript">"Włącz skrypty JavaScript"</string>
     <string name="pref_content_open_in_background">"Otwórz w tle"</string>
-    <string name="pref_content_open_in_background_summary">"Nowe okna są otwierane za bieżącym"</string>
+    <string name="pref_content_open_in_background_summary">"Nowe okna są otwierane w tle"</string>
     <string name="pref_content_homepage">"Ustaw stronę główną"</string>
-    <string name="pref_content_autofit">"Automatycznie dopasowuj strony"</string>
+    <string name="pref_content_autofit">"Autodopasowanie stron"</string>
     <string name="pref_content_autofit_summary">"Formatuj strony WWW, aby mieściły się na ekranie"</string>
     <string name="pref_privacy_title">"Ustawienia prywatności"</string>
     <string name="pref_privacy_clear_cache">"Wyczyść pamięć podręczną"</string>
     <string name="pref_privacy_clear_cache_summary">"Usuń całą zawartość stron z pamięci podręcznej"</string>
     <string name="pref_privacy_clear_cache_dlg">"Pamięć podręczna zostanie wyczyszczona."</string>
-    <string name="pref_privacy_clear_cookies">"Wyczyść wszystkie dane plików cookie"</string>
+    <string name="pref_privacy_clear_cookies">"Wyczyść wszystkie cookies"</string>
     <string name="pref_privacy_clear_cookies_summary">"Wyczyść pliki cookie przeglądarki"</string>
     <string name="pref_privacy_clear_cookies_dlg">"Wszystkie pliki cookie zostaną usunięte."</string>
     <string name="pref_privacy_clear_history">"Wyczyść historię"</string>
@@ -143,9 +139,9 @@
     <string name="pref_security_title">"Ustawienia zabezpieczeń"</string>
     <string name="pref_security_remember_passwords">"Zapamiętuj hasła"</string>
     <string name="pref_security_remember_passwords_summary">"Zapamiętuj nazwy użytkownika i hasła do stron WWW"</string>
-    <string name="pref_security_save_form_data">"Zapamiętaj dane formularza"</string>
+    <string name="pref_security_save_form_data">"Zapamiętuj wpisane dane"</string>
     <string name="pref_security_save_form_data_summary">"Zapamiętuj do późniejszego użycia dane, które wpisuję w formularzach"</string>
-    <string name="pref_security_show_security_warning">"Wyświetlaj ostrzeżenia zabezpieczeń"</string>
+    <string name="pref_security_show_security_warning">"Wyświetlaj ostrzeżenia"</string>
     <string name="pref_security_show_security_warning_summary">"Wyświetl ostrzeżenie w razie problemów z zabezpieczeniami strony"</string>
     <string name="pref_security_accept_cookies">"Akceptuj pliki cookie"</string>
     <string name="pref_security_accept_cookies_summary">"Zezwalaj witrynom na zapis i odczyt danych plików „cookie”."</string>
@@ -161,12 +157,12 @@
     <string name="pref_extras_title">"Ustawienia zaawansowane"</string>
     <string name="pref_extras_gears_enable">"Włącz technologię Gears"</string>
     <string name="pref_extras_gears_enable_summary">"Aplikacje rozszerzające zakres funkcji przeglądarki"</string>
-    <string name="pref_extras_gears_settings">"Gears — ustawienia"</string>
+    <string name="pref_extras_gears_settings">"Gears – ustawienia"</string>
     <string name="pref_plugin_installed">"Lista dodatków plug-in"</string>
     <string name="pref_plugin_installed_empty_list">"Brak zainstalowanych dodatków plug-in."</string>
     <string name="pref_extras_gears_settings_summary">"Aplikacje rozszerzające zakres funkcji przeglądarki"</string>
     <string name="pref_extras_reset_default">"Przywróć wartości domyślne"</string>
-    <string name="pref_extras_reset_default_summary">"Wyczyść wszystkie dane przeglądarki i przywróć wszystkie ustawienia do wartości domyślnych"</string>
+    <string name="pref_extras_reset_default_summary">"Wyczyść wszystkie dane przeglądarki i przywróć wszystkie ustawienia domyślne"</string>
     <string name="pref_extras_reset_default_dlg">"Wszystkie dane przeglądarki zostaną wyczyszczone, a ustawienia powrócą do wartości domyślnych."</string>
     <string name="pref_extras_reset_default_dlg_title">"Przywróć wartości domyślne"</string>
     <string name="pref_development_title">"Debugowanie"</string>
@@ -208,11 +204,10 @@
     <string name="clear_history">"Wyczyść historię"</string>
     <string name="browser_history">"Ostatnio odwiedzane strony"</string>
     <string name="empty_history">"Historia przeglądarki jest pusta."</string>
-    <string name="add_new_bookmark">"Nowa zakładka"</string>
+    <string name="add_new_bookmark">"Dodaj do zakładek..."</string>
     <string name="no_database">"Brak bazy danych!"</string>
     <string name="search_hint">"Wpisz adres WWW"</string>
-    <string name="search">"Szukaj"</string>
-    <string name="search_button_text">"Idź"</string>
+    <string name="search_button_text">"Otwórz"</string>
     <string name="attention">"Uwaga"</string>
     <string name="popup_window_attempt">"Ta strona próbuje otworzyć okienko wyskakujące."</string>
     <string name="allow">"Zezwól"</string>
@@ -238,7 +233,8 @@
     <string name="download_no_sdcard_dlg_title">"Brak karty SD"</string>
     <string name="download_no_sdcard_dlg_msg">"Do pobrania pliku <xliff:g id="FILENAME">%s</xliff:g> potrzebna jest karta SD."</string>
     <string name="download_sdcard_busy_dlg_title">"Karta SD jest niedostępna"</string>
-    <string name="download_sdcard_busy_dlg_msg">"Karta SD jest zajęta. Aby zezwolić na pobieranie, przejdź do Strona główna &gt; Ustawienia &gt; Karta SD i pamięć telefonu, a następnie usuń zaznaczenie pola wyboru „Użyj dla pamięci USB”."</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"Nie można znaleźć pliku do otwarcia tego programu."</string>
     <string name="retry">"Spróbuj ponownie"</string>
     <string name="no_downloads">"Historia pobierania jest pusta."</string>
@@ -254,50 +250,68 @@
     <string name="download_length_required">"Pobieranie niemożliwe. Nie można ustalić rozmiaru elementu."</string>
     <string name="download_precondition_failed">"Pobieranie zostało przerwane. Nie można go wznowić."</string>
     <string name="activity_instrumentation_test_runner">"Uruchamianie testów przeglądarki"</string>
-  <string-array name="bookmarks">
-    <item>"Google"</item>
-    <item>"http://www.google.com/"</item>
-    <item>"Yahoo!"</item>
-    <item>"http://www.yahoo.com/"</item>
-    <item>"MSN"</item>
-    <item>"http://www.msn.com/"</item>
-    <item>"MySpace"</item>
-    <item>"http://www.myspace.com/"</item>
-    <item>"Facebook"</item>
-    <item>"http://www.facebook.com/"</item>
-    <item>"Wikipedia"</item>
-    <item>"http://www.wikipedia.org/"</item>
-    <item>"eBay"</item>
-    <item>"http://www.ebay.com/"</item>
-    <item>"CNN"</item>
-    <item>"http://www.cnn.com/"</item>
-    <item>"New York Times"</item>
-    <item>"http://www.nytimes.com/"</item>
-    <item>"ESPN"</item>
-    <item>"http://espn.go.com/"</item>
-    <item>"Amazon"</item>
-    <item>"http://www.amazon.com/"</item>
-    <item>"Pogoda"</item>
-    <item>"http://www.weather.com/"</item>
-    <item>"BBC"</item>
-    <item>"http://www.bbc.co.uk/"</item>
-  </string-array>
+    <string name="search_google">"Szukanie Google"</string>
     <string name="permlab_readHistoryBookmarks">"odczytywanie historii i zakładek przeglądarki"</string>
     <string name="permdesc_readHistoryBookmarks">"Zezwala aplikacji na odczytanie wszystkich adresów URL odwiedzonych przy użyciu przeglądarki oraz wszystkich zakładek przeglądarki."</string>
     <string name="permlab_writeHistoryBookmarks">"zapisać historię i zakładki przeglądarki"</string>
     <string name="permdesc_writeHistoryBookmarks">"Pozwala aplikacji na zmianę historii lub zakładek przeglądarki zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby usunąć lub zmienić dane przeglądarki."</string>
-    <string name="query_data_message">"Poniższa witryna chce przechowywać informacje w Twoim komputerze przy użyciu Gears."</string>
-    <string name="location_message">"Poniższa witryna chce uzyskać informacje o Twojej lokalizacji przy użyciu Gears."</string>
-    <string name="shortcut_message">"Ta witryna chce utworzyć skrót w Twoim komputerze. Czy chcesz na to zezwolić?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"W poniższej tabeli przedstawiono uprawnienia udzielone każdej z witryn próbujących użyć Gears."</string>
-    <string name="filepicker_message">"Gears — wybieranie pliku"</string>
-    <string name="image_message">"Wybrany obraz"</string>
-    <string name="settings_title">"Gears — ustawienia"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
+    <string name="settings_title">"Gears – ustawienia"</string>
     <string name="privacy_policy">"Przeczytaj zasady zachowania poufności informacji witryny, aby dowiedzieć się, jak będą użyte informacje o twojej lokalizacji."</string>
-    <string name="permission_button_alwaysdeny">"Nigdy nie zezwalaj tej witrynie"</string>
-    <string name="permission_button_allow">"Zezwól"</string>
-    <string name="permission_button_deny">"Odmów"</string>
-    <string name="shortcut_button_alwaysdeny">"Nigdy nie zezwalaj temu skrótowi"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"OK"</string>
     <string name="shortcut_button_deny">"Anuluj"</string>
     <string name="settings_button_allow">"Zastosuj"</string>
@@ -314,4 +328,5 @@
     <string name="denied">"Odmówiono"</string>
     <string name="unrecognized_dialog_message">"Nierozpoznany typ okna dialogowego"</string>
     <string name="default_button">"OK"</string>
+    <string name="zoom_overview_button_text">"Widok ogólny"</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 621ef99..eedcbb0 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"Браузер"</string>
+    <string name="tab_bookmarks">"Закладки"</string>
+    <string name="tab_most_visited">"Часто посещаемые"</string>
+    <string name="tab_history">"История"</string>
+    <string name="added_to_bookmarks">"Добавлено в закладки"</string>
+    <string name="removed_from_bookmarks">"Удалено из закладок"</string>
     <string name="sign_in_to">"Регистрация в <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
     <string name="username">"Название"</string>
     <string name="password">"Пароль"</string>
     <string name="action">"Войти"</string>
     <string name="cancel">"Отмена"</string>
     <string name="ok">"ОК"</string>
-    <string name="matches_found">"совпадений(я)"</string>
+    <string name="matches_found">" совпадений(я)"</string>
     <string name="zero">"Нет"</string>
     <string name="page_info">"Сведения о странице"</string>
     <string name="page_info_view">"Просмотреть сведения о странице"</string>
@@ -47,12 +51,9 @@
     <string name="issued_on">"Когда выдан:"</string>
     <string name="expires_on">"Действителен до:"</string>
     <string name="retrieving_creds_dlg_msg">"Получение сведений о входе…"</string>
-    <string name="close">"Закрыть"</string>
-    <string name="close_window">"Это окно будето закрыто."</string>
     <string name="stopping">"Остановка загрузки…"</string>
     <string name="stop">"Остановить"</string>
     <string name="reload">"Обновить"</string>
-    <string name="back">"Назад"</string>
     <string name="forward">"Вперед"</string>
     <string name="save">"ОК"</string>
     <string name="do_not_save">"Отмена"</string>
@@ -72,15 +73,13 @@
     <string name="bookmark_url_not_valid">"URL недействителен."</string>
     <string name="delete_bookmark">"Удаление"</string>
     <string name="bookmark_page">"Добавить в закладки последнюю просмотренную страницу"</string>
-    <string name="current_page">"Текущая страница:"</string>
+    <string name="current_page">"из "</string>
     <string name="delete_bookmark_warning">"Закладка \"<xliff:g id="BOOKMARK">%s</xliff:g>\" будет удалена."</string>
     <string name="open_in_new_window">"Открыть в новом окне"</string>
     <string name="new_window">"Новое окно"</string>
-    <string name="goto_dot">"Перейти к URL"</string>
+    <string name="goto_dot">"Выбрать"</string>
     <string name="find_dot">"Найти на странице"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"Главная страница"</string>
+    <string name="select_dot">"Выбрать текст"</string>
     <string name="view_tabs">"Обзор окон"</string>
     <string name="view_tabs_condensed">"Окна"</string>
     <string name="tab_picker_title">"Текущие окна"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"Закладка"</string>
     <string name="history">"История"</string>
     <string name="menu_view_download">"Загрузки"</string>
-    <string name="menu_bookmark_page">"Страница закладок"</string>
     <string name="share_page">"Отправить страницу"</string>
-    <string name="menu_zoom">"Масштаб"</string>
-    <string name="menu_flip_orientation">"Изменить ориентацию"</string>
     <string name="contextmenu_openlink">"Открыть"</string>
     <string name="contextmenu_openlink_newwindow">"Открыть в новом окне"</string>
     <string name="contextmenu_bookmark_thislink">"Добавить в закладки"</string>
@@ -208,10 +204,9 @@
     <string name="clear_history">"Очистить историю"</string>
     <string name="browser_history">"Недавно посещенные страницы"</string>
     <string name="empty_history">"История бразуера пуста."</string>
-    <string name="add_new_bookmark">"Создать закладку"</string>
+    <string name="add_new_bookmark">"Добавить закладку…"</string>
     <string name="no_database">"Нет базы данных!"</string>
     <string name="search_hint">"Введите веб-адрес"</string>
-    <string name="search">"Поиск"</string>
     <string name="search_button_text">"Перейти"</string>
     <string name="attention">"Внимание"</string>
     <string name="popup_window_attempt">"Этот сайт пытается открыть всплывающее окно."</string>
@@ -238,7 +233,8 @@
     <string name="download_no_sdcard_dlg_title">"Нет карты SD"</string>
     <string name="download_no_sdcard_dlg_msg">"Для загрузки файла <xliff:g id="FILENAME">%s</xliff:g> нужна карта SD."</string>
     <string name="download_sdcard_busy_dlg_title">"Карта SD недоступна"</string>
-    <string name="download_sdcard_busy_dlg_msg">"Карта SD занята. Чтобы разрешить загрузки, выберите Главный экран &gt; Настройки &gt; Карта SD &gt; Хранилище телефона и снимите флажок \"Использовать в качестве USB-хранилища\"."</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"Не удалось найти приложение для открытия этого файла."</string>
     <string name="retry">"Повторить"</string>
     <string name="no_downloads">"История загрузок пуста."</string>
@@ -254,50 +250,68 @@
     <string name="download_length_required">"Загрузка невозможна. Не удается определить размер элемента."</string>
     <string name="download_precondition_failed">"Загрузка прервана и не может быть продолжена."</string>
     <string name="activity_instrumentation_test_runner">"Проверка браузера"</string>
-  <string-array name="bookmarks">
-    <item>"Google"</item>
-    <item>"http://www.google.ru/"</item>
-    <item>"Yahoo!"</item>
-    <item>"http://www.yahoo.com/"</item>
-    <item>"MSN"</item>
-    <item>"http://www.msn.com/"</item>
-    <item>"MySpace"</item>
-    <item>"http://www.myspace.com/"</item>
-    <item>"Facebook"</item>
-    <item>"http://www.facebook.com/"</item>
-    <item>"Википедия"</item>
-    <item>"http://ru.wikipedia.org/"</item>
-    <item>"eBay"</item>
-    <item>"http://www.ebay.com/"</item>
-    <item>"CNN"</item>
-    <item>"http://www.cnn.com/"</item>
-    <item>"New York Times"</item>
-    <item>"http://www.nytimes.com/"</item>
-    <item>"ESPN"</item>
-    <item>"http://espn.go.com/"</item>
-    <item>"Amazon"</item>
-    <item>"http://www.amazon.com/"</item>
-    <item>"Weather Channel"</item>
-    <item>"http://www.weather.com/"</item>
-    <item>"BBC"</item>
-    <item>"http://www.bbc.co.uk/"</item>
-  </string-array>
+    <string name="search_google">"Поиск в Google"</string>
     <string name="permlab_readHistoryBookmarks">"считывать историю и закладки браузера"</string>
     <string name="permdesc_readHistoryBookmarks">"Позволяет приложению считывать все URL, открытые через браузер, и все закладки браузера."</string>
     <string name="permlab_writeHistoryBookmarks">"записывать историю и закладки браузера"</string>
     <string name="permdesc_writeHistoryBookmarks">"Позволяет приложению изменять сохраненные в телефоне историю и закладки браузера. Вредоносное ПО сможет стирать или изменять данные браузера."</string>
-    <string name="query_data_message">"Указанный ниже веб-сайт пытается сохранить данные на вашем компьютере с помощью Gears."</string>
-    <string name="location_message">"Указанный ниже веб-сайт пытается получить данные о вашем местоположении с помощью Gears."</string>
-    <string name="shortcut_message">"Этот веб-сайт пытается создать ярлык на вашем компьютере. Разрешить?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"В таблице ниже показаны разрешения, которые вы дали сайтам, пытавшимся использовать Gears."</string>
-    <string name="filepicker_message">"Выбор файлов Gears"</string>
-    <string name="image_message">"Выбранное изображение"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"Настройки Gears"</string>
     <string name="privacy_policy">"Прочитайте политику конфиденциальности сайта, чтобы узнать, как будут использованы данные о вашем местоположении."</string>
-    <string name="permission_button_alwaysdeny">"Никогда для этого сайта"</string>
-    <string name="permission_button_allow">"Разрешить"</string>
-    <string name="permission_button_deny">"Запретить"</string>
-    <string name="shortcut_button_alwaysdeny">"Никогда для этого ярлыка"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"ОК"</string>
     <string name="shortcut_button_deny">"Отмена"</string>
     <string name="settings_button_allow">"Применить"</string>
@@ -314,4 +328,5 @@
     <string name="denied">"Запрещено"</string>
     <string name="unrecognized_dialog_message">"Неизвестный тип диалога"</string>
     <string name="default_button">"ОК"</string>
+    <string name="zoom_overview_button_text">"Обзор"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index f3b8202..6cc0db8 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"浏览器"</string>
+    <string name="tab_bookmarks">"书签"</string>
+    <string name="tab_most_visited">"访问最多的网站"</string>
+    <string name="tab_history">"历史记录"</string>
+    <string name="added_to_bookmarks">"添加到书签"</string>
+    <string name="removed_from_bookmarks">"从书签中删除"</string>
     <string name="sign_in_to">"登录至 <xliff:g id="HOSTNAME">%s1</xliff:g>“<xliff:g id="REALM">%s2</xliff:g>”"</string>
     <string name="username">"名称"</string>
     <string name="password">"密码"</string>
     <string name="action">"登录"</string>
     <string name="cancel">"取消"</string>
     <string name="ok">"确定"</string>
-    <string name="matches_found">"匹配项"</string>
+    <string name="matches_found">" 匹配项"</string>
     <string name="zero">"否"</string>
     <string name="page_info">"页面信息"</string>
     <string name="page_info_view">"查看页面信息"</string>
@@ -47,12 +51,9 @@
     <string name="issued_on">"发布时间:"</string>
     <string name="expires_on">"有效期至:"</string>
     <string name="retrieving_creds_dlg_msg">"正在检索登录详细信息..."</string>
-    <string name="close">"关闭"</string>
-    <string name="close_window">"该窗口会关闭。"</string>
     <string name="stopping">"正在停止..."</string>
     <string name="stop">"停止"</string>
     <string name="reload">"刷新"</string>
-    <string name="back">"返回"</string>
     <string name="forward">"前进"</string>
     <string name="save">"确定"</string>
     <string name="do_not_save">"取消"</string>
@@ -72,15 +73,13 @@
     <string name="bookmark_url_not_valid">"网址无效。"</string>
     <string name="delete_bookmark">"删除"</string>
     <string name="bookmark_page">"将上次查看过的页面加为书签"</string>
-    <string name="current_page">"当前页面:"</string>
+    <string name="current_page">"来源 "</string>
     <string name="delete_bookmark_warning">"会删除书签“<xliff:g id="BOOKMARK">%s</xliff:g>”。"</string>
     <string name="open_in_new_window">"在新窗口中打开"</string>
     <string name="new_window">"新窗口"</string>
-    <string name="goto_dot">"转至网址"</string>
+    <string name="goto_dot">"开始"</string>
     <string name="find_dot">"在页面上查找"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"主页"</string>
+    <string name="select_dot">"选择文本"</string>
     <string name="view_tabs">"窗口概述"</string>
     <string name="view_tabs_condensed">"窗口"</string>
     <string name="tab_picker_title">"当前窗口"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"书签"</string>
     <string name="history">"历史记录"</string>
     <string name="menu_view_download">"下载"</string>
-    <string name="menu_bookmark_page">"书签页面"</string>
     <string name="share_page">"共享页面"</string>
-    <string name="menu_zoom">"缩放"</string>
-    <string name="menu_flip_orientation">"反转方向"</string>
     <string name="contextmenu_openlink">"打开"</string>
     <string name="contextmenu_openlink_newwindow">"在新窗口中打开"</string>
     <string name="contextmenu_bookmark_thislink">"书签链接"</string>
@@ -208,10 +204,9 @@
     <string name="clear_history">"清除历史记录"</string>
     <string name="browser_history">"最近访问过的页面"</string>
     <string name="empty_history">"浏览器历史记录为空。"</string>
-    <string name="add_new_bookmark">"新建书签"</string>
+    <string name="add_new_bookmark">"添加书签..."</string>
     <string name="no_database">"没有数据库!"</string>
     <string name="search_hint">"键入网址"</string>
-    <string name="search">"搜索"</string>
     <string name="search_button_text">"转至"</string>
     <string name="attention">"注意"</string>
     <string name="popup_window_attempt">"该网站正试图打开一个弹出窗口。"</string>
@@ -238,7 +233,8 @@
     <string name="download_no_sdcard_dlg_title">"无 SD 卡"</string>
     <string name="download_no_sdcard_dlg_msg">"需要 SD 卡才能下载 <xliff:g id="FILENAME">%s</xliff:g>。"</string>
     <string name="download_sdcard_busy_dlg_title">"SD 卡不可用"</string>
-    <string name="download_sdcard_busy_dlg_msg">"SD 卡正忙。要允许下载,请访问“主页”&gt;“设置”&gt;“SD 卡和手机存储”,然后取消选中“用于 USB 存储”复选框。"</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"无法找到可打开此文件的应用程序。"</string>
     <string name="retry">"重试"</string>
     <string name="no_downloads">"下载历史记录为空。"</string>
@@ -254,50 +250,68 @@
     <string name="download_length_required">"无法下载。无法确定该项的大小。"</string>
     <string name="download_precondition_failed">"下载中断,无法重新开始。"</string>
     <string name="activity_instrumentation_test_runner">"浏览器测试运行器"</string>
-  <string-array name="bookmarks">
-    <item>"Google"</item>
-    <item>"http://www.google.cn/"</item>
-    <item>"Yahoo!"</item>
-    <item>"http://www.yahoo.com/"</item>
-    <item>"MSN"</item>
-    <item>"http://www.msn.com/"</item>
-    <item>"MySpace"</item>
-    <item>"http://www.myspace.com/"</item>
-    <item>"Facebook"</item>
-    <item>"http://www.facebook.com/"</item>
-    <item>"Wikipedia"</item>
-    <item>"http://www.wikipedia.org/"</item>
-    <item>"易趣"</item>
-    <item>"http://www.ebay.com/"</item>
-    <item>"CNN"</item>
-    <item>"http://www.cnn.com/"</item>
-    <item>"纽约时报"</item>
-    <item>"http://www.nytimes.com/"</item>
-    <item>"ESPN"</item>
-    <item>"http://espn.go.com/"</item>
-    <item>"卓越亚马逊"</item>
-    <item>"http://www.amazon.com/"</item>
-    <item>"Weather Channel"</item>
-    <item>"http://www.weather.com/"</item>
-    <item>"BBC"</item>
-    <item>"http://www.bbc.co.uk/"</item>
-  </string-array>
+    <string name="search_google">"使用 Google 进行搜索"</string>
     <string name="permlab_readHistoryBookmarks">"读取浏览器的历史记录和书签"</string>
     <string name="permdesc_readHistoryBookmarks">"允许应用程序读取浏览器访问过的所有网址以及浏览器的所有书签。"</string>
     <string name="permlab_writeHistoryBookmarks">"写入浏览器的历史记录和书签"</string>
     <string name="permdesc_writeHistoryBookmarks">"允许应用程序修改您手机中存储的浏览器的历史记录或书签。恶意应用程序可能会利用此权限清除或修改您浏览器的数据。"</string>
-    <string name="query_data_message">"下面的网站想要使用 Gears 在您的计算机上存储信息。"</string>
-    <string name="location_message">"下面的网站想要使用 Gears 访问关于您的位置的信息。"</string>
-    <string name="shortcut_message">"该网站想要在您的计算机上创建快捷方式。是否允许创建?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"下表显示了您授予尝试使用 Gears 的各个网站的权限。"</string>
-    <string name="filepicker_message">"Gears 文件选择器"</string>
-    <string name="image_message">"选定图片"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"Gears 设置"</string>
     <string name="privacy_policy">"阅读网站的隐私政策,以了解会如何使用您的位置。"</string>
-    <string name="permission_button_alwaysdeny">"始终拒绝该网站"</string>
-    <string name="permission_button_allow">"允许"</string>
-    <string name="permission_button_deny">"拒绝"</string>
-    <string name="shortcut_button_alwaysdeny">"始终拒绝使用该快捷方式"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"确定"</string>
     <string name="shortcut_button_deny">"取消"</string>
     <string name="settings_button_allow">"应用"</string>
@@ -314,4 +328,5 @@
     <string name="denied">"已拒绝"</string>
     <string name="unrecognized_dialog_message">"未识别的对话类型"</string>
     <string name="default_button">"确定"</string>
+    <string name="zoom_overview_button_text">"概览"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 48b6ec3..45241be 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -15,15 +15,19 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for application_name (1935869255545976415) -->
-    <skip />
+    <string name="application_name">"瀏覽器"</string>
+    <string name="tab_bookmarks">"書籤"</string>
+    <string name="tab_most_visited">"常用網頁"</string>
+    <string name="tab_history">"紀錄"</string>
+    <string name="added_to_bookmarks">"已加入書籤"</string>
+    <string name="removed_from_bookmarks">"已自書籤中移除"</string>
     <string name="sign_in_to">"登入到 <xliff:g id="HOSTNAME">%s1</xliff:g>「<xliff:g id="REALM">%s2</xliff:g>」"</string>
     <string name="username">"名字"</string>
     <string name="password">"密碼"</string>
     <string name="action">"登入"</string>
     <string name="cancel">"取消"</string>
     <string name="ok">"確定"</string>
-    <string name="matches_found">"個符合項目"</string>
+    <string name="matches_found">" 個符合項目"</string>
     <string name="zero">"否"</string>
     <string name="page_info">"頁面資訊"</string>
     <string name="page_info_view">"檢視頁面資訊"</string>
@@ -47,12 +51,9 @@
     <string name="issued_on">"發給:"</string>
     <string name="expires_on">"有效日期:"</string>
     <string name="retrieving_creds_dlg_msg">"取回登入資訊…"</string>
-    <string name="close">"關閉"</string>
-    <string name="close_window">"視窗即將關閉。"</string>
     <string name="stopping">"停止中…"</string>
     <string name="stop">"停止"</string>
     <string name="reload">"重新整理"</string>
-    <string name="back">"上一頁"</string>
     <string name="forward">"下一頁"</string>
     <string name="save">"確定"</string>
     <string name="do_not_save">"取消"</string>
@@ -72,15 +73,13 @@
     <string name="bookmark_url_not_valid">"網址無效。"</string>
     <string name="delete_bookmark">"刪除"</string>
     <string name="bookmark_page">"最後瀏覽的書籤頁面"</string>
-    <string name="current_page">"本頁:"</string>
+    <string name="current_page">"來源 "</string>
     <string name="delete_bookmark_warning">"<xliff:g id="BOOKMARK">%s</xliff:g>"</string>
     <string name="open_in_new_window">"在新視窗開啟"</string>
     <string name="new_window">"新視窗"</string>
-    <string name="goto_dot">"前往網址"</string>
+    <string name="goto_dot">"前往"</string>
     <string name="find_dot">"在頁面中尋找"</string>
-    <!-- no translation found for select_dot (6299170761900561967) -->
-    <skip />
-    <string name="homepage">"首頁"</string>
+    <string name="select_dot">"選取文字"</string>
     <string name="view_tabs">"視窗總覽"</string>
     <string name="view_tabs_condensed">"視窗"</string>
     <string name="tab_picker_title">"目前視窗"</string>
@@ -93,10 +92,7 @@
     <string name="shortcut_bookmark">"書籤"</string>
     <string name="history">"紀錄"</string>
     <string name="menu_view_download">"下載"</string>
-    <string name="menu_bookmark_page">"書籤頁面"</string>
     <string name="share_page">"分享網頁"</string>
-    <string name="menu_zoom">"縮放"</string>
-    <string name="menu_flip_orientation">"旋轉方向"</string>
     <string name="contextmenu_openlink">"開啟"</string>
     <string name="contextmenu_openlink_newwindow">"在新視窗開啟"</string>
     <string name="contextmenu_bookmark_thislink">"書籤連結"</string>
@@ -208,10 +204,9 @@
     <string name="clear_history">"清除紀錄"</string>
     <string name="browser_history">"最近瀏覽的頁面"</string>
     <string name="empty_history">"瀏覽記錄是空的。"</string>
-    <string name="add_new_bookmark">"新書籤"</string>
+    <string name="add_new_bookmark">"加入書籤…"</string>
     <string name="no_database">"沒有資料!"</string>
     <string name="search_hint">"輸入網頁位址"</string>
-    <string name="search">"搜尋"</string>
     <string name="search_button_text">"前往"</string>
     <string name="attention">"注意"</string>
     <string name="popup_window_attempt">"此網站試圖開啟快顯視窗。"</string>
@@ -238,7 +233,8 @@
     <string name="download_no_sdcard_dlg_title">"沒有 SD 卡"</string>
     <string name="download_no_sdcard_dlg_msg">"需要 SD 卡下載 <xliff:g id="FILENAME">%s</xliff:g>。"</string>
     <string name="download_sdcard_busy_dlg_title">"無法使用 SD 卡"</string>
-    <string name="download_sdcard_busy_dlg_msg">"SD 卡忙碌中。若要允許下載,請前往 [首頁] &gt; [設定] &gt; [SD 卡和電話儲存空間],然後清除 [使用作為 USB 儲存空間] 核取方塊。"</string>
+    <!-- no translation found for download_sdcard_busy_dlg_msg (3473883538192835204) -->
+    <skip />
     <string name="download_no_application">"找不到可以開啟這個檔案的應用程式。"</string>
     <string name="retry">"重試"</string>
     <string name="no_downloads">"下載記錄是空的。"</string>
@@ -254,22 +250,68 @@
     <string name="download_length_required">"無法下載。物件大小無法估計。"</string>
     <string name="download_precondition_failed">"下載中斷。無法續傳。"</string>
     <string name="activity_instrumentation_test_runner">"Browser Test Runner"</string>
+    <string name="search_google">"搜尋 Google"</string>
     <string name="permlab_readHistoryBookmarks">"讀取瀏覽器的瀏覽記錄和書籤"</string>
     <string name="permdesc_readHistoryBookmarks">"允許應用程式讀取瀏覽器造訪過的所有 URL 和瀏覽器所有的書籤。"</string>
     <string name="permlab_writeHistoryBookmarks">"寫入瀏覽器的瀏覽記錄和書籤"</string>
     <string name="permdesc_writeHistoryBookmarks">"允許應用程式修改儲存在電話上的瀏覽器記錄或書籤。惡意應用程式可能會使用此選項來清除或修改您瀏覽器的資料。"</string>
-    <string name="query_data_message">"下列網站想要使用 Gears 在您的電腦上儲存資訊。"</string>
-    <string name="location_message">"下列網站想要使用 Gears 來存取您的位置資訊。"</string>
-    <string name="shortcut_message">"此網站想要在您的電腦上建立捷徑。是否允許此動作?"</string>
+    <!-- no translation found for query_data_prompt (5474381240981604223) -->
+    <skip />
+    <!-- no translation found for query_data_message (8789381063185445197) -->
+    <skip />
+    <!-- no translation found for location_prompt (226262202057302423) -->
+    <skip />
+    <!-- no translation found for location_message (1729456751935683242) -->
+    <skip />
+    <!-- no translation found for shortcut_prompt (437193299088893596) -->
+    <skip />
+    <!-- no translation found for shortcut_message (4793042709293755892) -->
+    <skip />
     <string name="settings_message">"下表列出您為每個想要使用 Gears 之網站所授予的權限。"</string>
-    <string name="filepicker_message">"Gears File Picker"</string>
-    <string name="image_message">"選取的圖片"</string>
+    <!-- no translation found for filepicker_message (4929726371602896039) -->
+    <skip />
+    <!-- no translation found for image_message (5450245866521896891) -->
+    <skip />
     <string name="settings_title">"裝置設定"</string>
     <string name="privacy_policy">"讀取網站的隱私權政策,以瞭解網站將如何使用您的位置資訊。"</string>
-    <string name="permission_button_alwaysdeny">"永遠不允許此網站"</string>
-    <string name="permission_button_allow">"允許"</string>
-    <string name="permission_button_deny">"拒絕"</string>
-    <string name="shortcut_button_alwaysdeny">"永遠不允許此捷徑"</string>
+    <!-- no translation found for settings_storage_title (7089119630457156408) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_on (2733295483569432111) -->
+    <skip />
+    <!-- no translation found for settings_storage_subtitle_off (1338039396087898813) -->
+    <skip />
+    <!-- no translation found for settings_location_title (4953062923509886651) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_on (1496219621849158879) -->
+    <skip />
+    <!-- no translation found for settings_location_subtitle_off (5216466051810596189) -->
+    <skip />
+    <!-- no translation found for settings_remove_site (1822247070226589958) -->
+    <skip />
+    <!-- no translation found for settings_empty (2008952224378583146) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove_title (5360857296753219635) -->
+    <skip />
+    <!-- no translation found for settings_confirmation_remove (585560170733446898) -->
+    <skip />
+    <!-- no translation found for storage_notification (6534213782873968255) -->
+    <skip />
+    <!-- no translation found for storage_notification_alwaysdeny (5473208033665783513) -->
+    <skip />
+    <!-- no translation found for location_notification (3495804750470905804) -->
+    <skip />
+    <!-- no translation found for location_notification_alwaysdeny (6184925953783312629) -->
+    <skip />
+    <!-- no translation found for shortcut_notification (1659700220868444568) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3837055994905214848) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7301874925704148242) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (104712269725153018) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (4172277731325126605) -->
+    <skip />
     <string name="shortcut_button_allow">"確定"</string>
     <string name="shortcut_button_deny">"取消"</string>
     <string name="settings_button_allow">"套用"</string>
@@ -286,4 +328,5 @@
     <string name="denied">"遭拒"</string>
     <string name="unrecognized_dialog_message">"無法辨識的對話類型"</string>
     <string name="default_button">"確定"</string>
+    <string name="zoom_overview_button_text">"總覽"</string>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 8d02fe1..f34b640 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -33,16 +33,10 @@
     <color name="black">#ff000000</color>
     <color name="gray">#ffbbbbbb</color>
     <color name="dark_gray">#ff777777</color>
-    <color name="blue">#ff0000ff</color>
     
-    <color name="translucent_white">#11ffffff</color>
-
     <!-- Gears Dialogs -->
     <color name="permission_border">#f1cc1d</color>
     <color name="permission_background">#faefb8</color>
-    <color name="shortcut_border">#e8e8e8</color>
-    <color name="shortcut_background">#f8f8f8</color>
-    <color name="icon_selection">#ff7a00</color>
     <color name="dialog_link">#ff0000ff</color>
 </resources>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 59ed396..83cc639 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -18,6 +18,16 @@
     <!-- The name of the application. -->
     <string name="application_name">Browser</string>
 
+    <!-- Name of tab containing bookmarks -->
+    <string name="tab_bookmarks">Bookmarks</string>
+    <!-- Name of tab containing the user's most visited websites, organized by number of visits -->
+    <string name="tab_most_visited">Most visited</string>
+    <!-- Name of tab containing the user's complete history, organized by time of last visit -->
+    <string name="tab_history">History</string>
+    <!-- Toast shown when a history item's star is clicked, converting it to a bookmark -->
+    <string name="added_to_bookmarks">Added to bookmarks</string>
+    <!-- Toast shown when a history item's star is clicked off, removing its bookmark -->
+    <string name="removed_from_bookmarks">Removed from bookmarks</string>
     <!-- Sign-in dialog -->
     <!-- This is used as the title of a dialog which is used to sign in to a secure site.
             "%s1"is replaced with the host and "%s2" with realm -->
@@ -96,18 +106,12 @@
 
     <!-- Dialog that is shown while we are retrieving the login creds from the system -->
     <string name="retrieving_creds_dlg_msg">Retrieving sign-in details\u2026</string>
-    <!-- Menu item in a context menu for closing a browser window. -->
-    <string name="close">Close</string>
-    <!-- Confirmation dialog message stating that a browser window will be closed -->
-    <string name="close_window">This window will be closed.</string>
     <!-- Toast informing the user that loading has stopped for the current page. -->
     <string name="stopping">Stopping\u2026</string>
     <!-- Menu item to stop the current page from loading. -->
     <string name="stop">Stop</string>
     <!-- Menu item to reload or refresh the current page. -->
     <string name="reload">Refresh</string>
-    <!-- Menu item to go back to the previous page. -->
-    <string name="back">Back</string>
     <!-- Menu item to go to the next page (only useful if the user has previously hit back.) -->
     <string name="forward">Forward</string>
     <!-- Button label to confirm saving a bookmark. -->
@@ -154,7 +158,7 @@
             dialog to bookmark the page that the browser is currently viewing,
             though it is not currently being displayed, since they are viewing
             the bookmarks screen. -->
-    <string name="current_page">Current page:\u0020</string>
+    <string name="current_page">from\u0020</string>
     <!-- Confirmation dialog message confirming that the user wishes to delete
             the bookmark they selected for deletion -->
     <string name="delete_bookmark_warning">Bookmark \"<xliff:g id="bookmark">%s</xliff:g>\" will be deleted.</string>
@@ -163,15 +167,13 @@
     <!-- Appears in Current windows screen as label on blank + window; user 
             selects this window to open a new browser window -->
     <string name="new_window">New window</string>
-    <!-- Menu item to open a dialog which allows the user to enter a url-->
-    <string name="goto_dot">Go to URL</string>
+    <!-- Menu item to open a dialog which allows the user to enter a url or do search-->
+    <string name="goto_dot">Go</string>
     <!-- Menu item that opens up a dialog which allows the user to provide a
             string and search for it on the page. -->
     <string name="find_dot">Find on page</string>
     <!-- Menu item to switch to text selection mode for copy and paste. -->
     <string name="select_dot">Select text</string>
-    <!-- Menu item to go to the home page, as stored in settings -->
-    <string name="homepage">Home page</string>
     <!-- Menu item which opens a screen which shows all the currently open
             windows, and also allows them to create a new one. -->
     <string name="view_tabs">Window overview</string>
@@ -202,15 +204,8 @@
     <string name="history">History</string>
     <!-- Menu item for viewing downloads from the browser -->
     <string name="menu_view_download">Downloads</string>
-    <!-- Menu item to display the bookmark page.  This is a longer version shown
-            without an icon next to it -->
-    <string name="menu_bookmark_page">Bookmark page</string>
     <!-- Menu item -->
     <string name="share_page">Share page</string>
-    <!-- Menu item to bring up the zoom controls -->
-    <string name="menu_zoom">Zoom</string>
-    <!-- Menu item to flip the orientation of the screen.-->
-    <string name="menu_flip_orientation">Flip orientation</string>
     <!-- Context Menu item open the currently selected link in the current
             window.-->
     <string name="contextmenu_openlink">Open</string>
@@ -447,8 +442,8 @@
     <string name="browser_history">Recently-visited pages</string>
     <!-- Appears on History screen if no history is found -->
     <string name="empty_history">Browser history is empty.</string>
-    <!-- Menu item -->
-    <string name="add_new_bookmark">New bookmark</string>
+    <!-- Displayed at the top of the bookmarks page.  When clicked, it bookmarks the page the browser is currently showing -->
+    <string name="add_new_bookmark">Add bookmark\u2026</string>
     <!-- Add bookmark dialog sets its title to this if we have no database.
             This is an error case -->
     <string name="no_database">No database!</string>
@@ -459,8 +454,6 @@
     <!-- This string is for the browser "Go To" UI. -->
     <!-- This is the hint text shown in the Go To widget, before text is entered. -->
     <string name="search_hint">Type Web address</string>
-    <!-- Menu item -->
-    <string name="search">Search</string>
     <!-- This string is for the browser "Go To" UI. -->
     <!-- This is the button label in the "Go To" UI. -->
     <string name="search_button_text">Go</string>
@@ -530,7 +523,7 @@
     <!-- Message for a dialog informing the user that the SD card used for
             external storage is busy so they cannot download anything.  Informs
             the user how to enable SD card storage -->
-    <string name="download_sdcard_busy_dlg_msg">The SD card is busy. To allow downloads, go to Home > Settings > SD card &amp; phone storage and clear the \"Use for USB storage\" check box.</string>
+    <string name="download_sdcard_busy_dlg_msg">The SD card is busy. To allow downloads, select \"Turn off USB storage\" in the notification.</string>
  
     <!-- Message for a dialog informing the user that there is no application on
             the phone that can open the file that was downloaded  -->
@@ -588,6 +581,8 @@
     <string-array name="bookmarks" translatable="false">
         <item>Google</item>
         <item>http://www.google.com/</item>
+        <item>Picasa Web Albums</item>
+        <item>http://picasaweb.google.com/m/viewer?source=androidclient</item>
         <item>Yahoo!</item>
         <item>http://www.yahoo.com/</item>
         <item>MSN</item>
@@ -623,6 +618,9 @@
     <string name="google_search_base" translatable="false">
         http://www.google.com/m?hl=%1$s&amp;gl=%2$s&amp;</string>
 
+    <!-- Used in Goto to indicate Google search -->
+    <string name="search_google">Search Google</string>
+
     <!-- Title of an application permission, listed so the user can choose whether 
         they want to allow the application to do this. -->
     <string name="permlab_readHistoryBookmarks">read Browser\'s history and bookmarks</string>
@@ -641,21 +639,43 @@
         can use this to erase or modify your Browser\'s data.</string>
 
     <!-- Gears Dialogs -->
-    <string name="query_data_message">The Web site below wants to store information on your computer using Gears.</string>
-    <string name="location_message">The Web site below wants to access information about your location using Gears.</string>
-    <string name="shortcut_message">This Web site wants to create a shortcut on your computer. Do you want to allow this?</string>
+    <string name="query_data_prompt">Allow storage</string>
+    <string name="query_data_message">This web site would like to store information on your phone.</string>
+    <string name="location_prompt">Access your location</string>
+    <string name="location_message">This web site would like to have access to your location.</string>
+    <string name="shortcut_prompt">Create a shortcut</string>
+    <string name="shortcut_message">This web site would like to create a shortcut to this page on your home screen.</string>
     <string name="settings_message">The table below shows the permissions you have granted to each site that has attempted to use Gears.</string>
-    <string name="filepicker_message">Gears File Picker</string>
-    <string name="image_message">Selected image</string>
+    <string name="filepicker_message">File Picker</string>
+    <string name="image_message">Choosen Image</string>
 
     <string name="settings_title">Gears settings</string>
     <string name="privacy_policy">Read the site\'s privacy policy to see how your location will be used.</string>
+    <string name="settings_storage_title">Allow Local Storage</string>
+    <string name="settings_storage_subtitle_on">This site can save information to your phone</string>
+    <string name="settings_storage_subtitle_off">This site cannot save information to your phone</string>
 
-    <string name="permission_button_alwaysdeny">Never allow this site</string>
-    <string name="permission_button_allow">Allow</string>
-    <string name="permission_button_deny">Deny</string>
+    <string name="settings_location_title">Allow Location Detection</string>
+    <string name="settings_location_subtitle_on">This site can read your current location</string>
+    <string name="settings_location_subtitle_off">This site cannot read your current location</string>
 
-    <string name="shortcut_button_alwaysdeny">Never allow this shortcut</string>
+    <string name="settings_remove_site">Remove this site from Gears</string>
+    <string name="settings_empty">No permissions set</string>
+
+    <string name="settings_confirmation_remove_title">Remove this site</string>
+    <string name="settings_confirmation_remove">All permissions will be cleared, and any data stored on your phone by the site will be deleted.</string>
+
+    <string name="storage_notification">This site will store information on this phone.\n Change this setting in:\n Settings -> Gears Settings</string>
+    <string name="storage_notification_alwaysdeny">This site will never store information on this phone.\n Change this setting in:\n Settings -> Gears Settings</string>
+    <string name="location_notification">This site can access your current location.\n Change this setting in:\n Settings -> Gears Settings</string>
+    <string name="location_notification_alwaysdeny">This site will not access your current location.\n Change this setting in:\n Settings -> Gears Settings</string>
+    <string name="shortcut_notification">Shortcut created</string>
+
+    <string name="permission_button_alwaysdeny">Never Allow</string>
+    <string name="permission_button_allow">OK</string>
+    <string name="permission_button_deny">Cancel</string>
+
+    <string name="shortcut_button_alwaysdeny">Never Allow</string>
     <string name="shortcut_button_allow">OK</string>
     <string name="shortcut_button_deny">Cancel</string>
 
@@ -677,4 +697,7 @@
     <string name="unrecognized_dialog_message">Unrecognized dialog type</string>
     <string name="default_button">OK</string>
 
+    <!-- Zoom-related strings --><skip />
+    <!-- Caption for a button that is shown when the zoom widget is showing.  The button's action will switch to the zoom overview mode. -->
+    <string name="zoom_overview_button_text">Overview</string>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 1a5ee1f..f20220f 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -32,7 +32,7 @@
         <item name="android:textAppearance">?android:attr/textAppearanceLargeInverse</item>
         <item name="android:completionThreshold">2</item>
         <item name="android:dropDownSelector">@android:drawable/list_selector_background</item>
-        <item name="android:popupBackground">@android:drawable/editbox_dropdown_dark_frame</item>
+        <item name="android:popupBackground">@android:drawable/spinner_dropdown_background</item>
     </style>
 
     <style name="gears_button">
diff --git a/res/xml/browser_preferences.xml b/res/xml/browser_preferences.xml
index cd40322..fdfa839 100644
--- a/res/xml/browser_preferences.xml
+++ b/res/xml/browser_preferences.xml
@@ -67,6 +67,8 @@
         <com.android.browser.BrowserHomepagePreference
                 android:key="homepage" 
                 android:title="@string/pref_content_homepage"
+                android:hint="@string/http"
+                android:inputType="textUri"
                 android:singleLine="true" />
 
     </PreferenceCategory>
diff --git a/res/xml/searchable.xml b/res/xml/searchable.xml
index c94f0f3..bb578c6 100644
--- a/res/xml/searchable.xml
+++ b/res/xml/searchable.xml
@@ -23,7 +23,9 @@
     android:hint="@string/search_hint"
     android:searchButtonText="@string/search_button_text"
     android:searchMode="queryRewriteFromData"
+    android:voiceSearchMode="showVoiceSearchButton|launchWebSearch"
     android:inputType="textUri"
+    android:imeOptions="actionGo"
     
     android:searchSuggestAuthority="browser"
     android:searchSuggestSelection="url LIKE ?"
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index ea65a46..cf3fe70 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -48,8 +48,8 @@
     private Bundle      mMap;
     
     private static final String[]   mProjection = 
-        { "_id", "url", "bookmark", "created", "title" };
-    private static final String     WHERE_CLAUSE = "url = ? AND bookmark = 0";
+        { "_id", "url", "bookmark", "created", "title", "visits" };
+    private static final String     WHERE_CLAUSE = "url = ?";
     private final String[]          SELECTION_ARGS = new String[1];
 
     private View.OnClickListener mSaveBookmark = new View.OnClickListener() {
@@ -119,16 +119,13 @@
         boolean emptyTitle = title.length() == 0;
         boolean emptyUrl = unfilteredUrl.trim().length() == 0;
         Resources r = getResources();
-        if (emptyTitle) {
+        if (emptyTitle || emptyUrl) {
+            if (emptyTitle) {
+                mTitle.setError(r.getText(R.string.bookmark_needs_title));
+            }
             if (emptyUrl) {
-                setTitle(r.getText(R.string.empty_bookmark));
-                return false;
-            }    
-            setTitle(r.getText(R.string.bookmark_needs_title));
-            return false;
-        }
-        if (emptyUrl) {
-            setTitle(r.getText(R.string.bookmark_needs_url));
+                mAddress.setError(r.getText(R.string.bookmark_needs_url));
+            }
             return false;
         }
         String url = unfilteredUrl;
@@ -138,11 +135,11 @@
             try {
                 address = new WebAddress(unfilteredUrl);
             } catch (ParseException e) {
-                setTitle(r.getText(R.string.bookmark_url_not_valid));
+                mAddress.setError(r.getText(R.string.bookmark_url_not_valid));
                 return false;
             }
             if (address.mHost.length() == 0) {
-                setTitle(r.getText(R.string.bookmark_url_not_valid));
+                mAddress.setError(r.getText(R.string.bookmark_url_not_valid));
                 return false;
             }
             url = address.toString();
@@ -163,25 +160,58 @@
                         WHERE_CLAUSE,
                         SELECTION_ARGS,
                         null);
-                if (c.moveToFirst()) {
-                    // This means we have been to this site, so convert the 
-                    // history item to a bookmark.
-                    ContentValues map = new ContentValues();
+                ContentValues map = new ContentValues();
+                if (c.moveToFirst() && c.getInt(c.getColumnIndexOrThrow(
+                        Browser.BookmarkColumns.BOOKMARK)) == 0) {
+                    // This means we have been to this site but not bookmarked
+                    // it, so convert the history item to a bookmark                    
                     map.put(Browser.BookmarkColumns.CREATED, creationTime);
                     map.put(Browser.BookmarkColumns.TITLE, title);
                     map.put(Browser.BookmarkColumns.BOOKMARK, 1);
                     cr.update(Browser.BOOKMARKS_URI, map, 
                             "_id = " + c.getInt(0), null);
                 } else {
-                    // Adding a bookmark for a site the user has not been to.
-                    ContentValues map = new ContentValues();
-                    map.put(Browser.BookmarkColumns.TITLE, title);
-                    map.put(Browser.BookmarkColumns.URL, url);
-                    map.put(Browser.BookmarkColumns.CREATED, creationTime);
-                    map.put(Browser.BookmarkColumns.BOOKMARK, 1);
-                    map.put(Browser.BookmarkColumns.DATE, 0);
-                    map.put(Browser.BookmarkColumns.VISITS, 0);
-                    cr.insert(Browser.BOOKMARKS_URI, map);
+                    int count = c.getCount();
+                    boolean matchedTitle = false;
+                    for (int i = 0; i < count; i++) {
+                        // One or more bookmarks already exist for this site.
+                        // Check the names of each
+                        c.moveToPosition(i);
+                        if (c.getString(c.getColumnIndexOrThrow(
+                                Browser.BookmarkColumns.TITLE)).equals(title)) {
+                            // The old bookmark has the same name.
+                            // Update its creation time.
+                            map.put(Browser.BookmarkColumns.CREATED,
+                                    creationTime);
+                            cr.update(Browser.BOOKMARKS_URI, map, 
+                                    "_id = " + c.getInt(0), null);
+                            matchedTitle = true;
+                        }
+                    }
+                    if (!matchedTitle) {
+                        // Adding a bookmark for a site the user has visited,
+                        // or a new bookmark (with a different name) for a site
+                        // the user has visited
+                        map.put(Browser.BookmarkColumns.TITLE, title);
+                        map.put(Browser.BookmarkColumns.URL, url);
+                        map.put(Browser.BookmarkColumns.CREATED, creationTime);
+                        map.put(Browser.BookmarkColumns.BOOKMARK, 1);
+                        map.put(Browser.BookmarkColumns.DATE, 0);
+                        int visits = 0;
+                        if (count > 0) {
+                            // The user has already bookmarked, and possibly
+                            // visited this site.  However, they are creating
+                            // a new bookmark with the same url but a different
+                            // name.  The new bookmark should have the same
+                            // number of visits as the already created bookmark.
+                            visits = c.getInt(c.getColumnIndexOrThrow(
+                                    Browser.BookmarkColumns.VISITS));
+                        }
+                        // Bookmark starts with 3 extra visits so that it will
+                        // bubble up in the most visited and goto search box
+                        map.put(Browser.BookmarkColumns.VISITS, visits + 3);
+                        cr.insert(Browser.BOOKMARKS_URI, map);
+                    }
                 }
                 WebIconDatabase.getInstance().retainIconForPageUrl(url);
                 c.deactivate();
diff --git a/src/com/android/browser/AddNewBookmark.java b/src/com/android/browser/AddNewBookmark.java
index 748c9c2..a75d002 100644
--- a/src/com/android/browser/AddNewBookmark.java
+++ b/src/com/android/browser/AddNewBookmark.java
@@ -63,10 +63,6 @@
      *  @param url  The new url for the bookmark item.
      */
     /* package */ void setUrl(String url) {
-        if (url.length() > BrowserSettings.MAX_TEXTVIEW_LEN) {
-            mUrlText.setText(url.substring(0, BrowserSettings.MAX_TEXTVIEW_LEN));
-        } else {
-            mUrlText.setText(url);
-        }
+        mUrlText.setText(url);
     }
 }
diff --git a/src/com/android/browser/BookmarkItem.java b/src/com/android/browser/BookmarkItem.java
index 0015eaf..a70dd4f 100644
--- a/src/com/android/browser/BookmarkItem.java
+++ b/src/com/android/browser/BookmarkItem.java
@@ -19,19 +19,20 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.view.LayoutInflater;
+import android.view.View;
 import android.widget.ImageView;
-import android.widget.RelativeLayout;
+import android.widget.LinearLayout;
 import android.widget.TextView;
 
 /**
  *  Custom layout for an item representing a bookmark in the browser.
  */
-class BookmarkItem extends RelativeLayout {
+class BookmarkItem extends LinearLayout {
 
-    private TextView    mTextView;
-    private TextView    mUrlText;
-    private ImageView   mImageView;
-    private LayoutInflater mFactory;
+    protected TextView    mTextView;
+    protected TextView    mUrlText;
+    protected ImageView   mImageView;
+    protected String      mUrl;
 
     /**
      *  Instantiate a bookmark item, including a default favicon.
@@ -41,11 +42,13 @@
     BookmarkItem(Context context) {
         super(context);
 
-        mFactory = LayoutInflater.from(context);
-        mFactory.inflate(R.layout.bookmark_item, this);
+        LayoutInflater factory = LayoutInflater.from(context);
+        factory.inflate(R.layout.history_item, this);
         mTextView = (TextView) findViewById(R.id.title);
         mUrlText = (TextView) findViewById(R.id.url);
         mImageView = (ImageView) findViewById(R.id.favicon);
+        View star = findViewById(R.id.star);
+        star.setVisibility(View.GONE);
     }
 
     /**
@@ -61,8 +64,8 @@
     /**
      * Return the name assigned to this bookmark item.
      */
-    /* package */ CharSequence getName() {
-        return mTextView.getText();
+    /* package */ String getName() {
+        return mTextView.getText().toString();
     }
 
     /**
@@ -72,6 +75,10 @@
         return mTextView;
     }
 
+    /* package */ String getUrl() {
+        return mUrl;
+    }
+
     /**
      *  Set the favicon for this item.
      *
@@ -101,5 +108,6 @@
      */
     /* package */ void setUrl(String url) {
         mUrlText.setText(url);
+        mUrl = url;
     }
 }
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 789babe..e018eb4 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -16,26 +16,28 @@
 
 package com.android.browser;
 
+import com.google.android.googleapps.IGoogleLoginService;
+import com.google.android.googlelogin.GoogleLoginServiceConstants;
+
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.AlertDialog;
-import android.app.SearchManager;
 import android.app.ProgressDialog;
+import android.app.SearchManager;
 import android.content.ActivityNotFoundException;
-import android.content.res.AssetManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.DialogInterface.OnCancelListener;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
-import android.content.pm.ActivityInfo;
+import android.content.DialogInterface.OnCancelListener;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.content.res.AssetManager;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.database.Cursor;
@@ -54,10 +56,10 @@
 import android.graphics.drawable.PaintDrawable;
 import android.hardware.SensorListener;
 import android.hardware.SensorManager;
+import android.net.ConnectivityManager;
 import android.net.Uri;
 import android.net.WebAddress;
 import android.net.http.EventHandler;
-import android.net.http.RequestQueue;
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.os.AsyncTask;
@@ -75,10 +77,10 @@
 import android.os.SystemProperties;
 import android.preference.PreferenceManager;
 import android.provider.Browser;
-import android.provider.Contacts.Intents.Insert;
 import android.provider.Contacts;
 import android.provider.Downloads;
 import android.provider.MediaStore;
+import android.provider.Contacts.Intents.Insert;
 import android.text.IClipboard;
 import android.text.TextUtils;
 import android.text.format.DateFormat;
@@ -86,8 +88,6 @@
 import android.util.Config;
 import android.util.Log;
 import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.MenuItem.OnMenuItemClickListener;
 import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -97,6 +97,9 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.view.WindowManager;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.MenuItem.OnMenuItemClickListener;
 import android.view.animation.AlphaAnimation;
 import android.view.animation.Animation;
 import android.view.animation.AnimationSet;
@@ -120,16 +123,14 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.google.android.googleapps.IGoogleLoginService;
-import com.google.android.googlelogin.GoogleLoginServiceConstants;
-
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.InputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.MalformedURLException;
+import java.net.URI;
 import java.net.URL;
 import java.net.URLEncoder;
 import java.text.ParseException;
@@ -138,9 +139,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Vector;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import java.util.Vector;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
@@ -202,7 +203,7 @@
                     if (googleUser == null || !hostedUser.equals(googleUser)) {
                         String domain = hostedUser.substring(hostedUser.lastIndexOf('@')+1);
                         homepage = "http://www.google.com/m/a/" + domain + "?client=ms-" +
-                            SystemProperties.get("ro.com.google.clientid", "unknown");
+                            SystemProperties.get("persist.sys.com.google.clientid", "unknown");
                     }
                 } catch (RemoteException ignore) {
                     // Login service died; carry on
@@ -685,9 +686,11 @@
             // If the intent is ACTION_VIEW and data is not null, the Browser is
             // invoked to view the content by another application. In this case,
             // the tab will be close when exit.
+            String url = getUrlFromIntent(intent);
             final TabControl.Tab t = mTabControl.createNewTab(
                     Intent.ACTION_VIEW.equals(intent.getAction()) &&
-                    intent.getData() != null);
+                    intent.getData() != null,
+                    intent.getStringExtra(Browser.EXTRA_APPLICATION_ID), url);
             mTabControl.setCurrentTab(t);
             // This is one of the only places we call attachTabToContentView
             // without animating from the tab picker.
@@ -709,7 +712,6 @@
             }
             copyPlugins(true);
 
-            String url = getUrlFromIntent(intent);
             if (url == null || url.length() == 0) {
                 if (mSettings.isLoginInitialized()) {
                     webView.loadUrl(mSettings.getHomePage());
@@ -730,19 +732,18 @@
            http stack */
         mNetworkStateChangedFilter = new IntentFilter();
         mNetworkStateChangedFilter.addAction(
-                RequestQueue.HTTP_NETWORK_STATE_CHANGED_INTENT);
+                ConnectivityManager.CONNECTIVITY_ACTION);
         mNetworkStateIntentReceiver = new BroadcastReceiver() {
                 @Override
                 public void onReceive(Context context, Intent intent) {
                     if (intent.getAction().equals(
-                            RequestQueue.HTTP_NETWORK_STATE_CHANGED_INTENT)) {
-                        Boolean up = (Boolean)intent.getExtra(
-                                RequestQueue.HTTP_NETWORK_STATE_UP);
-                        onNetworkToggle(up);
+                            ConnectivityManager.CONNECTIVITY_ACTION)) {
+                        boolean down = intent.getBooleanExtra(
+                                ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
+                        onNetworkToggle(!down);
                     }
                 }
             };
-        setRequestedOrientation(mSettings.getOrientation());
     }
 
     @Override
@@ -778,11 +779,44 @@
             }
             if (Intent.ACTION_VIEW.equals(action) &&
                     (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
+                final String appId =
+                        intent.getStringExtra(Browser.EXTRA_APPLICATION_ID);
+                final TabControl.Tab appTab = mTabControl.getTabFromId(appId);
+                if (appTab != null) {
+                    Log.i(LOGTAG, "Reusing tab for " + appId);
+                    // Dismiss the subwindow if applicable.
+                    dismissSubWindow(appTab);
+                    // Since we might kill the WebView, remove it from the
+                    // content view first.
+                    removeTabFromContentView(appTab);
+                    // Recreate the main WebView after destroying the old one.
+                    // If the WebView has the same original url and is on that
+                    // page, it can be reused.
+                    boolean needsLoad =
+                            mTabControl.recreateWebView(appTab, url);
+                    if (current != appTab) {
+                        showTab(appTab, needsLoad ? url : null);
+                    } else {
+                        if (mTabOverview != null && mAnimationCount == 0) {
+                            sendAnimateFromOverview(appTab, false,
+                                    needsLoad ? url : null, TAB_OVERVIEW_DELAY,
+                                    null);
+                        } else {
+                            // If the tab was the current tab, we have to attach
+                            // it to the view system again.
+                            attachTabToContentView(appTab);
+                            if (needsLoad) {
+                                appTab.getWebView().loadUrl(url);
+                            }
+                        }
+                    }
+                    return;
+                }
                 // if FLAG_ACTIVITY_BROUGHT_TO_FRONT flag is on, the url will be
                 // opened in a new tab unless we have reached MAX_TABS. Then the
                 // url will be opened in the current tab. If a new tab is
                 // created, it will have "true" for exit on close.
-                openTabAndShow(url, null, true);
+                openTabAndShow(url, null, true, appId);
             } else {
                 if ("about:debug".equals(url)) {
                     mSettings.toggleDebugSettings();
@@ -1289,13 +1323,12 @@
     }
 
     /**
-     * Overriding this forces the search key to launch global search.  The difference
-     * is the final "true" which requests global search.
+     * Overriding this to insert a local information bundle
      */
     @Override
     public boolean onSearchRequested() {
         startSearch(null, false,
-                createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHKEY), true);
+                createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHKEY), false);
         return true;
     }
 
@@ -1324,19 +1357,13 @@
                 }
                 break;
 
-            case R.id.search_menu_id:
-                // launch using "global" search, which will bring up the Google search box
-                startSearch(null, false,
-                        createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHMENU), true);
-                break;
-
             case R.id.bookmarks_menu_id:
-                bookmarksPicker();
+                bookmarksOrHistoryPicker(false);
                 break;
 
             case R.id.windows_menu_id:
                 if (mTabControl.getTabCount() == 1) {
-                    openTabAndShow(mSettings.getHomePage(), null, false);
+                    openTabAndShow(mSettings.getHomePage(), null, false, null);
                 } else {
                     tabPicker(true, mTabControl.getCurrentIndex(), false);
                 }
@@ -1412,12 +1439,7 @@
                 break;
 
             case R.id.classic_history_menu_id:
-                loadHistory();
-                break;
-
-            case R.id.bookmark_page_menu_id:
-                Browser.saveBookmark(this, getTopWindow().getTitle(),
-                        getTopWindow().getUrl());
+                bookmarksOrHistoryPicker(true);
                 break;
 
             case R.id.share_page_menu_id:
@@ -1428,12 +1450,6 @@
                 getTopWindow().debugDump();
                 break;
 
-            case R.id.zoom_menu_id:
-                // FIXME: Can we move this out of WebView? How does this work
-                // for a subwindow?
-                getTopWindow().invokeZoomPicker();
-                break;
-
             case R.id.zoom_in_menu_id:
                 getTopWindow().zoomIn();
                 break;
@@ -1446,18 +1462,6 @@
                 viewDownloads(null);
                 break;
 
-            case R.id.flip_orientation_menu_id:
-                if (mSettings.getOrientation() !=
-                        ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
-                    mSettings.setOrientation(this,
-                            ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
-                } else {
-                    mSettings.setOrientation(this,
-                            ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
-                }
-                setRequestedOrientation(mSettings.getOrientation());
-                break;
-
             // -- Tab menu
             case R.id.view_tab_menu_id:
                 if (mTabListener != null && mTabOverview != null) {
@@ -1499,17 +1503,12 @@
                 }
                 break;
 
-            case R.id.history_tab_menu_id: {
-                    Intent i = new Intent(this, BrowserHistoryPage.class);
-                    i.putExtra("maxTabsOpen",
-                            mTabControl.getTabCount() >=
-                            TabControl.MAX_TABS);
-                    startActivityForResult(i, CLASSIC_HISTORY_PAGE);
-                }
+            case R.id.history_tab_menu_id:
+                bookmarksOrHistoryPicker(true);
                 break;
 
             case R.id.bookmarks_tab_menu_id:
-                bookmarksPicker();
+                bookmarksOrHistoryPicker(false);
                 break;
 
             case R.id.properties_tab_menu_id:
@@ -1570,6 +1569,7 @@
                 if (mCurrentMenuState != mMenuState) {
                     menu.setGroupVisible(R.id.MAIN_MENU, false);
                     menu.setGroupEnabled(R.id.MAIN_MENU, false);
+                    menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false);
                     menu.setGroupVisible(R.id.TAB_MENU, true);
                     menu.setGroupEnabled(R.id.TAB_MENU, true);
                 }
@@ -1582,6 +1582,7 @@
                 if (mCurrentMenuState != mMenuState) {
                     menu.setGroupVisible(R.id.MAIN_MENU, false);
                     menu.setGroupEnabled(R.id.MAIN_MENU, false);
+                    menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false);
                     menu.setGroupVisible(R.id.TAB_MENU, false);
                     menu.setGroupEnabled(R.id.TAB_MENU, false);
                 }
@@ -1590,47 +1591,34 @@
                 if (mCurrentMenuState != mMenuState) {
                     menu.setGroupVisible(R.id.MAIN_MENU, true);
                     menu.setGroupEnabled(R.id.MAIN_MENU, true);
+                    menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, true);
                     menu.setGroupVisible(R.id.TAB_MENU, false);
                     menu.setGroupEnabled(R.id.TAB_MENU, false);
                 }
                 final WebView w = getTopWindow();
-                boolean canGoBack = w.canGoBack();
+                boolean canGoBack = false;
+                boolean canGoForward = false;
+                boolean isHome = false;
+                if (w != null) {
+                    canGoBack = w.canGoBack();
+                    canGoForward = w.canGoForward();
+                    isHome = mSettings.getHomePage().equals(w.getUrl());
+                }
                 final MenuItem back = menu.findItem(R.id.back_menu_id);
-                back.setVisible(canGoBack);
                 back.setEnabled(canGoBack);
-                final MenuItem flip =
-                        menu.findItem(R.id.flip_orientation_menu_id);
-                boolean keyboardClosed =
-                        getResources().getConfiguration().hardKeyboardHidden ==
-                        Configuration.HARDKEYBOARDHIDDEN_YES;
-                flip.setEnabled(keyboardClosed);
 
-                boolean isHome = mSettings.getHomePage().equals(w.getUrl());
                 final MenuItem home = menu.findItem(R.id.homepage_menu_id);
-                home.setVisible(!isHome);
                 home.setEnabled(!isHome);
 
                 menu.findItem(R.id.forward_menu_id)
-                        .setEnabled(w.canGoForward());
-
-                menu.findItem(R.id.zoom_in_menu_id).setVisible(false);
-                menu.findItem(R.id.zoom_out_menu_id).setVisible(false);
+                        .setEnabled(canGoForward);
 
                 // decide whether to show the share link option
                 PackageManager pm = getPackageManager();
                 Intent send = new Intent(Intent.ACTION_SEND);
                 send.setType("text/plain");
-                List<ResolveInfo> list = pm.queryIntentActivities(send,
-                        PackageManager.MATCH_DEFAULT_ONLY);
-                menu.findItem(R.id.share_page_menu_id).setVisible(
-                        list.size() > 0);
-
-                // Hide the menu+<window number> items
-                // Can't set visibility in menu xml file b/c when a
-                // group is set visible, all items are set visible.
-                for (int i = 0; i < WINDOW_SHORTCUT_ID_ARRAY.length; i++) {
-                    menu.findItem(WINDOW_SHORTCUT_ID_ARRAY[i]).setVisible(false);
-                }
+                ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY);
+                menu.findItem(R.id.share_page_menu_id).setVisible(ri != null);
 
                 // If there is only 1 window, the text will be "New window"
                 final MenuItem windows = menu.findItem(R.id.windows_menu_id);
@@ -1737,14 +1725,16 @@
                 PackageManager pm = getPackageManager();
                 Intent send = new Intent(Intent.ACTION_SEND);
                 send.setType("text/plain");
-                List<ResolveInfo> list = pm.queryIntentActivities(send,
-                        PackageManager.MATCH_DEFAULT_ONLY);
-                menu.findItem(R.id.share_link_context_menu_id).setVisible(
-                        list.size() > 0);
-                break;
-
+                ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY);
+                menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null);
+                if (type == WebView.HitTestResult.SRC_ANCHOR_TYPE) {
+                    break;
+                }
+                // otherwise fall through to handle image part
             case WebView.HitTestResult.IMAGE_TYPE:
-                menu.setHeaderTitle(extra);
+                if (type == WebView.HitTestResult.IMAGE_TYPE) {
+                    menu.setHeaderTitle(extra);
+                }
                 menu.findItem(R.id.view_image_context_menu_id).setIntent(
                         new Intent(Intent.ACTION_VIEW, Uri.parse(extra)));
                 menu.findItem(R.id.download_context_menu_id).
@@ -1757,22 +1747,11 @@
         }
     }
 
-    // Used by attachTabToContentView for the WebView's ZoomControl widget.
-    private static final FrameLayout.LayoutParams ZOOM_PARAMS =
-            new FrameLayout.LayoutParams(
-                    ViewGroup.LayoutParams.FILL_PARENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT,
-                    Gravity.BOTTOM);
-
     // Attach the given tab to the content view.
     private void attachTabToContentView(TabControl.Tab t) {
         final WebView main = t.getWebView();
         // Attach the main WebView.
         mContentView.addView(main, COVER_SCREEN_PARAMS);
-        // Attach the Zoom control widget and hide it.
-        final View zoom = main.getZoomControls();
-        mContentView.addView(zoom, ZOOM_PARAMS);
-        zoom.setVisibility(View.GONE);
         // Attach the sub window if necessary
         attachSubWindow(t);
         // Request focus on the top window.
@@ -1792,8 +1771,7 @@
 
     // Remove the given tab from the content view.
     private void removeTabFromContentView(TabControl.Tab t) {
-        // Remove the Zoom widget and the main WebView.
-        mContentView.removeView(t.getWebView().getZoomControls());
+        // Remove the main WebView.
         mContentView.removeView(t.getWebView());
         // Remove the sub window if it exists.
         if (t.getSubWebView() != null) {
@@ -1838,7 +1816,13 @@
         // Send the animate message.
         final HashMap map = new HashMap();
         map.put("view", view);
-        map.put("url", url);
+        // Load the url after the AnimatingView has captured the picture. This
+        // prevents any bad layout or bad scale from being used during
+        // animation.
+        if (url != null) {
+            dismissSubWindow(tab);
+            tab.getWebView().loadUrl(url);
+        }
         map.put("msg", msg);
         mHandler.sendMessageDelayed(mHandler.obtainMessage(
                 ANIMATE_FROM_OVERVIEW, newTab ? 1 : 0, 0, map), delay);
@@ -1858,6 +1842,10 @@
 
     // Called by TabControl when a tab is requesting focus
     /* package */ void showTab(TabControl.Tab t) {
+        showTab(t, null);
+    }
+
+    private void showTab(TabControl.Tab t, String url) {
         // Disallow focus change during a tab animation.
         if (mAnimationCount > 0) {
             return;
@@ -1869,7 +1857,7 @@
             delay = TAB_ANIMATION_DURATION + TAB_OVERVIEW_DELAY;
             tabPicker(false, mTabControl.getTabIndex(t), false);
         }
-        sendAnimateFromOverview(t, false, null, delay, null);
+        sendAnimateFromOverview(t, false, url, delay, null);
     }
 
     // This method does a ton of stuff. It will attempt to create a new tab
@@ -1881,7 +1869,7 @@
     // method is called from TabListener.onClick(), the method will animate
     // away from the tab overview.
     private void openTabAndShow(String url, final Message msg,
-            boolean closeOnExit) {
+            boolean closeOnExit, String appId) {
         final boolean newTab = mTabControl.getTabCount() != TabControl.MAX_TABS;
         final TabControl.Tab currentTab = mTabControl.getCurrentTab();
         if (newTab) {
@@ -1909,8 +1897,9 @@
                 }
                 // Animate from the Tab overview after any animations have
                 // finished.
-                sendAnimateFromOverview(mTabControl.createNewTab(closeOnExit),
-                        true, url, delay, msg);
+                sendAnimateFromOverview(
+                        mTabControl.createNewTab(closeOnExit, appId, url), true,
+                        url, delay, msg);
             }
         } else if (url != null) {
             // We should not have a msg here.
@@ -1987,15 +1976,17 @@
                             public void run() {
                                 // Remove the AnimatingView.
                                 mContentView.removeView(view);
-                                // Make newIndex visible.
-                                mTabOverview.setCurrentIndex(newIndex);
-                                // Restore the listener.
-                                mTabOverview.setListener(mTabListener);
-                                // Change the menu to TAB_MENU if the
-                                // ImageGrid is interactive.
-                                if (mTabOverview.isLive()) {
-                                    mMenuState = R.id.TAB_MENU;
-                                    mTabOverview.requestFocus();
+                                if (mTabOverview != null) {
+                                    // Make newIndex visible.
+                                    mTabOverview.setCurrentIndex(newIndex);
+                                    // Restore the listener.
+                                    mTabOverview.setListener(mTabListener);
+                                    // Change the menu to TAB_MENU if the
+                                    // ImageGrid is interactive.
+                                    if (mTabOverview.isLive()) {
+                                        mMenuState = R.id.TAB_MENU;
+                                        mTabOverview.requestFocus();
+                                    }
                                 }
                                 // If a remove was requested, remove the tab.
                                 if (remove) {
@@ -2013,10 +2004,12 @@
                                     if (currentTab != tab) {
                                         mTabControl.setCurrentTab(currentTab);
                                     }
-                                    mTabOverview.remove(newIndex);
-                                    // Make the current tab visible.
-                                    mTabOverview.setCurrentIndex(
-                                            mTabControl.getCurrentIndex());
+                                    if (mTabOverview != null) {
+                                        mTabOverview.remove(newIndex);
+                                        // Make the current tab visible.
+                                        mTabOverview.setCurrentIndex(
+                                                mTabControl.getCurrentIndex());
+                                    }
                                 }
                             }
                         });
@@ -2041,7 +2034,7 @@
     // Animate from the tab picker. The index supplied is the index to animate
     // from.
     private void animateFromTabOverview(final AnimatingView view,
-            final boolean newTab, final String url, final Message msg) {
+            final boolean newTab, final Message msg) {
         // firstVisible is the first visible tab on the screen.  This helps
         // to know which corner of the screen the selected tab is.
         int firstVisible = mTabOverview.getFirstVisiblePosition();
@@ -2063,7 +2056,7 @@
         // Find the view at this location.
         final View v = mTabOverview.getChildAt(location);
 
-        // Wait until the animation completes to load the url.
+        // Wait until the animation completes to replace the AnimatingView.
         final Animation.AnimationListener l =
                 new Animation.AnimationListener() {
                     public void onAnimationStart(Animation a) {}
@@ -2078,15 +2071,9 @@
                                 dismissTabOverview(v == null);
                                 TabControl.Tab t =
                                         mTabControl.getCurrentTab();
-                                WebView w = t.getWebView();
-                                if (url != null) {
-                                    // Dismiss the subwindow if one exists.
-                                    dismissSubWindow(t);
-                                    w.loadUrl(url);
-                                }
                                 mMenuState = R.id.MAIN_MENU;
                                 // Resume regular updates.
-                                w.resumeTimers();
+                                t.getWebView().resumeTimers();
                                 // Dispatch the message after the animation
                                 // completes.
                                 if (msg != null) {
@@ -2111,7 +2098,7 @@
             // Make the view VISIBLE during the animation.
             view.setVisibility(View.VISIBLE);
         } else {
-            // Go ahead and load the url.
+            // Go ahead and do all the cleanup.
             l.onAnimationEnd(null);
         }
     }
@@ -2126,7 +2113,12 @@
         }
         // Just in case there was a problem with animating away from the tab
         // overview
-        mTabControl.getCurrentWebView().setVisibility(View.VISIBLE);
+        WebView current = mTabControl.getCurrentWebView();
+        if (current != null) {
+            current.setVisibility(View.VISIBLE);
+        } else {
+            Log.e(LOGTAG, "No current WebView in dismissTabOverview");
+        }
         // Make the sub window container visible.
         if (mTabControl.getCurrentSubWindow() != null) {
             mTabControl.getCurrentTab().getSubWebViewContainer()
@@ -2140,12 +2132,12 @@
 
     private void openTab(String url) {
         if (mSettings.openInBackground()) {
-            TabControl.Tab t = mTabControl.createNewTab(false);
+            TabControl.Tab t = mTabControl.createNewTab();
             if (t != null) {
                 t.getWebView().loadUrl(url);
             }
         } else {
-            openTabAndShow(url, null, false);
+            openTabAndShow(url, null, false, null);
         }
     }
 
@@ -2218,8 +2210,6 @@
         }
         resetTitleAndIcon(current);
         int progress = current.getProgress();
-        mInLoad = (progress != 100);
-        updateInLoadMenuItems();
         mWebChromeClient.onProgressChanged(current, progress);
     }
 
@@ -2450,7 +2440,7 @@
                 return KeyTracker.State.DONE_TRACKING;
             }
             if (stage == KeyTracker.Stage.LONG_REPEAT) {
-                loadHistory();
+                bookmarksOrHistoryPicker(true);
                 return KeyTracker.State.DONE_TRACKING;
             } else if (stage == KeyTracker.Stage.UP) {
                 // FIXME: Currently, we do not have a notion of the
@@ -2522,13 +2512,6 @@
         }
     }
 
-    private void loadHistory() {
-        Intent intent = new Intent(this, BrowserHistoryPage.class);
-        intent.putExtra("maxTabsOpen",
-                mTabControl.getTabCount() >= TabControl.MAX_TABS);
-        startActivityForResult(intent, CLASSIC_HISTORY_PAGE);
-    }
-
     // called by a non-UI thread to post the message
     public void postMessage(int what, int arg1, int arg2, Object obj) {
         mHandler.sendMessage(mHandler.obtainMessage(what, arg1, arg2, obj));
@@ -2555,8 +2538,7 @@
                 case ANIMATE_FROM_OVERVIEW:
                     final HashMap map = (HashMap) msg.obj;
                     animateFromTabOverview((AnimatingView) map.get("view"),
-                            msg.arg1 == 1, (String) map.get("url"),
-                            (Message) map.get("msg"));
+                            msg.arg1 == 1, (Message) map.get("msg"));
                     break;
 
                 case ANIMATE_TO_OVERVIEW:
@@ -2569,7 +2551,7 @@
                     // the method relies on the value being 0 to start the next
                     // animation.
                     mAnimationCount--;
-                    openTabAndShow((String) msg.obj, null, false);
+                    openTabAndShow((String) msg.obj, null, false, null);
                     break;
 
                 case FOCUS_NODE_HREF:
@@ -2723,6 +2705,18 @@
 
             mInLoad = true;
             updateInLoadMenuItems();
+            if (!mIsNetworkUp) {
+                if ( mAlertDialog == null) {
+                    mAlertDialog = new AlertDialog.Builder(BrowserActivity.this)
+                        .setTitle(R.string.loadSuspendedTitle)
+                        .setMessage(R.string.loadSuspended)
+                        .setPositiveButton(R.string.ok, null)
+                        .show();
+                }
+                if (view != null) {
+                    view.setNetworkAvailable(false);
+                }
+            }
 
             // schedule to check memory condition
             mHandler.sendMessageDelayed(mHandler.obtainMessage(CHECK_MEMORY),
@@ -2739,7 +2733,7 @@
             updateLockIconImage(mLockIconType);
 
             // Performance probe
-             if (false) {
+            if (false) {
                 long[] sysCpu = new long[7];
                 if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null,
                         sysCpu, null)) {
@@ -2834,11 +2828,6 @@
                 }
             }
 
-            if (mInLoad) {
-                mInLoad = false;
-                updateInLoadMenuItems();
-            }
-
             mHandler.removeMessages(CHECK_MEMORY);
             checkMemory();
         }
@@ -3180,7 +3169,7 @@
                 // openTabAndShow will dispatch the message after creating the
                 // new WebView. This will prevent another request from coming
                 // in during the animation.
-                openTabAndShow(null, msg, false);
+                openTabAndShow(null, msg, false, null);
                 parent.addChildTab(mTabControl.getCurrentTab());
                 WebView.WebViewTransport transport =
                         (WebView.WebViewTransport) msg.obj;
@@ -3296,6 +3285,18 @@
                 // onPageFinished() is only called for the main frame. sync
                 // cookie and cache promptly here.
                 CookieSyncManager.getInstance().sync();
+                if (mInLoad) {
+                    mInLoad = false;
+                    updateInLoadMenuItems();
+                }
+            } else {
+                // onPageFinished may have already been called but a subframe
+                // is still loading and updating the progress. Reset mInLoad
+                // and update the menu items.
+                if (!mInLoad) {
+                    mInLoad = true;
+                    updateInLoadMenuItems();
+                }
             }
         }
 
@@ -3367,8 +3368,8 @@
             //     that matches.
             Intent intent = new Intent(Intent.ACTION_VIEW);
             intent.setDataAndType(Uri.parse(url), mimetype);
-            if (getPackageManager().queryIntentActivities(intent,
-                        PackageManager.MATCH_DEFAULT_ONLY).size() != 0) {
+            if (getPackageManager().resolveActivity(intent,
+                        PackageManager.MATCH_DEFAULT_ONLY) != null) {
                 // someone knows how to handle this mime type with this scheme, don't download.
                 try {
                     startActivity(intent);
@@ -3424,10 +3425,44 @@
             return;
         }
 
+        // java.net.URI is a lot stricter than KURL so we have to undo
+        // KURL's percent-encoding and redo the encoding using java.net.URI.
+        URI uri = null;
+        try {
+            // Undo the percent-encoding that KURL may have done.
+            String newUrl = new String(URLUtil.decode(url.getBytes()));
+            // Parse the url into pieces
+            WebAddress w = new WebAddress(newUrl);
+            String frag = null;
+            String query = null;
+            String path = w.mPath;
+            // Break the path into path, query, and fragment
+            if (path.length() > 0) {
+                // Strip the fragment
+                int idx = path.lastIndexOf('#');
+                if (idx != -1) {
+                    frag = path.substring(idx + 1);
+                    path = path.substring(0, idx);
+                }
+                idx = path.lastIndexOf('?');
+                if (idx != -1) {
+                    query = path.substring(idx + 1);
+                    path = path.substring(0, idx);
+                }
+            }
+            uri = new URI(w.mScheme, w.mAuthInfo, w.mHost, w.mPort, path,
+                    query, frag);
+        } catch (Exception e) {
+            Log.e(LOGTAG, "Could not parse url for download: " + url, e);
+            return;
+        }
+
+        // XXX: Have to use the old url since the cookies were stored using the
+        // old percent-encoded url.
         String cookies = CookieManager.getInstance().getCookie(url);
 
         ContentValues values = new ContentValues();
-        values.put(Downloads.COLUMN_URI, url);
+        values.put(Downloads.COLUMN_URI, uri.toString());
         values.put(Downloads.COLUMN_COOKIE_DATA, cookies);
         values.put(Downloads.COLUMN_USER_AGENT, userAgent);
         values.put(Downloads.COLUMN_NOTIFICATION_PACKAGE,
@@ -3437,7 +3472,7 @@
         values.put(Downloads.COLUMN_VISIBILITY, Downloads.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
         values.put(Downloads.COLUMN_MIME_TYPE, mimetype);
         values.put(Downloads.COLUMN_FILE_NAME_HINT, filename);
-        values.put(Downloads.COLUMN_DESCRIPTION, Uri.parse(url).getHost());
+        values.put(Downloads.COLUMN_DESCRIPTION, uri.getHost());
         if (contentLength > 0) {
             values.put(Downloads.COLUMN_TOTAL_BYTES, contentLength);
         }
@@ -3884,7 +3919,7 @@
         }
 
         mHttpAuthHandler = handler;
-        mHttpAuthenticationDialog = new AlertDialog.Builder(this)
+        AlertDialog dialog = new AlertDialog.Builder(this)
                 .setTitle(titleText)
                 .setIcon(android.R.drawable.ic_dialog_alert)
                 .setView(v)
@@ -3920,12 +3955,17 @@
                             mHttpAuthenticationDialog = null;
                             mHttpAuthHandler = null;
                         }})
-                .show();
+                .create();
+        // Make the IME appear when the dialog is displayed if applicable.
+        dialog.getWindow().setSoftInputMode(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+        dialog.show();
         if (focusId != 0) {
-            mHttpAuthenticationDialog.findViewById(focusId).requestFocus();
+            dialog.findViewById(focusId).requestFocus();
         } else {
             v.findViewById(R.id.username_edit).requestFocus();
         }
+        mHttpAuthenticationDialog = dialog;
     }
 
     public int getProgress() {
@@ -3956,16 +3996,20 @@
     }
 
     /**
-     * http stack says net has come or gone... inform the user
+     * connectivity manager says net has come or gone... inform the user
      * @param up true if net has come up, false if net has gone down
      */
     public void onNetworkToggle(boolean up) {
-        if (up) {
+        if (up == mIsNetworkUp) {
+            return;
+        } else if (up) {
+            mIsNetworkUp = true;
             if (mAlertDialog != null) {
                 mAlertDialog.cancel();
                 mAlertDialog = null;
             }
         } else {
+            mIsNetworkUp = false;
             if (mInLoad && mAlertDialog == null) {
                 mAlertDialog = new AlertDialog.Builder(this)
                         .setTitle(R.string.loadSuspendedTitle)
@@ -3984,8 +4028,7 @@
     protected void onActivityResult(int requestCode, int resultCode,
                                     Intent intent) {
         switch (requestCode) {
-            case BOOKMARKS_PAGE:
-            case CLASSIC_HISTORY_PAGE:
+            case COMBO_PAGE:
                 if (resultCode == RESULT_OK && intent != null) {
                     String data = intent.getAction();
                     Bundle extras = intent.getExtras();
@@ -4048,7 +4091,7 @@
                 // If the user removes the last tab, act like the New Tab item
                 // was clicked on.
                 if (mTabControl.getTabCount() == 0) {
-                    current = mTabControl.createNewTab(false);
+                    current = mTabControl.createNewTab();
                     sendAnimateFromOverview(current, true,
                             mSettings.getHomePage(), TAB_OVERVIEW_DELAY, null);
                 } else {
@@ -4088,7 +4131,7 @@
 
             // NEW_TAB means that the "New Tab" cell was clicked on.
             if (index == ImageGrid.NEW_TAB) {
-                openTabAndShow(mSettings.getHomePage(), null, false);
+                openTabAndShow(mSettings.getHomePage(), null, false, null);
             } else {
                 sendAnimateFromOverview(mTabControl.getTab(index),
                         false, null, 0, null);
@@ -4202,13 +4245,13 @@
         mMenuState = EMPTY_MENU;
     }
 
-    private void bookmarksPicker() {
+    private void bookmarksOrHistoryPicker(boolean startWithHistory) {
         WebView current = mTabControl.getCurrentWebView();
         if (current == null) {
             return;
         }
         Intent intent = new Intent(this,
-                BrowserBookmarksPage.class);
+                CombinedBookmarkHistoryActivity.class);
         String title = current.getTitle();
         String url = current.getUrl();
         // Just in case the user opens bookmarks before a page finishes loading
@@ -4228,7 +4271,11 @@
         intent.putExtra("url", url);
         intent.putExtra("maxTabsOpen",
                 mTabControl.getTabCount() >= TabControl.MAX_TABS);
-        startActivityForResult(intent, BOOKMARKS_PAGE);
+        if (startWithHistory) {
+            intent.putExtra(CombinedBookmarkHistoryActivity.STARTING_TAB,
+                    CombinedBookmarkHistoryActivity.HISTORY_TAB);
+        }
+        startActivityForResult(intent, COMBO_PAGE);
     }
 
     // Called when loading from context menu or LOAD_URL message
@@ -4351,7 +4398,7 @@
         return composeSearchUrl(inUrl);
     }
 
-    /* package */static String composeSearchUrl(String search) {
+    /* package */ String composeSearchUrl(String search) {
         return URLUtil.composeSearchUrl(search, QuickSearch_G,
                 QUERY_PLACE_HOLDER);
     }
@@ -4376,7 +4423,7 @@
                     R.string.google_search_base, l.getLanguage(),
                     l.getCountry().toLowerCase())
                     + "client=ms-"
-                    + SystemProperties.get("ro.com.google.clientid", "unknown")
+                    + SystemProperties.get("persist.sys.com.google.clientid", "unknown")
                     + "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&q=%s";
         } else {
             QuickSearch_G = url;
@@ -4409,6 +4456,7 @@
     boolean mCanChord;
 
     private boolean mInLoad;
+    private boolean mIsNetworkUp;
 
     private boolean mPageStarted;
     private boolean mActivityInPause = true;
@@ -4503,8 +4551,6 @@
 
     // "source" parameter for Google search through search key
     final static String GOOGLE_SEARCH_SOURCE_SEARCHKEY = "browser-key";
-    // "source" parameter for Google search through search menu
-    final static String GOOGLE_SEARCH_SOURCE_SEARCHMENU = "browser-menu";
     // "source" parameter for Google search through goto menu
     final static String GOOGLE_SEARCH_SOURCE_GOTO = "browser-goto";
     // "source" parameter for Google search through simplily type
@@ -4543,10 +4589,9 @@
     private BroadcastReceiver mNetworkStateIntentReceiver;
 
     // activity requestCode
-    final static int BOOKMARKS_PAGE         = 1;
-    final static int CLASSIC_HISTORY_PAGE   = 2;
-    final static int DOWNLOAD_PAGE          = 3;
-    final static int PREFERENCES_PAGE       = 4;
+    final static int COMBO_PAGE             = 1;
+    final static int DOWNLOAD_PAGE          = 2;
+    final static int PREFERENCES_PAGE       = 3;
 
     // the frenquency of checking whether system memory is low
     final static int CHECK_MEMORY_INTERVAL = 30000;     // 30 seconds
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 5c509a8..a7d45f9 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -162,7 +162,7 @@
         }
 
         mBookmarksAdapter = new BrowserBookmarksAdapter(this, 
-                getIntent().getStringExtra("title"), mCreateShortcut);
+                getIntent().getStringExtra("url"), mCreateShortcut);
         mMaxTabsOpen = getIntent().getBooleanExtra("maxTabsOpen", false);
 
         ListView listView = (ListView) findViewById(R.id.list);
@@ -204,7 +204,7 @@
             } else {
                 final Intent intent = createShortcutIntent(getUrl(position),
                         getBookmarkTitle(position));
-                setResult(RESULT_OK, intent);
+                setResultToParent(RESULT_OK, intent);
                 finish();
             }
         }
@@ -212,8 +212,13 @@
 
     private Intent createShortcutIntent(String url, String title) {
         final Intent i = new Intent();
-        i.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_VIEW,
-                    Uri.parse(url)));
+        final Intent shortcutIntent = new Intent(Intent.ACTION_VIEW,
+                Uri.parse(url));
+        long urlHash = url.hashCode();
+        long uniqueId = (urlHash << 32) | shortcutIntent.hashCode();
+        shortcutIntent.putExtra(Browser.EXTRA_APPLICATION_ID,
+                Long.toString(uniqueId));
+        i.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
         i.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
         i.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
                 Intent.ShortcutIconResource.fromContext(BrowserBookmarksPage.this,
@@ -231,7 +236,8 @@
     }
 
     private void loadUrl(int position) {
-        setResult(RESULT_OK, (new Intent()).setAction(getUrl(position)));
+        Intent intent = (new Intent()).setAction(getUrl(position));
+        setResultToParent(RESULT_OK, intent);
         finish();
     }
 
@@ -262,7 +268,7 @@
     private void openInNewWindow(int position) {
         Bundle b = new Bundle();
         b.putBoolean("new_window", true);
-        setResult(RESULT_OK,
+        setResultToParent(RESULT_OK,
                 (new Intent()).setAction(getUrl(position)).putExtras(b));
 
         finish();
@@ -367,9 +373,18 @@
     
     public boolean dispatchKeyEvent(KeyEvent event) {    
         if (event.getKeyCode() ==  KeyEvent.KEYCODE_BACK && event.isDown()) {
-            setResult(RESULT_CANCELED);
+            setResultToParent(RESULT_CANCELED, null);
             mCanceled = true;
         }
         return super.dispatchKeyEvent(event);
     }
+
+    // This Activity is generally a sub-Activity of CombinedHistoryActivity. In
+    // that situation, we need to pass our result code up to our parent.
+    // However, if someone calls this Activity directly, then this has no
+    // parent, and it needs to set it on itself.
+    private void setResultToParent(int resultCode, Intent data) {
+        Activity a = getParent() == null ? this : getParent();
+        a.setResult(resultCode, data);
+    }
 }
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index 3059126..42ca848 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -16,14 +16,17 @@
 
 package com.android.browser;
 
-import android.app.ListActivity;
+import android.app.Activity;
+import android.app.ExpandableListActivity;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.database.ContentObserver;
 import android.database.Cursor;
 import android.database.DataSetObserver;
 import android.graphics.Bitmap;
 import android.os.Bundle;
+import android.os.Handler;
 import android.os.ServiceManager;
 import android.provider.Browser;
 import android.text.IClipboard;
@@ -41,11 +44,11 @@
 import android.webkit.DateSorter;
 import android.webkit.WebIconDatabase.IconListener;
 import android.widget.AdapterView;
-import android.widget.ListAdapter;
-import android.widget.ListView;
+import android.widget.ExpandableListAdapter;
+import android.widget.ExpandableListView;
+import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
 import android.widget.TextView;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Vector;
 
@@ -53,22 +56,16 @@
  * Activity for displaying the browser's history, divided into
  * days of viewing.
  */
-public class BrowserHistoryPage extends ListActivity {
+public class BrowserHistoryPage extends ExpandableListActivity {
     private HistoryAdapter          mAdapter;
     private DateSorter              mDateSorter;
     private boolean                 mMaxTabsOpen;
 
     private final static String LOGTAG = "browser";
 
-    // FIXME: Make this a part of Browser so we do not have more than one
-    // copy (other copy is in BrowserBookmarksAdapter).
-    // Used to store favicons as we get them from the database
-    private final HashMap<String, Bitmap> mUrlsToIcons =
-            new HashMap<String, Bitmap>();
     // Implementation of WebIconDatabase.IconListener
     private class IconReceiver implements IconListener {
         public void onReceivedIcon(String url, Bitmap icon) {
-            mUrlsToIcons.put(url, icon);
             setListAdapter(mAdapter);
         }
     }
@@ -87,7 +84,7 @@
             b.putBoolean("new_window", true);
             intent.putExtras(b);
         }
-        setResult(RESULT_OK, intent);
+        setResultToParent(RESULT_OK, intent);
         finish();
     }
     
@@ -111,20 +108,32 @@
 
         mAdapter = new HistoryAdapter();
         setListAdapter(mAdapter);
-        ListView list = getListView();
+        final ExpandableListView list = getExpandableListView();
         list.setOnCreateContextMenuListener(this);
         LayoutInflater factory = LayoutInflater.from(this);
         View v = factory.inflate(R.layout.empty_history, null);
         addContentView(v, new LayoutParams(LayoutParams.FILL_PARENT,
                 LayoutParams.FILL_PARENT));
         list.setEmptyView(v);
-
+        // Do not post the runnable if there is nothing in the list.
+        if (list.getExpandableListAdapter().getGroupCount() > 0) {
+            list.post(new Runnable() {
+                public void run() {
+                    // In case the history gets cleared before this event
+                    // happens.
+                    if (list.getExpandableListAdapter().getGroupCount() > 0) {
+                        list.expandGroup(0);
+                    }
+                }
+            });
+        }
         mMaxTabsOpen = getIntent().getBooleanExtra("maxTabsOpen", false);
-        Browser.requestAllIcons(getContentResolver(), null, mIconReceiver);
+        CombinedBookmarkHistoryActivity.getIconListenerSet(getContentResolver())
+                .addListener(mIconReceiver);
         
         // initialize the result to canceled, so that if the user just presses
         // back then it will have the correct result
-        setResult(RESULT_CANCELED);
+        setResultToParent(RESULT_CANCELED, null);
     }
 
     @Override
@@ -160,9 +169,12 @@
     @Override
     public void onCreateContextMenu(ContextMenu menu, View v,
             ContextMenuInfo menuInfo) {
-        AdapterView.AdapterContextMenuInfo i = 
-            (AdapterView.AdapterContextMenuInfo)
-            menuInfo;
+        ExpandableListContextMenuInfo i = 
+            (ExpandableListContextMenuInfo) menuInfo;
+        // Do not allow a context menu to come up from the group views.
+        if (!(i.targetView instanceof HistoryItem)) {
+            return;
+        }
 
         // Inflate the menu
         MenuInflater inflater = getMenuInflater();
@@ -174,22 +186,20 @@
         // Only show open in new tab if we have not maxed out available tabs
         menu.findItem(R.id.new_window_context_menu_id).setVisible(!mMaxTabsOpen);
         
-     // decide whether to show the share link option
+        // decide whether to show the share link option
         PackageManager pm = getPackageManager();
         Intent send = new Intent(Intent.ACTION_SEND);
         send.setType("text/plain");
-        List<ResolveInfo> list = pm.queryIntentActivities(send,
-                PackageManager.MATCH_DEFAULT_ONLY);
-        menu.findItem(R.id.share_link_context_menu_id).setVisible(
-                list.size() > 0);
+        ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY);
+        menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null);
         
         super.onCreateContextMenu(menu, v, menuInfo);
     }
     
     @Override
     public boolean onContextItemSelected(MenuItem item) {
-        AdapterView.AdapterContextMenuInfo i = 
-            (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
+        ExpandableListContextMenuInfo i = 
+            (ExpandableListContextMenuInfo) item.getMenuInfo();
         String url = ((HistoryItem)i.targetView).getUrl();
         String title = ((HistoryItem)i.targetView).getName();
         switch (item.getItemId()) {
@@ -219,17 +229,48 @@
     }
     
     @Override
-    protected void onListItemClick(ListView l, View v, int position, long id) {
+    public boolean onChildClick(ExpandableListView parent, View v,
+            int groupPosition, int childPosition, long id) {
         if (v instanceof HistoryItem) {
             loadUrl(((HistoryItem) v).getUrl(), false);
+            return true;
         }
+        return false;
     }
 
-    private class HistoryAdapter implements ListAdapter {
+    // This Activity is generally a sub-Activity of CombinedHistoryActivity. In
+    // that situation, we need to pass our result code up to our parent.
+    // However, if someone calls this Activity directly, then this has no
+    // parent, and it needs to set it on itself.
+    private void setResultToParent(int resultCode, Intent data) {
+        Activity a = getParent() == null ? this : getParent();
+        a.setResult(resultCode, data);
+    }
+
+    private class ChangeObserver extends ContentObserver {
+        public ChangeObserver() {
+            super(new Handler());
+        }
+
+        @Override
+        public boolean deliverSelfNotifications() {
+            return true;
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            mAdapter.refreshData();
+        }
+    }
+    
+    private class HistoryAdapter implements ExpandableListAdapter {
         
-        // Map of items. Negative values are labels, positive values
-        // and zero are cursor offsets.
+        // Array for each of our bins.  Each entry represents how many items are
+        // in that bin.
         int mItemMap[];
+        // This is our GroupCount.  We will have at most DateSorter.DAY_COUNT
+        // bins, less if the user has no items in one or more bins.
+        int mNumberOfBins;
         Vector<DataSetObserver> mObservers;
         Cursor mCursor;
         
@@ -245,6 +286,7 @@
                     whereClause, null, orderBy);
             
             buildMap();
+            mCursor.registerContentObserver(new ChangeObserver());
         }
         
         void refreshData() {
@@ -255,107 +297,140 @@
             }
         }
         
-        public void buildMap() {
+        private void buildMap() {
             // The cursor is sorted by date
-            // Make one pass to build up the ItemMap with the inserted 
-            // section separators. 
-            int array[] = new int[mCursor.getCount() + DateSorter.DAY_COUNT];
+            // The ItemMap will store the number of items in each bin.
+            int array[] = new int[DateSorter.DAY_COUNT];
+            // Zero out the array.
+            for (int j = 0; j < DateSorter.DAY_COUNT; j++) {
+                array[j] = 0;
+            }
+            mNumberOfBins = 0;
             int dateIndex = -1;
             if (mCursor.moveToFirst() && mCursor.getCount() > 0) {
-                int itemIndex = 0;
                 while (!mCursor.isAfterLast()) {
                     long date = mCursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX);
                     int index = mDateSorter.getIndex(date);
                     if (index > dateIndex) {
+                        mNumberOfBins++;
+                        if (index == DateSorter.DAY_COUNT - 1) {
+                            // We are already in the last bin, so it will
+                            // include all the remaining items
+                            array[index] = mCursor.getCount()
+                                    - mCursor.getPosition();
+                            break;
+                        }
                         dateIndex = index;
-                        array[itemIndex] = dateIndex - DateSorter.DAY_COUNT;
-                        itemIndex++;
                     }
-                    array[itemIndex] = mCursor.getPosition();
-                    itemIndex++;
+                    array[dateIndex]++;
                     mCursor.moveToNext();
                 }
-            } else {
-                // The db is empty, just add the heading for the first item
-                dateIndex = 0;
-                array[0] = dateIndex - DateSorter.DAY_COUNT;
             }
-            // Compress the array as the trailing date sections may be
-            // empty
-            int extraEntries = DateSorter.DAY_COUNT - dateIndex - 1;
-            if (extraEntries > 0) {
-                int newArraySize = array.length - extraEntries;
-                mItemMap = new int[newArraySize];
-                System.arraycopy(array, 0, mItemMap, 0, newArraySize);
-            } else {
-                mItemMap = array;
-            }
+            mItemMap = array;
         }
 
-        public View getView(int position, View convertView, ViewGroup parent) {
-            if (mItemMap[position] < 0) {
-                return getHeaderView(position, convertView);
+        // This translates from a group position in the Adapter to a position in
+        // our array.  This is necessary because some positions in the array
+        // have no history items, so we simply do not present those positions
+        // to the Adapter.
+        private int groupPositionToArrayPosition(int groupPosition) {
+            if (groupPosition < 0 || groupPosition >= DateSorter.DAY_COUNT) {
+                throw new AssertionError("group position out of range");
             }
-            return getHistoryItem(position, convertView);
+            if (DateSorter.DAY_COUNT == mNumberOfBins || 0 == mNumberOfBins) {
+                // In the first case, we have exactly the same number of bins
+                // as our maximum possible, so there is no need to do a
+                // conversion
+                // The second statement is in case this method gets called when
+                // the array is empty, in which case the provided groupPosition
+                // will do fine.
+                return groupPosition;
+            }
+            int arrayPosition = -1;
+            while (groupPosition > -1) {
+                arrayPosition++;
+                if (mItemMap[arrayPosition] != 0) {
+                    groupPosition--;
+                }
+            }
+            return arrayPosition;
         }
-        
-        View getHistoryItem(int position, View convertView) {
+
+        public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
+                View convertView, ViewGroup parent) {
+            groupPosition = groupPositionToArrayPosition(groupPosition);
             HistoryItem item;
             if (null == convertView || !(convertView instanceof HistoryItem)) {
                 item = new HistoryItem(BrowserHistoryPage.this);
+                // Add padding on the left so it will be indented from the
+                // arrows on the group views.
+                item.setPadding(item.getPaddingLeft() + 10,
+                        item.getPaddingTop(),
+                        item.getPaddingRight(),
+                        item.getPaddingBottom());
             } else {
                 item = (HistoryItem) convertView;
             }
-            mCursor.moveToPosition(mItemMap[position]);
+            int index = childPosition;
+            for (int i = 0; i < groupPosition; i++) {
+                index += mItemMap[i];
+            }
+            mCursor.moveToPosition(index);
             item.setName(mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
             String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
             item.setUrl(url);
-            item.setFavicon((Bitmap) mUrlsToIcons.get(url));
+            item.setFavicon(CombinedBookmarkHistoryActivity.getIconListenerSet(
+                    getContentResolver()).getFavicon(url));
+            item.setIsBookmark(1 ==
+                    mCursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX));
             return item;
         }
         
-        View getHeaderView(int position, View convertView) {
+        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
+            groupPosition = groupPositionToArrayPosition(groupPosition);
             TextView item;
             if (null == convertView || !(convertView instanceof TextView)) {
                 LayoutInflater factory = 
                         LayoutInflater.from(BrowserHistoryPage.this);
                 item = (TextView) 
-                        factory.inflate(android.R.layout.preference_category, null);
+                        factory.inflate(R.layout.history_header, null);
             } else {
                 item = (TextView) convertView;
             }
-            item.setText(mDateSorter.getLabel(
-                    mItemMap[position] + DateSorter.DAY_COUNT));
+            item.setText(mDateSorter.getLabel(groupPosition));
             return item;
         }
 
         public boolean areAllItemsEnabled() {
-            return false;
+            return true;
         }
 
-        public boolean isEnabled(int position) {
-            return mItemMap[position] >= 0;
+        public boolean isChildSelectable(int groupPosition, int childPosition) {
+            return true;
         }
 
-        public int getCount() {
-            return mItemMap.length;
+        public int getGroupCount() {
+            return mNumberOfBins;
         }
 
-        public Object getItem(int position) {
+        public int getChildrenCount(int groupPosition) {
+            return mItemMap[groupPositionToArrayPosition(groupPosition)];
+        }
+
+        public Object getGroup(int groupPosition) {
             return null;
         }
 
-        public long getItemId(int position) {
-            return mItemMap[position];
+        public Object getChild(int groupPosition, int childPosition) {
+            return null;
         }
 
-        // 0 for TextView, 1 for HistoryItem
-        public int getItemViewType(int position) {
-            return mItemMap[position] < 0 ? 0 : 1;
+        public long getGroupId(int groupPosition) {
+            return groupPosition;
         }
 
-        public int getViewTypeCount() {
-            return 2;
+        public long getChildId(int groupPosition, int childPosition) {
+            return (childPosition << 3) + groupPosition;
         }
 
         public boolean hasStableIds() {
@@ -370,8 +445,24 @@
             mObservers.remove(observer);
         }
 
+        public void onGroupExpanded(int groupPosition) {
+        
+        }
+
+        public void onGroupCollapsed(int groupPosition) {
+        
+        }
+
+        public long getCombinedChildId(long groupId, long childId) {
+            return childId;
+        }
+
+        public long getCombinedGroupId(long groupId) {
+            return groupId;
+        }
+
         public boolean isEmpty() {
-            return getCount() == 1;
+            return mCursor.getCount() == 0;
         }
     }
 }
diff --git a/src/com/android/browser/BrowserHomepagePreference.java b/src/com/android/browser/BrowserHomepagePreference.java
index bc21143..d4708c3 100644
--- a/src/com/android/browser/BrowserHomepagePreference.java
+++ b/src/com/android/browser/BrowserHomepagePreference.java
@@ -48,8 +48,10 @@
         AlertDialog dialog = (AlertDialog) getDialog();
         // This callback is called before the dialog has been fully constructed
         if (dialog != null) {
+            String url = s.toString();
             dialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(
-                    Regex.WEB_URL_PATTERN.matcher(s.toString()).matches());
+                    url.length() == 0 || url.equals("about:blank") ||
+                    Regex.WEB_URL_PATTERN.matcher(url).matches());
         }
     }
 
diff --git a/src/com/android/browser/BrowserPreferencesPage.java b/src/com/android/browser/BrowserPreferencesPage.java
index b23f750..5d6795b 100644
--- a/src/com/android/browser/BrowserPreferencesPage.java
+++ b/src/com/android/browser/BrowserPreferencesPage.java
@@ -83,8 +83,7 @@
             if (needUpdate) {
                 value = value.trim().replace(" ", "%20");
             }
-            Uri path = Uri.parse(value);
-            if (path.getScheme() == null) {
+            if (value.length() != 0 && Uri.parse(value).getScheme() == null) {
                 value = "http://" + value;
                 needUpdate = true;
             }
diff --git a/src/com/android/browser/BrowserProvider.java b/src/com/android/browser/BrowserProvider.java
index 7aa5bb2..0c930c6 100644
--- a/src/com/android/browser/BrowserProvider.java
+++ b/src/com/android/browser/BrowserProvider.java
@@ -16,23 +16,26 @@
 
 package com.android.browser;
 
+import android.app.ISearchManager;
 import android.app.SearchManager;
+import android.content.ComponentName;
 import android.content.ContentProvider;
-import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.Intent;
 import android.content.UriMatcher;
 import android.database.AbstractCursor;
-import android.database.ContentObserver;
 import android.database.Cursor;
-import android.database.DataSetObserver;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
+import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemProperties;
 import android.provider.Browser;
 import android.util.Log;
+import android.server.search.SearchableInfo;
 import android.text.util.Regex;
 
 public class BrowserProvider extends ContentProvider {
@@ -40,22 +43,41 @@
     private SQLiteOpenHelper mOpenHelper;
     private static final String sDatabaseName = "browser.db";
     private static final String TAG = "BrowserProvider";
-    private static final String ORDER_BY = "date DESC";
+    private static final String ORDER_BY = "visits DESC, date DESC";
 
     private static final String[] TABLE_NAMES = new String[] {
         "bookmarks", "searches"
     };
-    private static final String[] SUGGEST_PROJECTION = new String [] {
-        "0 AS " + SearchManager.SUGGEST_COLUMN_FORMAT,
-        "url AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA,
-        "url AS " + SearchManager.SUGGEST_COLUMN_TEXT_1,
-        "title AS " + SearchManager.SUGGEST_COLUMN_TEXT_2,
-        "_id"
+    private static final String[] SUGGEST_PROJECTION = new String[] {
+            "_id", "url", "title", "bookmark"
     };
     private static final String SUGGEST_SELECTION = 
             "url LIKE ? OR url LIKE ? OR url LIKE ? OR url LIKE ?";
     private String[] SUGGEST_ARGS = new String[4];
 
+    // shared suggestion array index, make sure to match COLUMNS
+    private static final int SUGGEST_COLUMN_INTENT_ACTION_ID = 1;
+    private static final int SUGGEST_COLUMN_INTENT_DATA_ID = 2;
+    private static final int SUGGEST_COLUMN_TEXT_1_ID = 3;
+    private static final int SUGGEST_COLUMN_TEXT_2_ID = 4;
+    private static final int SUGGEST_COLUMN_ICON_1_ID = 5;
+    private static final int SUGGEST_COLUMN_ICON_2_ID = 6;
+    private static final int SUGGEST_COLUMN_QUERY_ID = 7;
+
+    // shared suggestion columns
+    private static final String[] COLUMNS = new String[] {
+            "_id",
+            SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
+            SearchManager.SUGGEST_COLUMN_INTENT_DATA,
+            SearchManager.SUGGEST_COLUMN_TEXT_1,
+            SearchManager.SUGGEST_COLUMN_TEXT_2,
+            SearchManager.SUGGEST_COLUMN_ICON_1,
+            SearchManager.SUGGEST_COLUMN_ICON_2,
+            SearchManager.SUGGEST_COLUMN_QUERY};
+
+    private static final int MAX_SUGGESTION_SHORT_ENTRIES = 3;
+    private static final int MAX_SUGGESTION_LONG_ENTRIES = 6;
+
     // make sure that these match the index of TABLE_NAMES
     private static final int URI_MATCH_BOOKMARKS = 0;
     private static final int URI_MATCH_SEARCHES = 1;
@@ -206,221 +228,195 @@
     }
 
     /*
-     * Subclass AbstractCursor so we can add "Google Search"
+     * Subclass AbstractCursor so we can combine multiple Cursors and add
+     * "Google Search".
+     * Here are the rules.
+     * 1. We only have MAX_SUGGESTION_LONG_ENTRIES in the list plus 
+     *      "Google Search";
+     * 2. If bookmark/history entries are less than 
+     *      (MAX_SUGGESTION_SHORT_ENTRIES -1), we include Google suggest.
      */
     private class MySuggestionCursor extends AbstractCursor {
-        private Cursor  mCursor;
+        private Cursor  mHistoryCursor;
+        private Cursor  mSuggestCursor;
+        private int     mHistoryCount;
+        private int     mSuggestionCount;
         private boolean mBeyondCursor;
         private String  mString;
-        private Uri     mNotifyUri;
-        private ContentResolver mContentResolver;
-        private AbstractCursor.SelfContentObserver mObserver;
-        private final Object mObserverLock = new Object();
 
-        public MySuggestionCursor(Cursor c, String string) {
-            mCursor = c;
-            if (Regex.WEB_URL_PATTERN.matcher(string).matches()) {
-                mString = "";
-            } else {
-                mString = string;
+        public MySuggestionCursor(Cursor hc, Cursor sc, String string) {
+            mHistoryCursor = hc;
+            mSuggestCursor = sc;
+            mHistoryCount = hc.getCount();
+            mSuggestionCount = sc != null ? sc.getCount() : 0;
+            if (mSuggestionCount > (MAX_SUGGESTION_LONG_ENTRIES - mHistoryCount)) {
+                mSuggestionCount = MAX_SUGGESTION_LONG_ENTRIES - mHistoryCount;
             }
+            mString = string;
             mBeyondCursor = false;
         }
 
+        @Override
         public boolean onMove(int oldPosition, int newPosition) {
-            if (mCursor.getCount() == newPosition) {
-                mBeyondCursor = true;
-            } else {
-                mCursor.moveToPosition(newPosition);
+            if (mHistoryCursor == null) {
+                return false;
+            }
+            if (mHistoryCount > newPosition) {
+                mHistoryCursor.moveToPosition(newPosition);
                 mBeyondCursor = false;
+            } else if (mHistoryCount + mSuggestionCount > newPosition) {
+                mSuggestCursor.moveToPosition(newPosition - mHistoryCount);
+                mBeyondCursor = false;
+            } else {
+                mBeyondCursor = true;
             }
             return true;
         }
 
+        @Override
         public int getCount() {
             if (mString.length() > 0) {
-                return mCursor.getCount() + 1;
+                return mHistoryCount + mSuggestionCount + 1;
             } else {
-                return mCursor.getCount();
+                return mHistoryCount + mSuggestionCount;
             }
         }
 
-        public boolean deleteRow() {
-            return !mBeyondCursor && mCursor.deleteRow();
-        }
-
+        @Override
         public String[] getColumnNames() {
-            return mCursor.getColumnNames();
+            return COLUMNS;
         }
 
-        public int getColumnCount() {
-            return mCursor.getColumnCount();
-        }
-
+        @Override
         public String getString(int columnIndex) {
-            if (!mBeyondCursor) {
-                return mCursor.getString(columnIndex);
+            if ((mPos != -1 && mHistoryCursor != null)) {
+                switch(columnIndex) {
+                    case SUGGEST_COLUMN_INTENT_ACTION_ID:
+                        if (mHistoryCount > mPos) {
+                            return Intent.ACTION_VIEW;
+                        } else {
+                            return Intent.ACTION_SEARCH;
+                        }
+
+                    case SUGGEST_COLUMN_INTENT_DATA_ID:
+                        if (mHistoryCount > mPos) {
+                            return mHistoryCursor.getString(1);
+                        } else {
+                            return null;
+                        }
+
+                    case SUGGEST_COLUMN_TEXT_1_ID:
+                        if (mHistoryCount > mPos) {
+                            return mHistoryCursor.getString(1);
+                        } else if (!mBeyondCursor) {
+                            return mSuggestCursor.getString(1);
+                        } else {
+                            return mString;
+                        }
+
+                    case SUGGEST_COLUMN_TEXT_2_ID:
+                        if (mHistoryCount > mPos) {
+                            return mHistoryCursor.getString(2);
+                        } else if (!mBeyondCursor) {
+                            return mSuggestCursor.getString(2);
+                        } else {
+                            return getContext().getString(R.string.search_google);
+                        }
+
+                    case SUGGEST_COLUMN_ICON_1_ID:
+                        if (mHistoryCount > mPos) {
+                            if (mHistoryCursor.getInt(3) == 1) {
+                                return new Integer(
+                                        R.drawable.ic_search_category_bookmark)
+                                        .toString();
+                            } else {
+                                return new Integer(
+                                        R.drawable.ic_search_category_history)
+                                        .toString();
+                            }
+                        } else {
+                            return new Integer(
+                                    R.drawable.ic_search_category_suggest)
+                                    .toString();
+                        }
+
+                    case SUGGEST_COLUMN_ICON_2_ID:
+                        return new String("0");
+
+                    case SUGGEST_COLUMN_QUERY_ID:
+                        if (mHistoryCount > mPos) {
+                            return null;
+                        } else if (!mBeyondCursor) {
+                            return mSuggestCursor.getString(3);
+                        } else {
+                            return mString;
+                        }
+                }
             }
-            switch (columnIndex) {
-                case 2: // SearchManager.SUGGEST_COLUMN_TEXT_1
-                    return "Google Search for \"" + mString + "\"";
-                case 1: // SearchManager.SUGGEST_COLUMN_INTENT_DATA
-                    return BrowserActivity.composeSearchUrl(mString);
-                case 3: // SearchManager.SUGGEST_COLUMN_TEXT_2
-                default:
-                    return "";
+            return null;
+        }
+
+        @Override
+        public double getDouble(int column) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public float getFloat(int column) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int getInt(int column) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public long getLong(int column) {
+            if ((mPos != -1) && column == 0) {
+                return mPos;        // use row# as the _Id
             }
+            throw new UnsupportedOperationException();
         }
 
-        public short getShort(int columnIndex) {
-            if (!mBeyondCursor) {
-                return mCursor.getShort(columnIndex);
-            }
-            if (0 == columnIndex) {
-                return 0;
-            }
-            return -1;
+        @Override
+        public short getShort(int column) {
+            throw new UnsupportedOperationException();
         }
 
-        public int getInt(int columnIndex) {
-            if (!mBeyondCursor) {
-                return mCursor.getInt(columnIndex);
-            }
-            if (0 == columnIndex) {
-                return 0;
-            }
-            return -1;
-        }
-
-        public long getLong(int columnIndex) {
-            if (!mBeyondCursor) {
-                return mCursor.getLong(columnIndex);
-            }
-            if (0 == columnIndex) {
-                return 0;
-            }
-            return -1;
-        }
-
-        public float getFloat(int columnIndex) {
-            if (!mBeyondCursor) {
-                return mCursor.getFloat(columnIndex);
-            }
-            if (0 == columnIndex) {
-                return 0f;
-            }
-            return -1f;
-        }
-
-        public double getDouble(int columnIndex) {
-            if (!mBeyondCursor) {
-                return mCursor.getDouble(columnIndex);
-            }
-            if (0 == columnIndex) {
-                return 0.0;
-            }
-            return -1.0;
-        }
-
-        public boolean isNull(int columnIndex) {
-            return mCursor.isNull(columnIndex);
-        }
-
-        public boolean supportsUpdates() {
-            return false;
-        }
-
-        public boolean hasUpdates() {
-            return false;
-        }
-
-        public boolean updateString(int columnIndex, String value) {
-            return false;
-        }
-
-        public boolean updateShort(int columnIndex, short value) {
-            return false;
-        }
-
-        public boolean updateInt(int columnIndex, int value) {
-            return false;
-        }
-
-        public boolean updateLong(int columnIndex, long value) {
-            return false;
-        }
-
-        public boolean updateFloat(int columnIndex, float value) {
-            return false;
-        }
-
-        public boolean updateDouble(int columnIndex, double value) {
-            return false;
+        @Override
+        public boolean isNull(int column) {
+            throw new UnsupportedOperationException();
         }
 
         // TODO Temporary change, finalize after jq's changes go in
         public void deactivate() {
-            if (mCursor != null) {
-                mCursor.deactivate();
+            if (mHistoryCursor != null) {
+                mHistoryCursor.deactivate();
+            }
+            if (mSuggestCursor != null) {
+                mSuggestCursor.deactivate();
             }
             super.deactivate();
         }
 
         public boolean requery() {
-            return mCursor.requery();
+            return (mHistoryCursor != null ? mHistoryCursor.requery() : false) |
+                    (mSuggestCursor != null ? mSuggestCursor.requery() : false);
         }
 
         // TODO Temporary change, finalize after jq's changes go in
         public void close() {
             super.close();
-            if (mCursor != null) {
-                mCursor.close();
-                mCursor = null;
+            if (mHistoryCursor != null) {
+                mHistoryCursor.close();
+                mHistoryCursor = null;
             }
-        }
-
-        public void registerContentObserver(ContentObserver observer) {
-            super.registerContentObserver(observer);
-        }
-
-        public void unregisterContentObserver(ContentObserver observer) {
-            super.unregisterContentObserver(observer);
-        }
-
-        public void registerDataSetObserver(DataSetObserver observer) {
-            super.registerDataSetObserver(observer);
-        }
-
-        public void unregisterDataSetObserver(DataSetObserver observer) {
-            super.unregisterDataSetObserver(observer);
-        }
-
-        protected void onChange(boolean selfChange) {
-            synchronized (mObserverLock) {
-                super.onChange(selfChange);
-                if (mNotifyUri != null && selfChange) {
-                    mContentResolver.notifyChange(mNotifyUri, mObserver);
-                }
+            if (mSuggestCursor != null) {
+                mSuggestCursor.close();
+                mSuggestCursor = null;
             }
         }
-
-        public void setNotificationUri(ContentResolver cr, Uri uri) {
-            synchronized (mObserverLock) {
-                if (mObserver != null) {
-                    cr.unregisterContentObserver(mObserver);
-                }
-                mObserver = new AbstractCursor.SelfContentObserver(this);
-                cr.registerContentObserver(uri, true, mObserver);
-                mCursor.setNotificationUri(cr, uri);
-                super.setNotificationUri(cr, uri);
-                mContentResolver = cr;
-                mNotifyUri = uri;
-            }
-        }
-
-        public boolean getWantsAllOnMoveCalls() {
-            return mCursor.getWantsAllOnMoveCalls();
-        }
     }
 
     @Override
@@ -455,13 +451,58 @@
                     suggestSelection = SUGGEST_SELECTION;
                 }
             }
-            // Suggestions are always performed with the default sort order:
-            // date ASC.
+
             Cursor c = db.query(TABLE_NAMES[URI_MATCH_BOOKMARKS],
                     SUGGEST_PROJECTION, suggestSelection, myArgs, null, null,
-                    ORDER_BY, null);
-            c.setNotificationUri(getContext().getContentResolver(), url);
-            return new MySuggestionCursor(c, selectionArgs[0]);
+                    ORDER_BY,
+                    (new Integer(MAX_SUGGESTION_LONG_ENTRIES)).toString());
+
+            if (Regex.WEB_URL_PATTERN.matcher(selectionArgs[0]).matches()) {
+                return new MySuggestionCursor(c, null, "");
+            } else {
+                // get Google suggest if there is still space in the list
+                if (myArgs != null && myArgs.length > 1
+                        && c.getCount() < (MAX_SUGGESTION_SHORT_ENTRIES - 1)) {
+                    ISearchManager sm = ISearchManager.Stub
+                            .asInterface(ServiceManager
+                                    .getService(Context.SEARCH_SERVICE));
+                    SearchableInfo si = null;
+                    try {
+                        // use the global search to get Google suggest provider
+                        si = sm.getSearchableInfo(new ComponentName(
+                                getContext(), "com.android.browser"), true);
+
+                        // similar to the getSuggestions() in SearchDialog.java
+                        StringBuilder uriStr = new StringBuilder("content://");
+                        uriStr.append(si.getSuggestAuthority());
+                        // if content path provided, insert it now
+                        final String contentPath = si.getSuggestPath();
+                        if (contentPath != null) {
+                            uriStr.append('/');
+                            uriStr.append(contentPath);
+                        }
+                        // append standard suggestion query path 
+                        uriStr.append('/' + SearchManager.SUGGEST_URI_PATH_QUERY);
+                        // inject query, either as selection args or inline
+                        String[] selArgs = null;
+                        if (si.getSuggestSelection() != null) {
+                            selArgs = new String[] {selectionArgs[0]};
+                        } else {
+                            uriStr.append('/');
+                            uriStr.append(Uri.encode(selectionArgs[0]));
+                        }
+
+                        // finally, make the query
+                        Cursor sc = getContext().getContentResolver().query(
+                                Uri.parse(uriStr.toString()), null,
+                                si.getSuggestSelection(), selArgs, null);
+
+                        return new MySuggestionCursor(c, sc, selectionArgs[0]);
+                    } catch (RemoteException e) {
+                    }
+                }
+                return new MySuggestionCursor(c, null, selectionArgs[0]);
+            }
         }
 
         String[] projection = null;
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 6164e38..d8c5186 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -26,6 +26,7 @@
 import android.view.WindowManager;
 import android.webkit.CacheManager;
 import android.webkit.CookieManager;
+import android.webkit.WebView;
 import android.webkit.WebViewDatabase;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
@@ -53,7 +54,7 @@
     // Public variables for settings
     // NOTE: these defaults need to be kept in sync with the XML
     // until the performance of PreferenceManager.setDefaultValues()
-    // is improved. 
+    // is improved.
     private boolean loadsImagesAutomatically = true;
     private boolean javaScriptEnabled = true;
     private boolean pluginsEnabled = true;
@@ -64,13 +65,12 @@
     private boolean saveFormData = true;
     private boolean openInBackground = false;
     private String defaultTextEncodingName;
-    private String homeUrl = "http://www.google.com/m?client=ms-" + 
-        SystemProperties.get("ro.com.google.clientid", "unknown");
+    private String homeUrl = "http://www.google.com/m?client=ms-" +
+        SystemProperties.get("persist.sys.com.google.clientid", "unknown");
     private boolean loginInitialized = false;
-    private int orientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
     private boolean autoFitPage = true;
     private boolean showDebugSettings = false;
-    
+
     // Development settings
     public WebSettings.LayoutAlgorithm layoutAlgorithm =
         WebSettings.LayoutAlgorithm.NARROW_COLUMNS;
@@ -79,7 +79,7 @@
     private boolean tracing = false;
     private boolean lightTouch = false;
     private boolean navDump = false;
-    // Browser only settings 
+    // Browser only settings
     private boolean doFlick = false;
 
     // Private preconfigured values
@@ -89,17 +89,17 @@
     private static int defaultFixedFontSize = 13;
     private static WebSettings.TextSize textSize =
         WebSettings.TextSize.NORMAL;
-    
+
     // Preference keys that are used outside this class
     public final static String PREF_CLEAR_CACHE = "privacy_clear_cache";
     public final static String PREF_CLEAR_COOKIES = "privacy_clear_cookies";
     public final static String PREF_CLEAR_HISTORY = "privacy_clear_history";
     public final static String PREF_HOMEPAGE = "homepage";
-    public final static String PREF_CLEAR_FORM_DATA = 
+    public final static String PREF_CLEAR_FORM_DATA =
             "privacy_clear_form_data";
-    public final static String PREF_CLEAR_PASSWORDS = 
+    public final static String PREF_CLEAR_PASSWORDS =
             "privacy_clear_passwords";
-    public final static String PREF_EXTRAS_RESET_DEFAULTS = 
+    public final static String PREF_EXTRAS_RESET_DEFAULTS =
             "reset_default_preferences";
     public final static String PREF_DEBUG_SETTINGS = "debug_menu";
     public final static String PREF_GEARS_SETTINGS = "gears_settings";
@@ -120,7 +120,7 @@
     public final static int MAX_TEXTVIEW_LEN = 80;
 
     private TabControl mTabControl;
-    
+
     // Single instance of the BrowserSettings for use in the Browser app.
     private static BrowserSettings sSingleton;
 
@@ -128,7 +128,7 @@
     // observer.
     private HashMap<WebSettings,Observer> mWebSettingsToObservers =
         new HashMap<WebSettings,Observer>();
- 
+
     /*
      * An observer wrapper for updating a WebSettings object with the new
      * settings after a call to BrowserSettings.update().
@@ -180,7 +180,7 @@
             s.setAllowFileAccess(false);
         }
     }
-   
+
     /**
      * Load settings from the browser app's database.
      * NOTE: Strings used for the preferences must match those specified
@@ -191,7 +191,7 @@
      *            observers of this object.
      */
     public void loadFromDb(Context ctx) {
-        SharedPreferences p = 
+        SharedPreferences p =
                 PreferenceManager.getDefaultSharedPreferences(ctx);
 
         // Set the default value for the plugins path to the application's
@@ -204,34 +204,33 @@
         //PreferenceManager.setDefaultValues(ctx, R.xml.browser_preferences);
         syncSharedPreferences(p);
     }
-    
+
     /* package */ void syncSharedPreferences(SharedPreferences p) {
-        homeUrl = 
+        homeUrl =
             p.getString(PREF_HOMEPAGE, homeUrl);
-        loadsImagesAutomatically = p.getBoolean("load_images", 
+        loadsImagesAutomatically = p.getBoolean("load_images",
                 loadsImagesAutomatically);
-        javaScriptEnabled = p.getBoolean("enable_javascript", 
+        javaScriptEnabled = p.getBoolean("enable_javascript",
                 javaScriptEnabled);
-        pluginsEnabled = p.getBoolean("enable_plugins", 
+        pluginsEnabled = p.getBoolean("enable_plugins",
                 pluginsEnabled);
         pluginsPath = p.getString("plugins_path", pluginsPath);
         javaScriptCanOpenWindowsAutomatically = !p.getBoolean(
-            "block_popup_windows", 
+            "block_popup_windows",
             !javaScriptCanOpenWindowsAutomatically);
-        showSecurityWarnings = p.getBoolean("show_security_warnings", 
+        showSecurityWarnings = p.getBoolean("show_security_warnings",
                 showSecurityWarnings);
-        rememberPasswords = p.getBoolean("remember_passwords", 
+        rememberPasswords = p.getBoolean("remember_passwords",
                 rememberPasswords);
-        saveFormData = p.getBoolean("save_formdata", 
+        saveFormData = p.getBoolean("save_formdata",
                 saveFormData);
-        boolean accept_cookies = p.getBoolean("accept_cookies", 
+        boolean accept_cookies = p.getBoolean("accept_cookies",
                 CookieManager.getInstance().acceptCookie());
         CookieManager.getInstance().setAcceptCookie(accept_cookies);
         openInBackground = p.getBoolean("open_in_background", openInBackground);
         loginInitialized = p.getBoolean("login_initialized", loginInitialized);
         textSize = WebSettings.TextSize.valueOf(
                 p.getString(PREF_TEXT_SIZE, textSize.name()));
-        orientation = p.getInt("orientation", orientation);
         autoFitPage = p.getBoolean("autofit_pages", autoFitPage);
         useWideViewPort = true; // use wide view port for either setting
         if (autoFitPage) {
@@ -242,23 +241,23 @@
         defaultTextEncodingName =
                 p.getString(PREF_DEFAULT_TEXT_ENCODING,
                         defaultTextEncodingName);
-        
-        showDebugSettings = 
+
+        showDebugSettings =
                 p.getBoolean(PREF_DEBUG_SETTINGS, showDebugSettings);
         // Debug menu items have precidence if the menu is visible
         if (showDebugSettings) {
-            boolean small_screen = p.getBoolean("small_screen", 
-                    layoutAlgorithm == 
+            boolean small_screen = p.getBoolean("small_screen",
+                    layoutAlgorithm ==
                     WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
             if (small_screen) {
                 layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN;
             } else {
-                boolean normal_layout = p.getBoolean("normal_layout", 
+                boolean normal_layout = p.getBoolean("normal_layout",
                         layoutAlgorithm == WebSettings.LayoutAlgorithm.NORMAL);
                 if (normal_layout) {
                     layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL;
                 } else {
-                    layoutAlgorithm = 
+                    layoutAlgorithm =
                             WebSettings.LayoutAlgorithm.NARROW_COLUMNS;
                 }
             }
@@ -273,7 +272,7 @@
         }
         update();
     }
-    
+
     public String getPluginsPath() {
         return pluginsPath;
     }
@@ -281,42 +280,27 @@
     public String getHomePage() {
         return homeUrl;
     }
-    
+
     public void setHomePage(Context context, String url) {
         Editor ed = PreferenceManager.
-                getDefaultSharedPreferences(context).edit();      
+                getDefaultSharedPreferences(context).edit();
         ed.putString(PREF_HOMEPAGE, url);
         ed.commit();
         homeUrl = url;
     }
-    
+
     public boolean isLoginInitialized() {
         return loginInitialized;
     }
-    
+
     public void setLoginInitialized(Context context) {
         loginInitialized = true;
         Editor ed = PreferenceManager.
-                getDefaultSharedPreferences(context).edit();      
+                getDefaultSharedPreferences(context).edit();
         ed.putBoolean("login_initialized", loginInitialized);
         ed.commit();
     }
-    
-    public int getOrientation() {
-        return orientation;
-    }
-    
-    public void setOrientation(Context context, int o) {
-        if (orientation == o) {
-            return;
-        }
-        orientation = o;
-        Editor ed = PreferenceManager.
-                getDefaultSharedPreferences(context).edit();      
-        ed.putInt("orientation", orientation);
-        ed.commit();
-    }
-    
+
     public WebSettings.TextSize getTextSize() {
         return textSize;
     }
@@ -344,19 +328,21 @@
     public boolean doFlick() {
         return doFlick;
     }
-    
+
     public boolean showDebugSettings() {
         return showDebugSettings;
     }
-    
+
     public void toggleDebugSettings() {
         showDebugSettings = !showDebugSettings;
+        navDump = showDebugSettings;
+        update();
     }
 
     /**
      * Add a WebSettings object to the list of observers that will be updated
      * when update() is called.
-     * 
+     *
      * @param s A WebSettings object that is strictly tied to the life of a
      *            WebView.
      */
@@ -412,7 +398,10 @@
     /*package*/ void clearCache(Context context) {
         WebIconDatabase.getInstance().removeAllIcons();
         if (mTabControl != null) {
-            mTabControl.getCurrentWebView().clearCache(true);
+            WebView current = mTabControl.getCurrentWebView();
+            if (current != null) {
+                current.clearCache(true);
+            }
         }
     }
 
@@ -438,12 +427,12 @@
         db.clearUsernamePassword();
         db.clearHttpAuthUsernamePassword();
     }
-    
+
     /*package*/ void resetDefaultPreferences(Context context) {
-        SharedPreferences p = 
+        SharedPreferences p =
             PreferenceManager.getDefaultSharedPreferences(context);
         p.edit().clear().commit();
-        PreferenceManager.setDefaultValues(context, R.xml.browser_preferences, 
+        PreferenceManager.setDefaultValues(context, R.xml.browser_preferences,
                 true);
     }
 
diff --git a/src/com/android/browser/CombinedBookmarkHistoryActivity.java b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
new file mode 100644
index 0000000..963f179
--- /dev/null
+++ b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.app.TabActivity;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.provider.Browser;
+import android.webkit.WebIconDatabase.IconListener;
+import android.widget.TabHost;
+import android.widget.TabHost.TabSpec;
+import android.view.Window;
+
+import java.util.HashMap;
+import java.util.Vector;
+
+public class CombinedBookmarkHistoryActivity extends TabActivity
+        implements TabHost.OnTabChangeListener {
+    /* package */ static String BOOKMARKS_TAB = "bookmark";
+    /* package */ static String VISITED_TAB = "visited";
+    /* package */ static String HISTORY_TAB = "history";
+    /* package */ static String STARTING_TAB = "tab";
+
+    static class IconListenerSet implements IconListener {
+        // Used to store favicons as we get them from the database
+        // FIXME: We use a different method to get the Favicons in
+        // BrowserBookmarksAdapter. They should probably be unified.
+        private HashMap<String, Bitmap> mUrlsToIcons;
+        private Vector<IconListener> mListeners;
+
+        public IconListenerSet() {
+            mUrlsToIcons = new HashMap<String, Bitmap>();
+            mListeners = new Vector<IconListener>();
+        }
+        public void onReceivedIcon(String url, Bitmap icon) {
+            mUrlsToIcons.put(url, icon);
+            for (IconListener listener : mListeners) {
+                listener.onReceivedIcon(url, icon);
+            }
+        }
+        public void addListener(IconListener listener) {
+            mListeners.add(listener);
+        }
+        public Bitmap getFavicon(String url) {
+            return (Bitmap) mUrlsToIcons.get(url);
+        }
+    }
+    private static IconListenerSet sIconListenerSet;
+    static IconListenerSet getIconListenerSet(ContentResolver cr) {
+        if (null == sIconListenerSet) {
+            sIconListenerSet = new IconListenerSet();
+            Browser.requestAllIcons(cr, null, sIconListenerSet);
+        }
+        return sIconListenerSet;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        setContentView(R.layout.tabs);
+        TabHost tabHost = getTabHost();
+        tabHost.setOnTabChangedListener(this);
+
+        Bundle extras = getIntent().getExtras();
+        Resources resources = getResources();
+
+        getIconListenerSet(getContentResolver());
+        Intent bookmarksIntent = new Intent(this, BrowserBookmarksPage.class);
+        bookmarksIntent.putExtras(extras);
+        tabHost.addTab(tabHost.newTabSpec(BOOKMARKS_TAB)
+                .setIndicator(resources.getString(R.string.tab_bookmarks),
+                resources.getDrawable(R.drawable.browser_bookmark_tab))
+                .setContent(bookmarksIntent));
+
+        Intent visitedIntent = new Intent(this, MostVisitedActivity.class);
+        visitedIntent.putExtras(extras);
+        tabHost.addTab(tabHost.newTabSpec(VISITED_TAB)
+                .setIndicator(resources.getString(R.string.tab_most_visited),
+                resources.getDrawable(R.drawable.browser_visited_tab))
+                .setContent(visitedIntent));
+
+        Intent historyIntent = new Intent(this, BrowserHistoryPage.class);
+        historyIntent.putExtras(extras);
+        tabHost.addTab(tabHost.newTabSpec(HISTORY_TAB)
+                .setIndicator(resources.getString(R.string.tab_history),
+                resources.getDrawable(R.drawable.
+                browser_history_tab)).setContent(historyIntent));
+
+        String defaultTab = extras.getString(STARTING_TAB);
+        if (defaultTab != null) {
+            tabHost.setCurrentTab(2);
+        }
+    }
+
+    // Copied from DialTacts Activity
+    /** {@inheritDoc} */
+    public void onTabChanged(String tabId) {
+        Activity activity = getLocalActivityManager().getActivity(tabId);
+        if (activity != null) {
+            activity.onWindowFocusChanged(true);
+        }
+    }
+
+    
+}
diff --git a/src/com/android/browser/FakeWebView.java b/src/com/android/browser/FakeWebView.java
index 7997672..633b799 100644
--- a/src/com/android/browser/FakeWebView.java
+++ b/src/com/android/browser/FakeWebView.java
@@ -34,10 +34,12 @@
  */
 public class FakeWebView extends ImageView {
     private TabControl.Tab mTab;
+    private Picture        mPicture;
     private boolean        mUsesResource;
 
     private class Listener implements WebView.PictureListener {
         public void onNewPicture(WebView view, Picture p) {
+            FakeWebView.this.mPicture = p;
             FakeWebView.this.invalidate();
         }
     };
@@ -69,13 +71,12 @@
             if (mTab != null) {
                 final WebView w = mTab.getTopWindow();
                 if (w != null) {
-                    Picture p = w.capturePicture();
-                    if (p != null) {
+                    if (mPicture != null) {
                         canvas.save();
                         float scale = getWidth() * w.getScale() / w.getWidth();
                         canvas.scale(scale, scale);
                         canvas.translate(-w.getScrollX(), -w.getScrollY());
-                        canvas.drawPicture(p);
+                        canvas.drawPicture(mPicture);
                         canvas.restore();
                     }
                 }
@@ -99,10 +100,12 @@
         mTab = t;
         if (t != null && t.getWebView() != null) {
             Listener l = new Listener();
-            t.getWebView().setPictureListener(l);
             if (t.getSubWebView() != null) {
                 t.getSubWebView().setPictureListener(l);
+            } else {
+                t.getWebView().setPictureListener(l);
             }
+            mPicture = mTab.getTopWindow().capturePicture();
         }
     }
 }
diff --git a/src/com/android/browser/FindDialog.java b/src/com/android/browser/FindDialog.java
index 2b26784..43cd1c4 100644
--- a/src/com/android/browser/FindDialog.java
+++ b/src/com/android/browser/FindDialog.java
@@ -17,6 +17,7 @@
 package com.android.browser;
 
 import android.app.Dialog;
+import android.content.Context;
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.os.Handler;
@@ -29,6 +30,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.view.WindowManager;
+import android.view.inputmethod.InputMethodManager;
 import android.webkit.WebView;
 import android.widget.EditText;
 import android.widget.TextView;
@@ -65,9 +68,19 @@
                 throw new AssertionError("No WebView for FindDialog::onClick");
             }
             mWebView.findNext(false);
+            hideSoftInput();
         }
     };
-    
+
+    /*
+     * Remove the soft keyboard from the screen.
+     */
+    private void hideSoftInput() {
+        InputMethodManager imm = (InputMethodManager)
+                mBrowserActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
+        imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
+    }
+
     private void disableButtons() {
         mPrevButton.setEnabled(false);
         mNextButton.setEnabled(false);
@@ -121,6 +134,8 @@
         mMatches = (TextView) findViewById(R.id.matches);
         mMatchesView = findViewById(R.id.matches_view);
         disableButtons();
+        theWindow.setSoftInputMode(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
     }
     
     public void dismiss() {
@@ -154,8 +169,9 @@
             throw new AssertionError("No WebView for FindDialog::findNext");
         }
         mWebView.findNext(true);
+        hideSoftInput();
     }
-    
+
     public void show() {
         super.show();
         mEditText.requestFocus();
diff --git a/src/com/android/browser/GearsBaseDialog.java b/src/com/android/browser/GearsBaseDialog.java
index afd0dd2..638ba27 100644
--- a/src/com/android/browser/GearsBaseDialog.java
+++ b/src/com/android/browser/GearsBaseDialog.java
@@ -17,6 +17,7 @@
 package com.android.browser;
 
 import android.app.Activity;
+import android.app.Dialog;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -67,6 +68,7 @@
   public static final int UPDATE_ICON = 5;
   public static final int REQUEST_ICON = 6;
   public static final int PAUSE_REQUEST_ICON = 7;
+  public static final int CLEAR_REQUEST_ICON = 8;
 
   protected final String LOCAL_DATA_STRING = "localData";
   protected final String LOCAL_STORAGE_STRING = "localStorage";
@@ -191,14 +193,14 @@
                   public void onClick(View v) {
                     mHandler.sendEmptyMessage(ALWAYS_DENY);
                   }
-                }, true, false);
+                });
 
     setupButton(R.id.button_allow, allowRsc,
                 new Button.OnClickListener() {
                   public void onClick(View v) {
                     mHandler.sendEmptyMessage(ALLOW);
                   }
-                }, false, true);
+                });
 
     setupButton(R.id.button_deny, denyRsc,
                 new Button.OnClickListener() {
@@ -249,6 +251,77 @@
   }
 
   /**
+   * Utility method to hide a view.
+   */
+  void hideView(View v, int rsc) {
+    if (rsc == 0) {
+      return;
+    }
+    View view;
+    if (v == null) {
+      view = findViewById(rsc);
+    } else {
+      view = v.findViewById(rsc);
+    }
+    if (view != null) {
+      view.setVisibility(View.GONE);
+    }
+  }
+
+  /**
+   * Utility method to show a view.
+   */
+  void showView(View v, int rsc) {
+    if (rsc == 0) {
+      return;
+    }
+    View view;
+    if (v == null) {
+      view = findViewById(rsc);
+    } else {
+      view = v.findViewById(rsc);
+    }
+    if (view != null) {
+      view.setVisibility(View.VISIBLE);
+    }
+  }
+
+  /**
+   * Utility method to set a text.
+   */
+  void setText(View v, int rsc, CharSequence text) {
+    if (rsc == 0) {
+      return;
+    }
+    View view = v.findViewById(rsc);
+    if (view != null) {
+      TextView textView = (TextView) view;
+      textView.setText(text);
+      textView.setVisibility(View.VISIBLE);
+    }
+  }
+
+  /**
+   * Utility method to set a text.
+   */
+  void setText(View v, int rsc, int txtRsc) {
+    if (rsc == 0) {
+      return;
+    }
+    View view = v.findViewById(rsc);
+    if (view != null) {
+      TextView textView = (TextView) view;
+      if (txtRsc == 0) {
+        textView.setVisibility(View.GONE);
+      } else {
+        CharSequence text = getString(txtRsc);
+        textView.setText(text);
+        textView.setVisibility(View.VISIBLE);
+      }
+    }
+  }
+
+  /**
    * Utility class to download an icon in the background.
    * Once done ask the UI thread to update the icon.
    */
@@ -360,7 +433,7 @@
    */
   public void setupDialog(TextView message, ImageView icon) {
     message.setText(R.string.unrecognized_dialog_message);
-    icon.setImageResource(R.drawable.gears_icon_48x48);
+    icon.setImageResource(R.drawable.ic_dialog_menu_generic);
     message.setVisibility(View.VISIBLE);
   }
 
@@ -373,4 +446,29 @@
     setupDialog();
   }
 
+  /**
+   * Method called when the back button is pressed,
+   * allowing the dialog to intercept the default behaviour.
+   */
+  public boolean handleBackButton() {
+    return false;
+  }
+
+  /**
+   * Returns the resource string of the notification displayed
+   * after the dialog. By default, does not return one.
+   */
+  public int notification() {
+    return 0;
+  }
+
+  /**
+   * If a secondary dialog (e.g. a confirmation dialog) is created,
+   * GearsNativeDialog will call this method.
+   */
+  public Dialog onCreateDialog(int id) {
+    // This should be redefined by subclasses as needed.
+    return null;
+  }
+
 }
diff --git a/src/com/android/browser/GearsDialog.java b/src/com/android/browser/GearsDialog.java
deleted file mode 100644
index 62a8aaa..0000000
--- a/src/com/android/browser/GearsDialog.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.widget.Button;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.webkit.WebSettings;
-
-import android.view.KeyEvent;
-import android.view.ViewGroup.LayoutParams;
-
-import android.widget.LinearLayout;
-
-public class GearsDialog extends Activity {
-
-  private static final String TAG = "GearsDialog";
-
-  private WebView webview;
-
-  private String htmlContent;
-  private String dialogArguments;
-
-  private boolean dismissed = false;
-
-  @Override
-  public void onCreate(Bundle icicle) {
-    super.onCreate(icicle);
-    webview = new WebView(this);
-    webview.getSettings().setJavaScriptEnabled(true);
-    webview.addJavascriptInterface(this, "bridge");
-
-    setContentView(webview);
-    setTitle("Gears");
-  }
-
-  @Override
-  public void onStart() {
-    super.onStart();
-    loadHTML();
-  }
-
-  @Override
-  public void onDestroy() {
-    super.onDestroy();
-    // In case we reach this point without
-    // notifying GearsDialogService, we do it now.
-    if (!dismissed) {
-      notifyEndOfDialog();
-    }
-  }
-
-  @Override
-  public void onConfigurationChanged(Configuration newConfig) {
-    super.onConfigurationChanged(newConfig);
-    Intent i = getIntent();
-    boolean inSettings = i.getBooleanExtra("inSettings", false);
-    // If we are called from the settings, we
-    // dismiss ourselve upon rotation
-    if (inSettings) {
-      notifyEndOfDialog();
-      finish();
-    }
-  }
-
-  /**
-   * Load the HTML content in the WebView
-   */
-  private void loadHTML() {
-    Intent i = getIntent();
-    htmlContent = i.getStringExtra("htmlContent");
-    dialogArguments = i.getStringExtra("dialogArguments");
-    webview.loadDataWithBaseURL("", htmlContent, "text/html", "", "");
-  }
-
-  /**
-   * Signal to GearsDialogService that we are done.
-   */
-  private void notifyEndOfDialog() {
-    GearsDialogService.signalFinishedDialog();
-    dismissed = true;
-  }
-
-  /**
-   * Intercepts the back key to immediately notify
-   * GearsDialogService that we are done.
-   */
-  public boolean dispatchKeyEvent(KeyEvent event) {
-    if (event.getKeyCode() ==  KeyEvent.KEYCODE_BACK && event.isDown()) {
-      notifyEndOfDialog();
-    }
-    return super.dispatchKeyEvent(event);
-  }
-
-  /**
-   * Returns a json-formatted string containing the information
-   * about the site.
-   * This method is accessible through the javascript bridge.
-   */
-  public String getDialogArguments() {
-    return dialogArguments;
-  }
-
-  /**
-   * Set the results string and closes the dialog.
-   * This method is accessible through the javascript bridge.
-   */
-  public void closeDialog(String results) {
-    GearsDialogService.closeDialog(results);
-    notifyEndOfDialog();
-    finish();
-  }
-
-  /**
-   * Debug method outputting a message.
-   * This method is accessible through the javascript bridge.
-   */
-  public void log(String msg) {
-    Log.v(TAG, msg);
-  }
-}
diff --git a/src/com/android/browser/GearsDialogService.java b/src/com/android/browser/GearsDialogService.java
deleted file mode 100644
index b92ff47..0000000
--- a/src/com/android/browser/GearsDialogService.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.app.Service;
-import android.util.Log;
-import android.content.Intent;
-import android.os.IBinder;
-
-import android.content.Intent;
-import android.content.ContentValues;
-import android.content.ActivityNotFoundException;
-
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import java.lang.InterruptedException;
-
-public class GearsDialogService extends Service {
-  private static final String TAG = "GearsDialogService";
-  private final String DIALOG_PACKAGE = "com.android.browser";
-  private final String DIALOG_CLASS = DIALOG_PACKAGE + ".GearsDialog";
-
-  public static Lock lock = new ReentrantLock();
-  public static Condition dialogFinished = lock.newCondition();
-  public static String results = null;
-
-  @Override
-  public IBinder onBind(Intent intent) {
-    if (IGearsDialogService.class.getName().equals(intent.getAction())) {
-      return mBinder;
-    }
-    return null;
-  }
-
-  private final IGearsDialogService.Stub mBinder = new IGearsDialogService.Stub() {
-    public String showDialog(String htmlContent, String dialogArguments,
-          boolean inSettings) {
-      return GearsDialogService.this.showDialog(htmlContent, dialogArguments,
-                 inSettings);
-    }
-  };
-
-  public static void closeDialog(String res) {
-    results = res;
-  }
-
-  public static void signalFinishedDialog() {
-    lock.lock();
-    dialogFinished.signal();
-    lock.unlock();
-  }
-
-  /**
-   * Show a 'true' modal dialog displaying html content, necessary
-   * for Gears. The method starts the GearsDialog activity, passing
-   * the necessary parameters to it, and then wait until the activity
-   * is finished. When the dialog closes, it sets the variable results.
-   */
-  public String showDialog(String htmlContent, String dialogArguments,
-      boolean inSettings) {
-    try {
-      Intent intent = new Intent();
-      intent.setClassName(DIALOG_PACKAGE, DIALOG_CLASS);
-      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-      intent.putExtra("htmlContent", htmlContent);
-      intent.putExtra("dialogArguments", dialogArguments);
-      intent.putExtra("inSettings", inSettings);
-      lock.lock();
-      startActivity(intent);
-      dialogFinished.await();
-    } catch (InterruptedException e) {
-      Log.e(TAG, "exception e: " + e);
-    } catch (ActivityNotFoundException e) {
-      Log.e(TAG, "exception e: " + e);
-    } finally {
-      lock.unlock();
-    }
-    return results;
-  }
-}
diff --git a/src/com/android/browser/GearsFilePickerDialog.java b/src/com/android/browser/GearsFilePickerDialog.java
deleted file mode 100644
index d84a970..0000000
--- a/src/com/android/browser/GearsFilePickerDialog.java
+++ /dev/null
@@ -1,725 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Color;
-import android.net.Uri;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.provider.MediaStore;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.GridView;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Vector;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Gears FilePicker dialog
- */
-class GearsFilePickerDialog extends GearsBaseDialog
-  implements View.OnTouchListener {
-
-  private static final String TAG = "Gears FilePicker";
-  private static Bitmap mDirectoryIcon;
-  private static Bitmap mDefaultIcon;
-  private static Bitmap mImageIcon;
-  private static Bitmap mBackIcon;
-
-  private static String MULTIPLE_FILES = "MULTIPLE_FILES";
-  private static String SINGLE_FILE = "SINGLE_FILE";
-
-  private static ImagesLoad mImagesLoader;
-  private FilePickerAdapter mAdapter;
-  private String mSelectionMode;
-  private boolean mMultipleSelection;
-  private String mCurrentPath;
-
-  // Disable saving thumbnails until this is refactored to fit into
-  // existing schemes.
-  private static final boolean enableSavedThumbnails = false;
-
-  public GearsFilePickerDialog(Activity activity,
-                               Handler handler,
-                               String arguments) {
-    super (activity, handler, arguments);
-    mAdapter = new FilePickerAdapter(activity);
-    parseArguments();
-  }
-
-  public void parseArguments() {
-    mSelectionMode = MULTIPLE_FILES;
-    try {
-      JSONObject json = new JSONObject(mDialogArguments);
-
-      if (json.has("mode")) {
-        mSelectionMode = json.getString("mode");
-      }
-    } catch (JSONException e) {
-      Log.e(TAG, "exc: " + e);
-    }
-    if (mSelectionMode.equalsIgnoreCase(SINGLE_FILE)) {
-      mMultipleSelection = false;
-    } else {
-      mMultipleSelection = true;
-    }
-  }
-
-  public void setup() {
-    inflate(R.layout.gears_dialog_filepicker, R.id.panel_content);
-    setupButtons(0,
-                 R.string.filepicker_button_allow,
-                 R.string.filepicker_button_deny);
-    setupDialog();
-
-    TextView textViewPath = (TextView) findViewById(R.id.path_name);
-    if (textViewPath != null) {
-      textViewPath.setText(R.string.filepicker_path);
-    }
-
-    GridView view = (GridView) findViewById(R.id.files_list);
-    view.setAdapter(mAdapter);
-    view.setOnTouchListener(this);
-
-    setSelectionText();
-
-    mImagesLoader = new ImagesLoad(mAdapter);
-    mImagesLoader.setAdapterView(view);
-    Thread thread = new Thread(mImagesLoader);
-    thread.start();
-  }
-
-  public void setSelectionText() {
-    Vector elements = mAdapter.selectedElements();
-    if (elements == null)
-      return;
-    TextView info = (TextView) findViewById(R.id.selection);
-    int nbElements = elements.size();
-    if (nbElements == 0) {
-      info.setText(R.string.filepicker_no_files_selected);
-    } else if (nbElements == 1) {
-      info.setText(R.string.filepicker_one_file_selected);
-    } else {
-      info.setText(nbElements + " " +
-                   mActivity.getString(
-                       R.string.filepicker_some_files_selected));
-    }
-  }
-
-  public void setCurrentPath(String path) {
-    if (path != null) {
-      mCurrentPath = path;
-      TextView textViewPath = (TextView) findViewById(R.id.current_path);
-      if (textViewPath != null) {
-        textViewPath.setText(path);
-      }
-    }
-  }
-
-  public void setupDialog(TextView message, ImageView icon) {
-    message.setText(R.string.filepicker_message);
-    message.setTextSize(24);
-    icon.setImageResource(R.drawable.gears_icon_32x32);
-  }
-
-  public boolean onTouch(View v, MotionEvent event) {
-    mImagesLoader.pauseIconRequest();
-    return false;
-  }
-
-  /**
-   * Utility class to load and generate thumbnails
-   * for image files
-   */
-  class ImagesLoad implements Runnable {
-    private Map mImagesMap;
-    private Vector mImagesPath;
-    private BaseAdapter mAdapter;
-    private AdapterView mAdapterView;
-    private Vector<FilePickerElement> mElements;
-    private Handler mLoaderHandler;
-
-    ImagesLoad(BaseAdapter adapter) {
-      mAdapter = adapter;
-    }
-
-    public void signalChanges() {
-      Message message = mHandler.obtainMessage(GearsBaseDialog.NEW_ICON,
-                                               mAdapter);
-      mHandler.sendMessage(message);
-    }
-
-    /**
-     * TODO: use the same thumbnails as the photo app
-     * (bug: http://b/issue?id=1497927)
-     */
-    public String getThumbnailPath(String path) {
-      File f = new File(path);
-      String myPath = f.getParent() + "/.thumbnails";
-      File d = new File(myPath);
-      if (!d.exists()) {
-        d.mkdirs();
-      }
-      return myPath + "/" + f.getName();
-    }
-
-    public boolean saveImage(String path, Bitmap image) {
-      boolean ret = false;
-      try {
-        FileOutputStream outStream = new FileOutputStream(path);
-        ret = image.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
-      } catch (IOException e) {
-        Log.e(TAG, "IOException ", e);
-      }
-      return ret;
-    }
-
-    public Bitmap generateImage(FilePickerElement elem) {
-      String path = elem.getPath();
-      Bitmap finalImage = null;
-      try {
-        String thumbnailPath = getThumbnailPath(path);
-        if (enableSavedThumbnails) {
-          File thumbnail = new File(thumbnailPath);
-          if (thumbnail.exists()) {
-            finalImage = BitmapFactory.decodeFile(thumbnailPath);
-            if (finalImage != null) {
-              return finalImage;
-            }
-          }
-        }
-        BitmapFactory.Options options = new BitmapFactory.Options();
-        options.inJustDecodeBounds = true;
-        BitmapFactory.decodeFile(path, options);
-
-        int width = options.outWidth;
-        int height = options.outHeight;
-        int size = 128;
-        int sampleSize = 1;
-        if (width > size || height > size) {
-          sampleSize = 2;
-          while ((width / sampleSize > size)
-                 || (height / sampleSize > size)) {
-            sampleSize += 2;
-          }
-        }
-        options.inJustDecodeBounds = false;
-        options.inSampleSize = sampleSize;
-        Bitmap originalImage = BitmapFactory.decodeFile(path, options);
-        if (originalImage == null) {
-          return null;
-        }
-        finalImage = Bitmap.createScaledBitmap(originalImage, size, size, true);
-        if (enableSavedThumbnails) {
-          if (saveImage(thumbnailPath, finalImage)) {
-            if (mDebug) {
-              Log.v(TAG, "Saved thumbnail for file " + path);
-            }
-          } else {
-            Log.e(TAG, "Could NOT Save thumbnail for file " + path);
-          }
-        }
-        originalImage.recycle();
-      } catch (java.lang.OutOfMemoryError e) {
-        Log.e(TAG, "Intercepted OOM ", e);
-      }
-      return finalImage;
-    }
-
-    public void pauseIconRequest() {
-      Message message = Message.obtain(mLoaderHandler,
-                                       GearsBaseDialog.PAUSE_REQUEST_ICON);
-      mLoaderHandler.sendMessageAtFrontOfQueue(message);
-    }
-    public void postIconRequest(FilePickerElement item, int position) {
-      if (item == null) {
-        return;
-      }
-      Message message = mLoaderHandler.obtainMessage(
-          GearsBaseDialog.REQUEST_ICON, position, 0, item);
-      mLoaderHandler.sendMessage(message);
-    }
-
-    public void generateIcon(FilePickerElement elem) {
-      if (elem.isImage()) {
-        if (elem.getThumbnail() == null) {
-          Bitmap image = generateImage(elem);
-          if (image != null) {
-            elem.setThumbnail(image);
-          }
-        }
-      }
-    }
-
-    public void setAdapterView(AdapterView view) {
-      mAdapterView = view;
-    }
-
-    public void run() {
-      Looper.prepare();
-      mLoaderHandler = new Handler() {
-        public void handleMessage(Message msg) {
-          int visibleElements = 10;
-          if (msg.what == GearsBaseDialog.PAUSE_REQUEST_ICON) {
-            try {
-              // We are busy (likely) scrolling the view,
-              // so we just pause the loading.
-              Thread.sleep(1000);
-              mLoaderHandler.removeMessages(
-                  GearsBaseDialog.PAUSE_REQUEST_ICON);
-            } catch (InterruptedException e) {
-              Log.e(TAG, "InterruptedException ", e);
-            }
-          } else if (msg.what == GearsBaseDialog.REQUEST_ICON) {
-            try {
-              Thread.sleep(10);
-            } catch (InterruptedException e) {
-              Log.e(TAG, "InterruptedException ", e);
-            }
-            FilePickerElement elem = (FilePickerElement) msg.obj;
-            int firstVisiblePosition = mAdapterView.getFirstVisiblePosition();
-            // If the elements are not visible, we slow down the update
-            // TODO: replace this by a low-priority thread
-            if ((msg.arg1 < firstVisiblePosition - visibleElements)
-                && msg.arg1 > firstVisiblePosition + visibleElements) {
-              try {
-                Thread.sleep(100);
-              } catch (InterruptedException e) {
-              }
-            }
-            generateIcon(elem);
-            signalChanges();
-          }
-        }
-      };
-      Looper.loop();
-    }
-  }
-
-  /**
-   * Utility class representing an element displayed in the
-   * file picker, associated with an icon and/or thumbnail
-   */
-  class FilePickerElement {
-    private File mPath;
-    private String mName;
-    private Bitmap mIcon;
-    private boolean mIsSelected;
-    private Vector mChildren;
-    private FilePickerElement mParent;
-    private boolean mIsParent;
-    private BaseAdapter mAdapter;
-    private String mExtension;
-    private Bitmap mThumbnail;
-    private boolean mIsImage;
-
-    public FilePickerElement(String name, BaseAdapter adapter) {
-      this(name, adapter, null);
-    }
-
-    public FilePickerElement(String path, String name, BaseAdapter adapter) {
-      this(path, name, adapter, null);
-    }
-
-    public FilePickerElement(String name,
-                             BaseAdapter adapter,
-                             FilePickerElement parent) {
-      mName = name;
-      mAdapter = adapter;
-      mParent = parent;
-      mIsSelected = false;
-      mChildren = null;
-    }
-
-    public FilePickerElement(String path,
-                             String name,
-                             BaseAdapter adapter,
-                             FilePickerElement parent) {
-      mPath = new File(path);
-      mName = name;
-      mIsSelected = false;
-      mChildren = null;
-      mParent = parent;
-      mAdapter = adapter;
-      mExtension = null;
-
-      setIcons();
-    }
-
-    public void setIcons() {
-      if (mPath.isDirectory()) {
-        if (mDirectoryIcon == null) {
-          mDirectoryIcon = BitmapFactory.decodeResource(
-              getResources(), R.drawable.gears_folder);
-        }
-        mIcon = mDirectoryIcon;
-
-      } else {
-        if (isImage()) {
-          if (mImageIcon == null) {
-            mImageIcon = BitmapFactory.decodeResource(
-                getResources(), R.drawable.gears_file_image);
-          }
-          mIcon = mImageIcon;
-        } else if (isAudio()) {
-          mIcon = BitmapFactory.decodeResource(
-              getResources(), R.drawable.gears_file_audio);
-        } else if (isVideo()) {
-          mIcon = BitmapFactory.decodeResource(
-              getResources(), R.drawable.gears_file_video);
-        } else {
-          if (mDefaultIcon == null) {
-            mDefaultIcon = BitmapFactory.decodeResource(
-                getResources(), R.drawable.gears_file_unknown);
-          }
-          mIcon = mDefaultIcon;
-        }
-      }
-      if (mBackIcon == null) {
-        mBackIcon = BitmapFactory.decodeResource(getResources(),
-                com.android.internal.R.drawable.ic_menu_back);
-      }
-    }
-
-    public boolean isImage() {
-      if (mIsImage) return mIsImage;
-      String extension = getExtension();
-      if (extension != null) {
-        if (extension.equalsIgnoreCase("jpg") ||
-            extension.equalsIgnoreCase("jpeg") ||
-            extension.equalsIgnoreCase("png") ||
-            extension.equalsIgnoreCase("gif")) {
-          mIsImage = true;
-          return true;
-        }
-      }
-      return false;
-    }
-
-    public boolean isAudio() {
-      String extension = getExtension();
-      if (extension != null) {
-        if (extension.equalsIgnoreCase("mp3") ||
-            extension.equalsIgnoreCase("wav") ||
-            extension.equalsIgnoreCase("aac")) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    public boolean isVideo() {
-      String extension = getExtension();
-      if (extension != null) {
-        if (extension.equalsIgnoreCase("mpg") ||
-            extension.equalsIgnoreCase("mpeg") ||
-            extension.equalsIgnoreCase("mpe") ||
-            extension.equalsIgnoreCase("divx") ||
-            extension.equalsIgnoreCase("3gpp") ||
-            extension.equalsIgnoreCase("avi")) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    public void setParent(boolean isParent) {
-      mIsParent = isParent;
-    }
-
-    public boolean isDirectory() {
-      return mPath.isDirectory();
-    }
-
-    public String getExtension() {
-      if (isDirectory()) {
-        return null;
-      }
-      if (mExtension == null) {
-        String path = getPath();
-        int index = path.lastIndexOf(".");
-        if ((index != -1) && (index != path.length() - 1)){
-          // if we find a dot that is not the last character
-          mExtension = path.substring(index+1);
-          return mExtension;
-        }
-      }
-      return mExtension;
-    }
-
-    public void refresh() {
-      mChildren = null;
-      Vector children = getChildren();
-      for (int i = 0; i < children.size(); i++) {
-        FilePickerElement elem = (FilePickerElement) children.get(i);
-        mImagesLoader.postIconRequest(elem, i);
-      }
-    }
-
-    public Vector getChildren() {
-      if (isDirectory()) {
-        if (mChildren == null) {
-          mChildren = new Vector();
-          File[] files = mPath.listFiles();
-          if (mParent != null) {
-            mChildren.add(mParent);
-            mParent.setParent(true);
-          }
-          for (int i = 0; i < files.length; i++) {
-            String name = files[i].getName();
-            String fpath = files[i].getPath();
-            if (!name.startsWith(".")) { // hide dotfiles
-              FilePickerElement elem = new FilePickerElement(fpath, name,
-                                                             mAdapter, this);
-              elem.setParent(false);
-              mChildren.add(elem);
-            }
-          }
-        }
-      }
-      return mChildren;
-    }
-
-    public FilePickerElement getChild(int position) {
-      Vector children = getChildren();
-      if (children != null) {
-        return (FilePickerElement) children.get(position);
-      }
-      return null;
-    }
-
-    public Bitmap getIcon(int position) {
-      if (mIsParent) {
-        return mBackIcon;
-      }
-      if (isImage()) {
-        if (mThumbnail != null) {
-          return mThumbnail;
-        } else {
-          mImagesLoader.postIconRequest(this, position);
-        }
-      }
-      return mIcon;
-    }
-
-    public Bitmap getThumbnail() {
-      return mThumbnail;
-    }
-
-    public void setThumbnail(Bitmap icon) {
-      mThumbnail = icon;
-    }
-
-    public String getName() {
-      return mName;
-    }
-
-    public String getPath() {
-      return mPath.getPath();
-    }
-
-    public void toggleSelection() {
-      mIsSelected = !mIsSelected;
-    }
-
-    public boolean isSelected() {
-      return mIsSelected;
-    }
-
-  }
-
-  /**
-   * Adapter for the GridView
-   */
-  class FilePickerAdapter extends BaseAdapter {
-    private Context mContext;
-    private Map mImagesMap;
-    private Map mImagesSelected;
-
-    private Vector mImages;
-    private Vector<FilePickerElement> mFiles;
-
-    private FilePickerElement mRootElement;
-    private FilePickerElement mCurrentElement;
-
-    public FilePickerAdapter(Context context) {
-      mContext = context;
-      mImages = new Vector();
-      mFiles = new Vector();
-
-      mImagesMap = Collections.synchronizedMap(new HashMap());
-      mImagesSelected = new HashMap();
-
-      Uri requests[] = { MediaStore.Images.Media.INTERNAL_CONTENT_URI,
-                         MediaStore.Images.Media.EXTERNAL_CONTENT_URI };
-
-      String startingPath = Environment.getExternalStorageDirectory().getPath();
-      mRootElement = new FilePickerElement(startingPath, "SD Card", this);
-      mCurrentElement = mRootElement;
-    }
-
-    public void addImage(String path) {
-      mImages.add(path);
-      Bitmap image = BitmapFactory.decodeResource(
-          getResources(), R.drawable.gears_file_unknown);
-      mImagesMap.put(path, image);
-      mImagesSelected.put(path, Boolean.FALSE);
-    }
-
-    public int getCount() {
-      Vector elems = mCurrentElement.getChildren();
-      setCurrentPath(mCurrentElement.getPath());
-      return elems.size();
-    }
-
-    public Object getItem(int position) {
-      return position;
-    }
-
-    public long getItemId(int position) {
-      return position;
-    }
-
-    public Vector selectedElements() {
-      if (mCurrentElement == null) {
-        return null;
-      }
-      Vector children = mCurrentElement.getChildren();
-      Vector ret = new Vector();
-      for (int i = 0; i < children.size(); i++) {
-        FilePickerElement elem = (FilePickerElement) children.get(i);
-        if (elem.isSelected()) {
-          ret.add(elem);
-        }
-      }
-      return ret;
-    }
-
-    public View getView(int position, View convertView, ViewGroup parent) {
-      View cell = convertView;
-      if (cell == null) {
-        LayoutInflater inflater = (LayoutInflater) getSystemService(
-            Context.LAYOUT_INFLATER_SERVICE);
-        cell = inflater.inflate(R.layout.gears_dialog_filepicker_cell, null);
-      }
-      ImageView imageView = (ImageView) cell.findViewById(R.id.icon);
-      TextView textView = (TextView) cell.findViewById(R.id.name);
-      FilePickerElement elem = mCurrentElement.getChild(position);
-      if (elem == null) {
-        String message = "Could not get elem " + position;
-        message += " for " + mCurrentElement.getPath();
-        Log.e(TAG, message);
-        return null;
-      }
-      String path = elem.getPath();
-      textView.setText(elem.getName());
-
-      View.OnClickListener listener = new View.OnClickListener() {
-        public void onClick(View view) {
-          int pos = (Integer) view.getTag();
-          FilePickerElement elem = mCurrentElement.getChild(pos);
-          if (elem.isDirectory()) {
-            mCurrentElement = elem;
-            mCurrentElement.refresh();
-          } else {
-            if (mMultipleSelection) {
-              elem.toggleSelection();
-            } else {
-              Vector elems = selectedElements();
-              if (elems != null) {
-                if (elems.size() == 0) {
-                  elem.toggleSelection();
-                } else if ((elems.size() == 1)
-                           && elem.isSelected()) {
-                  elem.toggleSelection();
-                }
-              }
-            }
-          }
-          setSelectionText();
-          notifyDataSetChanged();
-        }
-      };
-      cell.setLayoutParams(new GridView.LayoutParams(96, 96));
-      cell.setOnClickListener(listener);
-      cell.setOnTouchListener(new View.OnTouchListener() {
-        public boolean onTouch(View v, MotionEvent event) {
-          if (event.getAction() == MotionEvent.ACTION_DOWN) {
-            int color = getResources().getColor(R.color.icon_selection);
-            v.setBackgroundColor(color);
-          } else {
-            v.setBackgroundColor(Color.WHITE);
-          }
-          return false;
-        }
-      });
-
-      cell.setTag(position);
-
-      if (elem.isSelected()) {
-        int color = getResources().getColor(R.color.icon_selection);
-        cell.setBackgroundColor(color);
-      } else {
-        cell.setBackgroundColor(Color.WHITE);
-      }
-      Bitmap bmp = elem.getIcon(position);
-      if (bmp != null) {
-        imageView.setImageBitmap(bmp);
-      }
-
-      return cell;
-    }
-  }
-
-  private String selectedFiles() {
-    Vector selection = mAdapter.selectedElements();
-    JSONArray jsonSelection = new JSONArray();
-    if (selection != null) {
-      for (int i = 0; i < selection.size(); i++) {
-        FilePickerElement elem = (FilePickerElement) selection.get(i);
-        jsonSelection.put(elem.getPath());
-      }
-    }
-    return jsonSelection.toString();
-  }
-
-  public String closeDialog(int closingType) {
-    return selectedFiles();
-  }
-}
diff --git a/src/com/android/browser/GearsNativeDialog.java b/src/com/android/browser/GearsNativeDialog.java
index c8ae741..ecf166d 100644
--- a/src/com/android/browser/GearsNativeDialog.java
+++ b/src/com/android/browser/GearsNativeDialog.java
@@ -17,6 +17,7 @@
 package com.android.browser;
 
 import android.app.Activity;
+import android.app.Dialog;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
@@ -24,17 +25,17 @@
 import android.os.Message;
 import android.util.Config;
 import android.util.Log;
+import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.Window;
 import android.widget.BaseAdapter;
+import android.widget.Toast;
 
 import android.webkit.gears.NativeDialog;
 
 import com.android.browser.GearsBaseDialog;
 import com.android.browser.GearsPermissionsDialog;
 import com.android.browser.GearsSettingsDialog;
-import com.android.browser.GearsShortcutDialog;
-import com.android.browser.GearsFilePickerDialog;
 
 /**
  * Native dialog Activity used by gears
@@ -54,16 +55,12 @@
   private int mDialogType;
   private final int SETTINGS_DIALOG = 1;
   private final int PERMISSION_DIALOG = 2;
-  private final int SHORTCUT_DIALOG = 3;
-  private final int LOCATION_DIALOG = 4;
-  private final int FILEPICKER_DIALOG = 5;
+  private final int LOCATION_DIALOG = 3;
 
   private final String VERSION_STRING = "version";
   private final String SETTINGS_DIALOG_STRING = "settings_dialog";
   private final String PERMISSION_DIALOG_STRING = "permissions_dialog";
-  private final String SHORTCUT_DIALOG_STRING = "shortcuts_dialog";
   private final String LOCATION_DIALOG_STRING = "locations_dialog";
-  private final String FILEPICKER_DIALOG_STRING = "filepicker_dialog";
 
   private boolean mDialogDismissed = false;
 
@@ -90,10 +87,15 @@
 
   @Override
   public void onCreate(Bundle icicle) {
-    super.onCreate(icicle);
-    requestWindowFeature(Window.FEATURE_NO_TITLE);
-    setContentView(R.layout.gears_dialog);
     getArguments();
+    if (mDialogType == SETTINGS_DIALOG) {
+      setTheme(android.R.style.Theme);
+    }
+    super.onCreate(icicle);
+    if (mDialogType != SETTINGS_DIALOG) {
+      requestWindowFeature(Window.FEATURE_NO_TITLE);
+      setContentView(R.layout.gears_dialog);
+    }
 
     switch (mDialogType) {
       case SETTINGS_DIALOG:
@@ -103,15 +105,9 @@
       case PERMISSION_DIALOG:
         dialog = new GearsPermissionsDialog(this, mHandler, mDialogArguments);
         break;
-      case SHORTCUT_DIALOG:
-        dialog = new GearsShortcutDialog(this, mHandler, mDialogArguments);
-        break;
       case LOCATION_DIALOG:
         dialog = new GearsPermissionsDialog(this, mHandler, mDialogArguments);
         break;
-      case FILEPICKER_DIALOG:
-        dialog = new GearsFilePickerDialog(this, mHandler, mDialogArguments);
-        break;
       default:
         dialog = new GearsBaseDialog(this, mHandler, mDialogArguments);
     }
@@ -128,7 +124,7 @@
    */
   private void getArguments() {
     if (mDebug) {
-      mDialogType = FILEPICKER_DIALOG +1;
+      mDialogType = LOCATION_DIALOG +1;
       mockArguments();
 
       return;
@@ -150,12 +146,8 @@
       mGearsVersion = intent.getStringExtra(VERSION_STRING);
     } else if (dialogTypeString.equalsIgnoreCase(PERMISSION_DIALOG_STRING)) {
       mDialogType = PERMISSION_DIALOG;
-    } else if (dialogTypeString.equalsIgnoreCase(SHORTCUT_DIALOG_STRING)) {
-      mDialogType = SHORTCUT_DIALOG;
     } else if (dialogTypeString.equalsIgnoreCase(LOCATION_DIALOG_STRING)) {
       mDialogType = LOCATION_DIALOG;
-    } else if (dialogTypeString.equalsIgnoreCase(FILEPICKER_DIALOG_STRING)) {
-      mDialogType = FILEPICKER_DIALOG;
     }
   }
 
@@ -165,17 +157,6 @@
    * Set mock arguments.
    */
   private void mockArguments() {
-    String argumentsShortcuts = "{ locale: \"en-US\","
-        + "name: \"My Application\", link: \"http://www.google.com/\","
-        + "description: \"This application does things does things!\","
-        + "icon16x16: \"http://google-gears.googlecode.com/"
-        + "svn/trunk/gears/test/manual/shortcuts/16.png\","
-        + "icon32x32: \"http://google-gears.googlecode.com/"
-        + "svn/trunk/gears/test/manual/shortcuts/32.png\","
-        + "icon48x48: \"http://google-gears.googlecode.com/"
-        + "svn/trunk/gears/test/manual/shortcuts/48.png\","
-        + "icon128x128: \"http://google-gears.googlecode.com/"
-        + "svn/trunk/gears/test/manual/shortcuts/128.png\"}";
 
     String argumentsPermissions = "{ locale: \"en-US\", "
         + "origin: \"http://www.google.com\", dialogType: \"localData\","
@@ -185,6 +166,9 @@
         + "customMessage: \"Press the button to enable my "
         + "application to run offline!\" };";
 
+    String argumentsPermissions2 = "{ locale: \"en-US\", "
+        + "origin: \"http://www.google.com\", dialogType: \"localData\" };";
+
     String argumentsLocation = "{ locale: \"en-US\", "
         + "origin: \"http://www.google.com\", dialogType: \"locationData\","
         + "customIcon: \"http://google-gears.googlecode.com/"
@@ -195,8 +179,8 @@
 
     String argumentsSettings = "{ locale: \"en-US\", permissions: [ { "
         + "name: \"http://www.google.com\", "
-        + "localStorage: { permissionState: 1 }, "
-        + "locationData: { permissionState: 0 } }, "
+        + "localStorage: { permissionState: 0 }, "
+        + "locationData: { permissionState: 1 } }, "
         + "{ name: \"http://www.aaronboodman.com\", "
         + "localStorage: { permissionState: 1 }, "
         + "locationData: { permissionState: 2 } }, "
@@ -205,9 +189,6 @@
         + "locationData: { permissionState: 2 } } ] }";
 
     switch (mDialogType) {
-      case SHORTCUT_DIALOG:
-        mDialogArguments = argumentsShortcuts;
-        break;
       case PERMISSION_DIALOG:
         mDialogArguments = argumentsPermissions;
         break;
@@ -216,6 +197,7 @@
         break;
       case SETTINGS_DIALOG:
         mDialogArguments = argumentsSettings;
+        break;
     }
   }
 
@@ -232,6 +214,14 @@
     NativeDialog.closeDialog(ret);
     notifyEndOfDialog();
     finish();
+
+    // If the dialog sets a notification, we display it.
+    int notification = dialog.notification();
+    if (notification != 0) {
+      Toast toast = Toast.makeText(this, notification, Toast.LENGTH_LONG);
+      toast.setGravity(Gravity.BOTTOM, 0, 0);
+      toast.show();
+    }
   }
 
   @Override
@@ -265,10 +255,26 @@
    * NativeDialog that we are done.
    */
   public boolean dispatchKeyEvent(KeyEvent event) {
-    if (event.getKeyCode() ==  KeyEvent.KEYCODE_BACK && event.isDown()) {
-      closeDialog(GearsBaseDialog.CANCEL);
+    if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK)
+      && (event.getAction() == KeyEvent.ACTION_DOWN)) {
+      if (!dialog.handleBackButton()) {
+        // if the dialog doesn't do anything with the back button
+        closeDialog(GearsBaseDialog.CANCEL);
+      }
+      return true; // event consumed
     }
     return super.dispatchKeyEvent(event);
   }
 
+  /**
+   * If the dialog call showDialog() on ourself, we let
+   * it handle the creation of this secondary dialog.
+   * It is used in GearsSettingsDialog, to create the confirmation
+   * dialog when the user click on "Remove this site from Gears"
+   */
+  @Override
+  protected Dialog onCreateDialog(int id) {
+    return dialog.onCreateDialog(id);
+  }
+
 }
diff --git a/src/com/android/browser/GearsPermissions.java b/src/com/android/browser/GearsPermissions.java
index cd46324..e48e045 100644
--- a/src/com/android/browser/GearsPermissions.java
+++ b/src/com/android/browser/GearsPermissions.java
@@ -49,37 +49,37 @@
     public static final int PERMISSION_DENIED = 2;
 
     String mName;
-    int mRowRsc;
-    int mAllowedButtonRsc;
-    int mDeniedButtonRsc;
+    int mTitleRsc;
+    int mSubtitleOnRsc;
+    int mSubtitleOffRsc;
 
     PermissionType(String name) {
       mName = name;
     }
 
-    public void setResources(int rowRsc, int allowedButtonRsc,
-        int deniedButtonRsc) {
-      mRowRsc = rowRsc;
-      mAllowedButtonRsc = allowedButtonRsc;
-      mDeniedButtonRsc = deniedButtonRsc;
-    }
-
-    public int getRowRsc() {
-      return mRowRsc;
-    }
-
-    public int getAllowedButtonRsc() {
-      return mAllowedButtonRsc;
-    }
-
-    public int getDeniedButtonRsc() {
-      return mDeniedButtonRsc;
+    public void setResources(int titleRsc,
+        int subtitleOnRsc, int subtitleOffRsc) {
+      mTitleRsc = titleRsc;
+      mSubtitleOnRsc = subtitleOnRsc;
+      mSubtitleOffRsc = subtitleOffRsc;
     }
 
     public String getName() {
       return mName;
     }
 
+    public int getTitleRsc() {
+      return mTitleRsc;
+    }
+
+    public int getSubtitleOnRsc() {
+      return mSubtitleOnRsc;
+    }
+
+    public int getSubtitleOffRsc() {
+      return mSubtitleOffRsc;
+    }
+
   }
 
   /**
diff --git a/src/com/android/browser/GearsPermissionsDialog.java b/src/com/android/browser/GearsPermissionsDialog.java
index b57ab0b..dbec363 100644
--- a/src/com/android/browser/GearsPermissionsDialog.java
+++ b/src/com/android/browser/GearsPermissionsDialog.java
@@ -35,6 +35,7 @@
   private static final String TAG = "GearsPermissionsDialog";
 
   private String mDialogType;
+  private int mNotification = 0;
 
   public GearsPermissionsDialog(Activity activity,
                                 Handler handler,
@@ -48,15 +49,6 @@
                  R.string.permission_button_allow,
                  R.string.permission_button_deny);
 
-    View contentBorder = findViewById(R.id.content_border);
-    if (contentBorder != null) {
-      contentBorder.setBackgroundResource(R.color.permission_border);
-    }
-    View contentBackground = findViewById(R.id.content_background);
-    if (contentBackground != null) {
-      contentBackground.setBackgroundResource(R.color.permission_background);
-    }
-
     try {
       JSONObject json = new JSONObject(mDialogArguments);
 
@@ -84,6 +76,16 @@
         downloadIcon(iconUrl);
       }
 
+      View msg = findViewById(R.id.permission_dialog_message);
+      if (msg != null) {
+        TextView dialogMessage = (TextView) msg;
+        if (mDialogType.equalsIgnoreCase(LOCAL_DATA_STRING)) {
+          dialogMessage.setText(R.string.query_data_message);
+        } else if (mDialogType.equalsIgnoreCase(LOCATION_DATA_STRING)) {
+          dialogMessage.setText(R.string.location_message);
+        }
+      }
+
     } catch (JSONException e) {
       Log.e(TAG, "JSON exception ", e);
     }
@@ -91,15 +93,11 @@
 
   public void setupDialog(TextView message, ImageView icon) {
     if (mDialogType.equalsIgnoreCase(LOCAL_DATA_STRING)) {
-      message.setText(R.string.query_data_message);
-      icon.setImageResource(R.drawable.gears_local_data);
+      message.setText(R.string.query_data_prompt);
+      icon.setImageResource(android.R.drawable.ic_popup_disk_full);
     } else if (mDialogType.equalsIgnoreCase(LOCATION_DATA_STRING)) {
-      message.setText(R.string.location_message);
-      icon.setImageResource(R.drawable.gears_location_data);
-      View privacyPolicyLabel = findViewById(R.id.privacy_policy_label);
-      if (privacyPolicyLabel != null) {
-        privacyPolicyLabel.setVisibility(View.VISIBLE);
-      }
+      message.setText(R.string.location_prompt);
+      icon.setImageResource(R.drawable.ic_dialog_menu_generic);
     }
   }
 
@@ -108,9 +106,19 @@
     switch (closingType) {
       case ALWAYS_DENY:
         ret = "{\"allow\": false, \"permanently\": true }";
+        if (mDialogType.equalsIgnoreCase(LOCAL_DATA_STRING)) {
+          mNotification = R.string.storage_notification_alwaysdeny;
+        } else if (mDialogType.equalsIgnoreCase(LOCATION_DATA_STRING)) {
+          mNotification = R.string.location_notification_alwaysdeny;
+        }
         break;
       case ALLOW:
         ret = "{\"allow\": true, \"permanently\": true }";
+        if (mDialogType.equalsIgnoreCase(LOCAL_DATA_STRING)) {
+          mNotification = R.string.storage_notification;
+        } else if (mDialogType.equalsIgnoreCase(LOCATION_DATA_STRING)) {
+          mNotification = R.string.location_notification;
+        }
         break;
       case DENY:
         ret = "{\"allow\": false, \"permanently\": false }";
@@ -119,4 +127,7 @@
     return ret;
   }
 
+  public int notification() {
+    return mNotification;
+  }
 }
diff --git a/src/com/android/browser/GearsSettingsDialog.java b/src/com/android/browser/GearsSettingsDialog.java
index 56a1d8d..5ea2342 100644
--- a/src/com/android/browser/GearsSettingsDialog.java
+++ b/src/com/android/browser/GearsSettingsDialog.java
@@ -17,14 +17,21 @@
 package com.android.browser;
 
 import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.os.Handler;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
 import android.widget.Button;
+import android.widget.CheckBox;
 import android.widget.CompoundButton;
 import android.widget.ImageView;
 import android.widget.ListAdapter;
@@ -33,6 +40,7 @@
 import android.widget.TextView;
 
 import com.android.browser.GearsPermissions.OriginPermissions;
+import com.android.browser.GearsPermissions.Permission;
 import com.android.browser.GearsPermissions.PermissionsChangesListener;
 import com.android.browser.GearsPermissions.PermissionType;
 
@@ -55,6 +63,7 @@
   private Vector<OriginPermissions> mCurrentPermissions = null;
 
   private Vector<PermissionType> mPermissions;
+  private static final int CONFIRMATION_REMOVE_DIALOG = 1;
 
   // We declare the permissions globally to simplify the code
   private final PermissionType LOCAL_STORAGE =
@@ -64,23 +73,23 @@
 
   private boolean mChanges = false;
 
+  SettingsAdapter mListAdapter;
 
   public GearsSettingsDialog(Activity activity,
                              Handler handler,
                              String arguments) {
     super (activity, handler, arguments);
+    activity.setContentView(R.layout.gears_settings);
   }
 
   public void setup() {
     // First let's add the permissions' resources
-    LOCAL_STORAGE.setResources(R.id.local_storage_choice,
-       R.id.local_storage_allowed,
-       R.id.local_storage_denied);
-
-    LOCATION_DATA.setResources(R.id.location_data_choice,
-       R.id.location_data_allowed,
-       R.id.location_data_denied);
-
+    LOCAL_STORAGE.setResources(R.string.settings_storage_title,
+                               R.string.settings_storage_subtitle_on,
+                               R.string.settings_storage_subtitle_off);
+    LOCATION_DATA.setResources(R.string.settings_location_title,
+                               R.string.settings_location_subtitle_on,
+                               R.string.settings_location_subtitle_off);
     // add the permissions to the list of permissions.
     mPermissions = new Vector<PermissionType>();
     mPermissions.add(LOCAL_STORAGE);
@@ -88,25 +97,7 @@
     OriginPermissions.setListener(this);
 
 
-    inflate(R.layout.gears_dialog_settings, R.id.panel_content);
     setupDialog();
-    setupButtons(0,
-                 R.string.settings_button_allow,
-                 R.string.settings_button_deny);
-
-    // by default disable the allow button (it will get enabled if
-    // something is changed by the user)
-    View buttonView = findViewById(R.id.button_allow);
-    if (buttonView != null) {
-      Button button = (Button) buttonView;
-      button.setEnabled(false);
-    }
-
-    View gearsVersionView = findViewById(R.id.gears_version);
-    if (gearsVersionView != null) {
-      TextView gearsVersion = (TextView) gearsVersionView;
-      gearsVersion.setText(mGearsVersion);
-    }
 
     // We manage the permissions using three vectors, mSitesPermissions,
     // mOriginalPermissions and mCurrentPermissions.
@@ -165,32 +156,23 @@
     View listView = findViewById(R.id.sites_list);
     if (listView != null) {
       ListView list = (ListView) listView;
-      list.setAdapter(new SettingsAdapter(mActivity, mSitesPermissions));
+      mListAdapter = new SettingsAdapter(mActivity, mSitesPermissions);
+      list.setAdapter(mListAdapter);
       list.setScrollBarStyle(android.view.View.SCROLLBARS_OUTSIDE_INSET);
+      list.setOnItemClickListener(mListAdapter);
     }
     if (mDebug) {
       printPermissions();
     }
   }
 
+  private void setMainTitle() {
+    String windowTitle = mActivity.getString(R.string.pref_extras_gears_settings);
+    mActivity.setTitle(windowTitle);
+  }
+
   public void setupDialog() {
-    View dialogTitleView = findViewById(R.id.dialog_title);
-    if (dialogTitleView != null) {
-      TextView dialogTitle = (TextView) dialogTitleView;
-      dialogTitle.setText(R.string.settings_title);
-      dialogTitle.setVisibility(View.VISIBLE);
-    }
-    View dialogSubtitleView = findViewById(R.id.dialog_subtitle);
-    if (dialogSubtitleView != null) {
-      TextView dialogSubtitle = (TextView) dialogSubtitleView;
-      dialogSubtitle.setText(R.string.settings_message);
-      dialogSubtitle.setVisibility(View.VISIBLE);
-    }
-    View iconView = findViewById(R.id.icon);
-    if (iconView != null) {
-      ImageView icon = (ImageView) iconView;
-      icon.setImageResource(R.drawable.gears_icon_32x32);
-    }
+    setMainTitle();
   }
 
   /**
@@ -198,164 +180,95 @@
    */
   public boolean setPermission(PermissionType type, int perm) {
     if (mChanges == false) {
-      signalChanges();
+      mChanges = true;
     }
     return mChanges;
   }
 
-  /**
-   * Controller class for binding the model (OriginPermissions) with
-   * the UI.
-   */
-  class PermissionController {
-    final static int ALLOWED_BUTTON = 1;
-    final static int DENIED_BUTTON = 2;
-    private int mButtonType;
-    private PermissionType mPermissionType;
-    private OriginPermissions mPermissions;
-
-    PermissionController(PermissionType permissionType, int buttonType,
-        OriginPermissions permissions) {
-      mPermissionType = permissionType;
-      mButtonType = buttonType;
-      mPermissions = permissions;
-    }
-
-    public boolean isChecked() {
-      boolean checked = false;
-
-      switch (mButtonType) {
-        case ALLOWED_BUTTON:
-          if (mPermissions.getPermission(mPermissionType) ==
-              PermissionType.PERMISSION_ALLOWED) {
-            checked = true;
-          } break;
-        case DENIED_BUTTON:
-          if (mPermissions.getPermission(mPermissionType) ==
-              PermissionType.PERMISSION_DENIED) {
-            checked = true;
-          }
-      }
-      return checked;
-    }
-
-    public String print() {
-        return printType() + " for " + mPermissions.getOrigin();
-    }
-
-    private String printType() {
-      switch (mButtonType) {
-        case ALLOWED_BUTTON:
-          return "ALLOWED_BUTTON";
-        case DENIED_BUTTON:
-          return "DENIED_BUTTON";
-      }
-      return "UNKNOWN BUTTON";
-    }
-
-    public void changed(boolean isChecked) {
-      if (isChecked == isChecked()) {
-        return; // already set
-      }
-
-      switch (mButtonType) {
-        case ALLOWED_BUTTON:
-          mPermissions.setPermission(mPermissionType,
-              PermissionType.PERMISSION_ALLOWED);
-          break;
-        case DENIED_BUTTON:
-          mPermissions.setPermission(mPermissionType,
-              PermissionType.PERMISSION_DENIED);
-          break;
-      }
-    }
+  public boolean handleBackButton() {
+    return mListAdapter.backButtonPressed();
   }
 
-
+  /**
+   * We use this to create a confirmation dialog when the user
+   * clicks on "remove this site from gears"
+   */
+  public Dialog onCreateDialog(int id) {
+    return new AlertDialog.Builder(mActivity)
+        .setTitle(R.string.settings_confirmation_remove_title)
+        .setMessage(R.string.settings_confirmation_remove)
+        .setPositiveButton(android.R.string.ok,
+                           new AlertDialog.OnClickListener() {
+          public void onClick(DialogInterface dlg, int which) {
+            mListAdapter.removeCurrentSite();
+          }
+        })
+        .setNegativeButton(android.R.string.cancel, null)
+        .setIcon(android.R.drawable.ic_dialog_alert)
+        .create();
+  }
 
   /**
    * Adapter class for the list view in the settings dialog
    *
-   * Every row in the settings dialog display the permissions
-   * for a given origin. For every type of permission
-   * (location, local data...) there is two radio buttons to
-   * authorize or deny the permission.
-   * A remove button is also present to let the user remove
-   * all the authorization of an origin in one step.
+   * We first display a list of all the origins (sites), or
+   * a message saying that no permission is set if the list is empty.
+   * When the user click on one of the origin, we then display
+   * the list of the permissions existing for that origin.
+   * Each permission can be either allowed or denied by clicking
+   * on the checkbox.
+   * The last row is a special case, allowing to remove the entire origin.
    */
-  class SettingsAdapter extends ArrayAdapter {
+  class SettingsAdapter extends BaseAdapter
+      implements AdapterView.OnItemClickListener {
     private Activity mContext;
     private List mItems;
+    private OriginPermissions mCurrentSite;
+    private Vector mCurrentPermissions;
+    private int MAX_ROW_HEIGHT = 64;
 
     SettingsAdapter(Activity context, List items) {
-      super(context, R.layout.gears_dialog_settings_row, items);
       mContext = context;
       mItems = items;
+      mCurrentSite = null;
     }
 
-    /*
-     * setup the necessary listeners for the radiobuttons
-     * When the buttons are clicked the permissions change.
-     */
-    private void createAndSetButtonListener(View buttonView,
-        OriginPermissions perms, PermissionType permissionType,
-        int buttonType) {
-      if (buttonView == null) {
-        return;
-      }
-      RadioButton button = (RadioButton) buttonView;
-
-      button.setOnCheckedChangeListener(null);
-      PermissionController p = new PermissionController(permissionType,
-          buttonType, perms);
-      button.setTag(p);
-
-      CompoundButton.OnCheckedChangeListener listener =
-          new CompoundButton.OnCheckedChangeListener() {
-        public void onCheckedChanged(CompoundButton buttonView,
-            boolean isChecked) {
-          PermissionController perm = (PermissionController)buttonView.getTag();
-          perm.changed(isChecked);
+    public int getCount() {
+      if (mCurrentSite == null) {
+        int size = mItems.size();
+        if (size == 0) {
+          return 1;
+        } else {
+          return size;
         }
-      };
-
-      button.setOnCheckedChangeListener(listener);
-
-      if (p.isChecked() != button.isChecked()) {
-        button.setChecked(p.isChecked());
       }
+      return mCurrentPermissions.size() + 1;
     }
 
-    /*
-     * setup the remove button for an origin: each row has a global
-     * remove button in addition to the radio buttons controlling the
-     * permissions.
-     */
-    private void setRemoveButton(Button button, OriginPermissions perms) {
-      Button.OnClickListener listener = new Button.OnClickListener() {
-        public void onClick(View buttonView) {
-          if (mChanges == false) {
-            signalChanges();
-          }
-          OriginPermissions perm = (OriginPermissions) buttonView.getTag();
-          perm.setPermission(LOCAL_STORAGE, PermissionType.PERMISSION_NOT_SET);
-          perm.setPermission(LOCATION_DATA, PermissionType.PERMISSION_NOT_SET);
-          mSitesPermissions.remove(perm);
+    public long getItemId(int position) {
+      return position;
+    }
 
-          View view = findViewById(R.id.sites_list);
-          if (view != null) {
-            ListView listView = (ListView) view;
-            ListAdapter listAdapter = listView.getAdapter();
-            if (listAdapter != null) {
-              SettingsAdapter settingsAdapter = (SettingsAdapter) listAdapter;
-              settingsAdapter.notifyDataSetChanged();
-            }
-          }
+    private String shortName(String url) {
+        // We remove the http and https prefix
+        if (url.startsWith("http://")) {
+          return url.substring(7);
         }
-      };
-      button.setTag(perms);
-      button.setOnClickListener(listener);
-      displayAsLink(button);
+        if (url.startsWith("https://")) {
+          return url.substring(8);
+        }
+        return url;
+    }
+
+    public Object getItem(int position) {
+      if (mCurrentSite == null) {
+        if (mItems.size() == 0) {
+          return null;
+        } else {
+          return mItems.get(position);
+        }
+      }
+      return mCurrentPermissions.get(position);
     }
 
     public View getView(int position, View convertView, ViewGroup parent) {
@@ -363,46 +276,117 @@
       if (row == null) { // no cached view, we create one
         LayoutInflater inflater = (LayoutInflater) getSystemService(
             Context.LAYOUT_INFLATER_SERVICE);
-        row = inflater.inflate(R.layout.gears_dialog_settings_row, null);
+        row = inflater.inflate(R.layout.gears_settings_row, null);
       }
+      row.setMinimumHeight(MAX_ROW_HEIGHT);
 
-      OriginPermissions perms = (OriginPermissions) mItems.get(position);
+      if (mCurrentSite == null) {
+        if (mItems.size() == 0) {
+          hideView(row, R.id.title);
+          hideView(row, R.id.subtitle);
+          hideView(row, R.id.checkbox);
+          hideView(row, R.id.icon);
+          setText(row, R.id.info, R.string.settings_empty);
+        } else {
+          hideView(row, R.id.subtitle);
+          hideView(row, R.id.info);
+          hideView(row, R.id.checkbox);
+          OriginPermissions perms = (OriginPermissions) mItems.get(position);
+          setText(row, R.id.title, shortName(perms.getOrigin()));
+          showView(row, R.id.icon);
+        }
+      } else {
+        if (position == getCount() - 1) {
+          // last position: "remove this site from gears"
+          hideView(row, R.id.subtitle);
+          hideView(row, R.id.info);
+          hideView(row, R.id.checkbox);
+          hideView(row, R.id.icon);
+          setText(row, R.id.title, R.string.settings_remove_site);
+        } else {
+          hideView(row, R.id.info);
+          hideView(row, R.id.icon);
+          showView(row, R.id.checkbox);
 
-      View nameView = row.findViewById(R.id.origin_name);
-      if (nameView != null) {
-        TextView originName = (TextView) nameView;
-        originName.setText(perms.getOrigin());
-      }
+          PermissionType type =
+              (PermissionType) mCurrentPermissions.get(position);
+          setText(row, R.id.title, type.getTitleRsc());
 
-      View removeButtonView = row.findViewById(R.id.origin_remove);
-      if (removeButtonView != null) {
-        Button removeButton = (Button) removeButtonView;
-        setRemoveButton(removeButton, perms);
-      }
-
-      for (int i = 0; i < mPermissions.size(); i++) {
-        PermissionType type = mPermissions.get(i);
-        int rowRsc = type.getRowRsc();
-        int allowedButtonRsc = type.getAllowedButtonRsc();
-        int deniedButtonRsc = type.getDeniedButtonRsc();
-
-        View rowView = row.findViewById(rowRsc);
-        if (rowView != null) {
-          int perm = perms.getPermission(type);
-          if (perm != PermissionType.PERMISSION_NOT_SET) {
-            createAndSetButtonListener(row.findViewById(allowedButtonRsc),
-                perms, type, PermissionController.ALLOWED_BUTTON);
-            createAndSetButtonListener(row.findViewById(deniedButtonRsc),
-                perms, type, PermissionController.DENIED_BUTTON);
-            rowView.setVisibility(View.VISIBLE);
-          } else {
-            rowView.setVisibility(View.GONE);
+          View checkboxView = row.findViewById(R.id.checkbox);
+          if (checkboxView != null) {
+            CheckBox checkbox = (CheckBox) checkboxView;
+            int perm = mCurrentSite.getPermission(type);
+            if (perm == PermissionType.PERMISSION_DENIED) {
+              setText(row, R.id.subtitle, type.getSubtitleOffRsc());
+              checkbox.setChecked(false);
+            } else {
+              setText(row, R.id.subtitle, type.getSubtitleOnRsc());
+              checkbox.setChecked(true);
+            }
           }
         }
       }
-
       return row;
     }
+
+    public void removeCurrentSite() {
+      mCurrentSite.setPermission(LOCAL_STORAGE,
+                                 PermissionType.PERMISSION_NOT_SET);
+      mCurrentSite.setPermission(LOCATION_DATA,
+                                 PermissionType.PERMISSION_NOT_SET);
+      mSitesPermissions.remove(mCurrentSite);
+      mCurrentSite = null;
+      setMainTitle();
+      notifyDataSetChanged();
+    }
+
+    public void onItemClick(AdapterView<?> parent,
+                            View view,
+                            int position,
+                            long id) {
+      if (mItems.size() == 0) {
+        return;
+      }
+      if (mCurrentSite == null) {
+         mCurrentSite = (OriginPermissions) mItems.get(position);
+         mCurrentPermissions = new Vector();
+         for (int i = 0; i < mPermissions.size(); i++) {
+           PermissionType type = mPermissions.get(i);
+           int perm = mCurrentSite.getPermission(type);
+           if (perm != PermissionType.PERMISSION_NOT_SET) {
+             mCurrentPermissions.add(type);
+           }
+         }
+         mContext.setTitle(shortName(mCurrentSite.getOrigin()));
+      } else {
+        if (position == getCount() - 1) { // last item (remove site)
+          // Ask the user to confirm
+          // If yes, removeCurrentSite() will be called via the dialog callback.
+          mActivity.showDialog(CONFIRMATION_REMOVE_DIALOG);
+        } else {
+          PermissionType type =
+              (PermissionType) mCurrentPermissions.get(position);
+          if (mCurrentSite.getPermission(type) ==
+              PermissionType.PERMISSION_ALLOWED) {
+            mCurrentSite.setPermission(type, PermissionType.PERMISSION_DENIED);
+          } else {
+            mCurrentSite.setPermission(type, PermissionType.PERMISSION_ALLOWED);
+          }
+        }
+      }
+      notifyDataSetChanged();
+    }
+
+    public boolean backButtonPressed() {
+      if (mCurrentSite != null) { // we intercept the back button
+        mCurrentSite = null;
+        setMainTitle();
+        notifyDataSetChanged();
+        return true;
+      }
+      return false;
+    }
+
   }
 
   /**
@@ -423,21 +407,6 @@
   }
 
   /**
-   * Utility method used by the settings dialog, signaling
-   * the user the settings have been modified.
-   * We reflect this by enabling the Allow button (disabled
-   * by default).
-   */
-  public void signalChanges() {
-    View view = findViewById(R.id.button_allow);
-    if (view != null) {
-      Button button = (Button) view;
-      button.setEnabled(true);
-    }
-    mChanges = true;
-  }
-
-  /**
    * Computes the difference between the original permissions and the
    * current ones. Returns a json-formatted string.
    * It is used by the Settings dialog.
@@ -479,18 +448,7 @@
   }
 
   public String closeDialog(int closingType) {
-    String ret = null;
-    switch (closingType) {
-      case ALWAYS_DENY:
-        ret = "{\"allow\": false }";
-        break;
-      case ALLOW:
-        ret = computeDiff(true);
-        break;
-      case DENY:
-        ret = computeDiff(false);
-        break;
-    }
+    String ret = computeDiff(mChanges);
 
     if (mDebug) {
       printPermissions();
diff --git a/src/com/android/browser/GearsShortcutDialog.java b/src/com/android/browser/GearsShortcutDialog.java
deleted file mode 100644
index deede12..0000000
--- a/src/com/android/browser/GearsShortcutDialog.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.app.Activity;
-import android.os.Handler;
-import android.util.Log;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Gears Shortcut dialog
- */
-class GearsShortcutDialog extends GearsBaseDialog {
-
-  private static final String TAG = "GearsPermissionsDialog";
-
-  private final String ICON_16 = "icon16x16";
-  private final String ICON_32 = "icon32x32";
-  private final String ICON_48 = "icon48x48";
-  private final String ICON_128 = "icon128x128";
-
-  public GearsShortcutDialog(Activity activity,
-                             Handler handler,
-                             String arguments) {
-    super (activity, handler, arguments);
-  }
-
-  public void setup() {
-    inflate(R.layout.gears_dialog_permission, R.id.panel_content);
-    setupButtons(R.string.shortcut_button_alwaysdeny,
-                 R.string.shortcut_button_allow,
-                 R.string.shortcut_button_deny);
-
-    View contentBorder = findViewById(R.id.content_border);
-    if (contentBorder != null) {
-      contentBorder.setBackgroundResource(R.color.shortcut_border);
-    }
-    View contentBackground = findViewById(R.id.content_background);
-    if (contentBackground != null) {
-      contentBackground.setBackgroundResource(R.color.shortcut_background);
-    }
-
-    try {
-      JSONObject json = new JSONObject(mDialogArguments);
-
-      String iconUrl = pickIconToRender(json);
-      if (iconUrl != null) {
-        downloadIcon(iconUrl);
-      }
-
-      setupDialog();
-
-      setLabel(json, "name", R.id.origin_title);
-      setLabel(json, "link", R.id.origin_subtitle);
-      setLabel(json, "description", R.id.origin_message);
-    } catch (JSONException e) {
-      Log.e(TAG, "JSON exception", e);
-    }
-  }
-
-  public void setupDialog(TextView message, ImageView icon) {
-    message.setText(R.string.shortcut_message);
-    icon.setImageResource(R.drawable.gears_icon_48x48);
-  }
-
-  /**
-   * Utility method to validate an icon url. Used in the
-   * shortcut dialog.
-   */
-  boolean validIcon(JSONObject json, String name) {
-    try {
-      if (json.has(name)) {
-        String str = json.getString(name);
-        if (str.length() > 0) {
-          return true;
-        }
-      }
-    } catch (JSONException e) {
-      Log.e(TAG, "JSON exception", e);
-    }
-    return false;
-  }
-
-
-  /**
-   * Utility method to pick the best indicated icon
-   * from the dialogs' arguments. Used in the
-   * shortcut dialog.
-   */
-  String pickIconToRender(JSONObject json) {
-    try {
-      if (validIcon(json, ICON_48)) { // ideal size
-        mChoosenIconSize = 48;
-        return json.getString(ICON_48);
-      } else if (validIcon(json, ICON_32)) {
-        mChoosenIconSize = 32;
-        return json.getString(ICON_32);
-      } else if (validIcon(json, ICON_128)) {
-        mChoosenIconSize = 128;
-        return json.getString(ICON_128);
-      } else if (validIcon(json, ICON_16)) {
-        mChoosenIconSize = 16;
-        return json.getString(ICON_16);
-      }
-    } catch (JSONException e) {
-      Log.e(TAG, "JSON exception", e);
-    }
-    mChoosenIconSize = 0;
-    return null;
-  }
-
-  public String closeDialog(int closingType) {
-    String ret = null;
-    switch (closingType) {
-      case ALWAYS_DENY:
-        ret = "{\"allow\": false, \"permanently\": true }";
-        break;
-      case ALLOW:
-        ret = "{\"allow\": true, \"locations\": 0 }";
-        break;
-      case DENY:
-        ret = null;
-        break;
-    }
-    return ret;
-  }
-
-}
diff --git a/src/com/android/browser/HistoryItem.java b/src/com/android/browser/HistoryItem.java
index c83ced1..55e43f0 100644
--- a/src/com/android/browser/HistoryItem.java
+++ b/src/com/android/browser/HistoryItem.java
@@ -17,26 +17,31 @@
  
 package com.android.browser;
 
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
 import android.content.Context;
+import android.database.Cursor;
 import android.graphics.Bitmap;
-import android.graphics.Color;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.graphics.drawable.PaintDrawable;
-import android.view.LayoutInflater;
-import android.widget.LinearLayout;
+import android.net.Uri;
+import android.provider.Browser;
+import android.util.Log;
+import android.view.View;
+import android.webkit.WebIconDatabase;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
 import android.widget.TextView;
+import android.widget.Toast;
+
+import java.util.Date;
 
 /**
  *  Layout representing a history item in the classic history viewer.
  */
-/* package */ class HistoryItem extends LinearLayout {
+/* package */ class HistoryItem extends BookmarkItem {
 
-    private TextView    mTitleView; // Truncated Title
-    private String      mUrl;       // Full Url
-    private TextView    mUrlText;   // Truncated Url
-    
+    private CompoundButton  mStar;      // Star for bookmarking
+    private CompoundButton.OnCheckedChangeListener  mListener;
     /**
      *  Create a new HistoryItem.
      *  @param context  Context for this HistoryItem.
@@ -44,83 +49,79 @@
     /* package */ HistoryItem(Context context) {
         super(context);
 
-        setWillNotDraw(false);
-        LayoutInflater factory = LayoutInflater.from(context);
-        factory.inflate(R.layout.history_item, this);
-        mTitleView = (TextView) findViewById(R.id.title);
-        mUrlText = (TextView) findViewById(R.id.url);
+        mStar = (CompoundButton) findViewById(R.id.star);
+        mStar.setVisibility(View.VISIBLE);
+        mListener = new CompoundButton.OnCheckedChangeListener() {
+            public void onCheckedChanged(CompoundButton buttonView,
+                    boolean isChecked) {
+                ContentResolver cr = mContext.getContentResolver();
+                Cursor cursor = cr.query(
+                        Browser.BOOKMARKS_URI,
+                        Browser.HISTORY_PROJECTION,
+                        "url = ?",
+                        new String[] { mUrl },
+                        null);
+                boolean first = cursor.moveToFirst();
+                // Should be in the database no matter what
+                if (!first) {
+                    throw new AssertionError("URL is not in the database!");
+                }
+                if (isChecked) {
+                    // Add to bookmarks
+                    // FIXME: Share code with AddBookmarkPage.java
+                    ContentValues map = new ContentValues();
+                    map.put(Browser.BookmarkColumns.CREATED,
+                            new Date().getTime());
+                    map.put(Browser.BookmarkColumns.TITLE, getName());
+                    map.put(Browser.BookmarkColumns.BOOKMARK, 1);
+                    try {
+                        cr.update(Browser.BOOKMARKS_URI, map, 
+                                "_id = " + cursor.getInt(0), null);
+                    } catch (IllegalStateException e) {
+                        Log.e("HistoryItem", "no database!");
+                    }
+                    WebIconDatabase.getInstance().retainIconForPageUrl(mUrl);
+                    // catch IllegalStateException?
+                    Toast.makeText(mContext, R.string.added_to_bookmarks,
+                            Toast.LENGTH_LONG).show();
+                } else {
+                    // Remove from bookmarks
+                    // FIXME: This code should be shared with
+                    // BrowserBookmarksAdapter.java
+                    WebIconDatabase.getInstance().releaseIconForPageUrl(mUrl);
+                    Uri uri = ContentUris.withAppendedId(Browser.BOOKMARKS_URI,
+                            cursor.getInt(Browser.HISTORY_PROJECTION_ID_INDEX));
+                    // It is no longer a bookmark, but it is still a visited
+                    // site.
+                    ContentValues values = new ContentValues();
+                    values.put(Browser.BookmarkColumns.BOOKMARK, 0);
+                    try {
+                        cr.update(uri, values, null, null);
+                    } catch (IllegalStateException e) {
+                        Log.e("HistoryItem", "no database!");
+                    }
+                    Toast.makeText(mContext, R.string.removed_from_bookmarks,
+                            Toast.LENGTH_LONG).show();
+                }
+                cursor.deactivate();
+            }
+        };
     }
     
     void copyTo(HistoryItem item) {
-        item.mTitleView.setText(mTitleView.getText());
+        item.mTextView.setText(mTextView.getText());
         item.mUrlText.setText(mUrlText.getText());
-    }
-    
-    /**
-     * Return the name of this HistoryItem.
-     * @return  String name of this HistoryItem.
-     /
-    /* package */ String getName() {
-        return mTitleView.getText().toString();
+        item.setIsBookmark(mStar.isChecked());
+        item.mImageView.setImageDrawable(mImageView.getDrawable());
     }
 
     /**
-     * Return the url of this HistoryItem.
-     * @return  String url of this HistoryItem.
-     /
-    /* package */ String getUrl() {
-        return mUrl;
-    }
-
-    /**
-     *  Set the favicon for this item.
-     *
-     *  @param b    The new bitmap for this item.
-     *              If it is null, will use the default.
+     *  Set whether or not this represents a bookmark, and make sure the star
+     *  behaves appropriately.
      */
-    /* package */ void setFavicon(Bitmap b) {
-        Drawable[] array = new Drawable[2];
-        PaintDrawable p = new PaintDrawable(Color.WHITE);
-        p.setCornerRadius(3f);
-        array[0] = p;
-        if (b != null) {
-            array[1] = new BitmapDrawable(b);
-        } else {
-            array[1] = new BitmapDrawable(mContext.getResources().
-                    openRawResource(R.drawable.app_web_browser_sm));
-        }
-        LayerDrawable d = new LayerDrawable(array);
-        d.setLayerInset(1, 2, 2, 2, 2);
-        d.setBounds(0, 0, 20, 20);
-        mTitleView.setCompoundDrawables(d, null, null, null);
-    }
-    
-    /**
-     *  Set the name for this HistoryItem.
-     *  If the name is longer that BrowserSettings.MAX_TEXTVIEW_LEN characters, 
-     *  the name is truncated to BrowserSettings.MAX_TEXTVIEW_LEN characters. 
-     *  The History activity does not expose a UI element that can show the 
-     *  full title.
-     *  @param  name String representing new name for this HistoryItem.
-     */
-    /* package */ void setName(String name) {
-        if (name != null && name.length() > BrowserSettings.MAX_TEXTVIEW_LEN) {
-            name = name.substring(0, BrowserSettings.MAX_TEXTVIEW_LEN);
-        }
-        mTitleView.setText(name);
-    }
-    
-    /**
-     *  Set the url for this HistoryItem.
-     *  @param  url String representing new url for this HistoryItem.
-     */
-    /* package */ void setUrl(String url) {
-        mUrl = url;
-        // Truncate the url for the screen
-        if (url.length() > BrowserSettings.MAX_TEXTVIEW_LEN) {
-            mUrlText.setText(url.substring(0, BrowserSettings.MAX_TEXTVIEW_LEN));
-        } else {
-            mUrlText.setText(url);
-        }
+    void setIsBookmark(boolean isBookmark) {
+        mStar.setOnCheckedChangeListener(null);
+        mStar.setChecked(isBookmark);
+        mStar.setOnCheckedChangeListener(mListener);
     }
 }
diff --git a/src/com/android/browser/IGearsDialogService.aidl b/src/com/android/browser/IGearsDialogService.aidl
deleted file mode 100644
index 02b30a2..0000000
--- a/src/com/android/browser/IGearsDialogService.aidl
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.android.browser;
-
-interface IGearsDialogService {
-  String showDialog(String htmlContent, String dialogArguments,
-             boolean inSettings);
-}
diff --git a/src/com/android/browser/ImageAdapter.java b/src/com/android/browser/ImageAdapter.java
index b4c1209..e957143 100644
--- a/src/com/android/browser/ImageAdapter.java
+++ b/src/com/android/browser/ImageAdapter.java
@@ -231,20 +231,7 @@
         if (l == null) {
             return;
         }
-        DialogInterface.OnClickListener confirm =
-                new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog,
-                            int whichButton) {
-                        l.remove(position);
-                    }
-                };
-        new AlertDialog.Builder(mContext)
-                .setTitle(R.string.close)
-                .setIcon(android.R.drawable.ic_dialog_alert)
-                .setMessage(R.string.close_window)
-                .setPositiveButton(R.string.ok, confirm)
-                .setNegativeButton(R.string.cancel, null)
-                .show();
+        l.remove(position);
     }
 
     /* (non-Javadoc)
diff --git a/src/com/android/browser/MostVisitedActivity.java b/src/com/android/browser/MostVisitedActivity.java
new file mode 100644
index 0000000..704ee27
--- /dev/null
+++ b/src/com/android/browser/MostVisitedActivity.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.app.ListActivity;
+import android.content.Intent;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.database.DataSetObserver;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.Browser;
+import android.webkit.WebIconDatabase.IconListener;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.SimpleCursorAdapter;
+import android.widget.TextView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+
+import java.util.Vector;
+
+public class MostVisitedActivity extends ListActivity {
+
+    private MyAdapter   mAdapter;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mAdapter = new MyAdapter();
+        CombinedBookmarkHistoryActivity.getIconListenerSet(getContentResolver())
+                .addListener(new IconReceiver());
+        setListAdapter(mAdapter);
+        ListView list = getListView();
+        LayoutInflater factory = LayoutInflater.from(this);
+        View v = factory.inflate(R.layout.empty_history, null);
+        addContentView(v, new LayoutParams(LayoutParams.FILL_PARENT,
+                LayoutParams.FILL_PARENT));
+        list.setEmptyView(v);
+    }
+
+    private class IconReceiver implements IconListener {
+        public void onReceivedIcon(String url, Bitmap icon) {
+            setListAdapter(mAdapter);
+        }
+    }
+
+    protected void onListItemClick(ListView l, View v, int position, long id) {
+        TextView tv = (TextView) v.findViewById(R.id.url);
+        String url = tv.getText().toString();
+        loadUrl(url, false);
+    }
+
+    private void loadUrl(String url, boolean newWindow) {
+        Intent intent = new Intent().setAction(url);
+        if (newWindow) {
+            Bundle b = new Bundle();
+            b.putBoolean("new_window", true);
+            intent.putExtras(b);
+        }
+        setResultToParent(RESULT_OK, intent);
+        finish();
+    }
+
+    private class MyAdapter implements ListAdapter {
+        private Vector<DataSetObserver> mObservers;
+        private Cursor mCursor;
+        // These correspond with projection below.
+        private final int mUrlIndex = 0;
+        private final int mTitleIndex = 1;
+        private final int mBookmarkIndex = 2;
+
+        MyAdapter() {
+            mObservers = new Vector<DataSetObserver>();
+            String[] projection = new String[] {
+                    Browser.BookmarkColumns.URL,
+                    Browser.BookmarkColumns.TITLE,
+                    Browser.BookmarkColumns.BOOKMARK };
+            String whereClause = Browser.BookmarkColumns.VISITS + " != 0";
+            String orderBy = Browser.BookmarkColumns.VISITS + " DESC";
+            mCursor = managedQuery(Browser.BOOKMARKS_URI, projection,
+                    whereClause, null, orderBy);
+            mCursor.registerContentObserver(new ChangeObserver());
+        }
+
+        private class ChangeObserver extends ContentObserver {
+            public ChangeObserver() {
+                super(new Handler());
+            }
+
+            @Override
+            public boolean deliverSelfNotifications() {
+                return true;
+            }
+
+            @Override
+            public void onChange(boolean selfChange) {
+                MyAdapter.this.refreshData();
+            }
+        }
+
+        void refreshData() {
+            mCursor.requery();
+            for (DataSetObserver o : mObservers) {
+                o.onChanged();
+            }
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            HistoryItem item;
+            if (null == convertView) {
+                item = new HistoryItem(MostVisitedActivity.this);
+            } else {
+                item = (HistoryItem) convertView;
+            }
+            mCursor.moveToPosition(position);
+            item.setName(mCursor.getString(mTitleIndex));
+            String url = mCursor.getString(mUrlIndex);
+            item.setUrl(url);
+            item.setFavicon(CombinedBookmarkHistoryActivity.getIconListenerSet(
+                    getContentResolver()).getFavicon(url));
+            item.setIsBookmark(1 == mCursor.getInt(mBookmarkIndex));
+            return item;
+        }
+
+        public boolean areAllItemsEnabled() {
+            return true;
+        }
+
+        public boolean isEnabled(int position) {
+            return true;
+        }
+
+        public int getCount() {
+            return mCursor.getCount();
+        }
+
+        public Object getItem(int position) {
+            return null;
+        }
+
+        public long getItemId(int position) {
+            return position;
+        }
+
+        // Always a HistoryItem
+        public int getItemViewType(int position) {
+            return 0;
+        }
+
+        public int getViewTypeCount() {
+            return 1;
+        }
+
+        public boolean hasStableIds() {
+            return true;
+        }
+
+        public void registerDataSetObserver(DataSetObserver observer) {
+            mObservers.add(observer);
+        }
+
+        public void unregisterDataSetObserver(DataSetObserver observer) {
+            mObservers.remove(observer);
+        }
+
+        public boolean isEmpty() {
+            return getCount() == 0;
+        }
+    }
+
+    // This Activity is generally a sub-Activity of CombinedHistoryActivity. In
+    // that situation, we need to pass our result code up to our parent.
+    // However, if someone calls this Activity directly, then this has no
+    // parent, and it needs to set it on itself.
+    private void setResultToParent(int resultCode, Intent data) {
+        Activity a = getParent() == null ? this : getParent();
+        a.setResult(resultCode, data);
+    }
+}
+
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index dfac185..d58ee22 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -17,7 +17,9 @@
 package com.android.browser;
 
 import android.content.Context;
+import android.net.http.SslError;
 import android.os.Bundle;
+import android.os.Message;
 import android.util.Config;
 import android.util.Log;
 import android.view.Gravity;
@@ -25,8 +27,10 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.View.OnClickListener;
+import android.webkit.HttpAuthHandler;
 import android.webkit.JsPromptResult;
 import android.webkit.JsResult;
+import android.webkit.SslErrorHandler;
 import android.webkit.WebBackForwardList;
 import android.webkit.WebChromeClient;
 import android.webkit.WebHistoryItem;
@@ -79,6 +83,26 @@
         public boolean shouldOverrideUrlLoading(WebView view, String url) {
             return mClient.shouldOverrideUrlLoading(view, url);
         }
+        @Override
+        public void onReceivedSslError(WebView view, SslErrorHandler handler,
+                SslError error) {
+            mClient.onReceivedSslError(view, handler, error);
+        }
+        @Override
+        public void onReceivedHttpAuthRequest(WebView view,
+                HttpAuthHandler handler, String host, String realm) {
+            mClient.onReceivedHttpAuthRequest(view, handler, host, realm);
+        }
+        @Override
+        public void onFormResubmission(WebView view, Message dontResend,
+                Message resend) {
+            mClient.onFormResubmission(view, dontResend, resend);
+        }
+        @Override
+        public void onReceivedError(WebView view, int errorCode,
+                String description, String failingUrl) {
+            mClient.onReceivedError(view, errorCode, description, failingUrl);
+        }
     }
     // Subclass of WebChromeClient to display javascript dialogs.
     private class SubWindowChromeClient extends WebChromeClient {
@@ -150,11 +174,19 @@
         private Vector<Tab> mChildTabs;
 
         private Boolean mCloseOnExit;
+        // Application identifier used to find tabs that another application
+        // wants to reuse.
+        private String mAppId;
+        // Keep the original url around to avoid killing the old WebView if the
+        // url has not changed.
+        private String mOriginalUrl;
 
         // Construct a new tab
-        private Tab(WebView w, boolean closeOnExit) {
+        private Tab(WebView w, boolean closeOnExit, String appId, String url) {
             mMainView = w;
             mCloseOnExit = closeOnExit;
+            mAppId = appId;
+            mOriginalUrl = url;
         }
 
         /**
@@ -379,30 +411,34 @@
     }
 
     /**
-     * Create a new tab and display the new tab immediately.
+     * Create a new tab.
      * @return The newly createTab or null if we have reached the maximum
      *         number of open tabs.
      */
-    Tab createNewTab(boolean closeOnExit) {
+    Tab createNewTab(boolean closeOnExit, String appId, String url) {
         int size = mTabs.size();
         // Return false if we have maxed out on tabs
         if (MAX_TABS == size) {
             return null;
         }
-        // Create a new WebView
-        WebView w = new WebView(mActivity);
-        w.setMapTrackballToArrowKeys(false); // use trackball directly
-        // Add this WebView to the settings observer list and update the
-        // settings
-        final BrowserSettings s = BrowserSettings.getInstance();
-        s.addObserver(w.getSettings()).update(s, null);
+        final WebView w = createNewWebView();
         // Create a new tab and add it to the tab list
-        Tab t = new Tab(w, closeOnExit);
+        Tab t = new Tab(w, closeOnExit, appId, url);
         mTabs.add(t);
+        // Initially put the tab in the background.
+        putTabInBackground(t);
         return t;
     }
 
     /**
+     * Create a new tab with default values for closeOnExit(false),
+     * appId(null), and url(null).
+     */
+    Tab createNewTab() {
+        return createNewTab(false, null, null);
+    }
+
+    /**
      * Remove the tab from the list. If the tab is the current tab shown, the
      * last created tab will be shown.
      * @param t The tab to be removed.
@@ -510,6 +546,8 @@
     private static final String CURRTITLE = "currentTitle";
     private static final String CLOSEONEXIT = "closeonexit";
     private static final String PARENTTAB = "parentTab";
+    private static final String APPID = "appid";
+    private static final String ORIGINALURL = "originalUrl";
 
     /**
      * Save the state of all the Tabs.
@@ -543,7 +581,7 @@
             final int currentTab = inState.getInt(CURRTAB, -1);
             for (int i = 0; i < numTabs; i++) {
                 if (i == currentTab) {
-                    Tab t = createNewTab(false);
+                    Tab t = createNewTab();
                     // Me must set the current tab before restoring the state
                     // so that all the client classes are set.
                     setCurrentTab(t);
@@ -555,11 +593,15 @@
                 } else {
                     // Create a new tab and don't restore the state yet, add it
                     // to the tab list
-                    Tab t = new Tab(null, false);
+                    Tab t = new Tab(null, false, null, null);
                     t.mSavedState = inState.getBundle(WEBVIEW + i);
                     if (t.mSavedState != null) {
                         t.mUrl = t.mSavedState.getString(CURRURL);
                         t.mTitle = t.mSavedState.getString(CURRTITLE);
+                        // Need to maintain the app id and original url so we
+                        // can possibly reuse this tab.
+                        t.mAppId = t.mSavedState.getString(APPID);
+                        t.mOriginalUrl = t.mSavedState.getString(ORIGINALURL);
                     }
                     mTabs.add(t);
                     mTabQueue.add(t);
@@ -602,7 +644,9 @@
         // free the WebView cache
         Log.w(LOGTAG, "Free WebView cache");
         WebView view = getCurrentWebView();
-        view.clearCache(false);
+        if (view != null) {
+            view.clearCache(false);
+        }
         // force a gc
         System.gc();
     }
@@ -699,13 +743,92 @@
     }
 
     /**
+     * Return the tab with the matching application id.
+     * @param id The application identifier.
+     */
+    Tab getTabFromId(String id) {
+        if (id == null) {
+            return null;
+        }
+        final int size = getTabCount();
+        for (int i = 0; i < size; i++) {
+            final Tab t = getTab(i);
+            if (id.equals(t.mAppId)) {
+                return t;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Recreate the main WebView of the given tab. Returns true if the WebView
+     * was deleted.
+     */
+    boolean recreateWebView(Tab t, String url) {
+        final WebView w = t.mMainView;
+        if (w != null) {
+            if (url != null && url.equals(t.mOriginalUrl)) {
+                // The original url matches the current url. Just go back to the
+                // first history item so we can load it faster than if we
+                // rebuilt the WebView.
+                final WebBackForwardList list = w.copyBackForwardList();
+                if (list != null) {
+                    w.goBackOrForward(-list.getCurrentIndex());
+                    w.clearHistory(); // maintains the current page.
+                    return false;
+                }
+            }
+            // Remove the settings object from the global settings and destroy
+            // the WebView.
+            BrowserSettings.getInstance().deleteObserver(
+                    t.mMainView.getSettings());
+            t.mMainView.destroy();
+        }
+        // Create a new WebView. If this tab is the current tab, we need to put
+        // back all the clients so force it to be the current tab.
+        t.mMainView = createNewWebView();
+        if (getCurrentTab() == t) {
+            setCurrentTab(t, true);
+        }
+        // Clear the saved state except for the app id and close-on-exit
+        // values.
+        t.mSavedState = null;
+        t.mUrl = null;
+        t.mTitle = null;
+        // Save the new url in order to avoid deleting the WebView.
+        t.mOriginalUrl = url;
+        return true;
+    }
+
+    /**
+     * Creates a new WebView and registers it with the global settings.
+     */
+    private WebView createNewWebView() {
+        // Create a new WebView
+        WebView w = new WebView(mActivity);
+        w.setMapTrackballToArrowKeys(false); // use trackball directly
+        // Add this WebView to the settings observer list and update the
+        // settings
+        final BrowserSettings s = BrowserSettings.getInstance();
+        s.addObserver(w.getSettings()).update(s, null);
+        return w;
+    }
+
+    /**
      * Put the current tab in the background and set newTab as the current tab.
      * @param newTab The new tab. If newTab is null, the current tab is not
      *               set.
      */
     boolean setCurrentTab(Tab newTab) {
+        return setCurrentTab(newTab, false);
+    }
+
+    /**
+     * If force is true, this method skips the check for newTab == current.
+     */
+    private boolean setCurrentTab(Tab newTab, boolean force) {
         Tab current = getTab(mCurrentTab);
-        if (current == newTab) {
+        if (current == newTab && !force) {
             return true;
         }
         if (current != null) {
@@ -733,13 +856,7 @@
         boolean needRestore = (mainView == null);
         if (needRestore) {
             // Same work as in createNewTab() except don't do new Tab()
-            newTab.mMainView = mainView = new WebView(mActivity);
-            mainView.setMapTrackballToArrowKeys(false); // use t-ball directly
-
-            // Add this WebView to the settings observer list and update the
-            // settings
-            final BrowserSettings s = BrowserSettings.getInstance();
-            s.addObserver(mainView.getSettings()).update(s, null);
+            newTab.mMainView = mainView = createNewWebView();
         }
         mainView.setWebViewClient(mActivity.getWebViewClient());
         mainView.setWebChromeClient(mActivity.getWebChromeClient());
@@ -872,6 +989,12 @@
                 b.putString(CURRTITLE, t.mTitle);
             }
             b.putBoolean(CLOSEONEXIT, t.mCloseOnExit);
+            if (t.mAppId != null) {
+                b.putString(APPID, t.mAppId);
+            }
+            if (t.mOriginalUrl != null) {
+                b.putString(ORIGINALURL, t.mOriginalUrl);
+            }
 
             // Remember the parent tab so the relationship can be restored.
             if (t.mParentTab != null) {
@@ -892,6 +1015,15 @@
         if (b == null) {
             return false;
         }
+        // Restore the internal state even if the WebView fails to restore.
+        // This will maintain the app id, original url and close-on-exit values.
+        t.mSavedState = null;
+        t.mUrl = null;
+        t.mTitle = null;
+        t.mCloseOnExit = b.getBoolean(CLOSEONEXIT);
+        t.mAppId = b.getString(APPID);
+        t.mOriginalUrl = b.getString(ORIGINALURL);
+
         final WebView w = t.mMainView;
         final WebBackForwardList list = w.restoreState(b);
         if (list == null) {
@@ -902,10 +1034,6 @@
             w.restorePicture(b, f);
             f.delete();
         }
-        t.mSavedState = null;
-        t.mUrl = null;
-        t.mTitle = null;
-        t.mCloseOnExit = b.getBoolean(CLOSEONEXIT);
         return true;
     }
 }