diff --git a/src/com/android/settings/AccountPreference.java b/src/com/android/settings/AccountPreference.java
index e7919dd..2cc013c 100644
--- a/src/com/android/settings/AccountPreference.java
+++ b/src/com/android/settings/AccountPreference.java
@@ -39,16 +39,24 @@
     private int mStatus;
     private Account mAccount;
     private ArrayList<String> mAuthorities;
+    private ImageView mSyncStatusIcon;
+    private boolean mShowTypeIcon;
 
     public AccountPreference(Context context, Account account, Drawable icon,
-            ArrayList<String> authorities) {
+            ArrayList<String> authorities, boolean showTypeIcon) {
         super(context);
         mAccount = account;
         mAuthorities = authorities;
+        mShowTypeIcon = showTypeIcon;
+        if (showTypeIcon) {
+            setIcon(icon);
+        } else {
+            setIcon(getSyncStatusIcon(SYNC_DISABLED));
+        }
         setTitle(mAccount.name);
         setSummary("");
         setPersistent(false);
-        setSyncStatus(SYNC_DISABLED);
+        setSyncStatus(SYNC_DISABLED, false);
     }
 
     public Account getAccount() {
@@ -62,16 +70,22 @@
     @Override
     protected void onBindView(View view) {
         super.onBindView(view);
-        setSummary(getSyncStatusMessage(mStatus));
-        ImageView iconView = (ImageView) view.findViewById(android.R.id.icon);
-        iconView.setImageResource(getSyncStatusIcon(mStatus));
-        iconView.setContentDescription(getSyncContentDescription(mStatus));
+        if (!mShowTypeIcon) {
+            mSyncStatusIcon = (ImageView) view.findViewById(android.R.id.icon);
+            mSyncStatusIcon.setImageResource(getSyncStatusIcon(mStatus));
+            mSyncStatusIcon.setContentDescription(getSyncContentDescription(mStatus));
+        }
     }
 
-    public void setSyncStatus(int status) {
+    public void setSyncStatus(int status, boolean updateSummary) {
         mStatus = status;
-        setIcon(getSyncStatusIcon(status));
-        setSummary(getSyncStatusMessage(status));
+        if (!mShowTypeIcon && mSyncStatusIcon != null) {
+            mSyncStatusIcon.setImageResource(getSyncStatusIcon(status));
+            mSyncStatusIcon.setContentDescription(getSyncContentDescription(mStatus));
+        }
+        if (updateSummary) {
+            setSummary(getSyncStatusMessage(status));
+        }
     }
 
     private int getSyncStatusMessage(int status) {
@@ -109,7 +123,7 @@
                 res = R.drawable.ic_sync_red_holo;
                 break;
             case SYNC_IN_PROGRESS:
-                res = R.drawable.ic_sync_grey_holo;
+                res = R.drawable.ic_sync_green_holo;
                 break;
             default:
                 res = R.drawable.ic_sync_red_holo;
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 353bc3a..50019a3 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -112,6 +112,7 @@
 
     private AuthenticatorHelper mAuthenticatorHelper;
     private Header mLastHeader;
+    private boolean mListeningToAccountUpdates;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -187,7 +188,6 @@
         ListAdapter listAdapter = getListAdapter();
         if (listAdapter instanceof HeaderAdapter) {
             ((HeaderAdapter) listAdapter).resume();
-            AccountManager.get(this).addOnAccountsUpdatedListener(this, null, true);
         }
     }
 
@@ -198,6 +198,13 @@
         ListAdapter listAdapter = getListAdapter();
         if (listAdapter instanceof HeaderAdapter) {
             ((HeaderAdapter) listAdapter).pause();
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (mListeningToAccountUpdates) {
             AccountManager.get(this).removeOnAccountsUpdatedListener(this);
         }
     }
@@ -462,6 +469,10 @@
         for (Header header : accountHeaders) {
             target.add(headerIndex++, header);
         }
+        if (!mListeningToAccountUpdates) {
+            AccountManager.get(this).addOnAccountsUpdatedListener(this, null, true);
+            mListeningToAccountUpdates = true;
+        }
         return headerIndex;
     }
 
diff --git a/src/com/android/settings/accounts/ManageAccountsSettings.java b/src/com/android/settings/accounts/ManageAccountsSettings.java
index 85cf025..bb1ebdd 100644
--- a/src/com/android/settings/accounts/ManageAccountsSettings.java
+++ b/src/com/android/settings/accounts/ManageAccountsSettings.java
@@ -166,8 +166,8 @@
     public void onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
         boolean syncActive = ContentResolver.getCurrentSync() != null;
-        menu.findItem(MENU_SYNC_NOW_ID).setVisible(!syncActive);
-        menu.findItem(MENU_SYNC_CANCEL_ID).setVisible(syncActive);
+        menu.findItem(MENU_SYNC_NOW_ID).setVisible(!syncActive && mFirstAccount != null);
+        menu.findItem(MENU_SYNC_CANCEL_ID).setVisible(syncActive && mFirstAccount != null);
     }
 
     @Override
