diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 4675bb2..e2aeaf2 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -16,9 +16,6 @@
 
 package com.android.settings;
 
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.OnAccountsUpdateListener;
 import android.app.ActionBar;
 import android.app.Activity;
 import android.app.Fragment;
@@ -70,8 +67,6 @@
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.accessibility.CaptionPropertiesFragment;
 import com.android.settings.accounts.AccountSyncSettings;
-import com.android.settings.accounts.AuthenticatorHelper;
-import com.android.settings.accounts.ManageAccountsSettings;
 import com.android.settings.applications.InstalledAppDetails;
 import com.android.settings.applications.ManageApplications;
 import com.android.settings.applications.ProcessStatsUi;
@@ -117,8 +112,6 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
 
@@ -127,10 +120,9 @@
 public class SettingsActivity extends Activity
         implements PreferenceManager.OnPreferenceTreeClickListener,
         PreferenceFragment.OnPreferenceStartFragmentCallback,
-        ButtonBarHandler, OnAccountsUpdateListener, FragmentManager.OnBackStackChangedListener,
+        ButtonBarHandler, FragmentManager.OnBackStackChangedListener,
         SearchView.OnQueryTextListener, SearchView.OnCloseListener,
-        MenuItem.OnActionExpandListener,
-        AuthenticatorHelper.OnAccountsUpdateListener {
+        MenuItem.OnActionExpandListener {
 
     private static final String LOG_TAG = "Settings";
 
@@ -221,7 +213,6 @@
             R.id.language_settings,
             R.id.user_settings,
             R.id.account_settings,
-            R.id.account_add,
             R.id.system_section,
             R.id.date_time_settings,
             R.id.about_settings,
@@ -275,7 +266,6 @@
             UserSettings.class.getName(),
             NotificationAccessSettings.class.getName(),
             ConditionProviderSettings.class.getName(),
-            ManageAccountsSettings.class.getName(),
             PrintSettingsFragment.class.getName(),
             PrintJobSettingsFragment.class.getName(),
             TrustedCredentialsSettings.class.getName(),
@@ -297,9 +287,6 @@
     private SharedPreferences mDevelopmentPreferences;
     private SharedPreferences.OnSharedPreferenceChangeListener mDevelopmentPreferencesListener;
 
-    private AuthenticatorHelper mAuthenticatorHelper;
-    private boolean mListeningToAccountUpdates;
-
     private boolean mBatteryPresent = true;
     private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
 
@@ -363,10 +350,6 @@
         return mSwitchBar;
     }
 
-    public AuthenticatorHelper getAuthenticatorHelper() {
-        return mAuthenticatorHelper;
-    }
-
     public List<DashboardCategory> getDashboardCategories() {
         if (mNeedToRebuildCategories || mCategories.size() == 0) {
             buildDashboardCategories(mCategories);
@@ -482,13 +465,6 @@
         if (intent.hasExtra(EXTRA_UI_OPTIONS)) {
             getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0));
         }
-        // TODO: Delete accounts tile once we have the new screen working
-        // See: http://b/15815948
-        final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
-        mAuthenticatorHelper = new AuthenticatorHelper(
-                this, UserHandle.getCallingUserHandle(), um, this);
-        mAuthenticatorHelper.updateAuthDescriptions(this);
-        mAuthenticatorHelper.onAccountsUpdated(null);
 
         mDevelopmentPreferences = getSharedPreferences(DevelopmentSettings.PREF_FILE,
                 Context.MODE_PRIVATE);
@@ -743,10 +719,6 @@
         mDevelopmentPreferences.unregisterOnSharedPreferenceChangeListener(
                 mDevelopmentPreferencesListener);
         mDevelopmentPreferencesListener = null;
-
-        if (mListeningToAccountUpdates) {
-            AccountManager.get(this).removeOnAccountsUpdatedListener(this);
-        }
     }
 
     protected boolean isValidFragment(String fragmentName) {
@@ -1071,10 +1043,6 @@
 
             // Ids are integers, so downcasting is ok
             int id = (int) category.id;
-            if (id == R.id.account_settings) {
-                insertAccountsTiles(category);
-                continue;
-            }
             int n = category.getTilesCount() - 1;
             while (n >= 0) {
 
@@ -1146,10 +1114,6 @@
                             UserManager.DISALLOW_DEBUGGING_FEATURES)) {
                         category.removeTile(n);
                     }
