diff --git a/src/com/android/contacts/ContactLoader.java b/src/com/android/contacts/ContactLoader.java
index 405ba6f..17cd1e7 100644
--- a/src/com/android/contacts/ContactLoader.java
+++ b/src/com/android/contacts/ContactLoader.java
@@ -25,6 +25,7 @@
 import com.android.contacts.util.StreamItemPhotoEntry;
 import com.android.contacts.util.UriUtils;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
@@ -732,8 +733,7 @@
                 if (!resultIsCached) loadPhotoBinaryData(result);
 
                 // Note ME profile should never have "Add connection"
-                if (mLoadInvitableAccountTypes && result.getInvitableAccountTypes() == null &&
-                        !result.isUserProfile()) {
+                if (mLoadInvitableAccountTypes && result.getInvitableAccountTypes() == null) {
                     loadInvitableAccountTypes(result);
                 }
             }
@@ -855,25 +855,29 @@
      * Sets the "invitable" account types to {@link Result#mInvitableAccountTypes}.
      */
     private void loadInvitableAccountTypes(Result contactData) {
-        Map<AccountTypeWithDataSet, AccountType> invitables =
-                AccountTypeManager.getInstance(getContext()).getUsableInvitableAccountTypes();
-        if (invitables.isEmpty()) {
-            return;
-        }
+        final ArrayList<AccountType> resultList = Lists.newArrayList();
+        if (!contactData.isUserProfile()) {
+            Map<AccountTypeWithDataSet, AccountType> invitables =
+                    AccountTypeManager.getInstance(getContext()).getUsableInvitableAccountTypes();
+            if (!invitables.isEmpty()) {
+                final Map<AccountTypeWithDataSet, AccountType> resultMap =
+                        Maps.newHashMap(invitables);
 
-        Map<AccountTypeWithDataSet, AccountType> result = Maps.newHashMap(invitables);
+                // Remove the ones that already have a raw contact in the current contact
+                for (Entity entity : contactData.getEntities()) {
+                    final ContentValues values = entity.getEntityValues();
+                    final AccountTypeWithDataSet type = AccountTypeWithDataSet.get(
+                            values.getAsString(RawContacts.ACCOUNT_TYPE),
+                            values.getAsString(RawContacts.DATA_SET));
+                    resultMap.remove(type);
+                }
 
-        // Remove the ones that already have a raw contact in the current contact
-        for (Entity entity : contactData.getEntities()) {
-            final ContentValues values = entity.getEntityValues();
-            final AccountTypeWithDataSet type = AccountTypeWithDataSet.get(
-                    values.getAsString(RawContacts.ACCOUNT_TYPE),
-                    values.getAsString(RawContacts.DATA_SET));
-            result.remove(type);
+                resultList.addAll(resultMap.values());
+            }
         }
 
         // Set to mInvitableAccountTypes
-        contactData.mInvitableAccountTypes = new ArrayList<AccountType>(result.values());
+        contactData.mInvitableAccountTypes = resultList;
     }
 
     /**