@@ -274,16 +274,16 @@
                 }
             }
             if (syncIsFailing) {
-                accountPref.setSyncStatus(AccountPreference.SYNC_ERROR);
+                accountPref.setSyncStatus(AccountPreference.SYNC_ERROR, true);
             } else if (syncCount == 0) {
-                accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED);
+                accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED, true);
             } else if (syncCount > 0) {
                 if (syncingNow) {
-                    accountPref.setSyncStatus(AccountPreference.SYNC_IN_PROGRESS);
+                    accountPref.setSyncStatus(AccountPreference.SYNC_IN_PROGRESS, true);
                 } else {
-                    accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED);
+                    accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED, true);
                     if (lastSuccessTime > 0) {
-                        accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED);
+                        accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED, false);
                         date.setTime(lastSuccessTime);
                         final String timeString = formatSyncDate(date);
                         accountPref.setSummary(getResources().getString(
@@ -291,7 +291,7 @@
                     }
                 }
             } else {
-                accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED);
+                accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED, true);
             }
         }
 
@@ -324,14 +324,14 @@
             if (showAccount) {
                 final Drawable icon = getDrawableForType(account.type);
                 final AccountPreference preference =
-                        new AccountPreference(getActivity(), account, icon, auths);
+                        new AccountPreference(getActivity(), account, icon, auths, false);
                 getPreferenceScreen().addPreference(preference);
                 if (mFirstAccount == null) {
                     mFirstAccount = account;
                 }
             }
         }