-                } else if (id == R.id.account_add) {
-                    if (um.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) {
-                        category.removeTile(n);
-                    }
                 }
 
                 if (UserHandle.MU_ENABLED && UserHandle.myUserId() != 0
@@ -1201,62 +1165,6 @@
         return true;
     }
 
-    private void insertAccountsTiles(DashboardCategory target) {
-        String[] accountTypes = mAuthenticatorHelper.getEnabledAccountTypes();
-        List<DashboardTile> dashboardTiles = new ArrayList<DashboardTile>(accountTypes.length);
-        for (String accountType : accountTypes) {
-            CharSequence label = mAuthenticatorHelper.getLabelForType(this, accountType);
-            if (label == null) {
-                continue;
-            }
-
-            Account[] accounts = AccountManager.get(this).getAccountsByType(accountType);
-            boolean skipToAccount = accounts.length == 1
-                    && !mAuthenticatorHelper.hasAccountPreferences(accountType);
-            DashboardTile accountTile = new DashboardTile();
-            accountTile.title = label;
-            if (accountTile.extras == null) {
-                accountTile.extras = new Bundle();
-            }
-            if (skipToAccount) {
-                accountTile.fragment = AccountSyncSettings.class.getName();
-                accountTile.fragmentArguments = new Bundle();
-                // Need this for the icon
-                accountTile.extras.putString(ManageAccountsSettings.KEY_ACCOUNT_TYPE, accountType);
-                accountTile.extras.putParcelable(AccountSyncSettings.ACCOUNT_KEY, accounts[0]);
-                accountTile.fragmentArguments.putParcelable(AccountSyncSettings.ACCOUNT_KEY,
-                        accounts[0]);
-            } else {
-                accountTile.fragment = ManageAccountsSettings.class.getName();
-                accountTile.fragmentArguments = new Bundle();
-                accountTile.extras.putString(ManageAccountsSettings.KEY_ACCOUNT_TYPE, accountType);
-                accountTile.fragmentArguments.putString(ManageAccountsSettings.KEY_ACCOUNT_TYPE,
-                        accountType);
-                accountTile.fragmentArguments.putString(ManageAccountsSettings.KEY_ACCOUNT_LABEL,
-                        label.toString());
-            }
-            dashboardTiles.add(accountTile);
-            mAuthenticatorHelper.preloadDrawableForType(this, accountType);
-        }
-
-        // Sort by label
-        Collections.sort(dashboardTiles, new Comparator<DashboardTile>() {
-            @Override
-            public int compare(DashboardTile t1, DashboardTile t2) {
-                return t1.title.toString().compareTo(t2.title.toString());
-            }
-        });
-        int index = 0;
-        for (DashboardTile tile : dashboardTiles) {
-            target.addTile(index, tile);
-            index++;
-        }
-        if (!mListeningToAccountUpdates) {
-            AccountManager.get(this).addOnAccountsUpdatedListener(this, null, true);
-            mListeningToAccountUpdates = true;
-        }
-    }
-
     private void getMetaData() {
         try {
             ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),
@@ -1283,18 +1191,6 @@
         return super.shouldUpRecreateTask(new Intent(this, SettingsActivity.class));
     }
 
-    @Override
-    public void onAccountsUpdated(Account[] accounts) {
-        // TODO: watch for package upgrades to invalidate cache; see 7206643
-        mAuthenticatorHelper.updateAuthDescriptions(this);
-        invalidateCategories();
-    }
-
-    @Override
-    public void onAccountsUpdate(UserHandle userHandle) {
-        invalidateCategories();
-    }
-
     public static void requestHomeNotice() {
         sShowNoHomeNotice = true;
     }
diff --git a/src/com/android/settings/accounts/AuthenticatorHelper.java b/src/com/android/settings/accounts/AuthenticatorHelper.java
index e74c8d5..7ea2f12 100644
--- a/src/com/android/settings/accounts/AuthenticatorHelper.java
+++ b/src/com/android/settings/accounts/AuthenticatorHelper.java
@@ -171,9 +171,7 @@
         return false;
     }
 
