diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index 7d98173..7af04cf 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -22,6 +22,7 @@
 import android.database.CursorWrapper;
 import android.net.Uri;
 import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -30,6 +31,7 @@
 
 import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.R;
+import com.android.contacts.common.list.ContactsSectionIndexer;
 import com.android.contacts.common.logging.ListEvent.ListType;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountType;
@@ -38,6 +40,7 @@
 
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 /** Displays the members of a group. */
@@ -81,10 +84,19 @@
             mCount = super.getCount();
             mIndex = new int[mCount];
 
+            final List<Integer> indicesToFilter = new ArrayList<>();
+
             if (Log.isLoggable(TAG, Log.VERBOSE)) {
                 Log.v(TAG, "Group members CursorWrapper start: " + mCount);
             }
 
+            final Bundle bundle = cursor.getExtras();
+            final String sections[] = bundle.getStringArray(Contacts
+                    .EXTRA_ADDRESS_BOOK_INDEX_TITLES);
+            final int counts[] = bundle.getIntArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS);
+            final ContactsSectionIndexer indexer = (sections == null || counts == null)
+                    ? null : new ContactsSectionIndexer(sections, counts);
+
             mGroupMemberContactIds.clear();
             for (int i = 0; i < mCount; i++) {
                 super.moveToPosition(i);
@@ -92,8 +104,15 @@
                 if (!mGroupMemberContactIds.contains(contactId)) {
                     mIndex[mPos++] = i;
                     mGroupMemberContactIds.add(contactId);
+                } else {
+                    indicesToFilter.add(i);
                 }
             }
+
+            if (indexer != null && GroupUtil.needTrimming(mCount, counts, indexer.getPositions())) {
+                GroupUtil.updateBundle(bundle, indexer, indicesToFilter, sections, counts);
+            }
+
             mCount = mPos;
             mPos = 0;
             super.moveToFirst();
diff --git a/src/com/android/contacts/group/GroupUtil.java b/src/com/android/contacts/group/GroupUtil.java
index 2eee35b..e716fc7 100644
--- a/src/com/android/contacts/group/GroupUtil.java
+++ b/src/com/android/contacts/group/GroupUtil.java
@@ -21,6 +21,8 @@
 import android.content.Intent;
 import android.database.Cursor;
 import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Groups;
 import android.text.TextUtils;
 import android.widget.ImageView;
@@ -29,11 +31,14 @@
 import com.android.contacts.activities.GroupMembersActivity;
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.list.ContactsSectionIndexer;
 import com.android.contacts.common.model.account.GoogleAccountType;
 import com.google.common.base.Objects;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -156,4 +161,61 @@
     public static String getGroupsSortOrder() {
         return Groups.TITLE + " COLLATE LOCALIZED ASC";
     }
+
+    /**
+     * The sum of the last element in counts[] and the last element in positions[] is the total
+     * number of remaining elements in cursor. If count is more than what's in the indexer now,
+     * then we don't need to trim.
+     */
+    public static boolean needTrimming(int count, int[] counts, int[] positions) {
+        // The sum of the last element in counts[] and the last element in positions[] is
+        // the total number of remaining elements in cursor. If mCount is more than
+        // what's in the indexer now, then we don't need to trim.
+        return positions.length > 0 && counts.length > 0
+                && count <= (counts[counts.length - 1] + positions[positions.length - 1]);
+    }
+
+    /**
+     * Update Bundle extras so as to update indexer.
+     */
+    public static void updateBundle(Bundle bundle, ContactsSectionIndexer indexer,
+            List<Integer> subscripts, String[] sections, int[] counts) {
+        for (int i : subscripts) {
+            final int filteredContact = indexer.getSectionForPosition(i);
+            if (filteredContact < counts.length && filteredContact >= 0) {
+                counts[filteredContact]--;
+                if (counts[filteredContact] == 0) {
+                    sections[filteredContact] = "";
+                }
+            }
+        }
+        final String[] newSections = clearEmptyString(sections);
+        bundle.putStringArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_TITLES, newSections);
+        final int[] newCounts = clearZeros(counts);
+        bundle.putIntArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS, newCounts);
+    }
+
+    private static String[] clearEmptyString(String[] strings) {
+        final List<String> list = new ArrayList<>();
+        for (String s : strings) {
+            if (!TextUtils.isEmpty(s)) {
+                list.add(s);
+            }
+        }
+        return list.toArray(new String[list.size()]);
+    }
+
+    private static int[] clearZeros(int[] numbers) {
+        final List<Integer> list = new ArrayList<>();
+        for (int n : numbers) {
+            if (n > 0) {
+                list.add(n);
+            }
+        }
+        final int[] array = new int[list.size()];
+        for(int i = 0; i < list.size(); i++) {
+            array[i] = list.get(i);
+        }
+        return array;
+    }
 }
