diff --git a/res/layout/drawer_fragment.xml b/res/layout/drawer_fragment.xml
index ea9eed0..eeb792e 100644
--- a/res/layout/drawer_fragment.xml
+++ b/res/layout/drawer_fragment.xml
@@ -15,15 +15,18 @@
      limitations under the License.
 -->
 
+<!-- Layout for the navigation drawer. The content view needs to be wrapped in a FrameLayout in
+     order to go full screen with a ScrimDrawable. -->
 <FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/drawer_fragment_root"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fitsSystemWindows="true">
 
     <android.support.v7.widget.RecyclerView
         android:id="@+id/list"
-        android:background="#FAFAFA"
+        android:background="@color/navigation_drawer_background_color"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:divider="@null" />
diff --git a/res/layout/nav_drawer_spacer b/res/layout/nav_drawer_spacer.xml
similarity index 100%
rename from res/layout/nav_drawer_spacer
rename to res/layout/nav_drawer_spacer.xml
diff --git a/res/layout/nav_header_main.xml b/res/layout/nav_header_main.xml
index 518e6e6..7a2e3cb 100644
--- a/res/layout/nav_header_main.xml
+++ b/res/layout/nav_header_main.xml
@@ -16,16 +16,10 @@
   limitations under the License.
   -->
 
-<LinearLayout
+<View
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/nav_status_bar_spacer"
     android:layout_width="match_parent"
     android:layout_height="@dimen/nav_header_height"
     android:background="@color/contacts_accent_color"
