diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 56bf4e5..e27445f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -315,11 +315,17 @@
             android:label="@string/activity_title_settings"
             android:theme="@style/ContactsPreferencesTheme" />
 
+        <!-- Used to filter contacts list by account -->
+        <activity
+            android:name=".list.AccountFilterActivity"
+            android:label="@string/activity_title_contacts_filter"
+            android:theme="@style/ContactListFilterTheme" />
+
         <!-- Used to select display and sync groups -->
         <activity
             android:name=".list.CustomContactListFilterActivity"
             android:label="@string/custom_list_filter"
-            android:theme="@style/CustomContactListFilterTheme" />
+            android:theme="@style/ContactListFilterTheme" />
 
         <activity
             android:name=".activities.ShowOrCreateActivity"
diff --git a/res/layout/contact_list_filter.xml b/res/layout/contact_list_filter.xml
new file mode 100644
index 0000000..de05cf8
--- /dev/null
+++ b/res/layout/contact_list_filter.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:fillViewport="true">
+
+    <ListView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="0dip"
+        android:layout_weight="1" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dip"
+        android:layout_marginLeft="16dip"
+        android:layout_marginRight="16dip"
+        android:background="?android:attr/dividerHorizontal" />
+</LinearLayout>
diff --git a/res/layout/contacts_list_content.xml b/res/layout/contacts_list_content.xml
index 6792f9c..b92929b 100644
--- a/res/layout/contacts_list_content.xml
+++ b/res/layout/contacts_list_content.xml
@@ -21,6 +21,19 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
+    <TextView
+        android:id="@+id/account_filter_header"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:singleLine="true"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:padding="5dip"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="@android:color/white"
+        android:background="@android:color/black"
+        android:visibility="gone" />
+
     <view
         class="com.android.contacts.list.ContactEntryListView"
         android:id="@android:id/list"
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 32d02be..4f2b073 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -60,10 +60,11 @@
         <item name="list_item_header_text_size">14sp</item>
     </style>
 
-    <style name="CustomContactListFilterTheme" parent="@android:Theme.Holo.Light.Dialog">
+    <style name="ContactListFilterTheme" parent="@android:Theme.Holo.Light.Dialog">
+        <item name="android:windowCloseOnTouchOutside">true</item>
     </style>
 
-    <style name="CustomContactListFilterView" parent="CustomContactListFilterTheme">
+    <style name="CustomContactListFilterView" parent="ContactListFilterTheme">
         <item name="android:layout_width">400dip</item>
         <item name="android:layout_height">400dip</item>
     </style>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 821e5f8..a25b73d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -366,6 +366,9 @@
     <!-- Displayed at the top of the contacts showing the zero total number of contacts visible when a group or account is selected  [CHAR LIMIT=64]-->
     <string name="listTotalAllContactsZeroGroup">No contacts in <xliff:g id="name" example="Friends">%s</xliff:g></string>
 
+    <!-- Displayed at the top of the contacts showing the account filter selected  [CHAR LIMIT=64] -->
+    <string name="listAllContactsInAccount">Contacts in <xliff:g id="name" example="abc@gmail.com">%s</xliff:g></string>
+
     <!-- Displayed at the top of the contacts showing the total number of contacts found when "Only contacts with phones" not selected -->
     <plurals name="listFoundAllContacts">
         <item quantity="one">1 found</item>
@@ -1490,6 +1493,9 @@
     <!-- Title of the settings activity [CHAR LIMIT=64] -->
     <string name="activity_title_settings">Settings</string>
 
+    <!-- Title of the activity that allows the uesr to filter the list of contacts displayed according to account [CHAR LIMIT=25] -->
+    <string name="activity_title_contacts_filter">Contacts to display</string>
+
     <!-- Menu item for the settings activity [CHAR LIMIT=64] -->
     <string name="menu_settings">Settings</string>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 067a730..914532c 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -227,7 +227,7 @@
     <style name="ContactsPreferencesTheme" parent="@android:Theme.Holo.Light">
     </style>
 
