diff --git a/src/com/android/contacts/list/GroupMemberPickListAdapter.java b/src/com/android/contacts/list/GroupMemberPickListAdapter.java
index ae6517c..d25aafd 100644
--- a/src/com/android/contacts/list/GroupMemberPickListAdapter.java
+++ b/src/com/android/contacts/list/GroupMemberPickListAdapter.java
@@ -19,6 +19,7 @@
 import android.content.CursorLoader;
 import android.database.Cursor;
 import android.net.Uri;
+import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.RawContacts;
 import android.text.TextUtils;
@@ -43,21 +44,21 @@
     static class GroupMembersQuery {
 
         private static final String[] PROJECTION_PRIMARY = new String[] {
-                RawContacts._ID,                        // 0
-                RawContacts.CONTACT_ID,                 // 1
-                RawContacts.DISPLAY_NAME_PRIMARY,       // 2
+                Data.RAW_CONTACT_ID,             // 0
+                Data.CONTACT_ID,                 // 1
+                Data.DISPLAY_NAME_PRIMARY,       // 2
                 // Dummy columns overwritten by the cursor wrapper
-                RawContacts.SYNC1,                      // 3
-                RawContacts.SYNC2                       // 4
+                Data.PHOTO_ID,                   // 3
+                Data.LOOKUP_KEY                  // 4
         };
 
         private static final String[] PROJECTION_ALTERNATIVE = new String[] {
-                RawContacts._ID,                        // 0
-                RawContacts.CONTACT_ID,                 // 1
-                RawContacts.DISPLAY_NAME_ALTERNATIVE,   // 2
+                Data.RAW_CONTACT_ID,             // 0
+                Data.CONTACT_ID,                 // 1
+                Data.DISPLAY_NAME_ALTERNATIVE,   // 2
                 // Dummy columns overwritten by the cursor wrapper
-                RawContacts.SYNC1,                      // 3
-                RawContacts.SYNC2                       // 4
+                Data.PHOTO_ID,                   // 3
+                Data.LOOKUP_KEY                  // 4
         };
 
         static final int RAW_CONTACT_ID = 0;
@@ -101,7 +102,10 @@
 
     @Override
     public void configureLoader(CursorLoader loader, long directoryId) {
-        loader.setUri(RawContacts.CONTENT_URI);
+        final Uri uri = Data.CONTENT_URI.buildUpon()
+                .appendQueryParameter(Data.VISIBLE_CONTACTS_ONLY, "true")
+                .build();
+        loader.setUri(uri);
         loader.setProjection(
                 getContactNameDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY
                         ? GroupMembersQuery.PROJECTION_PRIMARY
@@ -115,7 +119,8 @@
 
     private String getSelection() {
         // Select raw contacts by account
-        String result = RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=? AND ";
+        String result = RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=? AND "
+                + Data.MIMETYPE + "=? AND ";
         if (TextUtils.isEmpty(mAccount.dataSet)) {
             result += Data.DATA_SET + " IS NULL";
         } else {
@@ -128,6 +133,7 @@
         final ArrayList<String> result = new ArrayList<>();
         result.add(mAccount.name);
         result.add(mAccount.type);
+        result.add(GroupMembership.CONTENT_ITEM_TYPE);
         if (!TextUtils.isEmpty(mAccount.dataSet)) result.add(mAccount.dataSet);
         return result.toArray(new String[0]);
     }
@@ -135,7 +141,7 @@
     public Uri getRawContactUri(int position) {
         final Cursor cursor = (Cursor) getItem(position);
         final long rawContactId = cursor.getLong(GroupMembersQuery.RAW_CONTACT_ID);
-        return RawContacts.CONTENT_URI.buildUpon()
+        return Data.CONTENT_URI.buildUpon()
                 .appendPath(Long.toString(rawContactId))
                 .build();
     }
diff --git a/src/com/android/contacts/list/GroupMemberPickerFragment.java b/src/com/android/contacts/list/GroupMemberPickerFragment.java
index d965e21..edd5739 100644
--- a/src/com/android/contacts/list/GroupMemberPickerFragment.java
+++ b/src/com/android/contacts/list/GroupMemberPickerFragment.java
@@ -23,7 +23,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.Data;
 import android.util.Log;
 import android.util.Pair;
 import android.view.LayoutInflater;
@@ -38,7 +38,9 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Fragment containing raw contacts for a specified account that are not already in a group.
@@ -84,12 +86,17 @@
                         + (mContactPhotosMap == null ? 0 : mContactPhotosMap.size()));
             }
 
+            final Set<String> uniqueRawContactIds = new HashSet<String>();
+
             for (int i = 0; i < mCount; i++) {
                 super.moveToPosition(i);
                 final String rawContactId = getString(GroupMembersQuery.RAW_CONTACT_ID);
-                if (!mRawContactIds.contains(rawContactId)) {
+                if (!mRawContactIds.contains(rawContactId)
+                        && !uniqueRawContactIds.contains(rawContactId)) {
                     mIndex[mPos++] = i;
-                } else if (mContactPhotosMap != null) {
+                    uniqueRawContactIds.add(rawContactId);
+                }
+                if (mRawContactIds.contains(rawContactId) && mContactPhotosMap != null) {
                     final long contactId = getLong(GroupMembersQuery.CONTACT_ID);
                     mContactPhotosMap.remove(contactId);
                 }
@@ -117,10 +124,10 @@
         }
 
         private int getColumnIndexForContactColumn(String columnName) {
-            if (Contacts.PHOTO_ID.equals(columnName)) {
+            if (Data.PHOTO_ID.equals(columnName)) {
                 return GroupMembersQuery.CONTACT_PHOTO_ID;
             }
-            if (Contacts.LOOKUP_KEY.equals(columnName)) {
+            if (Data.LOOKUP_KEY.equals(columnName)) {
                 return GroupMembersQuery.CONTACT_LOOKUP_KEY;
             }
             return -1;
@@ -130,14 +137,14 @@
         public String[] getColumnNames() {
             final String displayNameColumnName =
                     getContactNameDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY
-                            ? RawContacts.DISPLAY_NAME_PRIMARY
-                            : RawContacts.DISPLAY_NAME_ALTERNATIVE;
+                            ? Data.DISPLAY_NAME_PRIMARY
+                            : Data.DISPLAY_NAME_ALTERNATIVE;
             return new String[] {
-                    RawContacts._ID,
-                    RawContacts.CONTACT_ID,
+                    Data._ID,
+                    Data.CONTACT_ID,
                     displayNameColumnName,
-                    Contacts.PHOTO_ID,
-                    Contacts.LOOKUP_KEY,
+                    Data.PHOTO_ID,
+                    Data.LOOKUP_KEY,
             };
         }
 
@@ -219,15 +226,15 @@
     private final LoaderCallbacks<Cursor> mContactsEntityCallbacks = new LoaderCallbacks<Cursor>() {
 
         private final String[] PROJECTION = new String[] {
-                Contacts._ID,
-                Contacts.PHOTO_ID,
-                Contacts.LOOKUP_KEY
+                Data.CONTACT_ID,
+                Data.PHOTO_ID,
+                Data.LOOKUP_KEY
         };
 
         @Override
         public CursorLoader onCreateLoader(int id, Bundle args) {
             final CursorLoader loader = new CursorLoader(getActivity());
-            loader.setUri(Contacts.CONTENT_URI);
+            loader.setUri(Data.CONTENT_URI);
             loader.setProjection(PROJECTION);
             return loader;
         }
@@ -311,7 +318,9 @@
 
     @Override
     public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-        super.onLoadFinished(loader, new FilterCursorWrapper(data));
+        if (data != null) {
+            super.onLoadFinished(loader, new FilterCursorWrapper(data));
+        }
     }
 
     @Override