-    android:gravity="bottom"
-    android:orientation="vertical"
-    android:paddingBottom="@dimen/activity_vertical_margin"
-    android:paddingLeft="@dimen/activity_horizontal_margin"
-    android:paddingRight="@dimen/activity_horizontal_margin"
-    android:paddingTop="@dimen/activity_vertical_margin"
-    android:theme="@style/ThemeOverlay.AppCompat.Dark">
-</LinearLayout>
+    android:importantForAccessibility="no"/>
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 4a222ad..48ebeee 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -1124,7 +1124,7 @@
     }
 
     private void selectAccountForNewGroup() {
-        // This should never block because the GroupsFragment loads the accounts and the
+        // This should never block because the DrawerFragment loads the accounts and the
         // "Create Label" item only exists when that loading finishes
         final List<AccountInfo> accounts = Futures.getUnchecked(AccountTypeManager.getInstance(this)
                 .filterAccountsAsync(AccountTypeManager.AccountFilter.GROUPS_WRITABLE));
diff --git a/src/com/android/contacts/drawer/DrawerAdapter.java b/src/com/android/contacts/drawer/DrawerAdapter.java
index 959d478..c6d3c4d 100644
--- a/src/com/android/contacts/drawer/DrawerAdapter.java
+++ b/src/com/android/contacts/drawer/DrawerAdapter.java
@@ -47,7 +47,8 @@
     private static final int VIEW_TYPE_ACCOUNT_ENTRY = 4;
     private static final int VIEW_TYPE_CREATE_LABEL = 5;
     private static final int VIEW_TYPE_NAV_SPACER = 6;
-    private static final int VIEW_TYPE_NAV_DIVIDER = 7;
+    private static final int VIEW_TYPE_STATUS_SPACER = 7;
+    private static final int VIEW_TYPE_NAV_DIVIDER = 8;
 
     private static final int TYPEFACE_STYLE_ACTIVATE = R.style.DrawerItemTextActiveStyle;
     private static final int TYPEFACE_STYLE_INACTIVE = R.style.DrawerItemTextInactiveStyle;
@@ -61,7 +62,8 @@
     private long mSelectedGroupId;
     private ContactListFilter mSelectedAccount;
 
-    // Adapter elements, ordered in this way in the getItem() method. The ordering is based on:
+    // Adapter elements, ordered in this way mItemsList. The ordering is based on:
+    //  [Status bar spacer item]
     //  [Navigation spacer item]
     //  [Primary items] (Contacts, Suggestions)
     //  [Group Header]
@@ -71,6 +73,7 @@
     //  [Accounts]
     //  [Misc items] (a divider, Settings, Help & Feedback)
     //  [Navigation spacer item]
+    private StatusBarSpacerItem mStatusBarSpacerItem = null;
     private NavSpacerItem mNavSpacerItem = null;
     private List<PrimaryItem> mPrimaryItems = new ArrayList<>();
     private HeaderItem mGroupHeader = null;
@@ -94,6 +97,7 @@
     private void initializeDrawerMenuItems() {
         // Spacer item for dividing sections in drawer
         mNavSpacerItem = new NavSpacerItem(R.id.nav_drawer_spacer);
+        mStatusBarSpacerItem = new StatusBarSpacerItem(R.id.nav_status_bar_spacer);
         // Primary items
         mPrimaryItems.add(new PrimaryItem(R.id.nav_all_contacts, R.string.contactsList,
                 R.drawable.quantum_ic_account_circle_vd_theme_24, ContactsView.ALL_CONTACTS));
@@ -117,6 +121,7 @@
 
     private void rebuildItemsList() {
         mItemsList.clear();
+        mItemsList.add(mStatusBarSpacerItem);
         mItemsList.add(mNavSpacerItem);
         mItemsList.addAll(mPrimaryItems);
         if (mAreGroupWritableAccountsAvailable) {
@@ -184,6 +189,8 @@
     @Override
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         switch (viewType) {
+            case VIEW_TYPE_STATUS_SPACER:
+                return getBaseViewHolder(R.layout.nav_header_main, parent);
             case VIEW_TYPE_NAV_SPACER:
                 return getBaseViewHolder(R.layout.nav_drawer_spacer, parent);
             case VIEW_TYPE_PRIMARY_ITEM:
@@ -394,6 +401,15 @@
         }
     }
 
+
+    // Navigation drawer item for status bar spacer item to take up the height of status bar in the
+    // drawer.
+    public static class StatusBarSpacerItem extends BaseDrawerItem {
+        public StatusBarSpacerItem(int id) {
+            super(VIEW_TYPE_STATUS_SPACER, id, /* textResId */ 0, /* iconResId */ 0);
+        }
+    }
+
     // Navigation drawer item for spacer item for dividing sections in the drawer.
     public static class NavSpacerItem extends BaseDrawerItem {
         public NavSpacerItem(int id) {
diff --git a/src/com/android/contacts/drawer/DrawerFragment.java b/src/com/android/contacts/drawer/DrawerFragment.java
index b57f151..2c8bfba 100644
--- a/src/com/android/contacts/drawer/DrawerFragment.java
+++ b/src/com/android/contacts/drawer/DrawerFragment.java
@@ -18,48 +18,62 @@
 
 import android.app.Activity;
 import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
+import android.app.LoaderManager;
+import android.content.CursorLoader;
+import android.content.Loader;
 import android.database.ContentObserver;
+import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
+import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.WindowInsets;
+import android.widget.FrameLayout;
 
+import com.android.contacts.GroupListLoader;
 import com.android.contacts.R;
 import com.android.contacts.activities.PeopleActivity.ContactsView;
 import com.android.contacts.group.GroupListItem;
 import com.android.contacts.group.GroupUtil;
-import com.android.contacts.group.GroupsFragment;
-import com.android.contacts.group.GroupsFragment.GroupsListener;
-import com.android.contacts.interactions.AccountFiltersFragment;
-import com.android.contacts.interactions.AccountFiltersFragment.AccountFiltersListener;
 import com.android.contacts.list.ContactListFilter;
+import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.account.AccountInfo;
+import com.android.contacts.model.account.AccountsLoader;
+import com.android.contacts.model.account.AccountsLoader.AccountsListener;
+import com.android.contacts.util.AccountFilterUtil;
 import com.android.contactsbind.ObjectFactory;
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class DrawerFragment extends Fragment implements AccountFiltersListener, GroupsListener {
+public class DrawerFragment extends Fragment implements AccountsListener{
+
+    private static final int LOADER_GROUPS = 1;
+    private static final int LOADER_ACCOUNTS = 2;
+    private static final int LOADER_FILTERS = 3;
+
+    private static final String KEY_CONTACTS_VIEW = "contactsView";
+    private static final String KEY_SELECTED_GROUP = "selectedGroup";
+    private static final String KEY_SELECTED_ACCOUNT = "selectedAccount";
 
     private WelcomeContentObserver mObserver;
     private RecyclerView mDrawerRecyclerView;
     private DrawerAdapter mDrawerAdapter;
     private ContactsView mCurrentContactsView;
     private DrawerFragmentListener mListener;
-    private GroupsFragment mGroupsFragment;
-    private AccountFiltersFragment mAccountFiltersFragment;
+    // Transparent scrim drawn at the top of the drawer fragment.
+    private ScrimDrawable mScrimDrawable;
 
-    private static final String TAG_GROUPS = "groups";
-    private static final String TAG_FILTERS = "filters";
-    private static final String KEY_CONTACTS_VIEW = "contactsView";
-    private static final String KEY_SELECTED_GROUP = "selectedGroup";
-    private static final String KEY_SELECTED_ACCOUNT = "selectedAccount";
+    private List<GroupListItem> mGroupListItems = new ArrayList<>();
+    private boolean mGroupsLoaded;
+    private boolean mAccountsLoaded;
+    private boolean mHasGroupWritableAccounts;
 
     private final class WelcomeContentObserver extends ContentObserver {
         private WelcomeContentObserver(Handler handler) {
@@ -72,6 +86,55 @@
         }
     }
 
+    private final LoaderManager.LoaderCallbacks<List<ContactListFilter>> mFiltersLoaderListener =
+            new LoaderManager.LoaderCallbacks<List<ContactListFilter>> () {
+                @Override
+                public Loader<List<ContactListFilter>> onCreateLoader(int id, Bundle args) {
+                    return new AccountFilterUtil.FilterLoader(getActivity());
+                }
+
+                @Override
+                public void onLoadFinished(
+                        Loader<List<ContactListFilter>> loader, List<ContactListFilter> data) {
+                    if (data != null) {
+                        if (data == null || data.size() < 2) {
+                            mDrawerAdapter.setAccounts(new ArrayList<ContactListFilter>());
+                        } else {
+                            mDrawerAdapter.setAccounts(data);
+                        }
+                    }
+                }
+
+                public void onLoaderReset(Loader<List<ContactListFilter>> loader) {
+                }
+            };
+
+    private final LoaderManager.LoaderCallbacks<Cursor> mGroupListLoaderListener =
+            new LoaderManager.LoaderCallbacks<Cursor>() {
+                @Override
+                public CursorLoader onCreateLoader(int id, Bundle args) {
+                    return new GroupListLoader(getActivity());
+                }
+
+                @Override
+                public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+                    if (data == null) {
+                        return;
+                    }
+                    mGroupListItems.clear();
+                    for (int i = 0; i < data.getCount(); i++) {
+                        if (data.moveToNext()) {
+                            mGroupListItems.add(GroupUtil.getGroupListItem(data, i));
+                        }
+                    }
+                    mGroupsLoaded = true;
+                    notifyIfReady();
+                }
+
+                public void onLoaderReset(Loader<Cursor> loader) {
+                }
+            };
+
     public DrawerFragment() {}
 
     @Override
@@ -109,6 +172,14 @@
             setNavigationItemChecked(ContactsView.ALL_CONTACTS);
         }
 
+        final FrameLayout root = (FrameLayout) contentView.findViewById(R.id.drawer_fragment_root);
+        root.setFitsSystemWindows(true);
+        root.setOnApplyWindowInsetsListener(new WindowInsetsListener());
+        root.setForegroundGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL);
+
+        mScrimDrawable = new ScrimDrawable();
+        root.setForeground(mScrimDrawable);
+
         return contentView;
     }
 
@@ -139,27 +210,11 @@
         }
     }
 
-    // TODO create loaders in this fragment instead of having separate fragments that just kick off
-    // some data loading.
     private void loadGroupsAndFilters() {
-        final FragmentManager fragmentManager = getFragmentManager();
-        final FragmentTransaction transaction = fragmentManager.beginTransaction();
-        mGroupsFragment = (GroupsFragment) fragmentManager.findFragmentByTag(TAG_GROUPS);
-        if (mGroupsFragment == null) {
-            mGroupsFragment = new GroupsFragment();
-            transaction.add(mGroupsFragment, TAG_GROUPS);
-        }
-        mGroupsFragment.setListener(this);
-
-        mAccountFiltersFragment = (AccountFiltersFragment)
-                fragmentManager.findFragmentByTag(TAG_FILTERS);
-        if (mAccountFiltersFragment == null) {
-            mAccountFiltersFragment = new AccountFiltersFragment();
-            transaction.add(mAccountFiltersFragment, TAG_FILTERS);
-        }
-        mAccountFiltersFragment.setListener(this);
-        transaction.commitAllowingStateLoss();
-        fragmentManager.executePendingTransactions();
+        getLoaderManager().initLoader(LOADER_FILTERS, null, mFiltersLoaderListener);
+        AccountsLoader.loadAccounts(this, LOADER_ACCOUNTS,
+                AccountTypeManager.AccountFilter.GROUPS_WRITABLE);
+        getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupListLoaderListener);
     }
 
     @Override