\ No newline at end of file
diff --git a/src/com/android/contacts/list/GroupMemberPickerFragment.java b/src/com/android/contacts/list/GroupMemberPickerFragment.java
index 51629bc..7601a3c 100644
--- a/src/com/android/contacts/list/GroupMemberPickerFragment.java
+++ b/src/com/android/contacts/list/GroupMemberPickerFragment.java
@@ -21,7 +21,6 @@
 import android.database.CursorWrapper;
 import android.os.Bundle;
 import android.provider.ContactsContract.Contacts;
-import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -36,9 +35,9 @@
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactsSectionIndexer;
 import com.android.contacts.common.list.DefaultContactListAdapter;
+import com.android.contacts.group.GroupUtil;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -85,66 +84,31 @@
             mCount = super.getCount();
             mIndex = new int[mCount];
 
+            final List<Integer> indicesToFilter = new ArrayList<>();
+
             if (Log.isLoggable(TAG, Log.VERBOSE)) {
                 Log.v(TAG, "RawContacts CursorWrapper start: " + mCount);
             }
 
             final Bundle bundle = cursor.getExtras();
-            boolean hasSections = bundle.containsKey(Contacts.EXTRA_ADDRESS_BOOK_INDEX_TITLES)
-                    && bundle.containsKey(Contacts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS);
-            boolean needsTrimming = false;
-
-            String sections[] = new String[]{};
-            int counts[] = new int[]{};
-            ContactsSectionIndexer indexer = null;
-            if (hasSections) {
-                sections = bundle.getStringArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_TITLES);
-                counts = bundle.getIntArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS);
-
-                indexer = new ContactsSectionIndexer(sections, counts);
-                final int positions[] = indexer.getPositions();
-
-                // The sum of the last element in counts[] and the last element in positions[] is
-                // the total number of remaining elements in cursor. If mCount is more than
-                // what's in the indexer now, then we don't need to trim.
-                needsTrimming =
-                        mCount <= (counts[counts.length - 1] + positions[positions.length - 1]);
-
-                if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, "sections before: " + Arrays.toString(sections));
-                    Log.v(TAG, "counts before: " + Arrays.toString(counts));
-                    Log.v(TAG, "positions: " + Arrays.toString(positions));
-                    Log.v(TAG, "mCount: " + mCount);
-                }
-            }
+            final String sections[] = bundle.getStringArray(Contacts
+                    .EXTRA_ADDRESS_BOOK_INDEX_TITLES);
+            final int counts[] = bundle.getIntArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS);
+            final ContactsSectionIndexer indexer = (sections == null || counts == null)
+                    ? null : new ContactsSectionIndexer(sections, counts);
 
             for (int i = 0; i < mCount; i++) {
                 super.moveToPosition(i);
                 final String contactId = getString(ContactQuery.CONTACT_ID);
                 if (!mRawContactIds.contains(contactId)) {
                     mIndex[mPos++] = i;
-                } else if (needsTrimming) {
-                    int filteredContact = indexer.getSectionForPosition(i);
-                    if (filteredContact < counts.length && filteredContact >= 0) {
-                        counts[filteredContact]--;
-                        if (counts[filteredContact] == 0) {
-                            sections[filteredContact] = "";
-                        }
-                    }
+                } else {
+                    indicesToFilter.add(i);
                 }
             }
 
-            if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                Log.v(TAG, "sections  after: " + Arrays.toString(sections));
-                Log.v(TAG, "counts  after: " + Arrays.toString(counts));
-                Log.v(TAG, "mIndex: " + Arrays.toString(mIndex));
-            }
-
-            if (needsTrimming) {
-                final String[] newSections = clearEmptyString(sections);
-                bundle.putStringArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_TITLES, newSections);
-                final int[] newCounts = clearZeros(counts);
-                bundle.putIntArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS, newCounts);
+            if (indexer != null && GroupUtil.needTrimming(mCount, counts, indexer.getPositions())) {
+                GroupUtil.updateBundle(bundle, indexer, indicesToFilter, sections, counts);
             }
 
             mCount = mPos;
@@ -156,30 +120,6 @@
             }
         }
 