-    <style name="CustomContactListFilterTheme" parent="@android:Theme">
+    <style name="ContactListFilterTheme" parent="@android:Theme.Holo.Light">
     </style>
 
     <style name="ContactPickerLayout" parent="ContactPickerTheme">
@@ -235,7 +235,7 @@
         <item name="android:layout_height">match_parent</item>
     </style>
 
-    <style name="CustomContactListFilterView" parent="CustomContactListFilterTheme">
+    <style name="CustomContactListFilterView" parent="ContactListFilterTheme">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">match_parent</item>
     </style>
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index e0f8aef..51ed1e8 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -18,8 +18,6 @@
 
 import com.android.contacts.R;
 import com.android.contacts.activities.ActionBarAdapter.Listener.Action;
-import com.android.contacts.list.ContactListFilterController;
-import com.android.contacts.list.ContactListFilterController.ContactListFilterListener;
 import com.android.contacts.list.ContactsRequest;
 
 import android.app.ActionBar;
@@ -36,8 +34,7 @@
 /**
  * Adapter for the action bar at the top of the Contacts activity.
  */
-public class ActionBarAdapter
-        implements OnQueryTextListener, OnCloseListener, ContactListFilterListener {
+public class ActionBarAdapter implements OnQueryTextListener, OnCloseListener {
 
     public interface Listener {
         public enum Action {
@@ -61,7 +58,6 @@
     private final boolean mAlwaysShowSearchView;
 
     private Listener mListener;
-    private ContactListFilterController mFilterController;
 
     private ActionBar mActionBar;
 
@@ -108,11 +104,6 @@
         mListener = listener;
     }
 
-    public void setContactListFilterController(ContactListFilterController controller) {
-        mFilterController = controller;
-        mFilterController.addListener(this);
-    }
-
     public boolean isSearchMode() {
         return mSearchMode;
     }
@@ -210,20 +201,6 @@
         mActionBar.setSelectedNavigationItem(savedState.getInt(EXTRA_KEY_SELECTED_TAB));
     }
 
-    @Override
-    public void onContactListFiltersLoaded() {
-        update();
-    }
-
-    @Override
-    public void onContactListFilterChanged() {
-        update();
-    }
-
-    @Override
-    public void onContactListFilterCustomizationRequest() {
-    }
-
     private void setFocusOnSearchView() {
         mSearchView.requestFocus();
         mSearchView.setIconified(false); // Workaround for the "IME not popping up" issue.
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 19019f4..049deb0 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -32,6 +32,7 @@
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.interactions.ImportExportDialogFragment;
 import com.android.contacts.interactions.PhoneNumberInteraction;
+import com.android.contacts.list.AccountFilterActivity;
 import com.android.contacts.list.ContactBrowseListContextMenuAdapter;
 import com.android.contacts.list.ContactBrowseListFragment;
 import com.android.contacts.list.ContactEntryListFragment;
@@ -108,7 +109,8 @@
     private static final int SUBACTIVITY_EDIT_CONTACT = 3;
     private static final int SUBACTIVITY_NEW_GROUP = 4;
     private static final int SUBACTIVITY_EDIT_GROUP = 5;
-    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 6;
+    private static final int SUBACTIVITY_ACCOUNT_FILTER = 6;
+    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 7;
 
     private static final String KEY_SEARCH_MODE = "searchMode";
 
@@ -178,8 +180,6 @@
 
     public PeopleActivity() {
         mIntentResolver = new ContactsIntentResolver(this);
-        // TODO: Get rid of the ContactListFilterController class because there aren't any
-        // dropdown filters anymore. Just store the selected filter as a member variable.
         mContactListFilterController = new ContactListFilterController(this);
         mContactListFilterController.addListener(this);
         mProviderStatusLoader = new ProviderStatusLoader(this);
@@ -304,7 +304,6 @@
         ActionBar actionBar = getActionBar();
         mActionBarAdapter = new ActionBarAdapter(this, this);
         mActionBarAdapter.onCreate(savedState, mRequest, getActionBar());
-        mActionBarAdapter.setContactListFilterController(mContactListFilterController);
 
         ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
         ContactDetailTabCarousel tabCarousel = (ContactDetailTabCarousel)
@@ -489,17 +488,6 @@
     }
 
     @Override
-    public void onContactListFiltersLoaded() {
-        if (mListFragment == null || !mListFragment.isAdded()) {
-            return;
-        }
-
-        mListFragment.setFilter(mContactListFilterController.getFilter());
-
-        invalidateOptionsMenuIfNeeded();
-    }
-
-    @Override
     public void onContactListFilterChanged() {
         if (mListFragment == null || !mListFragment.isAdded()) {
             return;
@@ -510,12 +498,6 @@
         invalidateOptionsMenuIfNeeded();
     }
 
-    @Override
-    public void onContactListFilterCustomizationRequest() {
-        startActivityForResult(new Intent(this, CustomContactListFilterActivity.class),
-                SUBACTIVITY_CUSTOMIZE_FILTER);
-    }
-
     private void setupContactDetailFragment(final Uri contactLookupUri) {
         mContactDetailLoaderFragment.loadUri(contactLookupUri);
         invalidateOptionsMenuIfNeeded();
@@ -593,7 +575,7 @@
             mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
         }
 
-        if (mContactListFilterController.isLoaded()) {
+        if (mContactListFilterController.isInitialized()) {
             mListFragment.setFilter(mContactListFilterController.getFilter());
         }
     }
@@ -1035,8 +1017,8 @@
                 return true;
             }
             case R.id.menu_contacts_filter: {
-                final Intent intent = new Intent(this, CustomContactListFilterActivity.class);
-                startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
+                final Intent intent = new Intent(this, AccountFilterActivity.class);
+                startActivityForResult(intent, SUBACTIVITY_ACCOUNT_FILTER);
                 return true;
             }
             case R.id.menu_search: {
@@ -1115,13 +1097,30 @@
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         switch (requestCode) {
+            case SUBACTIVITY_ACCOUNT_FILTER: {
+                if (resultCode == Activity.RESULT_OK) {
+                    ContactListFilter filter = (ContactListFilter) data.getParcelableExtra(
+                            AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER);
+                    if (filter == null) {
+                        return;
+                    }
+                    // If this is a custom filter, launch the activity to customize the display list
+                    if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
+                        final Intent intent = new Intent(this,
+                                CustomContactListFilterActivity.class);
+                        startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
+                    } else {
+                        mContactListFilterController.setContactListFilter(filter, true);
+                    }
+                }
+                break;
+            }
             case SUBACTIVITY_CUSTOMIZE_FILTER: {
                 if (resultCode == Activity.RESULT_OK) {
                     mContactListFilterController.selectCustomFilter();
                 }
                 break;
             }
-
             case SUBACTIVITY_EDIT_CONTACT:
             case SUBACTIVITY_NEW_CONTACT: {
                 if (resultCode == RESULT_OK && mContentPaneDisplayed) {
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
new file mode 100644
index 0000000..c38599e
--- /dev/null
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2011 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.list;
+
+import com.android.contacts.ContactsActivity;
+import com.android.contacts.ContactsSearchManager;
+import com.android.contacts.R;
+import com.android.contacts.model.AccountType;
+import com.android.contacts.model.AccountTypeManager;
+
+import android.accounts.Account;
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Shows a list of all available accounts, letting the user select under which account to view
+ * contacts.
+ */
+public class AccountFilterActivity extends ContactsActivity
+        implements AdapterView.OnItemClickListener {
+
+    private static final String TAG = AccountFilterActivity.class.getSimpleName();
+
+    public static final String KEY_EXTRA_CONTACT_LIST_FILTER = "contactListFilter";
+
+    private ListView mListView;
+
+    private List<ContactListFilter> mFilters = new ArrayList<ContactListFilter>();
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.contact_list_filter);
+
+        mListView = (ListView) findViewById(com.android.internal.R.id.list);
+        mListView.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                finishAndSetResult(mFilters.get(position));
+            }
+        });
+
+        ActionBar actionBar =  getActionBar();
+        if (actionBar != null) {
+            actionBar.setDisplayHomeAsUpEnabled(true);
+        }
+
+        loadAccountFilters();
+    }
+
+    private void loadAccountFilters() {
+        ArrayList<ContactListFilter> accountFilters = new ArrayList<ContactListFilter>();
+        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
+        ArrayList<Account> accounts = accountTypes.getAccounts(false);
+        for (Account account : accounts) {
+            AccountType accountType = accountTypes.getAccountType(account.type);
+            Drawable icon = accountType != null ? accountType.getDisplayIcon(this) : null;
+            accountFilters.add(ContactListFilter.createAccountFilter(account.type, account.name,
+                    icon, account.name));
+        }
+        int count = accountFilters.size();
+
+        if (count >= 1) {
+            // If we only have one account, don't show it as "account", instead show it as "all"
+            mFilters.add(ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
+            if (count > 1) {
+                mFilters.addAll(accountFilters);
+                mFilters.add(ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_CUSTOM));
+            }
+        }
+
+        mListView.setAdapter(new FilterListAdapter(this));
+    }
+
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        finishAndSetResult(mFilters.get(position));
+    }
+
+    private void finishAndSetResult(ContactListFilter filter) {
+        final Intent intent = new Intent();
+        intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
+        setResult(Activity.RESULT_OK, intent);
+        finish();
+    }
+
+    @Override
+    public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
+            boolean globalSearch) {
+        if (globalSearch) {
+            super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
+        } else {
+            ContactsSearchManager.startSearch(this, initialQuery);
+        }
+    }
+
+    private class FilterListAdapter extends BaseAdapter {
+        private LayoutInflater mLayoutInflater;
+
+        public FilterListAdapter(Context context) {
+            mLayoutInflater = (LayoutInflater) context.getSystemService
+                    (Context.LAYOUT_INFLATER_SERVICE);
+        }
+
+        @Override
+        public int getCount() {
+            return mFilters.size();
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public ContactListFilter getItem(int position) {
+            return mFilters.get(position);
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            ContactListFilterView view;
+            if (convertView != null) {
+                view = (ContactListFilterView) convertView;
+            } else {
+                view = (ContactListFilterView) mLayoutInflater.inflate(
+                        R.layout.filter_spinner_item, parent, false);
+            }
+            view.setSingleAccount(mFilters.size() == 1);
+            ContactListFilter filter = mFilters.get(position);
+            view.setContactListFilter(filter);
+            view.bindView(true);
+            return view;
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case android.R.id.home:
+                finish();
+                return true;
+            default:
+                break;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/src/com/android/contacts/list/ContactListFilterController.java b/src/com/android/contacts/list/ContactListFilterController.java
index 533f24a..28b62ca 100644
--- a/src/com/android/contacts/list/ContactListFilterController.java
+++ b/src/com/android/contacts/list/ContactListFilterController.java
@@ -15,67 +15,43 @@
  */
 package com.android.contacts.list;
 
-import com.android.contacts.R;
-
 import android.app.Activity;
-import android.app.LoaderManager;
-import android.app.LoaderManager.LoaderCallbacks;
 import android.content.Context;
-import android.content.Loader;
 import android.content.SharedPreferences;
-import android.content.res.TypedArray;
-import android.os.Bundle;
 import android.preference.PreferenceManager;
-import android.text.TextUtils;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.BaseAdapter;
-import android.widget.ListPopupWindow;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Controls a list of {@link ContactListFilter}'s.
+ * Stores the {@link ContactListFilter} selected by the user and saves it to
+ * {@link SharedPreferences} if necessary.
  */
-// TODO: Remove the extra functionality dealing with loading and displaying a list of filters in
-// the action bar.
-public class ContactListFilterController
-        implements LoaderCallbacks<List<ContactListFilter>>, OnClickListener, OnItemClickListener {
+public class ContactListFilterController {
 
     public interface ContactListFilterListener {
-        void onContactListFiltersLoaded();
         void onContactListFilterChanged();
-        void onContactListFilterCustomizationRequest();
     }
 
     private Context mContext;
-    private LoaderManager mLoaderManager;
-    private boolean mEnabled = true;
     private List<ContactListFilterListener> mListeners = new ArrayList<ContactListFilterListener>();
-    private ListPopupWindow mPopup;
-    private int mPopupWidth = -1;
-    private List<ContactListFilter> mCachedFilters;
-    private SparseArray<ContactListFilter> mFilters;
-    private int mNextFilterId = 1;
-    private View mAnchor;
-    private FilterListAdapter mFilterListAdapter;
     private ContactListFilter mFilter;
-    private boolean mFiltersLoaded;
-    private int mAccountCount;
+
+    private boolean mIsInitialized;
 
     public ContactListFilterController(Activity activity) {
         mContext = activity;
-        mLoaderManager = activity.getLoaderManager();
     }
 
-    public void setEnabled(boolean flag) {
-        mEnabled = flag;
+    public void onStart() {
+        if (mFilter == null) {
+            mFilter = ContactListFilter.restoreFromPreferences(getSharedPreferences());
+            mIsInitialized = true;
+        }
+    }
+
+    public boolean isInitialized() {
+        return mIsInitialized;
     }
 
     public void addListener(ContactListFilterListener listener) {
@@ -90,157 +66,10 @@
         return mFilter;
     }
 
-    public int getFilterCount() {
-        return mFilters != null ? mFilters.size() : 0;
-    }
-
-    public boolean isLoaded() {
-        return mFiltersLoaded;
-    }
-
-    public void onStart() {
-        if (mFilter == null) {
-            mFilter = ContactListFilter.restoreFromPreferences(getSharedPreferences());
-        }
-    }
-
     private SharedPreferences getSharedPreferences() {
         return PreferenceManager.getDefaultSharedPreferences(mContext);
     }
 
-    @Override
-    public ContactListFilterLoader onCreateLoader(int id, Bundle args) {
-        return new ContactListFilterLoader(mContext);
-    }
-
-    @Override
-    public void onLoadFinished(
-            Loader<List<ContactListFilter>> loader, List<ContactListFilter> filters) {
-        int count = filters.size();
-        if (mCachedFilters != null && mCachedFilters.size() == count) {
-            boolean changed = false;
-            for (int i = 0; i < filters.size(); i++) {
-                ContactListFilter filter1 = mCachedFilters.get(i);
-                ContactListFilter filter2 = filters.get(i);
-                if (!filter1.equals(filter2)) {
-                    changed = true;
-                    break;
-                }
-
-                // Group title is intentionally not included in the "equals" algorithm for
-                // ContactListFilter, because we want stability of filter identity
-                // across label changes.  However, here we do care about the label changes.
-                if (filter1.filterType == ContactListFilter.FILTER_TYPE_GROUP &&
-                        !TextUtils.equals(filter1.title, filter2.title)) {
-                    changed = true;
-                    break;
-                }
-            }
-
-            if (!changed) {
-                return;
-            }
-        }
-
-        mCachedFilters = filters;
-
-        if (mFilters == null) {
-            mFilters = new SparseArray<ContactListFilter>(filters.size());
-        } else {
-            mFilters.clear();
-        }
-
-        boolean filterValid = mFilter != null && !mFilter.isValidationRequired();
-
-        mAccountCount = 0;
-        for (int index = 0; index < count; index++) {
-            if (filters.get(index).filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
-                mAccountCount++;
-            }
-        }
-
-        if (mAccountCount != 1) {
-            mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
-            mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_STARRED));
-        }
-
-        for (int index = 0; index < count; index++) {
-            ContactListFilter filter = filters.get(index);
-
-            boolean firstAndOnly = mAccountCount == 1
-                    && filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT;
-
-            // If we only have one account, don't show it as "account", instead show it as "all"
-            if (firstAndOnly) {
-                filter = ContactListFilter.createFilterWithType(
-                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
-            }
-
-            mFilters.append(mNextFilterId++, filter);
-
-            if (filter.equals(mFilter)) {
-                // Refresh the filter in case the title got changed
-                mFilter = filter;
-                filterValid = true;
-            }
-
-            if (firstAndOnly) {
-                mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
-                        ContactListFilter.FILTER_TYPE_STARRED));
-            }
-        }
-
-        if (mAccountCount > 0) {
-            mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_CUSTOM));
-        }
-
-        boolean filterChanged = false;
-        if (mFilter == null  || !filterValid) {
-            filterChanged = mFilter != null;
-            mFilter = getDefaultFilter();
-        }
-
-        if (mFilterListAdapter == null) {
-            mFilterListAdapter = new FilterListAdapter();
-        } else {
-            mFilterListAdapter.notifyDataSetChanged();
-        }
-
-        mFiltersLoaded = true;
-        notifyContacListFiltersLoaded();
-
-        if (filterChanged) {
-            notifyContactListFilterChanged();
-        }
-    }
-
-    public void onLoaderReset(Loader<List<ContactListFilter>> loader) {
-    }
-
-    private void setContactListFilter(int filterId) {
-        ContactListFilter filter;
-        if (filterId == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
-            filter = ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
-        } else if (filterId == ContactListFilter.FILTER_TYPE_CUSTOM) {
-            filter = ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_CUSTOM);
-        } else if (filterId == ContactListFilter.FILTER_TYPE_STARRED) {
-            filter = ContactListFilter.createFilterWithType(
-                    ContactListFilter.FILTER_TYPE_STARRED);
-        } else {
-            filter = mFilters.get(filterId);
-            if (filter == null) {
-                filter = getDefaultFilter();
-            }
-        }
-
-        setContactListFilter(filter, true);
-    }
-
     public void setContactListFilter(ContactListFilter filter, boolean persistent) {
         if (!filter.equals(mFilter)) {
             mFilter = filter;
@@ -253,59 +82,9 @@
         }
     }
 
