diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 71fef38..170083d 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -54,8 +54,6 @@
 import android.graphics.drawable.PaintDrawable;
 import android.hardware.SensorListener;
 import android.hardware.SensorManager;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
 import android.net.Uri;
 import android.net.WebAddress;
 import android.net.http.EventHandler;
@@ -63,7 +61,6 @@
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.os.AsyncTask;
-import android.os.Build;
 import android.os.Bundle;
 import android.os.Debug;
 import android.os.Environment;
@@ -78,7 +75,6 @@
 import android.os.SystemProperties;
 import android.preference.PreferenceManager;
 import android.provider.Browser;
-import android.provider.Checkin;
 import android.provider.Contacts.Intents.Insert;
 import android.provider.Contacts;
 import android.provider.Downloads;
@@ -104,7 +100,6 @@
 import android.view.animation.AlphaAnimation;
 import android.view.animation.Animation;
 import android.view.animation.AnimationSet;
-import android.view.animation.AnimationUtils;
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.ScaleAnimation;
 import android.view.animation.TranslateAnimation;
@@ -112,8 +107,6 @@
 import android.webkit.CookieSyncManager;
 import android.webkit.DownloadListener;
 import android.webkit.HttpAuthHandler;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
 import android.webkit.SslErrorHandler;
 import android.webkit.URLUtil;
 import android.webkit.WebChromeClient;
@@ -143,7 +136,6 @@
 import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.regex.Matcher;
@@ -151,7 +143,6 @@
 import java.util.Vector;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
-import java.util.zip.ZipInputStream;
 
 public class BrowserActivity extends Activity
     implements KeyTracker.OnKeyTracker,
