diff --git a/src/com/android/exchange/service/ContactsSyncAdapterService.java b/src/com/android/exchange/service/ContactsSyncAdapterService.java
index d99cfcd..e2dd7e3 100644
--- a/src/com/android/exchange/service/ContactsSyncAdapterService.java
+++ b/src/com/android/exchange/service/ContactsSyncAdapterService.java
@@ -128,7 +128,7 @@
                 final Cursor mailboxCursor = cr.query(Mailbox.CONTENT_URI, Mailbox.ID_PROJECTION,
                         ACCOUNT_AND_TYPE_CONTACTS, new String[] {Long.toString(accountId)}, null);
                 try {
-                     if (mailboxCursor.moveToFirst()) {
+                    while (mailboxCursor.moveToNext()) {
                          LogUtils.i(TAG, "Contact sync requested for " + account.name);
                          // TODO: Currently just bouncing this to Email sync; eventually streamline.
                         final long mailboxId = mailboxCursor.getLong(Mailbox.ID_PROJECTION_COLUMN);
diff --git a/src/com/android/exchange/service/EasCalendarSyncHandler.java b/src/com/android/exchange/service/EasCalendarSyncHandler.java
index d5c8415..8884739 100644
--- a/src/com/android/exchange/service/EasCalendarSyncHandler.java
+++ b/src/com/android/exchange/service/EasCalendarSyncHandler.java
@@ -171,17 +171,6 @@
     }
 
     @Override
-    protected String getSyncKey() {
-        if (mMailbox == null) {
-            return null;
-        }
-        if (mMailbox.mSyncKey == null) {
-            mMailbox.mSyncKey = "0";
-        }
-        return mMailbox.mSyncKey;
-    }
-
-    @Override
     protected String getFolderClassName() {
         return "Calendar";
     }
diff --git a/src/com/android/exchange/service/EasContactsSyncHandler.java b/src/com/android/exchange/service/EasContactsSyncHandler.java
index cc593e1..8daf3eb 100644
--- a/src/com/android/exchange/service/EasContactsSyncHandler.java
+++ b/src/com/android/exchange/service/EasContactsSyncHandler.java
@@ -1,6 +1,5 @@
 package com.android.exchange.service;
 
-import android.content.ContentProviderClient;
 import android.content.ContentProviderOperation;
 import android.content.ContentResolver;
 import android.content.ContentUris;
@@ -12,7 +11,6 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.RemoteException;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Event;
@@ -28,7 +26,6 @@
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
 import android.provider.ContactsContract.Groups;
-import android.provider.SyncStateContract;
 import android.text.TextUtils;
 import android.util.Base64;
 
@@ -162,40 +159,6 @@
     }
 
     @Override
-    protected String getSyncKey() {
-        // mMailbox.mSyncKey is bogus since state is stored by the contacts provider, so we
-        // need to fetch the data from there.
-        // However, we need for that value to be reasonable, so we set it here once we fetch it.
-        final ContentProviderClient client = mContentResolver.acquireContentProviderClient(
-                ContactsContract.AUTHORITY_URI);
-        try {
-            final byte[] data = SyncStateContract.Helpers.get(client,
-                    ContactsContract.SyncState.CONTENT_URI, mAccountManagerAccount);
-            if (data == null || data.length == 0) {
-                // We don't have a sync key yet, initialize it.
-                // TODO: Should we leave it and just let the first successful sync set it?
-                /*
-                mMailbox.mSyncKey = "0";
-                SyncStateContract.Helpers.set(client, ContactsContract.SyncState.CONTENT_URI,
-                            mAccountManagerAccount, "0".getBytes());
-                // Make sure ungrouped contacts for Exchange are visible by default.
-                final ContentValues cv = new ContentValues(3);
-                cv.put(Groups.ACCOUNT_NAME, mAccount.mEmailAddress);
-                cv.put(Groups.ACCOUNT_TYPE, Eas.EXCHANGE_ACCOUNT_MANAGER_TYPE);
-                cv.put(ContactsContract.Settings.UNGROUPED_VISIBLE, true);
-                client.insert(addCallerIsSyncAdapterParameter(Settings.CONTENT_URI), cv);
-                */
-                mMailbox.mSyncKey = "0";
-            } else {
-                mMailbox.mSyncKey = new String(data);
-            }
-            return mMailbox.mSyncKey;
-        } catch (final RemoteException e) {
-            return null;
-        }
-    }
-
-    @Override
     protected String getFolderClassName() {
         return "Contacts";
     }
diff --git a/src/com/android/exchange/service/EasMailboxSyncHandler.java b/src/com/android/exchange/service/EasMailboxSyncHandler.java
index 3364a78..ab297a4 100644
--- a/src/com/android/exchange/service/EasMailboxSyncHandler.java
+++ b/src/com/android/exchange/service/EasMailboxSyncHandler.java
@@ -96,18 +96,6 @@
     }
 
     @Override
-    protected String getSyncKey() {
-        if (mMailbox == null) {
-            return null;
-        }
-        if (mMailbox.mSyncKey == null) {
-            // TODO: Write to DB? Probably not, and just let successful sync do that.
-            mMailbox.mSyncKey = "0";
-        }
-        return mMailbox.mSyncKey;
-    }
-
-    @Override
     protected String getFolderClassName() {
         return "Email";
     }
diff --git a/src/com/android/exchange/service/EasSyncHandler.java b/src/com/android/exchange/service/EasSyncHandler.java
index 0054163..29f55b5 100644
--- a/src/com/android/exchange/service/EasSyncHandler.java
+++ b/src/com/android/exchange/service/EasSyncHandler.java
@@ -156,7 +156,15 @@
      * @return The sync key for the object being synced. "0" means this is the first sync. If
      *      there is an error in getting the sync key, this function returns null.
      */
-    protected abstract String getSyncKey();
+    protected String getSyncKey() {
+        if (mMailbox == null) {
+            return null;
+        }
+        if (mMailbox.mSyncKey == null) {
+            mMailbox.mSyncKey = "0";
+        }
+        return mMailbox.mSyncKey;
+    }
 
     /**
      * Get the folder class name for this mailbox.