@@ -211,29 +266,28 @@
         }
     }
 
-    @Override
-    public void onGroupsLoaded(List<GroupListItem> groupListItems, boolean areGroupWritable) {
-        final Iterator<GroupListItem> iterator = groupListItems.iterator();
-        while (iterator.hasNext()) {
-            final GroupListItem groupListItem = iterator.next();
-            if (GroupUtil.isEmptyFFCGroup(groupListItem)) {
-                iterator.remove();
-            }
-        }
-        mDrawerAdapter.setGroups(groupListItems, areGroupWritable);
-    }
-
     public void updateGroupMenu(long groupId) {
         mDrawerAdapter.setSelectedGroupId(groupId);
         setNavigationItemChecked(ContactsView.GROUP_VIEW);
     }
 
     @Override
-    public void onFiltersLoaded(List<ContactListFilter> accountFilterItems) {
-        if (accountFilterItems == null || accountFilterItems.size() < 2) {
-            mDrawerAdapter.setAccounts(new ArrayList<ContactListFilter>());
-        } else {
-            mDrawerAdapter.setAccounts(accountFilterItems);
+    public void onAccountsLoaded(List<AccountInfo> accounts) {
+        mHasGroupWritableAccounts = !accounts.isEmpty();
+        mAccountsLoaded = true;
+        notifyIfReady();
+    }
+
+    private void notifyIfReady() {
+        if (mAccountsLoaded && mGroupsLoaded) {
+            final Iterator<GroupListItem> iterator = mGroupListItems.iterator();
+            while (iterator.hasNext()) {
+                final GroupListItem groupListItem = iterator.next();
+                if (GroupUtil.isEmptyFFCGroup(groupListItem)) {
+                    iterator.remove();
+                }
+            }
+            mDrawerAdapter.setGroups(mGroupListItems, mHasGroupWritableAccounts);
         }
     }
 
@@ -246,4 +300,14 @@
         void onOpenSettings();
         void onLaunchHelpFeedback();
     }
+
+    private class WindowInsetsListener implements View.OnApplyWindowInsetsListener {
+        @Override
+        public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
+            final int insetTop = insets.getSystemWindowInsetTop();
+            // set height of the scrim
+            mScrimDrawable.setIntrinsicHeight(insetTop);
+            return insets;
+        }
+    }
 }
