diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index cf44fe3..3ae009e 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -49,6 +49,7 @@
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.common.editor.SelectAccountDialogFragment;
+import com.android.contacts.common.list.AccountFilterActivity;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
 import com.android.contacts.common.model.AccountTypeManager;
@@ -465,7 +466,7 @@
                     positionOfLastFilter, menuName);
             mFilterMenuMap.put(filter, menuItem);
             final Intent intent = new Intent();
-            intent.putExtra(AccountFilterUtil.EXTRA_CONTACT_LIST_FILTER, filter);
+            intent.putExtra(AccountFilterActivity.EXTRA_CONTACT_LIST_FILTER, filter);
             menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                 @Override
                 public boolean onMenuItemClick(MenuItem item) {
@@ -496,7 +497,7 @@
 
     protected void updateFilterMenu(ContactListFilter filter) {
         clearCheckedMenus();
-        if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
+        if (ContactListFilter.isContactsFilterType(filter)) {
             if (mIdMenuMap != null && mIdMenuMap.get(R.id.nav_all_contacts) != null) {
                 mIdMenuMap.get(R.id.nav_all_contacts).setCheckable(true);
                 mIdMenuMap.get(R.id.nav_all_contacts).setChecked(true);
@@ -512,7 +513,7 @@
     }
 
     /**
-     * Returns the current filter if the child class is {@link PeopleActivity}, and null otherwise.
+     * Returns the current filter if the child class is PeopleActivity, and null otherwise.
      */
     protected ContactListFilter getContactListFilter() {
         return null;
@@ -526,7 +527,6 @@
     @Override
     public boolean onNavigationItemSelected(final MenuItem item) {
         final int id = item.getItemId();
-
         mToggle.runWhenIdle(new Runnable() {
             @Override
             public void run() {
@@ -564,8 +564,8 @@
 
     protected void switchToAllContacts() {
         final Intent intent = new Intent();
-        final ContactListFilter filter = createAllAccountsFilter();
-        intent.putExtra(AccountFilterUtil.EXTRA_CONTACT_LIST_FILTER, filter);
+        final ContactListFilter filter = createContactsFilter();
+        intent.putExtra(AccountFilterActivity.EXTRA_CONTACT_LIST_FILTER, filter);
         AccountFilterUtil.handleAccountFilterResult(
                 mContactListFilterController, AppCompatActivity.RESULT_OK, intent);
         if (shouldFinish()) {
@@ -578,8 +578,17 @@
                 Assistants.getDuplicatesActivityIntent(this));
     }
 
-    protected ContactListFilter createAllAccountsFilter() {
-        return ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+    /**
+     * Returns a {@link ContactListFilter} of type
+     * {@link ContactListFilter#FILTER_TYPE_ALL_ACCOUNTS}, or if a custom "Contacts to display"
+     * filter has been set, then one of type {@link ContactListFilter#FILTER_TYPE_CUSTOM}.
+     */
+    protected ContactListFilter createContactsFilter() {
+        final int filterType =
+                ContactListFilterController.getInstance(this).isCustomFilterPersisted()
+                        ? ContactListFilter.FILTER_TYPE_CUSTOM
+                        : ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS;
+        return ContactListFilter.createFilterWithType(filterType);
     }
 
     private void clearCheckedMenus() {
@@ -587,7 +596,6 @@
         clearCheckedMenu(mGroupMenuMap);
         clearCheckedMenu(mIdMenuMap);
     }
-
     private void clearCheckedMenu(Map<?, MenuItem> map) {
         final Iterator it = map.entrySet().iterator();
         while (it.hasNext()) {
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 2ab0fef..fadede6 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -225,7 +225,7 @@
         // This is useful when user upgrades app while an account filter or a custom filter was
         // stored in sharedPreference in a previous version of Contacts app.
         final ContactListFilter filter = mIsRecreatedInstance
-                ? mContactListFilterController.getFilter() : createAllAccountsFilter();
+                ? mContactListFilterController.getFilter() : createContactsFilter();
         persistFilterIfNeeded(filter);
 
         createViewsAndFragments(savedState);
@@ -434,7 +434,7 @@
             final int tabToOpen;
             switch (actionCode) {
                 case ContactsRequest.ACTION_ALL_CONTACTS:
-                    filter = createAllAccountsFilter();
+                    filter = createContactsFilter();
                     tabToOpen = TabState.ALL;
                     break;
                 case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
@@ -460,7 +460,7 @@
             }
 
             if (filter != null) {
-                mContactListFilterController.setContactListFilter(filter, false);
+                mContactListFilterController.setContactListFilter(filter, /* persistent */ false);
                 searchMode = false;
             }
 
@@ -985,7 +985,7 @@
             ContactListFilter currentFilter = mAllFragment.getFilter();
             if (currentFilter != null
                     && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
-                filter = createAllAccountsFilter();
+                filter = createContactsFilter();
                 setFilterAndUpdateTitle(filter);
             } else {
                 filter = ContactListFilter.createFilterWithType(
@@ -1307,8 +1307,7 @@
                 Logger.logScreenView(this, ScreenType.SEARCH_EXIT);
                 Logger.logSearchEvent(mAllFragment.createSearchState());
             }
-        } else if (mContactListFilterController.getFilter().filterType !=
-                ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
+        } else if (!isAllContactsFilter(mContactListFilterController.getFilter())) {
             switchToAllContacts();
         } else {
             super.onBackPressed();
@@ -1392,7 +1391,7 @@
 
     private void setFilterAndUpdateTitle(ContactListFilter filter, boolean restoreSelectedUri) {
         mAllFragment.setFilter(filter, restoreSelectedUri);
-        final int listType =  filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS
+        final int listType = isAllContactsFilter(filter)
                 ? ListEvent.ListType.ALL_CONTACTS : ListEvent.ListType.ACCOUNT;
         mAllFragment.setListType(listType);
 
@@ -1425,7 +1424,7 @@
     }
 
     private boolean isAllContactsFilter(ContactListFilter filter) {
-        return filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS;
+        return ContactListFilter.isContactsFilterType(filter);
     }
 
     private boolean isDeviceContactsFilter(ContactListFilter filter) {
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index fd6c0c0..8fdce75 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -73,8 +73,11 @@
         final ContactListFilterController contactListFilterController =
                 ContactListFilterController.getInstance(getContext());
         final ContactListFilter filter = contactListFilterController.getFilter();
-        if (!isSearchMode()
-                && filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
+        if (isSearchMode()) {
+            hideHeaderAndAddPadding(getContext(), getListView(), accountFilterContainer);
+        } else if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+            bindListHeaderCustom(getListView(), accountFilterContainer);
+        } else if (filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
             final AccountWithDataSet accountWithDataSet = new AccountWithDataSet(
                     filter.accountName, filter.accountType, filter.dataSet);
             bindListHeader(getContext(), getListView(), accountFilterContainer,
diff --git a/src/com/android/contacts/list/MultiSelectContactsListFragment.java b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
index af403ca..1e3c191 100644
--- a/src/com/android/contacts/list/MultiSelectContactsListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
@@ -299,6 +299,19 @@
         }
     }
 
+    protected void bindListHeaderCustom(View listView, View accountFilterContainer) {
+        bindListHeaderCommon(listView, accountFilterContainer);
+
+        final TextView accountFilterHeader = (TextView) accountFilterContainer.findViewById(
+                R.id.account_filter_header);
+        accountFilterHeader.setText(R.string.listCustomView);
+        accountFilterHeader.setAllCaps(false);
+
+        final ImageView accountFilterHeaderIcon = (ImageView) accountFilterContainer
+                .findViewById(R.id.account_filter_icon);
+        accountFilterHeaderIcon.setVisibility(View.INVISIBLE);
+    }
+
     /**
      * Show account icon, count of contacts and account name in the header of the list.
      */
@@ -309,9 +322,7 @@
             return;
         }
 
-        // Show header and remove top padding of the list
-        accountFilterContainer.setVisibility(View.VISIBLE);
-        listView.setPadding(0, 0, 0, 0);
+        bindListHeaderCommon(listView, accountFilterContainer);
 
         // Set text of count of contacts and account name (if it's a Google account)
         final TextView accountFilterHeader = (TextView) accountFilterContainer.findViewById(
@@ -333,9 +344,16 @@
         final Drawable icon = accountType != null ? accountType.getDisplayIcon(context) : null;
         final ImageView accountFilterHeaderIcon = (ImageView) accountFilterContainer
                 .findViewById(R.id.account_filter_icon);
+        accountFilterHeaderIcon.setVisibility(View.VISIBLE);
         accountFilterHeaderIcon.setImageDrawable(icon);
     }
 
+    private void bindListHeaderCommon(View listView, View accountFilterContainer) {
+        // Show header and remove top padding of the list
+        accountFilterContainer.setVisibility(View.VISIBLE);
+        listView.setPadding(0, 0, 0, 0);
+    }
+
     /**
      * Hide header of list view and add padding to the top of list view.
      */