-    @Override
-    public void onClick(View v) {
-        if (!mFiltersLoaded || !mEnabled) {
-            return;
-        }
-
-        if (mPopupWidth == -1) {
-            TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ContactBrowser);
-            mPopupWidth = a.getDimensionPixelSize(
-                    R.styleable.ContactBrowser_contact_filter_popup_width, -1);
-            a.recycle();
-
-            if (mPopupWidth == -1) {
-                mPopupWidth = mAnchor.getWidth();
-            }
-        }
-
-        mPopup = new ListPopupWindow(mContext, null);
-        mPopup.setWidth(mPopupWidth);
-        mPopup.setAdapter(mFilterListAdapter);
-        mPopup.setAnchorView(mAnchor);
-        mPopup.setOnItemClickListener(this);
-        mPopup.setModal(true);
-        mPopup.show();
-    }
-
-    @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        mPopup.dismiss();
-        if (mFilters.get((int) id).filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
-            notifyContactListFilterCustomizationRequest();
-        } else {
-            setContactListFilter((int) id);
-        }
-    }
-
     public void selectCustomFilter() {
-        mFilter = ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_CUSTOM);
-        notifyContactListFilterChanged();
-    }
-
-    public int getAccountCount() {
-        return mAccountCount;
-    }
-
-    private ContactListFilter getDefaultFilter() {
-        return mFilters.size() > 0 ? mFilters.valueAt(0) : null;
-    }
-
-    private void notifyContacListFiltersLoaded() {
-        for (ContactListFilterListener listener : mListeners) {
-            listener.onContactListFiltersLoaded();
-        }
+        setContactListFilter(ContactListFilter.createFilterWithType(
+                ContactListFilter.FILTER_TYPE_CUSTOM), true);
     }
 
     private void notifyContactListFilterChanged() {
@@ -314,48 +93,4 @@
         }
     }
 