diff --git a/src/com/android/contacts/drawer/ScrimDrawable.java b/src/com/android/contacts/drawer/ScrimDrawable.java
new file mode 100644
index 0000000..5663b1b
--- /dev/null
+++ b/src/com/android/contacts/drawer/ScrimDrawable.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 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.drawer;
+
+import android.graphics.drawable.ColorDrawable;
+
+/**
+ * Create a simple scrim that covers just the status bar area when necessary.
+ * Copied from com.google.android.gms.people.accountswitcherview.ScrimDrawable;
+ */
+public class ScrimDrawable extends ColorDrawable {
+    public static final int DEFAULT_COLOR = 0x33000000;
+
+    /**
+     * Default constructor. Uses default color.
+     */
+    public ScrimDrawable() {
+        this(DEFAULT_COLOR);
+    }
+
+    /**
+     * Set a color if necessary.
+     *
+     * @param color
+     */
+    public ScrimDrawable(int color) {
+        super(color);
+    }
+
+    private int mIntrinsicHeight;
+
+    @Override
+    public int getIntrinsicHeight() {
+        return mIntrinsicHeight;
+    }
+
+    public void setIntrinsicHeight(int intrinsicHeight) {
+        mIntrinsicHeight = intrinsicHeight;
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/contacts/group/GroupUtil.java b/src/com/android/contacts/group/GroupUtil.java
index a4a02a6..706f16b 100644
--- a/src/com/android/contacts/group/GroupUtil.java
+++ b/src/com/android/contacts/group/GroupUtil.java
@@ -70,7 +70,7 @@
     }
 
     /** Returns a {@link GroupListItem} read from the given cursor and position. */
-    static GroupListItem getGroupListItem(Cursor cursor, int position) {
+    public static GroupListItem getGroupListItem(Cursor cursor, int position) {
         if (cursor == null || cursor.isClosed() || !cursor.moveToPosition(position)) {
             return null;
         }
diff --git a/src/com/android/contacts/group/GroupsFragment.java b/src/com/android/contacts/group/GroupsFragment.java
deleted file mode 100644
index e2a1de4..0000000
--- a/src/com/android/contacts/group/GroupsFragment.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * 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.group;
-
-import android.app.Fragment;
-import android.app.LoaderManager;
-import android.content.CursorLoader;
-import android.content.Loader;
-import android.database.Cursor;
-import android.os.Bundle;
-
-import com.android.contacts.GroupListLoader;
-import com.android.contacts.model.AccountTypeManager;
-import com.android.contacts.model.account.AccountInfo;
-import com.android.contacts.model.account.AccountsLoader;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Loads groups and group metadata for all accounts.
- */
-public final class GroupsFragment extends Fragment implements AccountsLoader.AccountsListener {
-
-    private static final int LOADER_GROUPS = 1;
-    private static final int LOADER_ACCOUNTS = 2;
-
-    /**
-     * Callbacks for hosts of the {@link GroupsFragment}.
-     */
-    public interface GroupsListener  {
-
-        /**
-         * Invoked after groups and group metadata have been loaded.
-         */
-        void onGroupsLoaded(List<GroupListItem> groupListItems,
-                boolean areGroupWritableAccountsAvailable);
-    }
-
-    private final LoaderManager.LoaderCallbacks<Cursor> mGroupListLoaderListener =
-            new LoaderManager.LoaderCallbacks<Cursor>() {
-
-                @Override
-                public CursorLoader onCreateLoader(int id, Bundle args) {
-                    return new GroupListLoader(getActivity());
-                }
-
-                @Override
-                public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-                    if (data == null) {
-                        return;
-                    }
-                    mGroupListItems.clear();
-                    for (int i = 0; i < data.getCount(); i++) {
-                        if (data.moveToNext()) {
-                            mGroupListItems.add(GroupUtil.getGroupListItem(data, i));
-                        }
-                    }
-                    mGroupsLoaded = true;
-                    notifyIfReady();
-                }
-
-                public void onLoaderReset(Loader<Cursor> loader) {
-                }
-            };
-
-    private List<GroupListItem> mGroupListItems = new ArrayList<>();
-    private boolean mHasGroupWritableAccounts = false;
-    private boolean mGroupsLoaded = false;
-    private boolean mAccountsLoaded = false;
-    private GroupsListener mListener;
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        AccountsLoader.loadAccounts(this, LOADER_ACCOUNTS,
-                AccountTypeManager.AccountFilter.GROUPS_WRITABLE);
-        getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupListLoaderListener);
-    }
-
-    public void setListener(GroupsListener listener) {
-        mListener = listener;
-    }
-
-    @Override
-    public void onAccountsLoaded(List<AccountInfo> accounts) {
-        mHasGroupWritableAccounts = !accounts.isEmpty();
-        mAccountsLoaded = true;
-        notifyIfReady();
-    }
-
-    private void notifyIfReady() {
-        if (mAccountsLoaded && mGroupsLoaded && mListener != null) {
-            mListener.onGroupsLoaded(mGroupListItems, mHasGroupWritableAccounts);
-        }
-    }
-}
diff --git a/src/com/android/contacts/interactions/AccountFiltersFragment.java b/src/com/android/contacts/interactions/AccountFiltersFragment.java
deleted file mode 100644
index e1d882e..0000000
--- a/src/com/android/contacts/interactions/AccountFiltersFragment.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.interactions;
-
-import android.app.Fragment;
-import android.app.LoaderManager;
-import android.content.Loader;
-import android.os.Bundle;
-
-import com.android.contacts.list.ContactListFilter;
-import com.android.contacts.util.AccountFilterUtil;
-
-import java.util.List;
-
-/**
- * Loads account filters.
- */
-public class AccountFiltersFragment extends Fragment {
-
-    private static final int LOADER_FILTERS = 1;
-
-    /**
-     * Callbacks for hosts of the {@link AccountFiltersFragment}.
-     */
-    public interface AccountFiltersListener  {
-
-        /**
-         * Invoked after account filters have been loaded.
-         */
-        void onFiltersLoaded(List<ContactListFilter> accountFilterItems);
-    }
-
-    private final LoaderManager.LoaderCallbacks<List<ContactListFilter>> mFiltersLoaderListener =
-            new LoaderManager.LoaderCallbacks<List<ContactListFilter>> () {
-                @Override
-                public Loader<List<ContactListFilter>> onCreateLoader(int id, Bundle args) {
-                    return new AccountFilterUtil.FilterLoader(getActivity());
-                }
-
-                @Override
-                public void onLoadFinished(
-                        Loader<List<ContactListFilter>> loader, List<ContactListFilter> data) {
-                    if (mListener != null && data != null) {
-                        mListener.onFiltersLoaded(data);
-                    }
-                }
-
-                public void onLoaderReset(Loader<List<ContactListFilter>> loader) {
-                }
-            };
-
-    private AccountFiltersListener mListener;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-    }
-
-    @Override
-    public void onStart() {
-        getLoaderManager().initLoader(LOADER_FILTERS, null, mFiltersLoaderListener);
-
-        super.onStart();
-    }
-
-    public void setListener(AccountFiltersListener listener) {
-        mListener = listener;
-    }
-}
