diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 09767bf..cf1f888 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1366,6 +1366,7 @@
 
         <activity android:name="Settings$AccountSyncSettingsActivity"
             android:label="@string/account_sync_settings_title"
+            android:parentActivityName="Settings"
             android:uiOptions="none">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -1378,6 +1379,16 @@
                 android:resource="@id/account_settings" />
         </activity>
 
+        <activity android:name=".accounts.SyncSettingsActivity"
+            android:label="@string/account_sync_settings_title"
+            android:theme="@android:style/Theme.Holo.Dialog">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.settings.SYNC_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="com.android.settings.accounts.AddAccountSettings"
             android:theme="@android:style/Theme.Translucent.NoTitleBar"
             android:configChanges="orientation|keyboardHidden|screenSize"
@@ -1441,7 +1452,6 @@
                 android:parentActivityName="Settings">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <action android:name="android.settings.SYNC_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="com.android.settings.SHORTCUT" />
             </intent-filter>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 3911fd5..9335788 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -48,7 +48,7 @@
     <dimen name="divider_margin_bottom">7dip</dimen>
 
     <!--  Size of icons in the top-level of settings  -->
-    <dimen name="header_icon_width">32dp</dimen>
+    <dimen name="header_icon_width">28dp</dimen>
     <dimen name="appwidget_min_width">260dip</dimen>
     <dimen name="appwidget_min_height">40dip</dimen>
 </resources>
diff --git a/res/xml/sync_settings.xml b/res/xml/sync_settings.xml
new file mode 100644
index 0000000..530f4ab
--- /dev/null
+++ b/res/xml/sync_settings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+    <CheckBoxPreference
+        android:key="sync_switch"
+        android:title="@string/sync_automatically" />
+</PreferenceScreen>
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
