diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3be62c7..e852560 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -18,8 +18,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.browser">
 
-    <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
     <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 7a43e14..6cdd112 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -30,7 +30,6 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.ServiceConnection;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -45,7 +44,6 @@
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
 import android.net.Uri;
 import android.net.WebAddress;
 import android.net.http.SslCertificate;
@@ -55,11 +53,9 @@
 import android.os.Debug;
 import android.os.Environment;
 import android.os.Handler;
-import android.os.IBinder;
 import android.os.Message;
 import android.os.PowerManager;
 import android.os.Process;
-import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.provider.Browser;
@@ -102,10 +98,15 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 import android.widget.Toast;
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AccountManagerFuture;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
+import android.accounts.AccountManagerCallback;
 
 import com.android.common.Patterns;
 
-import com.google.android.googleapps.IGoogleLoginService;
 import com.google.android.googlelogin.GoogleLoginServiceConstants;
 
 import java.io.ByteArrayOutputStream;
@@ -124,8 +125,8 @@
 import java.util.regex.Pattern;
 
 public class BrowserActivity extends Activity
-    implements View.OnCreateContextMenuListener,
-        DownloadListener {
+    implements View.OnCreateContextMenuListener, DownloadListener,
+        AccountManagerCallback<Account[]> {
 
     /* Define some aliases to make these debugging flags easier to refer to.
      * This file imports android.provider.Browser, so we can't just refer to "Browser.DEBUG".
@@ -134,9 +135,6 @@
     private final static boolean LOGV_ENABLED = com.android.browser.Browser.LOGV_ENABLED;
     private final static boolean LOGD_ENABLED = com.android.browser.Browser.LOGD_ENABLED;
 
-    private IGoogleLoginService mGls = null;
-    private ServiceConnection mGlsConnection = null;
-
     // These are single-character shortcuts for searching popular sources.
     private static final int SHORTCUT_INVALID = 0;
     private static final int SHORTCUT_GOOGLE_SEARCH = 1;
@@ -144,89 +142,73 @@
     private static final int SHORTCUT_DICTIONARY_SEARCH = 3;
     private static final int SHORTCUT_GOOGLE_MOBILE_LOCAL_SEARCH = 4;
 
+    private Account[] mAccountsGoogle;
+    private Account[] mAccountsPreferHosted;
+
+    private void startReadOfGoogleAccounts() {
+        mAccountsGoogle = null;
+        mAccountsPreferHosted = null;
+
+        AccountManager.get(this).getAccountsByTypeAndFeatures(
+                GoogleLoginServiceConstants.ACCOUNT_TYPE,
+                new String[]{GoogleLoginServiceConstants.FEATURE_LEGACY_HOSTED_OR_GOOGLE},
+                this, null);
+    }
+
+    /** This implements AccountManagerCallback<Account[]> */
+    public void run(AccountManagerFuture<Account[]> accountManagerFuture) {
+        try {
+            if (mAccountsGoogle == null) {
+                mAccountsGoogle = accountManagerFuture.getResult();
+
+                AccountManager.get(this).getAccountsByTypeAndFeatures(
+                        GoogleLoginServiceConstants.ACCOUNT_TYPE,
+                        new String[]{GoogleLoginServiceConstants.FEATURE_LEGACY_GOOGLE},
+                        this, null);
+            } else {
+                mAccountsPreferHosted = accountManagerFuture.getResult();
+                setupHomePage();
+            }
+        } catch (OperationCanceledException e) {
+            setupHomePage();
+        } catch (IOException e) {
+            setupHomePage();
+        } catch (AuthenticatorException e) {
+            setupHomePage();
+        }
+    }
+
     private void setupHomePage() {
-        final Runnable getAccount = new Runnable() {
-            public void run() {
-                // Lower priority
-                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-                // get the default home page
-                String homepage = mSettings.getHomePage();
+        // get the default home page
+        String homepage = mSettings.getHomePage();
 
-                try {
-                    if (mGls == null) return;
+        if (mAccountsPreferHosted != null && mAccountsGoogle != null) {
+            // three cases:
+            //
+            //   hostedUser == googleUser
+            //      The device has only a google account
+            //
+            //   hostedUser != googleUser
+            //      The device has a hosted account and a google account
+            //
+            //   hostedUser != null, googleUser == null
+            //      The device has only a hosted account (so far)
+            String hostedUser = mAccountsPreferHosted.length == 0 
+                    ? null
+                    : mAccountsPreferHosted[0].name;
+            String googleUser = mAccountsGoogle.length == 0 ? null : mAccountsGoogle[0].name;
 
-                    if (!homepage.startsWith("http://www.google.")) return;
-                    if (homepage.indexOf('?') == -1) return;
+            // developers might have no accounts at all
+            if (hostedUser == null) return;
 
-                    String hostedUser = mGls.getAccount(GoogleLoginServiceConstants.PREFER_HOSTED);
-                    String googleUser = mGls.getAccount(GoogleLoginServiceConstants.REQUIRE_GOOGLE);
-
-                    // three cases:
-                    //
-                    //   hostedUser == googleUser
-                    //      The device has only a google account
-                    //
-                    //   hostedUser != googleUser
-                    //      The device has a hosted account and a google account
-                    //
-                    //   hostedUser != null, googleUser == null
-                    //      The device has only a hosted account (so far)
-
-                    // developers might have no accounts at all
-                    if (hostedUser == null) return;
-
-                    if (googleUser == null || !hostedUser.equals(googleUser)) {
-                        String domain = hostedUser.substring(hostedUser.lastIndexOf('@')+1);
-                        homepage = homepage.replace("?", "/a/" + domain + "?");
-                    }
-                } catch (RemoteException ignore) {
-                    // Login service died; carry on
-                } catch (RuntimeException ignore) {
-                    // Login service died; carry on
-                } finally {
-                    finish(homepage);
-                }
+            if (googleUser == null || !hostedUser.equals(googleUser)) {
+                String domain = hostedUser.substring(hostedUser.lastIndexOf('@')+1);
+                homepage = homepage.replace("?", "/a/" + domain + "?");
             }
+        }
 
-            private void finish(final String homepage) {
-                mHandler.post(new Runnable() {
-                    public void run() {
-                        mSettings.setHomePage(BrowserActivity.this, homepage);
-                        resumeAfterCredentials();
-
-                        // as this is running in a separate thread,
-                        // BrowserActivity's onDestroy() may have been called,
-                        // which also calls unbindService().
-                        if (mGlsConnection != null) {
-                            // we no longer need to keep GLS open
-                            unbindService(mGlsConnection);
-                            mGlsConnection = null;
-                        }
-                    } });
-            } };
-
-        final boolean[] done = { false };
-
-        // Open a connection to the Google Login Service.  The first
-        // time the connection is established, set up the homepage depending on
-        // the account in a background thread.
-        mGlsConnection = new ServiceConnection() {
-            public void onServiceConnected(ComponentName className, IBinder service) {
-                mGls = IGoogleLoginService.Stub.asInterface(service);
-                if (done[0] == false) {
-                    done[0] = true;
-                    Thread account = new Thread(getAccount);
-                    account.setName("GLSAccount");
-                    account.start();
-                }
-            }
-            public void onServiceDisconnected(ComponentName className) {
-                mGls = null;
-            }
-        };
-
-        bindService(GoogleLoginServiceConstants.SERVICE_INTENT,
-                    mGlsConnection, Context.BIND_AUTO_CREATE);
+        mSettings.setHomePage(BrowserActivity.this, homepage);
+        resumeAfterCredentials();
     }
 
     private static class ClearThumbnails extends AsyncTask<File, Void, Void> {
@@ -400,7 +382,7 @@
             // asset directory to the data partition.
             if ((extra == null || !extra.getBoolean("testing"))
                     && !mSettings.isLoginInitialized()) {
-                setupHomePage();
+                startReadOfGoogleAccounts();
             }
 
             if (urlData.isEmpty()) {
@@ -1018,10 +1000,6 @@
         // Destroy all the tabs
         mTabControl.destroy();
         WebIconDatabase.getInstance().close();
-        if (mGlsConnection != null) {
-            unbindService(mGlsConnection);
-            mGlsConnection = null;
-        }
 
         unregisterReceiver(mPackageInstallationReceiver);
     }