-        if (mAccountType != null) {
+        if (mAccountType != null && mFirstAccount != null) {
             addAuthenticatorSettings();
         }
         onSyncStateUpdated();
diff --git a/src/com/android/settings/accounts/SyncSettings.java b/src/com/android/settings/accounts/SyncSettings.java
new file mode 100644
index 0000000..20c296a
--- /dev/null
+++ b/src/com/android/settings/accounts/SyncSettings.java
@@ -0,0 +1,174 @@
+/*
+ * 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.settings.accounts;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.OnAccountsUpdateListener;
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceScreen;
+import android.util.Log;
+
+import com.android.settings.AccountPreference;
+import com.android.settings.DialogCreatable;
+import com.android.settings.R;
+
+import java.util.ArrayList;
+
+public class SyncSettings extends AccountPreferenceBase
+        implements OnAccountsUpdateListener, DialogCreatable {
+
+    private static final String KEY_SYNC_SWITCH = "sync_switch";
+
+    private String[] mAuthorities;
+
+    private SettingsDialogFragment mDialogFragment;
+    private CheckBoxPreference mAutoSyncPreference;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        addPreferencesFromResource(R.xml.sync_settings);
+        mAutoSyncPreference =
+                (CheckBoxPreference) getPreferenceScreen().findPreference(KEY_SYNC_SWITCH);
+        mAutoSyncPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                ContentResolver.setMasterSyncAutomatically((Boolean) newValue);
+                return true;
+            }
+        });
+
+        setHasOptionsMenu(true);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        Activity activity = getActivity();
+        AccountManager.get(activity).addOnAccountsUpdatedListener(this, null, true);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        final Activity activity = getActivity();
+        mAutoSyncPreference.setChecked(ContentResolver.getMasterSyncAutomatically());
+        mAuthorities = activity.getIntent().getStringArrayExtra(AUTHORITIES_FILTER_KEY);
+
+        updateAuthDescriptions();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        final Activity activity = getActivity();
+        AccountManager.get(activity).removeOnAccountsUpdatedListener(this);
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferences, Preference preference) {
+        if (preference instanceof AccountPreference) {
+            startAccountSettings((AccountPreference) preference);
+        } else {
+            return false;
+        }
+        return true;
+    }
+
+    private void startAccountSettings(AccountPreference acctPref) {
+        Intent intent = new Intent("android.settings.ACCOUNT_SYNC_SETTINGS");
+        intent.putExtra(AccountSyncSettings.ACCOUNT_KEY, acctPref.getAccount());
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        startActivity(intent);
+        finish();
+    }
+
+    @Override
+    public void showDialog(int dialogId) {
+        if (mDialogFragment != null) {
+            Log.e(TAG, "Old dialog fragment not null!");
+        }
+        mDialogFragment = new SettingsDialogFragment(this, dialogId);
+        mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
+    }
+
+    private void removeAccountPreferences() {
+        PreferenceScreen parent = getPreferenceScreen();
+        for (int i = 0; i < parent.getPreferenceCount(); ) {
+            if (parent.getPreference(i) instanceof AccountPreference) {
+                parent.removePreference(parent.getPreference(i));
+            } else {
+                i++;
+            }
+        }
+    }
+
+    @Override
+    public void onAccountsUpdated(Account[] accounts) {
+        if (getActivity() == null) return;
+
+        removeAccountPreferences();
+        for (int i = 0, n = accounts.length; i < n; i++) {
+            final Account account = accounts[i];
+            final ArrayList<String> auths = getAuthoritiesForAccountType(account.type);
+
+            boolean showAccount = true;
+            if (mAuthorities != null && auths != null) {
+                showAccount = false;
+                for (String requestedAuthority : mAuthorities) {
+                    if (auths.contains(requestedAuthority)) {
+                        showAccount = true;
+                        break;
+                    }
+                }
+            }
+
+            if (showAccount) {
+                final Drawable icon = getDrawableForType(account.type);
+                final AccountPreference preference =
+                        new AccountPreference(getActivity(), account, icon, auths, true);
+                getPreferenceScreen().addPreference(preference);
+                preference.setSummary(getLabelForType(account.type));
+            }
+        }
+        onSyncStateUpdated();
+    }
+
+    @Override
+    protected void onAuthDescriptionsUpdated() {
+        // Update account icons for all account preference items
+        for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
+            Preference pref = getPreferenceScreen().getPreference(i);
+            if (pref instanceof AccountPreference) {
+                AccountPreference accPref = (AccountPreference)
+                        getPreferenceScreen().getPreference(i);
+                accPref.setIcon(getDrawableForType(accPref.getAccount().type));
+                accPref.setSummary(getLabelForType(accPref.getAccount().type));
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/accounts/SyncSettingsActivity.java b/src/com/android/settings/accounts/SyncSettingsActivity.java
new file mode 100644
index 0000000..ed0089e
--- /dev/null
+++ b/src/com/android/settings/accounts/SyncSettingsActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2012 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.settings.accounts;
+
+import android.content.Intent;
+import android.preference.PreferenceActivity;
+
+/**
+ * Launcher activity for the SyncSettings fragment.
+ *
+ */
+public class SyncSettingsActivity extends PreferenceActivity {
+    @Override
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, SyncSettings.class.getName());
+        modIntent.putExtra(EXTRA_NO_HEADERS, true);
+        return modIntent;
+    }
+}
\ No newline at end of file
