diff --git a/res/values/strings.xml b/res/values/strings.xml
index 07bfdc0..31552b6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -678,9 +678,6 @@
          contact filter state. [CHAR LIMIT=64] -->
     <string name="toast_displaying_all_contacts">Displaying all contacts</string>
 
-    <!-- Message in the standard "no account" prompt that encourages the user to add a Google account before continuing to use the People app [CHAR LIMIT=NONE] -->
-    <string name="no_account_prompt">Contacts works better with a Google Account.\n\n\u2022 Access from any web browser.\n\u2022 Back up your contacts securely.</string>
-
     <!-- Message in the standard "no account" prompt that encourages the user to add any account (non Google-specific) before continuing to use the People app [CHAR LIMIT=NONE] -->
     <string name="generic_no_account_prompt">Keep your contacts safe even if you lose your phone: synchronize with an online service.</string>
 
diff --git a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
index 617ef0d..9748e46 100644
--- a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
@@ -36,7 +36,7 @@
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.util.AccountsListAdapter;
 import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
-import com.android.contacts.util.AccountPromptUtils;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 
 import java.util.List;
 
@@ -70,7 +70,7 @@
     private final OnClickListener mAddAccountClickListener = new OnClickListener() {
         @Override
         public void onClick(View v) {
-            final Intent intent = AccountPromptUtils.getIntentForAddingAccount();
+            final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount();
             startActivityForResult(intent, SUBACTIVITY_ADD_NEW_ACCOUNT);
         }
     };
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index d887ef9..7643a05 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -59,8 +59,6 @@
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.activity.RequestPermissionsActivity;
 import com.android.contacts.common.dialog.ClearFrequentsDialog;
-import com.android.contacts.common.util.ImplicitIntentsUtil;
-import com.android.contacts.common.widget.FloatingActionButtonController;
 import com.android.contacts.common.interactions.ImportExportDialogFragment;
 import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.common.list.ContactListFilter;
@@ -74,7 +72,9 @@
 import com.android.contacts.common.preference.DisplayOptionsPreferenceFragment;
 import com.android.contacts.common.util.AccountFilterUtil;
 import com.android.contacts.common.util.Constants;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.common.util.ViewUtil;
+import com.android.contacts.common.widget.FloatingActionButtonController;
 import com.android.contacts.editor.EditorIntents;
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.interactions.ContactMultiDeletionInteraction;
@@ -92,7 +92,6 @@
 import com.android.contacts.list.ProviderStatusWatcher;
 import com.android.contacts.list.ProviderStatusWatcher.ProviderStatusListener;
 import com.android.contacts.quickcontact.QuickContactActivity;
-import com.android.contacts.util.AccountPromptUtils;
 import com.android.contacts.util.DialogManager;
 import com.android.contacts.util.PhoneCapabilityTester;
 import com.android.contactsbind.HelpUtils;
@@ -196,10 +195,6 @@
         return (mProviderStatus != null) && mProviderStatus.equals(ProviderStatus.STATUS_NORMAL);
     }
 
-    private boolean areContactWritableAccountsAvailable() {
-        return ContactsUtils.areContactWritableAccountsAvailable(this);
-    }
-
     private boolean areGroupWritableAccountsAvailable() {
         return ContactsUtils.areGroupWritableAccountsAvailable(this);
     }