-    public void onAccountsUpdated(Account[] accounts) {
-        // TODO: Revert to non-public once no longer needed in SettingsActivity
-        // See http://b/15819268
+    void onAccountsUpdated(Account[] accounts) {
         updateAuthDescriptions(mContext);
         if (accounts == null) {
             accounts = AccountManager.get(mContext).getAccountsAsUser(mUserHandle.getIdentifier());
@@ -193,6 +191,7 @@
 
     @Override
     public void onReceive(final Context context, final Intent intent) {
+        // TODO: watch for package upgrades to invalidate cache; see http://b/7206643
         final Account[] accounts = AccountManager.get(mContext)
                 .getAccountsAsUser(mUserHandle.getIdentifier());
         onAccountsUpdated(accounts);
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index ece32f6..ed89d89 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -16,13 +16,9 @@
 
 package com.android.settings.dashboard;
 
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.OnAccountsUpdateListener;
 import android.app.Fragment;
 import android.content.Context;
 import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -35,18 +31,14 @@
 import android.widget.TextView;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
-import com.android.settings.accounts.AuthenticatorHelper;
-import com.android.settings.accounts.ManageAccountsSettings;
 
 import java.util.List;
 
-public class DashboardSummary extends Fragment implements OnAccountsUpdateListener {
+public class DashboardSummary extends Fragment {
     private static final String LOG_TAG = "DashboardSummary";
 
     private LayoutInflater mLayoutInflater;
     private ViewGroup mDashboard;
-    private AuthenticatorHelper mAuthHelper;
-    private boolean mAccountListenerAdded;
 
     private static final int MSG_REBUILD_UI = 1;
     private Handler mHandler = new Handler() {
@@ -72,8 +64,6 @@
         final View rootView = inflater.inflate(R.layout.dashboard, container, false);
         mDashboard = (ViewGroup) rootView.findViewById(R.id.dashboard_container);
 
-        mAuthHelper = ((SettingsActivity) context).getAuthenticatorHelper();
-
         return rootView;
     }
 
@@ -129,45 +119,19 @@
     public void onResume() {
         super.onResume();
 
-        if (!mAccountListenerAdded) {
-            AccountManager.get(getActivity()).addOnAccountsUpdatedListener(this, null, false);
-            mAccountListenerAdded = true;
-        }
-
         sendRebuildUI();
     }
 
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-
-        if (mAccountListenerAdded) {
-            AccountManager.get(getActivity()).removeOnAccountsUpdatedListener(this);
-            mAccountListenerAdded = false;
-        }
-    }
-
     private void updateTileView(Context context, Resources res, DashboardTile tile,
             ImageView tileIcon, TextView tileTextView, TextView statusTextView) {
 
-        if (tile.extras != null
-                && tile.extras.containsKey(ManageAccountsSettings.KEY_ACCOUNT_TYPE)) {
-            String accType = tile.extras.getString(ManageAccountsSettings.KEY_ACCOUNT_TYPE);
-            Drawable drawable = mAuthHelper.getDrawableForType(context, accType);
-            tileIcon.setImageDrawable(drawable);
+        if (tile.iconRes > 0) {
+            tileIcon.setImageResource(tile.iconRes);
         } else {
-            if (tile.iconRes > 0) {
-                tileIcon.setImageResource(tile.iconRes);
-            } else {
-                tileIcon.setImageDrawable(null);
-            }
+            tileIcon.setImageDrawable(null);
+            tileIcon.setBackground(null);
         }
-        if (tileIcon != null) {
-            if (tile.iconRes > 0) {
-            } else {
-                tileIcon.setBackground(null);
-            }
-        }
+
         tileTextView.setText(tile.getTitle(res));
 
         CharSequence summary = tile.getSummary(res);
@@ -184,11 +148,4 @@
             mHandler.sendEmptyMessage(MSG_REBUILD_UI);
         }
     }
-
-    @Override
-    public void onAccountsUpdated(Account[] accounts) {
-        final SettingsActivity sa = (SettingsActivity) getActivity();
-        sa.setNeedToRebuildCategories(true);
-        sendRebuildUI();
-    }
 }
