diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 049deb0..3488bed 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -123,8 +123,6 @@
 
     private boolean mSearchMode;
 
-    private ContactBrowseListFragment mListFragment;
-
     /**
      * Whether we have a right-side contact or group detail pane for displaying info on that
      * contact or group while browsing. Generally means "this is a tablet".
@@ -157,6 +155,9 @@
 
     private boolean mOptionsMenuContactsAvailable;
 
+    /**
+     * Showing a list of Contacts. Also used for showing search results in search mode.
+     */
     private DefaultContactBrowseListFragment mAllFragment;
     private StrequentContactListFragment mFavoritesFragment;
     private StrequentContactListFragment mFrequentFragment;
@@ -170,7 +171,30 @@
 
     private ContactDetailLayoutController mContactDetailLayoutController;
 
-    private Handler mHandler = new Handler();
+    private final Handler mHandler = new Handler();
+
+    /**
+     * TODO: Use ViewPager so that tabs can be swiped left and right. Figure out how to use the
+     * support library in our app.
+     */
+    private final TabListener mTabListener = new TabListener() {
+        @Override
+        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+            hideFragmentOnTabUnselect((TabState) tab.getTag(), ft);
+        }
+
+        @Override
+        public void onTabSelected(Tab tab, FragmentTransaction ft) {
+            final TabState tabState = (TabState) tab.getTag();
+            setSelectedTab(tabState);
+            showFragmentOnTabSelect(tabState, ft);
+            invalidateOptionsMenu();
+        }
+
+        @Override
+        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+        }
+    };
 
     private enum TabState {
         FAVORITES, ALL, GROUPS
@@ -191,12 +215,12 @@
 
     @Override
     public void onAttachFragment(Fragment fragment) {
-        if (fragment instanceof ContactBrowseListFragment) {
-            mListFragment = (ContactBrowseListFragment)fragment;
-            mListFragment.setOnContactListActionListener(new ContactBrowserActionListener());
+        if (fragment instanceof DefaultContactBrowseListFragment) {
+            mAllFragment = (DefaultContactBrowseListFragment)fragment;
+            mAllFragment.setOnContactListActionListener(new ContactBrowserActionListener());
             if (!getWindow().hasFeature(Window.FEATURE_ACTION_BAR)) {
-                mListFragment.setContextMenuAdapter(
-                        new ContactBrowseListContextMenuAdapter(mListFragment));
+                mAllFragment.setContextMenuAdapter(
+                        new ContactBrowseListContextMenuAdapter(mAllFragment));
             }
         } else if (fragment instanceof GroupBrowseListFragment) {
             mGroupsFragment = (GroupBrowseListFragment) fragment;
@@ -315,21 +339,21 @@
         if (createContentView) {
             actionBar.removeAllTabs();
             Tab favoritesTab = actionBar.newTab();
+            favoritesTab.setTag(TabState.FAVORITES);
             favoritesTab.setText(getString(R.string.contactsFavoritesLabel));
-            favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment,
-                    mFrequentFragment, TabState.FAVORITES));
+            favoritesTab.setTabListener(mTabListener);
             actionBar.addTab(favoritesTab);
 
             Tab allTab = actionBar.newTab();
+            allTab.setTag(TabState.ALL);
             allTab.setText(getString(R.string.contactsAllLabel));
-            allTab.setTabListener(new TabChangeListener(mAllFragment,
-                    mContactDetailLoaderFragment, TabState.ALL));
+            allTab.setTabListener(mTabListener);
             actionBar.addTab(allTab);
 
             Tab groupsTab = actionBar.newTab();
+            groupsTab.setTag(TabState.GROUPS);
             groupsTab.setText(getString(R.string.contactsGroupsLabel));
-            groupsTab.setTabListener(new TabChangeListener(mGroupsFragment,
-                    mGroupDetailFragment, TabState.GROUPS));
+            groupsTab.setTabListener(mTabListener);
             actionBar.addTab(groupsTab);
             actionBar.setDisplayShowTitleEnabled(true);
 
@@ -343,47 +367,61 @@
         configureFragments(savedState == null);
     }
 
-    /**
-     * Tab change listener that is instantiated once for each tab. Handles showing/hiding fragments.
-     * TODO: Use ViewPager so that tabs can be swiped left and right. Figure out how to use the
-     * support library in our app.
-     */
-    private class TabChangeListener implements TabListener {
-        private final Fragment mBrowseListFragment;
-
-        /**
-         * Right pane fragment that is present on larger screen sizes (can be
-         * null for smaller screen sizes).
-         */
-        private final Fragment mDetailFragment;
-        private final TabState mTabState;
-
-        public TabChangeListener(Fragment listFragment, Fragment detailFragment, TabState state) {
-            mBrowseListFragment = listFragment;
-            mDetailFragment = detailFragment;
-            mTabState = state;
-        }
-
-        @Override
-        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
-            ft.hide(mBrowseListFragment);
-            if (mDetailFragment != null) {
-                ft.hide(mDetailFragment);
+    private void hideFragmentOnTabUnselect(TabState newTabState, FragmentTransaction ft) {
+        switch (newTabState) {
+            case FAVORITES: {
+                ft.hide(mFavoritesFragment);
+                if (mFrequentFragment != null) {
+                    ft.hide(mFrequentFragment);
+                }
+                break;
+            }
+            case ALL: {
+                ft.hide(mAllFragment);
+                if (mContactDetailFragment != null) {
+                    ft.hide(mContactDetailFragment);
+                }
+                break;
+            }
+            case GROUPS: {
+                ft.hide(mGroupsFragment);
+                if (mGroupDetailFragment != null) {
+                    ft.hide(mGroupDetailFragment);
+                }
+                break;
+            }
+            default: {
+                throw new IllegalStateException("Unexpected tab state: " + newTabState);
             }
         }
+    }
 
-        @Override
-        public void onTabSelected(Tab tab, FragmentTransaction ft) {
-            ft.show(mBrowseListFragment);
-            if (mDetailFragment != null) {
-                ft.show(mDetailFragment);
+    private void showFragmentOnTabSelect(TabState newTabState, FragmentTransaction ft) {
+        switch (newTabState) {
+            case FAVORITES: {
+                ft.show(mFavoritesFragment);
+                if (mFrequentFragment != null) {
+                    ft.show(mFrequentFragment);
+                }
+                break;
             }
-            setSelectedTab(mTabState);
-            invalidateOptionsMenu();
-        }
-
-        @Override
-        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+            case ALL: {
+                ft.show(mAllFragment);
+                if (mContactDetailFragment != null) {
+                    ft.show(mContactDetailFragment);
+                }
+                break;
+            }
+            case GROUPS: {
+                ft.show(mGroupsFragment);
+                if (mGroupDetailFragment != null) {
+                    ft.show(mGroupDetailFragment);
+                }
+                break;
+            }
+            default: {
+                throw new IllegalStateException("Unexpected tab state: " + newTabState);
+            }
         }
     }
 
@@ -474,7 +512,7 @@
                 mSearchMode = false;
             }
 
-            mListFragment.setContactsRequest(mRequest);
+            mAllFragment.setContactsRequest(mRequest);
             configureContactListFragmentForRequest();
 
         } else {
@@ -489,11 +527,11 @@
 
     @Override
     public void onContactListFilterChanged() {
-        if (mListFragment == null || !mListFragment.isAdded()) {
+        if (mAllFragment == null || !mAllFragment.isAdded()) {
             return;
         }
 
-        mListFragment.setFilter(mContactListFilterController.getFilter());
+        mAllFragment.setFilter(mContactListFilterController.getFilter());
 
         invalidateOptionsMenuIfNeeded();
     }
@@ -557,39 +595,39 @@
 
     private void loadSearch(String query) {
         configureFragments(false /* from request */);
-        mListFragment.setQueryString(query, true);
+        mAllFragment.setQueryString(query, true);
     }
 
     private void configureContactListFragmentForRequest() {
         Uri contactUri = mRequest.getContactUri();
         if (contactUri != null) {
-            mListFragment.setSelectedContactUri(contactUri);
+            mAllFragment.setSelectedContactUri(contactUri);
         }
 
-        mListFragment.setSearchMode(mRequest.isSearchMode());
-        mListFragment.setQueryString(mRequest.getQueryString(), false);
+        mAllFragment.setSearchMode(mRequest.isSearchMode());
+        mAllFragment.setQueryString(mRequest.getQueryString(), false);
 
         if (mRequest.isDirectorySearchEnabled()) {
-            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
+            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
         } else {
-            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
+            mAllFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
         }
 
         if (mContactListFilterController.isInitialized()) {
-            mListFragment.setFilter(mContactListFilterController.getFilter());
+            mAllFragment.setFilter(mContactListFilterController.getFilter());
         }
     }
 
     private void configureContactListFragment() {
-        mListFragment.setSearchMode(mSearchMode);
+        mAllFragment.setSearchMode(mSearchMode);
 
-        mListFragment.setVisibleScrollbarEnabled(!mSearchMode);
-        mListFragment.setVerticalScrollbarPosition(
+        mAllFragment.setVisibleScrollbarEnabled(!mSearchMode);
+        mAllFragment.setVerticalScrollbarPosition(
                 mContentPaneDisplayed
                         ? View.SCROLLBAR_POSITION_LEFT
                         : View.SCROLLBAR_POSITION_RIGHT);
-        mListFragment.setSelectionVisible(mContentPaneDisplayed);
-        mListFragment.setQuickContactEnabled(!mContentPaneDisplayed);
+        mAllFragment.setSelectionVisible(mContentPaneDisplayed);
+        mAllFragment.setQuickContactEnabled(!mContentPaneDisplayed);
     }
 
     private void configureGroupListFragment() {
@@ -621,12 +659,12 @@
             if (mainView != null) {
                 mainView.setVisibility(View.VISIBLE);
             }
-            if (mListFragment != null) {
-                mListFragment.setEnabled(true);
+            if (mAllFragment != null) {
+                mAllFragment.setEnabled(true);
             }
         } else {
-            if (mListFragment != null) {
-                mListFragment.setEnabled(false);
+            if (mAllFragment != null) {
+                mAllFragment.setEnabled(false);
             }
             if (mContactsUnavailableFragment == null) {
                 mContactsUnavailableFragment = new ContactsUnavailableFragment();
@@ -653,7 +691,7 @@
         @Override
         public void onSelectionChange() {
             if (mContentPaneDisplayed) {
-                setupContactDetailFragment(mListFragment.getSelectedContactUri());
+                setupContactDetailFragment(mAllFragment.getSelectedContactUri());
             }
         }
 
@@ -723,16 +761,16 @@
         @Override
         public void onInvalidSelection() {
             ContactListFilter filter;
-            ContactListFilter currentFilter = mListFragment.getFilter();
+            ContactListFilter currentFilter = mAllFragment.getFilter();
             if (currentFilter != null
                     && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
                 filter = ContactListFilter.createFilterWithType(
                         ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
-                mListFragment.setFilter(filter);
+                mAllFragment.setFilter(filter);
             } else {
                 filter = ContactListFilter.createFilterWithType(
                         ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
-                mListFragment.setFilter(filter, false);
+                mAllFragment.setFilter(filter, false);
             }
             mContactListFilterController.setContactListFilter(filter, true);
         }
@@ -948,7 +986,7 @@
             return true;
         }
 
-        if (mListFragment != null && mListFragment.isOptionsMenuChanged()) {
+        if (mAllFragment != null && mAllFragment.isOptionsMenuChanged()) {
             return true;
         }
 
@@ -1087,8 +1125,8 @@
     @Override
     public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
             boolean globalSearch) {
-        if (mListFragment != null && mListFragment.isAdded() && !globalSearch) {
-            mListFragment.startSearch(initialQuery);
+        if (mAllFragment != null && mAllFragment.isAdded() && !globalSearch) {
+            mAllFragment.startSearch(initialQuery);
         } else {
             super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
         }
@@ -1125,7 +1163,7 @@
             case SUBACTIVITY_NEW_CONTACT: {
                 if (resultCode == RESULT_OK && mContentPaneDisplayed) {
                     mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
-                    mListFragment.reloadDataAndSetSelectedUri(data.getData());
+                    mAllFragment.reloadDataAndSetSelectedUri(data.getData());
                 }
                 break;
             }
@@ -1143,7 +1181,7 @@
             // anymore
             case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_PICKER:
                 if (resultCode == RESULT_OK) {
-                    mListFragment.onPickerResult(data);
+                    mAllFragment.onPickerResult(data);
                 }
 
 // TODO fix or remove multipicker code
@@ -1158,7 +1196,7 @@
 
     @Override
     public boolean onContextItemSelected(MenuItem item) {
-        ContextMenuAdapter menuAdapter = mListFragment.getContextMenuAdapter();
+        ContextMenuAdapter menuAdapter = mAllFragment.getContextMenuAdapter();
         if (menuAdapter != null) {
             return menuAdapter.onContextItemSelected(item);
         }
@@ -1261,7 +1299,7 @@
 
     // Visible for testing
     public ContactBrowseListFragment getListFragment() {
-        return mListFragment;
+        return mAllFragment;
     }
 
     // Visible for testing