-    private void notifyContactListFilterCustomizationRequest() {
-        for (ContactListFilterListener listener : mListeners) {
-            listener.onContactListFilterCustomizationRequest();
-        }
-    }
-
-    private class FilterListAdapter extends BaseAdapter {
-        private LayoutInflater mLayoutInflater;
-
-        public FilterListAdapter() {
-            mLayoutInflater = LayoutInflater.from(mContext);
-        }
-
-        @Override
-        public int getCount() {
-            return mFilters.size();
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return mFilters.keyAt(position);
-        }
-
-        @Override
-        public Object getItem(int position) {
-            return mFilters.valueAt(position);
-        }
-
-        public View getView(int position, View convertView, ViewGroup parent) {
-            ContactListFilterView view;
-            if (convertView != null) {
-                view = (ContactListFilterView) convertView;
-            } else {
-                view = (ContactListFilterView) mLayoutInflater.inflate(
-                        R.layout.filter_spinner_item, parent, false);
-            }
-            view.setSingleAccount(mAccountCount == 1);
-            ContactListFilter filter = mFilters.valueAt(position);
-            view.setContactListFilter(filter);
-            view.setActivated(filter.equals(mFilter));
-            view.bindView(true);
-            return view;
-        }
-    }
 }
diff --git a/src/com/android/contacts/list/ContactListFilterLoader.java b/src/com/android/contacts/list/ContactListFilterLoader.java
deleted file mode 100644
index 07c11bc..0000000
--- a/src/com/android/contacts/list/ContactListFilterLoader.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2010 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.list;
-
-import com.android.contacts.model.AccountType;
-import com.android.contacts.model.AccountTypeManager;
-
-import android.accounts.Account;
-import android.content.AsyncTaskLoader;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.drawable.Drawable;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Groups;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A loader for the data needed for the group selector.
- */
-public class ContactListFilterLoader extends AsyncTaskLoader<List<ContactListFilter>> {
-
-    private static final class GroupQuery {
-        public static final String[] COLUMNS = {
-            Groups._ID,
-            Groups.ACCOUNT_TYPE,
-            Groups.ACCOUNT_NAME,
-            Groups.TITLE,
-            Groups.AUTO_ADD,
-            Groups.SOURCE_ID,
-            Groups.GROUP_IS_READ_ONLY,
-        };
-
-        public static final int ID = 0;
-        public static final int ACCOUNT_TYPE = 1;
-        public static final int ACCOUNT_NAME = 2;
-        public static final int TITLE = 3;
-        public static final int IS_DEFAULT_GROUP = 4;       // Using the AUTO_ADD group as default
-        public static final int SOURCE_ID = 5;
-        public static final int GROUP_IS_READ_ONLY = 6;
-
-        public static final String SELECTION =
-                Groups.DELETED + "=0" +
-                " AND " + Groups.FAVORITES + "=0" +
-                " AND " + Groups.ACCOUNT_TYPE + " NOT NULL" +
-                " AND " + Groups.ACCOUNT_NAME + " NOT NULL";
-    }
-
-    private boolean mStopped;
-    private ForceLoadContentObserver mObserver;
-    private ArrayList<ContactListFilter> mResults;
-
-    public ContactListFilterLoader(Context context) {
-        super(context);
-    }
-
-    @Override
-    public List<ContactListFilter> loadInBackground() {
-
-        ArrayList<ContactListFilter> results = new ArrayList<ContactListFilter>();
-        Context context = getContext();
-        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(context);
-        ArrayList<Account> accounts = accountTypes.getAccounts(false);
-        for (Account account : accounts) {
-            AccountType accountType = accountTypes.getAccountType(account.type);
-            Drawable icon = accountType != null ? accountType.getDisplayIcon(getContext()) : null;
-            results.add(ContactListFilter.createAccountFilter(account.type, account.name, icon,
-                    account.name));
-        }
-
-        ContentResolver resolver = context.getContentResolver();
-
-        Cursor cursor = resolver.query(
-                Groups.CONTENT_URI, GroupQuery.COLUMNS, GroupQuery.SELECTION, null, null);
-        try {
-            while (cursor.moveToNext()) {
-                long groupId = cursor.getLong(GroupQuery.ID);
-                String groupSourceId = cursor.getString(GroupQuery.SOURCE_ID);
-                boolean groupReadOnly = cursor.getInt(GroupQuery.GROUP_IS_READ_ONLY) != 0;
-                String accountType = cursor.getString(GroupQuery.ACCOUNT_TYPE);
-                String accountName = cursor.getString(GroupQuery.ACCOUNT_NAME);
-                boolean defaultGroup = false;
-                if (!cursor.isNull(GroupQuery.IS_DEFAULT_GROUP)) {
-                    defaultGroup = cursor.getInt(GroupQuery.IS_DEFAULT_GROUP) != 0;
-                }
-                if (defaultGroup) {
-                    // Find the filter for this account and set the default group ID
-                    for (ContactListFilter filter : results) {
-                        if (filter.accountName.equals(accountName)
-                                && filter.accountType.equals(accountType)) {
-                            filter.groupId = groupId;
-                            filter.groupSourceId = groupSourceId;
-                            break;
-                        }
-                    }
-                } else {
-                    String title = cursor.getString(GroupQuery.TITLE);
-                    results.add(ContactListFilter.createGroupFilter(accountType, accountName,
-                            groupId, groupSourceId, groupReadOnly, title));
-                }
-            }
-        } finally {
-            cursor.close();
-        }
-
-        Collections.sort(results);
-
-        mResults = results;
-        return results;
-    }
-
-    /* Runs on the UI thread */
-    @Override
-    public void deliverResult(List<ContactListFilter> results) {
-        if (!mStopped) {
-            super.deliverResult(results);
-        }
-    }
-
-    @Override
-    protected void onStartLoading() {
-        if (mObserver == null) {
-            mObserver = new ForceLoadContentObserver();
-            getContext().getContentResolver().registerContentObserver(
-                    Contacts.CONTENT_URI, true, mObserver);
-        }
-
-        mStopped = false;
-
-        if (mResults != null) {
-            deliverResult(mResults);
-        } else {
-            forceLoad();
-        }
-    }
-
-    @Override
-    protected void onStopLoading() {
-        if (mObserver != null) {
-            getContext().getContentResolver().unregisterContentObserver(mObserver);
-            mObserver = null;
-        }
-
-        mResults = null;
-
-        // Attempt to cancel the current load task if possible.
-        cancelLoad();
-
-        // Make sure that any outstanding loads clean themselves up properly
-        mStopped = true;
-    }
-
-    @Override
-    protected void onReset() {
-        stopLoading();
-    }
-}
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index f95c4af..88531e1 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -34,6 +34,7 @@
 
     private View mCounterHeaderView;
     private View mSearchHeaderView;