@@ -210,7 +201,8 @@
 
                     if (googleUser == null || !hostedUser.equals(googleUser)) {
                         String domain = hostedUser.substring(hostedUser.lastIndexOf('@')+1);
-                        homepage = "http://www.google.com/m/a/" + domain;
+                        homepage = "http://www.google.com/m/a/" + domain + "?client=ms-" +
+                            SystemProperties.get("ro.com.google.clientid", "unknown");
                     }
                 } catch (RemoteException ignore) {
                     // Login service died; carry on
@@ -228,7 +220,7 @@
                         resumeAfterCredentials();
 
                         // as this is running in a separate thread,
-                        // BrowserActivity's onDestroy() may have been called, 
+                        // BrowserActivity's onDestroy() may have been called,
                         // which also calls unbindService().
                         if (mGlsConnection != null) {
                             // we no longer need to keep GLS open
@@ -665,10 +657,8 @@
         mGenericFavicon = getResources().getDrawable(
                 R.drawable.app_web_browser_sm);
 
-
-        mContentView = new FrameLayout(this);
-
-        setContentView(mContentView);
+        mContentView = (FrameLayout) getWindow().getDecorView().findViewById(
+                com.android.internal.R.id.content);
 
         // Create the tab control and our initial tab
         mTabControl = new TabControl(this);
@@ -773,7 +763,7 @@
         }
         final String action = intent.getAction();
         final int flags = intent.getFlags();
-        if (Intent.ACTION_MAIN.equals(action) || 
+        if (Intent.ACTION_MAIN.equals(action) ||
                 (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
             // just resume the browser
             return;
@@ -786,7 +776,7 @@
             if (url == null || url.length() == 0) {
                 url = mSettings.getHomePage();
             }
-            if (Intent.ACTION_VIEW.equals(action) && 
+            if (Intent.ACTION_VIEW.equals(action) &&
                     (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
                 // 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
@@ -872,7 +862,7 @@
 
     /**
      * Looking for the pattern like this
-     * 
+     *
      *          *
      *         * *
      *      ***   *     *******
@@ -890,7 +880,7 @@
         public void onSensorChanged(int sensor, float[] values) {
             boolean show = false;
             float[] diff = new float[3];
-            
+
             for (int i = 0; i < 3; i++) {
                 diff[i] = values[i] - mPrev[i];
                 if (Math.abs(diff[i]) > 1) {
@@ -959,7 +949,7 @@
 
         public void onAccuracyChanged(int sensor, int accuracy) {
             // TODO Auto-generated method stub
-            
+
         }
     };
 
@@ -1018,7 +1008,7 @@
         // the default implementation requires each view to have an id. As the
         // browser handles the state itself and it doesn't use id for the views,
         // don't call the default implementation. Otherwise it will trigger the
-        // warning like this, "couldn't save which view has focus because the 
+        // warning like this, "couldn't save which view has focus because the
         // focused view XXX has no id".
 
         // Save all the tabs
@@ -1088,7 +1078,7 @@
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
-        
+
         if (mPageInfoDialog != null) {
             mPageInfoDialog.dismiss();
             showPageInfo(
@@ -1132,7 +1122,7 @@
     }
 
     private boolean resumeWebView() {
-        if ((!mActivityInPause && !mPageStarted) || 
+        if ((!mActivityInPause && !mPageStarted) ||
                 (mActivityInPause && mPageStarted)) {
             CookieSyncManager.getInstance().startSync();
             WebView w = mTabControl.getCurrentWebView();
@@ -1168,7 +1158,7 @@
         mCredsDlg = new ProgressDialog(this);
         mCredsDlg.setIndeterminate(true);
         mCredsDlg.setMessage(getText(R.string.retrieving_creds_dlg_msg));
-        // If the user cancels the operation, then cancel the Google 
+        // If the user cancels the operation, then cancel the Google
         // Credentials request.
         mCredsDlg.setCancelMessage(mHandler.obtainMessage(CANCEL_CREDS_REQUEST));
         mCredsDlg.show();
@@ -1310,7 +1300,7 @@
     }
 
     @Override
-    public void startSearch(String initialQuery, boolean selectInitialQuery, 
+    public void startSearch(String initialQuery, boolean selectInitialQuery,
             Bundle appSearchData, boolean globalSearch) {
         if (appSearchData == null) {
             appSearchData = createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_TYPE);
@@ -1429,11 +1419,11 @@
                 Browser.saveBookmark(this, getTopWindow().getTitle(),
                         getTopWindow().getUrl());
                 break;
-                
+
             case R.id.share_page_menu_id:
                 Browser.sendString(this, getTopWindow().getUrl());
                 break;
-                
+
             case R.id.dump_nav_menu_id:
                 getTopWindow().debugDump();
                 break;
@@ -1455,11 +1445,11 @@
             case R.id.view_downloads_menu_id:
                 viewDownloads(null);
                 break;
-                
+
             case R.id.flip_orientation_menu_id:
-                if (mSettings.getOrientation() != 
+                if (mSettings.getOrientation() !=
                         ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
-                    mSettings.setOrientation(this, 
+                    mSettings.setOrientation(this,
                             ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                 } else {
                     mSettings.setOrientation(this,
@@ -1542,16 +1532,16 @@
                     for (int id = 0; id < WINDOW_SHORTCUT_ID_ARRAY.length; id++) {
                         if (WINDOW_SHORTCUT_ID_ARRAY[id] == menuid) {
                             TabControl.Tab desiredTab = mTabControl.getTab(id);
-                            if (desiredTab != null && 
+                            if (desiredTab != null &&
                                     desiredTab != mTabControl.getCurrentTab()) {
                                 switchTabs(mTabControl.getCurrentIndex(), id, false);
                             }
                             break;
-                        } 
+                        }
                     }
                 }
                 break;
-                
+
             default:
                 if (!super.onOptionsItemSelected(item)) {
                     return false;
@@ -1608,10 +1598,10 @@
                 final MenuItem back = menu.findItem(R.id.back_menu_id);
                 back.setVisible(canGoBack);
                 back.setEnabled(canGoBack);
-                final MenuItem flip = 
+                final MenuItem flip =
                         menu.findItem(R.id.flip_orientation_menu_id);
-                boolean keyboardClosed = 
-                        getResources().getConfiguration().hardKeyboardHidden == 
+                boolean keyboardClosed =
+                        getResources().getConfiguration().hardKeyboardHidden ==
                         Configuration.HARDKEYBOARDHIDDEN_YES;
                 flip.setEnabled(keyboardClosed);
 
@@ -1625,7 +1615,7 @@
 
                 menu.findItem(R.id.zoom_in_menu_id).setVisible(false);
                 menu.findItem(R.id.zoom_out_menu_id).setVisible(false);
-                
+
                 // decide whether to show the share link option
                 PackageManager pm = getPackageManager();
                 Intent send = new Intent(Intent.ACTION_SEND);
@@ -1634,7 +1624,7 @@
                         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.
@@ -2171,7 +2161,7 @@
             mText = toCopy;
         }
     }
-    
+
     private class Download implements OnMenuItemClickListener {
         private String mText;
 
@@ -2549,7 +2539,6 @@
     public final static int STOP_LOAD               = 1002;
 
     // Message Ids
-    private static final int JS_CONFIRM              = 101;
     private static final int FOCUS_NODE_HREF         = 102;
     private static final int CANCEL_CREDS_REQUEST    = 103;
     private static final int ANIMATE_FROM_OVERVIEW   = 104;
@@ -2563,15 +2552,6 @@
 
         public void handleMessage(Message msg) {
             switch (msg.what) {
-                case JS_CONFIRM:
-                    JsResult res = (JsResult) msg.obj;
-                    if (msg.arg1 == 0) {
-                        res.cancel();
-                    } else {
-                        res.confirm();
-                    }
-                    break;
-
                 case ANIMATE_FROM_OVERVIEW:
                     final HashMap map = (HashMap) msg.obj;
                     animateFromTabOverview((AnimatingView) map.get("view"),
@@ -2815,7 +2795,7 @@
                                     && mWebView.getContext() != null
                                     && mWebView.getContext().getSystemService(
                                     Context.CONNECTIVITY_SERVICE) != null) {
-                                ConnectivityManager cManager = 
+                                ConnectivityManager cManager =
                                         (ConnectivityManager) mWebView
                                         .getContext().getSystemService(
                                         Context.CONNECTIVITY_SERVICE);
@@ -3191,7 +3171,7 @@
                 mTabControl.createSubWindow();
                 final TabControl.Tab t = mTabControl.getCurrentTab();
                 attachSubWindow(t);
-                WebView.WebViewTransport transport = 
+                WebView.WebViewTransport transport =
                         (WebView.WebViewTransport) msg.obj;
                 transport.setWebView(t.getSubWebView());
                 msg.sendToTarget();
@@ -3338,7 +3318,7 @@
             try {
                 url = "%" + url;
                 String [] selArgs = new String[] { url };
-                
+
                 String where = Browser.BookmarkColumns.URL + " LIKE ? AND "
                         + Browser.BookmarkColumns.BOOKMARK + " = 0";
                 Cursor c = mResolver.query(Browser.BOOKMARKS_URI,
@@ -3366,159 +3346,6 @@
         public void onReceivedIcon(WebView view, Bitmap icon) {
             updateIcon(view.getUrl(), icon);
         }
-
-        //----------------------------------------------------------------------
-        // JavaScript functions.
-        //----------------------------------------------------------------------
-
-        // Show an alert to the user.
-        @Override
-        public boolean onJsAlert(WebView view, String url, String message,
-                JsResult result) {
-            String title = url;
-            if (URLUtil.isDataUrl(url)) {
-                // For data: urls, we just display 'JavaScript' similar to
-                // Safari.
-                title = getString(R.string.js_dialog_title_default);
-            } else {
-                try {
-                    URL aUrl = new URL(url);
-                    // Example: "The page at 'http://www.mit.edu' says:"
-                    title = getText(R.string.js_dialog_title_prefix)
-                        + " '"
-                        + (aUrl.getProtocol() + "://" + aUrl.getHost())
-                        + "' "
-                        + getText(R.string.js_dialog_title_suffix);
-                } catch (MalformedURLException ex) {
-                    // do nothing. just use the url passed as the title
-                }
-            }
-            final JsResult res = result;
-            new AlertDialog.Builder(BrowserActivity.this)
-                    .setTitle(title)
-                    .setMessage(message)
-                    .setPositiveButton(R.string.ok,
-                            new AlertDialog.OnClickListener() {
-                                public void onClick(DialogInterface dialog,
-                                        int which) {
-                                    res.confirm();
-                                }
-                            })
-                    .setCancelable(false)
-                    .show();
-            return true;
-        }
-
-        @Override
-        public boolean onJsConfirm(WebView view, String url, String message,
-                final JsResult result) {
-            String title = url;
-            try {
-                URL aUrl = new URL(url);
-                // Example: "The page at 'http://www.mit.edu' says:"
-                title = getText(R.string.js_dialog_title_prefix)
-                    + " '"
-                    + (aUrl.getProtocol() + "://" + aUrl.getHost())
-                    + "' "
-                    + getText(R.string.js_dialog_title_suffix);
-            } catch (MalformedURLException ex) {
-                // do nothing. just use the url passed as the title
-            }
-            new AlertDialog.Builder(BrowserActivity.this)
-                .setTitle(title)
-                .setMessage(message)
-                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        mHandler.obtainMessage(JS_CONFIRM, 1, 0, result).sendToTarget();
-                    }})
-                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        mHandler.obtainMessage(JS_CONFIRM, 0, 0, result).sendToTarget();
-                    }})
-                .show();
-            // Return true so WebView knows we will handle the confirm.
-            return true;
-        }
-
-        @Override
-        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
-                final JsPromptResult result) {
-            String title = url;
-            try {
-                URL aUrl = new URL(url);
-                // Example: "The page at 'http://www.mit.edu' says:"
-                title = getText(R.string.js_dialog_title_prefix)
-                    + " '"
-                    + (aUrl.getProtocol() + "://" + aUrl.getHost())
-                    + "' "
-                    + getText(R.string.js_dialog_title_suffix);
-            } catch (MalformedURLException ex) {
-                // do nothing, just use the url passed as the title
-            }
-
-            final LayoutInflater factory = LayoutInflater.from(BrowserActivity.this);
-            final View v = factory.inflate(R.layout.js_prompt, null);
-            ((TextView)v.findViewById(R.id.message)).setText(message);
-            ((EditText)v.findViewById(R.id.value)).setText(defaultValue);
-
-            new AlertDialog.Builder(BrowserActivity.this)
-                .setTitle(title)
-                .setView(v)
-                .setPositiveButton(R.string.ok,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int whichButton) {
-                                String value = ((EditText)v.findViewById(R.id.value)).getText()
-                                        .toString();
-                                result.confirm(value);
-                            }
-                        })
-                .setNegativeButton(R.string.cancel,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int whichButton) {
-                                result.cancel();
-                            }
-                        })
-                .setOnCancelListener(
-                        new DialogInterface.OnCancelListener() {
-                            public void onCancel(DialogInterface dialog) {
-                                result.cancel();
-                            }
-                        })
-                .show();
-
-            // Return true so WebView knows we will handle the prompt.
-            return true;
-        }
-
-        @Override
-        public boolean onJsBeforeUnload(WebView view, String url,
-                String message, final JsResult result) {
-            final String m =
-                    getString(R.string.js_dialog_before_unload, message);
-            new AlertDialog.Builder(BrowserActivity.this)
-                    .setMessage(m)
-                    .setPositiveButton(R.string.ok,
-                            new DialogInterface.OnClickListener() {
-                                public void onClick(DialogInterface dialog,
-                                        int which) {
-                                    // Use JS_CONFIRM since it has the same
-                                    // behavior we want here.
-                                    mHandler.obtainMessage(JS_CONFIRM, 1, 0,
-                                            result).sendToTarget();
-                                }})
-                    .setNegativeButton(R.string.cancel,
-                            new DialogInterface.OnClickListener() {
-                                public void onClick(DialogInterface dialog,
-                                        int which) {
-                                    // Use JS_CONFIRM since it has the same
-                                    // behavior we want here.
-                                    mHandler.obtainMessage(JS_CONFIRM, 0, 0,
-                                            result).sendToTarget();
-                                }})
-                    .show();
-            // Return true so WebView knows we will handle the dialog.
-            return true;
-        }
     };
 
     /**
@@ -3696,7 +3523,7 @@
                 .from(this);
 
         final View pageInfoView = factory.inflate(R.layout.page_info, null);
-        
+
         final WebView view = tab.getWebView();
 
         String url = null;
@@ -3770,7 +3597,7 @@
 
         // if we have a main top-level page SSL certificate set or a certificate
         // error
-        if (fromShowSSLCertificateOnError || 
+        if (fromShowSSLCertificateOnError ||
                 (view != null && view.getCertificate() != null)) {
             // add a 'View Certificate' button
             alertDialogBuilder.setNeutralButton(
@@ -3933,7 +3760,7 @@
                                 // need to show the dialog again once the
                                 // user is done exploring the page-info details
 
-                                showPageInfo(mTabControl.getTabFromView(view), 
+                                showPageInfo(mTabControl.getTabFromView(view),
                                         true);
                             }
                         })
@@ -4187,7 +4014,7 @@
         }
         getTopWindow().requestFocus();
     }
-    
+
     /*
      * This method is called as a result of the user selecting the options
      * menu to see the download window, or when a download changes state. It
@@ -4703,10 +4530,10 @@
     // overlap. A count of 0 means no animation where a count of > 0 means
     // there are animations in progress.
     private int mAnimationCount;
-    
+
     // As the ids are dynamically created, we can't guarantee that they will
     // be in sequence, so this static array maps ids to a window number.
-    final static private int[] WINDOW_SHORTCUT_ID_ARRAY = 
+    final static private int[] WINDOW_SHORTCUT_ID_ARRAY =
     { R.id.window_one_menu_id, R.id.window_two_menu_id, R.id.window_three_menu_id,
       R.id.window_four_menu_id, R.id.window_five_menu_id, R.id.window_six_menu_id,
       R.id.window_seven_menu_id, R.id.window_eight_menu_id };
diff --git a/src/com/android/browser/GearsFilePickerDialog.java b/src/com/android/browser/GearsFilePickerDialog.java
index c744a86..d84a970 100644
--- a/src/com/android/browser/GearsFilePickerDialog.java
+++ b/src/com/android/browser/GearsFilePickerDialog.java
@@ -413,7 +413,7 @@
       }
       if (mBackIcon == null) {
         mBackIcon = BitmapFactory.decodeResource(getResources(),
-                                                 R.drawable.gears_back);
+                com.android.internal.R.drawable.ic_menu_back);
       }
     }
 
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 01ef3a8..dfac185 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -107,27 +107,6 @@
             }
             mActivity.dismissSubWindow(mTab);
         }
-        // JavaScript functions
-        @Override
-        public boolean onJsAlert(WebView view, String url, String message,
-                JsResult result) {
-            return mClient.onJsAlert(view, url, message, result);
-        }
-        @Override
-        public boolean onJsConfirm(WebView view, String url, String message,
-                JsResult result) {
-            return mClient.onJsConfirm(view, url, message, result);
-        }
-        @Override
-        public boolean onJsPrompt(WebView view, String url, String message,
-                String initValue, JsPromptResult result) {
-            return mClient.onJsPrompt(view, url, message, initValue, result);
-        }
-        @Override
-        public boolean onJsBeforeUnload(WebView view, String url,
-                String message, JsResult result) {
-            return mClient.onJsBeforeUnload(view, url, message, result);
-        }
     }
     // Background WebChromeClient for focusing tabs
     private class BackgroundChromeClient extends WebChromeClient {
