diff --git a/src/com/android/exchange/ContactsSyncAdapterService.java b/src/com/android/exchange/ContactsSyncAdapterService.java
index 69fe792..b39d789 100644
--- a/src/com/android/exchange/ContactsSyncAdapterService.java
+++ b/src/com/android/exchange/ContactsSyncAdapterService.java
@@ -16,6 +16,7 @@
 
 package com.android.exchange;
 
+import com.android.email.Email;
 import com.android.email.provider.EmailContent;
 import com.android.email.provider.EmailContent.AccountColumns;
 import com.android.email.provider.EmailContent.Mailbox;
@@ -98,7 +99,7 @@
         if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD)) {
             Uri uri = RawContacts.CONTENT_URI.buildUpon()
                 .appendQueryParameter(RawContacts.ACCOUNT_NAME, account.name)
-                .appendQueryParameter(RawContacts.ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE)
+                .appendQueryParameter(RawContacts.ACCOUNT_TYPE, Email.EXCHANGE_ACCOUNT_MANAGER_TYPE)
                 .build();
             Cursor c = cr.query(uri,
                     new String[] {RawContacts._ID}, RawContacts.DIRTY + "=1", null, null);
diff --git a/src/com/android/exchange/Eas.java b/src/com/android/exchange/Eas.java
index c005544..86db9ab 100644
--- a/src/com/android/exchange/Eas.java
+++ b/src/com/android/exchange/Eas.java
@@ -38,7 +38,6 @@
     public static final int DEBUG_FILE_BIT = 4;
 
     public static final String VERSION = "0.3";
-    public static final String ACCOUNT_MANAGER_TYPE = "com.android.exchange";
     public static final String ACCOUNT_MAILBOX = "__eas";
 
     // From EAS spec
diff --git a/src/com/android/exchange/SyncManager.java b/src/com/android/exchange/SyncManager.java
index 5ed0047..c840fce 100644
--- a/src/com/android/exchange/SyncManager.java
+++ b/src/com/android/exchange/SyncManager.java
@@ -18,6 +18,7 @@
 package com.android.exchange;
 
 import com.android.email.AccountBackupRestore;
+import com.android.email.Email;
 import com.android.email.mail.MessagingException;
 import com.android.email.mail.store.TrustManagerFactory;
 import com.android.email.provider.EmailContent;
@@ -512,7 +513,7 @@
                         // Delete this from AccountManager...
                         android.accounts.Account acct =
                             new android.accounts.Account(account.mEmailAddress,
-                                    Eas.ACCOUNT_MANAGER_TYPE);
+                                    Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
                         AccountManager.get(SyncManager.this).removeAccount(acct, null, null);
                         mSyncableEasMailboxSelector = null;
                         mEasAccountSelector = null;
@@ -707,7 +708,8 @@
     public class EasAccountsUpdatedListener implements OnAccountsUpdateListener {
        public void onAccountsUpdated(android.accounts.Account[] accounts) {
            reconcileAccountsWithAccountManager(INSTANCE, getAccountList(),
-                   AccountManager.get(INSTANCE).getAccountsByType(Eas.ACCOUNT_MANAGER_TYPE));
+                   AccountManager.get(INSTANCE).getAccountsByType(
+                           Email.EXCHANGE_ACCOUNT_MANAGER_TYPE));
        }
     }
 
@@ -1200,7 +1202,7 @@
                 // Create an AccountManager style Account
                 android.accounts.Account acct =
                     new android.accounts.Account(easAccount.mEmailAddress,
-                            Eas.ACCOUNT_MANAGER_TYPE);
+                            Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
                 // Get the Contacts mailbox; this happens rarely so it's ok to get it all
                 Mailbox contacts = Mailbox.restoreMailboxWithId(this, contactsId);
                 int syncInterval = contacts.mSyncInterval;