+    private TextView mAccountFilterHeaderView;
 
     public DefaultContactBrowseListFragment() {
         setPhotoLoaderEnabled(true);
@@ -63,6 +64,8 @@
     protected void onCreateView(LayoutInflater inflater, ViewGroup container) {
         super.onCreateView(inflater, container);
 
+        mAccountFilterHeaderView = (TextView) getView().findViewById(R.id.account_filter_header);
+
         // Putting the header view inside a container will allow us to make
         // it invisible later. See checkHeaderViewVisibility()
         FrameLayout headerContainer = new FrameLayout(inflater.getContext());
@@ -92,6 +95,19 @@
     }
 
     @Override
+    public void setFilter(ContactListFilter filter) {
+        super.setFilter(filter);
+        if (filter != null && filter.filterType != ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS &&
+                filter.filterType != ContactListFilter.FILTER_TYPE_CUSTOM) {
+            mAccountFilterHeaderView.setText(getContext().getString(
+                    R.string.listAllContactsInAccount, filter.accountName));
+            mAccountFilterHeaderView.setVisibility(View.VISIBLE);
+        } else {
+            mAccountFilterHeaderView.setVisibility(View.GONE);
+        }
+    }
+
+    @Override
     protected void showCount(int partitionIndex, Cursor data) {
         if (!isSearchMode() && data != null) {
             int count = data.getCount();