@@ -899,24 +894,8 @@
                 mAllFragment.setEnabled(true);
             }
         } else {
-            // If there are no accounts on the device and we should show the "no account" prompt
-            // (based on {@link SharedPreferences}), then launch the account setup activity so the
-            // user can sign-in or create an account.
-            //
-            // Also check for ability to modify accounts.  In limited user mode, you can't modify
-            // accounts so there is no point sending users to account setup activity.
-            final UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
-            final boolean disallowModifyAccounts = userManager.getUserRestrictions().getBoolean(
-                    UserManager.DISALLOW_MODIFY_ACCOUNTS);
-            if (!disallowModifyAccounts && !areContactWritableAccountsAvailable() &&
-                    AccountPromptUtils.shouldShowAccountPrompt(this)) {
-                AccountPromptUtils.neverShowAccountPromptAgain(this);
-                AccountPromptUtils.launchAccountPrompt(this);
-                return;
-            }
-
-            // Otherwise, continue setting up the page so that the user can still use the app
-            // without an account.
+            // Setting up the page so that the user can still use the app
+            // even without an account.
             if (mAllFragment != null) {
                 mAllFragment.setEnabled(false);
             }
@@ -1024,7 +1003,7 @@
 
         @Override
         public void onAddAccountAction() {
-            final Intent intent = AccountPromptUtils.getIntentForAddingAccount();
+            final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount();
             ImplicitIntentsUtil.startActivityOutsideApp(PeopleActivity.this, intent);
         }
 
diff --git a/src/com/android/contacts/util/AccountPromptUtils.java b/src/com/android/contacts/util/AccountPromptUtils.java
deleted file mode 100644
index 4fc95a5..0000000
--- a/src/com/android/contacts/util/AccountPromptUtils.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.util;
-
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerCallback;
-import android.accounts.AccountManagerFuture;
-import android.accounts.AuthenticatorDescription;
-import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.provider.ContactsContract;
-import android.provider.Settings;
-import android.util.Log;
-
-import com.android.contacts.R;
-import com.android.contacts.common.model.account.GoogleAccountType;
-
-import java.io.IOException;
-
-/**
- * Utility class for controlling whether the standard "no account" prompt on launch is shown.
- */
-public class AccountPromptUtils {
-
-    private static final String TAG = AccountPromptUtils.class.getSimpleName();
-
-    /** {@link SharedPreferences} key for whether or not the "no account" prompt should be shown. */
-    private static final String KEY_SHOW_ACCOUNT_PROMPT = "settings.showAccountPrompt";
-
-    /**
-     * The following intent keys are understood by the {@link AccountManager} and should not be
-     * changed unless the API changes.
-     */
-    private static final String KEY_INTRO_MESSAGE = "introMessage";
-    private static final String KEY_ALLOW_SKIP_ACCOUNT_SETUP = "allowSkip";
-    private static final String KEY_USER_SKIPPED_ACCOUNT_SETUP = "setupSkipped";
-
-    private static SharedPreferences getSharedPreferences(Context context) {
-        return PreferenceManager.getDefaultSharedPreferences(context);
-    }
-
-    /**
-     * Returns true if the "no account" prompt should be shown
-     * (according to {@link SharedPreferences}), otherwise return false. Since this prompt is
-     * Google-specific for the time being, this method will also return false if the Google
-     * account type is not available from the {@link AccountManager}.
-     */
-    public static boolean shouldShowAccountPrompt(Context context) {
-        // TODO: Remove the filtering of account types once there is an API in
-        // {@link AccountManager} to show a similar account prompt
-        // (see {@link AccountManager#addAccount()} in {@link #launchAccountPrompt()}
-        // for any type of account. Bug: 5375902
-        AuthenticatorDescription[] allTypes =
-                AccountManager.get(context).getAuthenticatorTypes();
-        for (AuthenticatorDescription authenticatorType : allTypes) {
-            if (GoogleAccountType.ACCOUNT_TYPE.equals(authenticatorType.type)) {
-                return getSharedPreferences(context).getBoolean(KEY_SHOW_ACCOUNT_PROMPT, true);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Remember to never show the "no account" prompt again by saving this to
-     * {@link SharedPreferences}.
-     */
-    public static void neverShowAccountPromptAgain(Context context) {
-        getSharedPreferences(context).edit()
-                .putBoolean(KEY_SHOW_ACCOUNT_PROMPT, false)
-                .apply();
-    }
-
-    /**
-     * Launch the "no account" prompt. (We assume the caller has already verified that the prompt
-     * can be shown, so checking the {@link #KEY_SHOW_ACCOUNT_PROMPT} value in
-     * {@link SharedPreferences} will not be done in this method).
-     */
-    public static void launchAccountPrompt(Activity activity) {
-        Bundle options = new Bundle();
-        options.putCharSequence(KEY_INTRO_MESSAGE, activity.getString(R.string.no_account_prompt));
-        options.putBoolean(KEY_ALLOW_SKIP_ACCOUNT_SETUP, true);
-        AccountManager.get(activity).addAccount(GoogleAccountType.ACCOUNT_TYPE, null, null, options,
-                activity, getAccountManagerCallback(activity), null);
-    }
-
-    /**
-     * When adding account
-     * open the same UI screen for user to choose account
-     */
-    public static Intent getIntentForAddingAccount() {
-         final Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT);
-         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
-         intent.putExtra(Settings.EXTRA_AUTHORITIES,
-                 new String[]{ContactsContract.AUTHORITY});
-         return intent;
-    }
-
-    private static AccountManagerCallback<Bundle> getAccountManagerCallback(
-            final Activity activity) {
-        return new AccountManagerCallback<Bundle>() {
-            @Override
-            public void run(AccountManagerFuture<Bundle> future) {
-                if (future.isCancelled()) {
-                    // The account creation process was canceled
-                    return;
-                }
-                try {
-                    Bundle result = future.getResult();
-                    if (result.getBoolean(KEY_USER_SKIPPED_ACCOUNT_SETUP)) {
-                        AccountPromptUtils.neverShowAccountPromptAgain(activity);
-                    }
-                } catch (OperationCanceledException ignore) {
-                    Log.e(TAG, "Account setup error: account creation process canceled");
-                } catch (IOException ignore) {
-                    Log.e(TAG, "Account setup error: No authenticator was registered for this"
-                            + "account type or the authenticator failed to respond");
-                } catch (AuthenticatorException ignore) {
-                    Log.e(TAG, "Account setup error: Authenticator experienced an I/O problem");
-                }
-            }
-        };
-    }
-}