-        private String[] clearEmptyString(String[] strings) {
-            final List<String> list = new ArrayList<>();
-            for (String s : strings) {
-                if (!TextUtils.isEmpty(s)) {
-                    list.add(s);
-                }
-            }
-            return list.toArray(new String[list.size()]);
-        }
-
-        private int[] clearZeros(int[] numbers) {
-            final List<Integer> list = new ArrayList<>();
-            for (int n : numbers) {
-                if (n > 0) {
-                    list.add(n);
-                }
-            }
-            final int[] array = new int[list.size()];
-            for(int i = 0; i < list.size(); i++) {
-                array[i] = list.get(i);
-            }
-            return array;
-        }
-
         @Override
         public boolean move(int offset) {
             return moveToPosition(mPos + offset);
diff --git a/tests/src/com/android/contacts/tests/GroupUtilTest.java b/tests/src/com/android/contacts/tests/GroupUtilTest.java
new file mode 100644
index 0000000..9b719ff
--- /dev/null
+++ b/tests/src/com/android/contacts/tests/GroupUtilTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2016 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.contacts.tests;
+
+import com.android.contacts.common.list.ContactsSectionIndexer;
+import com.android.contacts.group.GroupUtil;
+
+import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
+import android.test.AndroidTestCase;
+import android.test.MoreAsserts;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.Arrays;
+import java.util.List;
+
+@SmallTest
+public class GroupUtilTest extends AndroidTestCase {
+
+    public void testNeedTrimming() {
+        final int zeroCount = 0;
+        final int emptyPositions[] = new int[]{};
+        final int emptyCounts[] = new int[]{};
+        assertFalse(GroupUtil.needTrimming(zeroCount, emptyPositions, emptyCounts));
+
+        final int count = 22;
+        int positions[] = new int[]{0, 1, 3, 5, 8, 9};
+        int counts[] = new int[]{1, 2, 2, 3, 1, 2};
+        assertFalse(GroupUtil.needTrimming(count, positions, counts));
+
+        positions = new int[]{0, 1, 7, 9, 16, 17, 19, 20};
+        counts = new int[]{1, 6, 2, 7, 1, 2, 1, 2};
+        assertTrue(GroupUtil.needTrimming(count, positions, counts));
+    }
+
+    public void testUpdateBundle_smallSet() {
+        final Bundle bundle = new Bundle();
+        final String[] sections = new String[]{"…", "A", "I", "T", "W", "Y", "Z", "#"};
+        final int[] counts = new int[]{1, 6, 2, 7, 1, 2, 1, 2};
+        final Integer[] subscripts = new Integer[]{1, 2, 5, 7, 8, 10, 11, 15, 16, 17, 18};
+        final List<Integer> subscriptsList = Arrays.asList(subscripts);
+        final ContactsSectionIndexer indexer = new ContactsSectionIndexer(sections, counts);
+
+        GroupUtil.updateBundle(bundle, indexer, subscriptsList, sections, counts);
+
+        final String[] newSections = new String[]{"…", "A", "T", "Z", "#"};
+        final int[] newCounts = new int[]{1, 3, 4, 1, 2};
+
+        assertNotNull(bundle.getStringArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_TITLES));
+        MoreAsserts.assertEquals("Wrong sections!", newSections, bundle.getStringArray(Contacts
+                .EXTRA_ADDRESS_BOOK_INDEX_TITLES));
+
+        assertNotNull(bundle.getIntArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS));
+        MoreAsserts.assertEquals("Wrong counts!", newCounts, bundle.getIntArray(Contacts
+                .EXTRA_ADDRESS_BOOK_INDEX_COUNTS));
+    }
+
+    public void testUpdateBundle_mediumSet() {
+        final Bundle bundle = new Bundle();
+        final String[] sections = new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "J",
+                "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z"};
+        final int[] counts = new int[]{81, 36, 84, 55, 28, 15, 18, 38, 145, 60, 41, 73, 15, 2, 56,
+                1, 74, 73, 45, 14, 28, 9, 18, 21};
+        final Integer[] subscripts = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+                15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+                36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+                57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+                78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
+                99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
+                116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
+                133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+                150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
+                167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
+                184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
+                201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
+                218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
+                235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
+                252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268,
+                269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
+                286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302,
+                303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319,
+                320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336,
+                337, 344, 347, 348, 349, 350, 351, 352, 353, 354, 495, 496, 497, 498, 499, 558, 559,
+                597, 598, 599, 600, 601, 602, 668, 669, 670, 671, 672, 673, 746, 747, 820, 821, 885,
+                886, 887, 888, 889, 890, 891, 892, 893, 894, 939, 979, 980, 981, 982, 983, 984, 985,
+                986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001,
+                1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015,
+                1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029};
+        final List<Integer> subscriptsList = Arrays.asList(subscripts);
+        final ContactsSectionIndexer indexer = new ContactsSectionIndexer(sections, counts);
+
+        GroupUtil.updateBundle(bundle, indexer, subscriptsList, sections, counts);
+
+        final String[] newSections = new String[]{"A", "H", "J", "K", "L", "M", "N", "O", "P",
+                "R", "S", "T", "V", "W"};
+        final int[] newCounts = new int[]{1, 8, 140, 58, 37, 65, 15, 2, 55, 72, 63, 44, 14, 25};
+
+        assertNotNull(bundle.getStringArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_TITLES));
+        MoreAsserts.assertEquals("Wrong sections!", newSections, bundle.getStringArray(Contacts
+                .EXTRA_ADDRESS_BOOK_INDEX_TITLES));
+
+        assertNotNull(bundle.getIntArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS));
+        MoreAsserts.assertEquals("Wrong counts!", newCounts, bundle.getIntArray(Contacts
+                .EXTRA_ADDRESS_BOOK_INDEX_COUNTS));
+    }
+
+}