@@ -1612,7 +1614,7 @@
                         if (account != null) {
                             android.accounts.Account a =
                                 new android.accounts.Account(account.mEmailAddress,
-                                        Eas.ACCOUNT_MANAGER_TYPE);
+                                        Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
                             if (!ContentResolver.getSyncAutomatically(a,
                                     ContactsContract.AUTHORITY)) {
                                 continue;
diff --git a/src/com/android/exchange/adapter/CalendarSyncAdapter.java b/src/com/android/exchange/adapter/CalendarSyncAdapter.java
index 8b01f9c..4465484 100644
--- a/src/com/android/exchange/adapter/CalendarSyncAdapter.java
+++ b/src/com/android/exchange/adapter/CalendarSyncAdapter.java
@@ -17,6 +17,7 @@
 
 package com.android.exchange.adapter;
 
+import com.android.email.Email;
 import com.android.email.provider.EmailContent.Mailbox;
 import com.android.exchange.Eas;
 import com.android.exchange.EasSyncService;
@@ -86,7 +87,7 @@
 
     private static final ContentProviderOperation PLACEHOLDER_OPERATION =
         ContentProviderOperation.newInsert(Uri.EMPTY).build();
-    
+
     private static final Uri sEventsUri = asSyncAdapter(Events.CONTENT_URI);
     private static final Uri sAttendeesUri = asSyncAdapter(Attendees.CONTENT_URI);
     private static final Uri sExtendedPropertiesUri = asSyncAdapter(ExtendedProperties.CONTENT_URI);
@@ -103,7 +104,7 @@
 
         Cursor c = mService.mContentResolver.query(Calendars.CONTENT_URI,
                 new String[] {Calendars._ID}, CALENDAR_SELECTION,
-                new String[] {mAccount.mEmailAddress, Eas.ACCOUNT_MANAGER_TYPE}, null);
+                new String[] {mAccount.mEmailAddress, Email.EXCHANGE_ACCOUNT_MANAGER_TYPE}, null);
         try {
             if (c.moveToFirst()) {
                 mCalendarId = c.getLong(CALENDAR_SELECTION_ID);
@@ -131,7 +132,7 @@
         EasCalendarSyncParser p = new EasCalendarSyncParser(is, this);
         return p.parse();
     }
-    
+
     static Uri asSyncAdapter(Uri uri) {
         return uri.buildUpon().appendQueryParameter(Calendar.CALLER_IS_SYNCADAPTER, "true").build();
     }
@@ -194,7 +195,8 @@
     public android.accounts.Account getAccountManagerAccount() {
         if (mAccountManagerAccount == null) {
             mAccountManagerAccount =
-                new android.accounts.Account(mAccount.mEmailAddress, Eas.ACCOUNT_MANAGER_TYPE);
+                new android.accounts.Account(mAccount.mEmailAddress,
+                        Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
         }
         return mAccountManagerAccount;
     }
@@ -218,7 +220,7 @@
             // Delete the calendar associated with this account
             // TODO Make sure the Events, etc. are also deleted
             mContentResolver.delete(Calendars.CONTENT_URI, CALENDAR_SELECTION,
-                    new String[] {mAccount.mEmailAddress, Eas.ACCOUNT_MANAGER_TYPE});
+                    new String[] {mAccount.mEmailAddress, Email.EXCHANGE_ACCOUNT_MANAGER_TYPE});
         }
 
         public void addEvent(CalendarOperations ops, String serverId, boolean update)
@@ -226,7 +228,7 @@
             ContentValues cv = new ContentValues();
             cv.put(Events.CALENDAR_ID, mCalendarId);
             cv.put(Events._SYNC_ACCOUNT, mAccount.mEmailAddress);
-            cv.put(Events._SYNC_ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE);
+            cv.put(Events._SYNC_ACCOUNT_TYPE, Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
             cv.put(Events._SYNC_ID, serverId);
 
             int allDayEvent = 0;
@@ -429,7 +431,7 @@
             ContentValues cv = new ContentValues();
             cv.put(Events.CALENDAR_ID, mCalendarId);
             cv.put(Events._SYNC_ACCOUNT, mAccount.mEmailAddress);
-            cv.put(Events._SYNC_ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE);
+            cv.put(Events._SYNC_ACCOUNT_TYPE, Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
 
             // It appears that these values have to be copied from the parent if they are to appear
             // Note that they can be overridden below
diff --git a/src/com/android/exchange/adapter/ContactsSyncAdapter.java b/src/com/android/exchange/adapter/ContactsSyncAdapter.java
index 7211794..b95e475 100644
--- a/src/com/android/exchange/adapter/ContactsSyncAdapter.java
+++ b/src/com/android/exchange/adapter/ContactsSyncAdapter.java
@@ -163,7 +163,7 @@
                 // Make sure ungrouped contacts for Exchange are defaultly visible
                 ContentValues cv = new ContentValues();
                 cv.put(Groups.ACCOUNT_NAME, mAccount.mEmailAddress);
-                cv.put(Groups.ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE);
+                cv.put(Groups.ACCOUNT_TYPE, com.android.email.Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
                 cv.put(Settings.UNGROUPED_VISIBLE, true);
                 client.insert(addCallerIsSyncAdapterParameter(Settings.CONTENT_URI), cv);
                 return "0";
@@ -198,8 +198,8 @@
 
     public android.accounts.Account getAccountManagerAccount() {
         if (mAccountManagerAccount == null) {
-            mAccountManagerAccount =
-                new android.accounts.Account(mAccount.mEmailAddress, Eas.ACCOUNT_MANAGER_TYPE);
+            mAccountManagerAccount = new android.accounts.Account(mAccount.mEmailAddress,
+                    com.android.email.Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
         }
         return mAccountManagerAccount;
     }
@@ -893,7 +893,8 @@
     private Uri uriWithAccountAndIsSyncAdapter(Uri uri) {
         return uri.buildUpon()
             .appendQueryParameter(RawContacts.ACCOUNT_NAME, mAccount.mEmailAddress)
-            .appendQueryParameter(RawContacts.ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE)
+            .appendQueryParameter(RawContacts.ACCOUNT_TYPE,
+                    com.android.email.Email.EXCHANGE_ACCOUNT_MANAGER_TYPE)
             .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
             .build();
     }
@@ -1771,7 +1772,8 @@
         ContentResolver cr = mService.mContentResolver;
         Uri uri = RawContactsEntity.CONTENT_URI.buildUpon()
                 .appendQueryParameter(RawContacts.ACCOUNT_NAME, mAccount.mEmailAddress)
-                .appendQueryParameter(RawContacts.ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE)
+                .appendQueryParameter(RawContacts.ACCOUNT_TYPE,
+                        com.android.email.Email.EXCHANGE_ACCOUNT_MANAGER_TYPE)
                 .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
                 .build();
 
@@ -1879,7 +1881,7 @@
                     for (ContentValues cv: emailValues) {
                         sendEmail(s, cv, emailCount++, displayName);
                     }
-                    
+
                     // Now, we'll send up groups, if any
                     if (!groupIds.isEmpty()) {
                         boolean groupFirst = true;
diff --git a/src/com/android/exchange/adapter/FolderSyncParser.java b/src/com/android/exchange/adapter/FolderSyncParser.java
index 57aafcf..b760dfd 100644
--- a/src/com/android/exchange/adapter/FolderSyncParser.java
+++ b/src/com/android/exchange/adapter/FolderSyncParser.java
@@ -17,6 +17,7 @@
 
 package com.android.exchange.adapter;
 
+import com.android.email.Email;
 import com.android.email.provider.AttachmentProvider;
 import com.android.email.provider.EmailContent;
 import com.android.email.provider.EmailProvider;
@@ -249,7 +250,7 @@
                     // TODO How will this change if the user changes his account display name?
                     cv.put(Calendars.DISPLAY_NAME, mAccount.mDisplayName);
                     cv.put(Calendars._SYNC_ACCOUNT, mAccount.mEmailAddress);
-                    cv.put(Calendars._SYNC_ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE);
+                    cv.put(Calendars._SYNC_ACCOUNT_TYPE, Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
                     cv.put(Calendars.SYNC_EVENTS, 1);
                     cv.put(Calendars.SELECTED, 1);
                     cv.put(Calendars.HIDDEN, 0);
diff --git a/tests/src/com/android/exchange/SyncManagerAccountTests.java b/tests/src/com/android/exchange/SyncManagerAccountTests.java
index 9a1f24b..66c20e9 100644
--- a/tests/src/com/android/exchange/SyncManagerAccountTests.java
+++ b/tests/src/com/android/exchange/SyncManagerAccountTests.java
@@ -17,6 +17,7 @@
 
 package com.android.exchange;
 
+import com.android.email.Email;
 import com.android.email.provider.EmailContent;
 import com.android.email.provider.EmailProvider;
 import com.android.email.provider.ProviderTestUtils;
@@ -63,7 +64,7 @@
     }
 
     private android.accounts.Account makeAccountManagerAccount(String username) {
-        return new android.accounts.Account(username, Eas.ACCOUNT_MANAGER_TYPE);
+        return new android.accounts.Account(username, Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
     }
 
     private void createAccountManagerAccount(String username) {
@@ -105,7 +106,7 @@
 
     private void deleteTemporaryAccountManagerAccounts(Context context) {
         android.accounts.Account[] accountManagerAccounts =
-            AccountManager.get(context).getAccountsByType(Eas.ACCOUNT_MANAGER_TYPE);
+                AccountManager.get(context).getAccountsByType(Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
         for (android.accounts.Account accountManagerAccount: accountManagerAccounts) {
             if (accountManagerAccount.name.startsWith(TEST_ACCOUNT_PREFIX) &&
                     accountManagerAccount.name.endsWith(TEST_ACCOUNT_SUFFIX)) {
@@ -135,7 +136,7 @@
         // Check that they're set up properly
         assertEquals(3, EmailContent.count(mMockContext, Account.CONTENT_URI, null, null));
         android.accounts.Account[] accountManagerAccounts =
-            AccountManager.get(context).getAccountsByType(Eas.ACCOUNT_MANAGER_TYPE);
+                AccountManager.get(context).getAccountsByType(Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
         assertEquals(3, accountManagerAccounts.length);
 
         // Delete account "2" from AccountManager
@@ -145,7 +146,7 @@
 
         // Confirm it's deleted
         accountManagerAccounts =
-            AccountManager.get(context).getAccountsByType(Eas.ACCOUNT_MANAGER_TYPE);
+                AccountManager.get(context).getAccountsByType(Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
         assertEquals(2, accountManagerAccounts.length);
 
         // Run the reconciler
@@ -169,8 +170,8 @@
                 makeSyncManagerAccountList(), accountManagerAccounts);
 
         // There should now be only one AccountManager account
-        accountManagerAccounts =
-            AccountManager.get(getContext()).getAccountsByType(Eas.ACCOUNT_MANAGER_TYPE);
+        accountManagerAccounts = AccountManager.get(getContext()).getAccountsByType(
+                Email.EXCHANGE_ACCOUNT_MANAGER_TYPE);
         assertEquals(1, accountManagerAccounts.length);
         // ... and it should be account "3"
         assertEquals(getTestAccountEmailAddress("3"), accountManagerAccounts[0].name);
