diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 617d5c7..fc476d1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -176,6 +176,8 @@
             android:label="@string/contactsList"
             android:icon="@mipmap/ic_launcher_contacts"
             android:theme="@style/ContactBrowserTheme"
+            android:clearTaskOnLaunch="true"
+            android:launchMode="singleTop"
         >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -198,8 +200,9 @@
         <!-- The actual list of contacts -->
         <activity android:name=".activities.ContactBrowserActivity"
             android:label="@string/contactsList"
-            android:clearTaskOnLaunch="true"
             android:theme="@style/ContactBrowserTheme"
+            android:launchMode="singleTop"
+            android:clearTaskOnLaunch="true"
         >
             <intent-filter>
                 <action android:name="com.android.contacts.action.LIST_DEFAULT" />
@@ -261,8 +264,9 @@
         
         <activity android:name=".activities.ContactSelectionActivity"
             android:label="@string/contactsList"
-            android:clearTaskOnLaunch="true"
             android:theme="@style/ContactPickerTheme"
+            android:launchMode="singleTop"
+            android:clearTaskOnLaunch="true"
         >
             <intent-filter>
                 <action android:name="android.intent.action.INSERT_OR_EDIT" />
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 8bdf405..2faa345 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -219,6 +219,11 @@
         outState.putString(EXTRA_KEY_QUERY, mQueryString);
     }
 
+    public void onRestoreInstanceState(Bundle savedState) {
+        mSearchMode = savedState.getBoolean(EXTRA_KEY_SEARCH_MODE);
+        mQueryString = savedState.getString(EXTRA_KEY_QUERY);
+    }
+
     @Override
     public void onContactListFiltersLoaded() {
         update();
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 240fb3a..4ff9e63 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -40,7 +40,6 @@
 import com.android.contacts.list.OnContactsUnavailableActionListener;
 import com.android.contacts.list.ProviderStatusLoader;
 import com.android.contacts.list.ProviderStatusLoader.ProviderStatusListener;
-import com.android.contacts.list.StrequentContactListFragment;
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.preference.ContactsPreferenceActivity;
 import com.android.contacts.util.AccountSelectionUtil;
@@ -94,8 +93,6 @@
     private static final int SUBACTIVITY_EDIT_CONTACT = 4;
     private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 5;
 
-    private static final int DEFAULT_DIRECTORY_RESULT_LIMIT = 20;
-
     private static final String KEY_SEARCH_MODE = "searchMode";
 
     private DialogManager mDialogManager = new DialogManager(this);
@@ -147,8 +144,9 @@
         if (fragment instanceof ContactBrowseListFragment) {
             mListFragment = (ContactBrowseListFragment)fragment;
             mListFragment.setOnContactListActionListener(new ContactBrowserActionListener());
-            if (mContactListFilterController.isLoaded()) {
-                mListFragment.setFilter(mContactListFilterController.getFilter());
+            if (!mHasActionBar) {
+                mListFragment.setContextMenuAdapter(
+                        new ContactBrowseListContextMenuAdapter(mListFragment));
             }
         } else if (fragment instanceof ContactDetailFragment) {
             mDetailFragment = (ContactDetailFragment)fragment;
@@ -165,10 +163,26 @@
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
 
-        if (savedState != null) {
-            mSearchMode = savedState.getBoolean(KEY_SEARCH_MODE);
-        }
+        mAddContactImageView = getLayoutInflater().inflate(
+                R.layout.add_contact_menu_item, null, false);
+        View item = mAddContactImageView.findViewById(R.id.menu_item);
+        item.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                createNewContact();
+            }
+        });
 
+        configureContentView(true, savedState);
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        setIntent(intent);
+        configureContentView(false, null);
+    }
+
+    private void configureContentView(boolean createContentView, Bundle savedState) {
         // Extract relevant information from the intent
         mRequest = mIntentResolver.resolveIntent(getIntent());
         if (!mRequest.isValid()) {
@@ -185,8 +199,10 @@
             return;
         }
 
-        setContentView(R.layout.contact_browser);
-        mContactContentDisplayed = findViewById(R.id.detail_container) != null;
+        if (createContentView) {
+            setContentView(R.layout.contact_browser);
+            mContactContentDisplayed = findViewById(R.id.detail_container) != null;
+        }
 
         if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT
                 && !mContactContentDisplayed) {
@@ -199,6 +215,7 @@
         }
 
         setTitle(mRequest.getActivityTitle());
+
         mHasActionBar = getWindow().hasFeature(Window.FEATURE_ACTION_BAR);
         if (mHasActionBar) {
             ActionBar actionBar = getActionBar();
@@ -206,41 +223,9 @@
             mActionBarAdapter = new ActionBarAdapter(this);
             mActionBarAdapter.onCreate(savedState, mRequest, actionBar);
             mActionBarAdapter.setContactListFilterController(mContactListFilterController);
-            // TODO: request may ask for FREQUENT - set the filter accordingly
-
-            mAddContactImageView = getLayoutInflater().inflate(
-                    R.layout.add_contact_menu_item, null, false);
-            View item = mAddContactImageView.findViewById(R.id.menu_item);
-            item.setOnClickListener(new OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    createNewContact();
-                }
-            });
         }
 
-        configureFragments(true /* from request */);
-    }
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        setIntent(intent);
-        if (Intent.ACTION_VIEW.equals(intent.getAction())) {
-            mRequest = mIntentResolver.resolveIntent(intent);
-
-            Uri uri = mRequest.getContactUri();
-            if (uri == null) {
-                return;
-            }
-
-            if (mHasActionBar) {
-                mActionBarAdapter.setSearchMode(false);
-                configureFragments(false /* from request */);
-            }
-
-            mListFragment.reloadDataAndSetSelectedUri(uri);
-        }
+        configureFragments(savedState == null);
     }
 
     @Override
@@ -248,6 +233,12 @@
         if (mActionBarAdapter != null) {
             mActionBarAdapter.setListener(null);
         }
+
+        mOptionsMenuContactsAvailable = false;
+        mOptionsMenuCustomFilterChangeable = false;
+        mOptionsMenuGroupActionsEnabled = false;
+
+        mProviderStatus = -1;
         mProviderStatusLoader.setProviderStatusListener(null);
         super.onPause();
     }
@@ -275,7 +266,6 @@
     }
 
     private void configureFragments(boolean fromRequest) {
-        boolean searchMode = mSearchMode;
         if (fromRequest) {
             ContactListFilter filter = null;
             int actionCode = mRequest.getActionCode();
@@ -299,49 +289,35 @@
 
             if (filter != null) {
                 mContactListFilterController.setContactListFilter(filter, false);
-                searchMode = false;
+                mSearchMode = false;
             } else if (mRequest.getActionCode() == ContactsRequest.ACTION_ALL_CONTACTS) {
                 mContactListFilterController.setContactListFilter(new ContactListFilter(
                         ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS), false);
             }
 
             if (mRequest.getContactUri() != null) {
-                searchMode = false;
+                mSearchMode = false;
             }
 
         } else if (mHasActionBar) {
-            searchMode = mActionBarAdapter.isSearchMode();
+            mSearchMode = mActionBarAdapter.isSearchMode();
         }
 
-        boolean replaceList = mListFragment == null || (mSearchMode != searchMode);
-        if (replaceList) {
-            if (mListFragment != null) {
-                mListFragment.setOnContactListActionListener(null);
-            }
+        if (mListFragment == null) {
+            mListFragment = new DefaultContactBrowseListFragment();
+            mListFragment.setContactsRequest(mRequest);
 
-            mSearchMode = searchMode;
-
-            if (mSearchMode) {
-                mListFragment = createContactSearchFragment();
-            } else {
-                mListFragment = createListFragment(ContactsRequest.ACTION_DEFAULT);
-                if (mRequest.getContactUri() != null) {
-                    mListFragment.setSelectedContactUri(mRequest.getContactUri());
-
-                }
-            }
-        }
-
-        if (mSearchMode && mHasActionBar) {
-            mListFragment.setQueryString(mActionBarAdapter.getQueryString());
-        }
-
-        if (replaceList) {
             getFragmentManager().openTransaction()
                     .replace(R.id.list_container, mListFragment)
                     .commit();
         }
 
+        if (fromRequest) {
+            configureListFragmentForRequest();
+        }
+
+        configureListFragment();
+
         if (mContactContentDisplayed && mDetailFragment == null) {
             mDetailFragment = new ContactDetailFragment();
             getFragmentManager().openTransaction()
@@ -349,9 +325,7 @@
                     .commit();
         }
 
-        if (replaceList) {
-            invalidateOptionsMenu();
-        }
+        invalidateOptionsMenu();
     }
 
     @Override
@@ -392,96 +366,38 @@
     @Override
     public void onAction() {
         configureFragments(false /* from request */);
+        mListFragment.setQueryString(mActionBarAdapter.getQueryString());
     }
 
-    /**
-     * Creates the list fragment for the specified mode.
-     */
-    private ContactBrowseListFragment createListFragment(int actionCode) {
-        switch (actionCode) {
-            case ContactsRequest.ACTION_DEFAULT: {
-                DefaultContactBrowseListFragment fragment = new DefaultContactBrowseListFragment();
-                fragment.setContactsRequest(mRequest);
-                fragment.setOnContactListActionListener(new ContactBrowserActionListener());
-                if (!mHasActionBar) {
-                    fragment.setContextMenuAdapter(
-                            new ContactBrowseListContextMenuAdapter(fragment));
-                }
-                fragment.setSearchMode(mRequest.isSearchMode());
-                fragment.setQueryString(mRequest.getQueryString());
-                if (mRequest.isSearchMode() && mRequest.isDirectorySearchEnabled()) {
-                    fragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
-                } else {
-                    fragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
-                }
-                fragment.setVisibleScrollbarEnabled(!mRequest.isSearchMode());
-                fragment.setVerticalScrollbarPosition(
-                        mContactContentDisplayed
-                                ? View.SCROLLBAR_POSITION_LEFT
-                                : View.SCROLLBAR_POSITION_RIGHT);
-                fragment.setSelectionVisible(mContactContentDisplayed);
-                fragment.setQuickContactEnabled(!mContactContentDisplayed);
-                fragment.setFilterEnabled(!mRequest.isSearchMode());
-                fragment.setPersistentSelectionEnabled(!mRequest.isSearchMode());
-                return fragment;
-            }
+    private void configureListFragmentForRequest() {
+        Uri contactUri = mRequest.getContactUri();
+        if (contactUri != null) {
+            mListFragment.setSelectedContactUri(contactUri);
+        }
 
-            case ContactsRequest.ACTION_GROUP: {
-                throw new UnsupportedOperationException("Not yet implemented");
-            }
+        mListFragment.setQueryString(mRequest.getQueryString());
 
-            case ContactsRequest.ACTION_STARRED: {
-                StrequentContactListFragment fragment = new StrequentContactListFragment();
-                fragment.setOnContactListActionListener(new ContactBrowserActionListener());
-                fragment.setFrequentlyContactedContactsIncluded(false);
-                fragment.setStarredContactsIncluded(true);
-                fragment.setSelectionVisible(mContactContentDisplayed);
-                fragment.setQuickContactEnabled(!mContactContentDisplayed);
-                return fragment;
-            }
+        if (mRequest.isDirectorySearchEnabled()) {
+            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
+        } else {
+            mListFragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
+        }
 
-            case ContactsRequest.ACTION_FREQUENT: {
-                StrequentContactListFragment fragment = new StrequentContactListFragment();
-                fragment.setOnContactListActionListener(new ContactBrowserActionListener());
-                fragment.setFrequentlyContactedContactsIncluded(true);
-                fragment.setStarredContactsIncluded(false);
-                fragment.setSelectionVisible(mContactContentDisplayed);
-                fragment.setQuickContactEnabled(!mContactContentDisplayed);
-                return fragment;
-            }
-
-            case ContactsRequest.ACTION_STREQUENT: {
-                StrequentContactListFragment fragment = new StrequentContactListFragment();
-                fragment.setOnContactListActionListener(new ContactBrowserActionListener());
-                fragment.setFrequentlyContactedContactsIncluded(true);
-                fragment.setStarredContactsIncluded(true);
-                fragment.setSelectionVisible(mContactContentDisplayed);
-                fragment.setQuickContactEnabled(!mContactContentDisplayed);
-                return fragment;
-            }
-
-            default:
-                throw new IllegalStateException("Invalid action code: " + actionCode);
+        if (mContactListFilterController.isLoaded()) {
+            mListFragment.setFilter(mContactListFilterController.getFilter());
         }
     }
 
-    private ContactBrowseListFragment createContactSearchFragment() {
-        DefaultContactBrowseListFragment fragment = new DefaultContactBrowseListFragment();
-        fragment.setOnContactListActionListener(new ContactBrowserActionListener());
-        if (!mHasActionBar) {
-            fragment.setContextMenuAdapter(new ContactBrowseListContextMenuAdapter(fragment));
-        }
-        fragment.setSearchMode(true);
-        fragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_DEFAULT);
-        fragment.setDirectoryResultLimit(DEFAULT_DIRECTORY_RESULT_LIMIT);
-        fragment.setVisibleScrollbarEnabled(false);
-        fragment.setVerticalScrollbarPosition(
+    private void configureListFragment() {
+        mListFragment.setSearchMode(mSearchMode);
+
+        mListFragment.setVisibleScrollbarEnabled(!mSearchMode);
+        mListFragment.setVerticalScrollbarPosition(
                 mContactContentDisplayed
                         ? View.SCROLLBAR_POSITION_LEFT
                         : View.SCROLLBAR_POSITION_RIGHT);
-        fragment.setSelectionVisible(true);
-        fragment.setQuickContactEnabled(!mContactContentDisplayed);
-        return fragment;
+        mListFragment.setSelectionVisible(mContactContentDisplayed);
+        mListFragment.setQuickContactEnabled(!mContactContentDisplayed);
     }
 
     @Override
@@ -1057,6 +973,15 @@
         }
     }
 
+    @Override
+    protected void onRestoreInstanceState(Bundle inState) {
+        super.onRestoreInstanceState(inState);
+        mSearchMode = inState.getBoolean(KEY_SEARCH_MODE);
+        if (mActionBarAdapter != null) {
+            mActionBarAdapter.onRestoreInstanceState(inState);
+        }
+    }
+
     private PhoneNumberInteraction getPhoneNumberCallInteraction() {
         if (mPhoneNumberCallInteraction == null) {
             mPhoneNumberCallInteraction = new PhoneNumberInteraction(this, false, null);
diff --git a/src/com/android/contacts/activities/ContactsFrontDoor.java b/src/com/android/contacts/activities/ContactsFrontDoor.java
index 214382d..3677cce 100644
--- a/src/com/android/contacts/activities/ContactsFrontDoor.java
+++ b/src/com/android/contacts/activities/ContactsFrontDoor.java
@@ -18,9 +18,9 @@
 
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.DialtactsActivity;
+import com.android.contacts.util.PhoneCapabilityTester;
 
 import android.content.Intent;
-import android.content.res.Configuration;
 import android.os.Bundle;
 
 public class ContactsFrontDoor extends ContactsActivity {
@@ -35,18 +35,16 @@
         intent.setAction(originalIntent.getAction());
         intent.setDataAndType(originalIntent.getData(), originalIntent.getType());
         intent.setFlags(
-                Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+                Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_FORWARD_RESULT
+                        | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
         intent.putExtra(EXTRA_FRONT_DOOR, true);
 
-        // The user launched the config based front door, pick the right activity to go to
-        Configuration config = getResources().getConfiguration();
-        int screenLayoutSize = config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
-        if (screenLayoutSize == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
-            // XL screen, use two pane UI
-            intent.setClass(this, ContactBrowserActivity.class);
-        } else {
+        if (PhoneCapabilityTester.isPhone(this)) {
             // Default to the normal dialtacts layout
             intent.setClass(this, DialtactsActivity.class);
+        } else {
+            // No tabs, just a contact list
+            intent.setClass(this, ContactBrowserActivity.class);
         }
 
         startActivity(intent);
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index bea9891..3d53da8 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -51,10 +51,8 @@
 
     private static final String KEY_SELECTED_URI = "selectedUri";
     private static final String KEY_SELECTION_VERIFIED = "selectionVerified";
-    private static final String KEY_FILTER_ENABLED = "filterEnabled";
     private static final String KEY_FILTER = "filter";
 
-    private static final String KEY_PERSISTENT_SELECTION_ENABLED = "persistentSelectionEnabled";
     private static final String PERSISTENT_SELECTION_PREFIX = "defaultContactBrowserSelection";
 
     /**
@@ -88,9 +86,7 @@
     private long mSelectedContactId;
     private boolean mSelectionVerified;
     private boolean mRefreshingContactUri;
-    private boolean mFilterEnabled;
     private ContactListFilter mFilter;
-    private boolean mPersistentSelectionEnabled;
     private String mPersistentSelectionPrefix = PERSISTENT_SELECTION_PREFIX;
 
     protected OnContactBrowserActionListener mListener;
@@ -164,8 +160,14 @@
         restoreSelectedUri(false);
     }
 
-    public void setPersistentSelectionEnabled(boolean flag) {
-        this.mPersistentSelectionEnabled = flag;
+    @Override
+    public void setSearchMode(boolean flag) {
+        if (isSearchMode() != flag) {
+            if (!flag) {
+                restoreSelectedUri(true);
+            }
+            super.setSearchMode(flag);
+        }
     }
 
     public void setFilter(ContactListFilter filter) {
@@ -196,14 +198,6 @@
         return mFilter;
     }
 
-    public boolean isFilterEnabled() {
-        return mFilterEnabled;
-    }
-
-    public void setFilterEnabled(boolean flag) {
-        this.mFilterEnabled = flag;
-    }
-
     @Override
     public void restoreSavedState(Bundle savedState) {
         super.restoreSavedState(savedState);
@@ -212,8 +206,6 @@
             return;
         }
 
-        mPersistentSelectionEnabled = savedState.getBoolean(KEY_PERSISTENT_SELECTION_ENABLED);
-        mFilterEnabled = savedState.getBoolean(KEY_FILTER_ENABLED);
         mFilter = savedState.getParcelable(KEY_FILTER);
         mSelectedContactUri = savedState.getParcelable(KEY_SELECTED_URI);
         mSelectionVerified = savedState.getBoolean(KEY_SELECTION_VERIFIED);
@@ -223,8 +215,6 @@
     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
-        outState.putBoolean(KEY_PERSISTENT_SELECTION_ENABLED, mPersistentSelectionEnabled);
-        outState.putBoolean(KEY_FILTER_ENABLED, mFilterEnabled);
         outState.putParcelable(KEY_FILTER, mFilter);
         outState.putParcelable(KEY_SELECTED_URI, mSelectedContactUri);
         outState.putBoolean(KEY_SELECTION_VERIFIED, mSelectionVerified);
@@ -346,7 +336,8 @@
             if (mSelectedContactUri.toString().startsWith(Contacts.CONTENT_LOOKUP_URI.toString())) {
                 List<String> pathSegments = mSelectedContactUri.getPathSegments();
                 mSelectedContactLookupKey = Uri.encode(pathSegments.get(2));
-            } else if (mSelectedContactUri.toString().startsWith(Contacts.CONTENT_URI.toString())) {
+            } else if (mSelectedContactUri.toString().startsWith(Contacts.CONTENT_URI.toString()) &&
+                    mSelectedContactUri.getPathSegments().size() >= 2) {
                 mSelectedContactLookupKey = null;
                 mSelectedContactId = ContentUris.parseId(mSelectedContactUri);
             } else {
@@ -371,7 +362,7 @@
             return;
         }
 
-        if (mFilterEnabled && mFilter != null) {
+        if (!isSearchMode() && mFilter != null) {
             adapter.setFilter(mFilter);
             if (mSelectionRequired
                     || mFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
@@ -578,26 +569,22 @@
     }
 
     private void saveSelectedUri(Uri contactUri) {
-        if (mFilterEnabled) {
-            ContactListFilter.storeToPreferences(mPrefs, mFilter);
-        }
-
-        if (mPersistentSelectionEnabled) {
-            Editor editor = mPrefs.edit();
-            if (contactUri == null) {
-                editor.remove(getPersistentSelectionKey());
-            } else {
-                editor.putString(getPersistentSelectionKey(), contactUri.toString());
-            }
-            editor.apply();
-        }
-    }
-
-    private void restoreSelectedUri(boolean willReloadData) {
-        if (!mPersistentSelectionEnabled) {
+        if (isSearchMode()) {
             return;
         }
 
+        ContactListFilter.storeToPreferences(mPrefs, mFilter);
+
+        Editor editor = mPrefs.edit();
+        if (contactUri == null) {
+            editor.remove(getPersistentSelectionKey());
+        } else {
+            editor.putString(getPersistentSelectionKey(), contactUri.toString());
+        }
+        editor.apply();
+    }
+
+    private void restoreSelectedUri(boolean willReloadData) {
         // The meaning of mSelectionRequired is that we need to show some
         // selection other than the previous selection saved in shared preferences
         if (mSelectionRequired) {
@@ -613,17 +600,13 @@
     }
 
     private void saveFilter() {
-        if (mFilterEnabled) {
-            ContactListFilter.storeToPreferences(mPrefs, mFilter);
-        }
+        ContactListFilter.storeToPreferences(mPrefs, mFilter);
     }
 
     private void restoreFilter() {
-        if (mFilterEnabled) {
-            mFilter = ContactListFilter.restoreFromPreferences(mPrefs);
-            if (mFilter == null) {
-                mFilter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
-            }
+        mFilter = ContactListFilter.restoreFromPreferences(mPrefs);
+        if (mFilter == null) {
+            mFilter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
         }
     }
 
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 1b7c9dc..d76ad38 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -424,13 +424,11 @@
                         startLoading();
                     }
                 }
+            } else {
+                mDirectoryListStatus = STATUS_NOT_LOADED;
+                getLoaderManager().destroyLoader(DIRECTORY_LOADER_ID);
             }
         }
-
-// TODO fix the empty view
-//            if (mEmptyView != null && (data == null || data.getCount() == 0)) {
-//                prepareEmptyView();
-//            }
     }
 
     public void onLoaderReset(Loader<Cursor> loader) {
@@ -574,10 +572,24 @@
             mSearchMode = flag;
             setSectionHeaderDisplayEnabled(!mSearchMode);
 
+            if (!flag) {
+                mDirectoryListStatus = STATUS_NOT_LOADED;
+                getLoaderManager().destroyLoader(DIRECTORY_LOADER_ID);
+            }
+
             if (mAdapter != null) {
-                mAdapter.clearPartitions();
-                mAdapter.setSearchMode(flag);
                 mAdapter.setPinnedPartitionHeadersEnabled(flag);
+                mAdapter.setSearchMode(flag);
+
+                mAdapter.clearPartitions();
+                if (!flag) {
+                    // If we are switching from search to regular display,
+                    // remove all directory partitions (except the default one).
+                    int count = mAdapter.getPartitionCount();
+                    for (int i = count; --i >= 1;) {
+                        mAdapter.removePartition(i);
+                    }
+                }
                 mAdapter.configureDefaultPartition(false, flag);
                 reloadData();
             }
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index 7dcca08..6b4a653 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -191,7 +191,7 @@
     protected void bindView(View itemView, int partition, Cursor cursor, int position) {
         final ContactListItemView view = (ContactListItemView)itemView;
 
-        view.setHighlightedPrefix(getUpperCaseQueryString());
+        view.setHighlightedPrefix(isSearchMode() ? getUpperCaseQueryString() : null);
 
         if (isSelectionVisible()) {
             view.setActivated(isSelectedContact(partition, cursor));
@@ -210,6 +210,8 @@
 
         if (isSearchMode()) {
             bindSearchSnippet(view, cursor);
+        } else {
+            view.setSnippet(null);
         }
     }
 
diff --git a/src/com/android/contacts/list/StrequentContactListFragment.java b/src/com/android/contacts/list/StrequentContactListFragment.java
index 393e698..b88a60d 100644
--- a/src/com/android/contacts/list/StrequentContactListFragment.java
+++ b/src/com/android/contacts/list/StrequentContactListFragment.java
@@ -25,6 +25,8 @@
 /**
  * Fragment containing a list of starred contacts followed by a list of frequently contacted.
  */
+
+// TODO: This class is currently unused.  Bring it back as a mode of ContactBrowserListFragment
 public class StrequentContactListFragment extends ContactBrowseListFragment
         implements OnClickListener {
 
diff --git a/tests/res/values/donottranslate_strings.xml b/tests/res/values/donottranslate_strings.xml
index 660bae2..8557fd6 100644
--- a/tests/res/values/donottranslate_strings.xml
+++ b/tests/res/values/donottranslate_strings.xml
@@ -24,11 +24,8 @@
         <item>LIST_ALL_CONTACTS_ACTION</item>
         <item>LIST_CONTACTS_WITH_PHONES_ACTION</item>
         <item>LIST_STARRED_ACTION</item>
-        <item>LIST_STARRED_ACTION (filter)</item>
         <item>LIST_FREQUENT_ACTION</item>
-        <item>LIST_FREQUENT_ACTION (filter)</item>
         <item>LIST_STREQUENT_ACTION</item>
-        <item>LIST_STREQUENT_ACTION (filter)</item>
         <item>ACTION_PICK: contact</item>
         <item>ACTION_PICK: contact (legacy)</item>
         <item>ACTION_PICK: phone</item>
@@ -36,20 +33,13 @@
         <item>ACTION_PICK: postal</item>
         <item>ACTION_PICK: postal (legacy)</item>
         <item>ACTION_CREATE_SHORTCUT: contact</item>
-        <item>ACTION_CREATE_SHORTCUT: contact (filter)</item>
         <item>ACTION_CREATE_SHORTCUT: dial</item>
-        <item>ACTION_CREATE_SHORTCUT: dial (filter)</item>
         <item>ACTION_CREATE_SHORTCUT: message</item>
-        <item>ACTION_CREATE_SHORTCUT: message (filter)</item>
         <item>ACTION_GET_CONTENT: contact</item>
-        <item>ACTION_GET_CONTENT: contact (filter)</item>
         <item>ACTION_GET_CONTENT: contact (legacy)</item>
-        <item>ACTION_GET_CONTENT: contact (filter, legacy)</item>
         <item>ACTION_GET_CONTENT: phone</item>
-        <item>ACTION_GET_CONTENT: phone (filter)</item>
         <item>ACTION_GET_CONTENT: phone (legacy)</item>
         <item>ACTION_GET_CONTENT: postal</item>
-        <item>ACTION_GET_CONTENT: postal (filter)</item>
         <item>ACTION_GET_CONTENT: postal (legacy)</item>
         <item>ACTION_INSERT_OR_EDIT</item>
         <item>ACTION_SEARCH (call button)</item>
diff --git a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
index 66079ad..50a1f1f 100644
--- a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
+++ b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
@@ -16,7 +16,6 @@
 
 package com.android.contacts.tests.allintents;
 
-import com.android.contacts.list.ContactsRequest;
 import com.android.contacts.tests.R;
 import com.google.android.collect.Lists;
 
@@ -61,74 +60,67 @@
     private static final String CONTACT_LIST_ACTIVITY_CLASS_NAME =
             "com.android.contacts.activities.ContactBrowserActivity";
 
-    private static final int LIST_DEFAULT = 0;
-    private static final int LIST_ALL_CONTACTS_ACTION = 1;
-    private static final int LIST_CONTACTS_WITH_PHONES_ACTION = 2;
-    private static final int LIST_STARRED_ACTION = 3;
-    private static final int LIST_STARRED_ACTION_WITH_FILTER = 4;
-    private static final int LIST_FREQUENT_ACTION = 5;
-    private static final int LIST_FREQUENT_ACTION_WITH_FILTER = 6;
-    private static final int LIST_STREQUENT_ACTION = 7;
-    private static final int LIST_STREQUENT_ACTION_WITH_FILTER = 8;
-    private static final int ACTION_PICK_CONTACT = 9;
-    private static final int ACTION_PICK_CONTACT_LEGACY = 10;
-    private static final int ACTION_PICK_PHONE = 11;
-    private static final int ACTION_PICK_PHONE_LEGACY = 12;
-    private static final int ACTION_PICK_POSTAL = 13;
-    private static final int ACTION_PICK_POSTAL_LEGACY = 14;
-    private static final int ACTION_CREATE_SHORTCUT_CONTACT = 15;
-    private static final int ACTION_CREATE_SHORTCUT_CONTACT_FILTER = 16;
-    private static final int ACTION_CREATE_SHORTCUT_DIAL = 17;
-    private static final int ACTION_CREATE_SHORTCUT_DIAL_FILTER = 18;
-    private static final int ACTION_CREATE_SHORTCUT_MESSAGE = 19;
-    private static final int ACTION_CREATE_SHORTCUT_MESSAGE_FILTER = 20;
-    private static final int ACTION_GET_CONTENT_CONTACT = 21;
-    private static final int ACTION_GET_CONTENT_CONTACT_FILTER = 22;
-    private static final int ACTION_GET_CONTENT_CONTACT_LEGACY = 23;
-    private static final int ACTION_GET_CONTENT_CONTACT_FILTER_LEGACY = 24;
-    private static final int ACTION_GET_CONTENT_PHONE = 25;
-    private static final int ACTION_GET_CONTENT_PHONE_FILTER = 26;
-    private static final int ACTION_GET_CONTENT_PHONE_LEGACY = 27;
-    private static final int ACTION_GET_CONTENT_POSTAL = 28;
-    private static final int ACTION_GET_CONTENT_POSTAL_FILTER = 29;
-    private static final int ACTION_GET_CONTENT_POSTAL_LEGACY = 30;
-    private static final int ACTION_INSERT_OR_EDIT = 31;
-    private static final int ACTION_SEARCH_CALL = 32;
-    private static final int ACTION_SEARCH_CONTACT = 33;
-    private static final int ACTION_SEARCH_EMAIL = 34;
-    private static final int ACTION_SEARCH_PHONE = 35;
-    private static final int SEARCH_SUGGESTION_CLICKED_CALL_BUTTON = 36;
-    private static final int SEARCH_SUGGESTION_CLICKED_CONTACT = 37;
-    private static final int SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED = 38;
-    private static final int SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED = 39;
-    private static final int JOIN_CONTACT = 40;
+    public enum ContactsIntent {
+        LIST_DEFAULT,
+        LIST_ALL_CONTACTS_ACTION,
+        LIST_CONTACTS_WITH_PHONES_ACTION,
+        LIST_STARRED_ACTION,
+        LIST_FREQUENT_ACTION,
+        LIST_STREQUENT_ACTION,
+        ACTION_PICK_CONTACT,
+        ACTION_PICK_CONTACT_LEGACY,
+        ACTION_PICK_PHONE,
+        ACTION_PICK_PHONE_LEGACY,
+        ACTION_PICK_POSTAL,
+        ACTION_PICK_POSTAL_LEGACY,
+        ACTION_CREATE_SHORTCUT_CONTACT,
+        ACTION_CREATE_SHORTCUT_DIAL,
+        ACTION_CREATE_SHORTCUT_MESSAGE,
+        ACTION_GET_CONTENT_CONTACT,
+        ACTION_GET_CONTENT_CONTACT_LEGACY,
+        ACTION_GET_CONTENT_PHONE,
+        ACTION_GET_CONTENT_PHONE_LEGACY,
+        ACTION_GET_CONTENT_POSTAL,
+        ACTION_GET_CONTENT_POSTAL_LEGACY,
+        ACTION_INSERT_OR_EDIT,
+        ACTION_SEARCH_CALL,
+        ACTION_SEARCH_CONTACT,
+        ACTION_SEARCH_EMAIL,
+        ACTION_SEARCH_PHONE,
+        SEARCH_SUGGESTION_CLICKED_CALL_BUTTON,
+        SEARCH_SUGGESTION_CLICKED_CONTACT,
+        SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED,
+        SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED,
+        JOIN_CONTACT,
+        EDIT_CONTACT,
+        EDIT_CONTACT_LOOKUP,
+        EDIT_CONTACT_LOOKUP_ID,
+        EDIT_RAW_CONTACT,
+        EDIT_LEGACY,
+        EDIT_NEW_CONTACT,
+        EDIT_NEW_CONTACT_WITH_DATA,
+        EDIT_NEW_CONTACT_FOR_ACCOUNT,
+        EDIT_NEW_CONTACT_FOR_ACCOUNT_WITH_DATA,
+        EDIT_NEW_RAW_CONTACT,
+        EDIT_NEW_LEGACY,
+        VIEW_CONTACT,
+        VIEW_CONTACT_LOOKUP,
+        VIEW_CONTACT_LOOKUP_ID,
+        VIEW_RAW_CONTACT,
+        VIEW_LEGACY,
+        DIAL,
+        DIAL_phone,
+        DIAL_person,
+        DIAL_voicemail,
+        CALL_BUTTON,
+        DIAL_tel,
+        VIEW_tel,
+        VIEW_calllog;
 
-    private static final int EDIT_CONTACT = 41;
-    private static final int EDIT_CONTACT_LOOKUP = 42;
-    private static final int EDIT_CONTACT_LOOKUP_ID = 43;
-    private static final int EDIT_RAW_CONTACT = 44;
-    private static final int EDIT_LEGACY = 45;
-    private static final int EDIT_NEW_CONTACT = 46;
-    private static final int EDIT_NEW_CONTACT_WITH_DATA = 47;
-    private static final int EDIT_NEW_CONTACT_FOR_ACCOUNT = 48;
-    private static final int EDIT_NEW_CONTACT_FOR_ACCOUNT_WITH_DATA = 49;
-    private static final int EDIT_NEW_RAW_CONTACT = 50;
-    private static final int EDIT_NEW_LEGACY = 51;
-
-    private static final int VIEW_CONTACT = 52;
-    private static final int VIEW_CONTACT_LOOKUP = 53;
-    private static final int VIEW_CONTACT_LOOKUP_ID = 54;
-    private static final int VIEW_RAW_CONTACT = 55;
-    private static final int VIEW_LEGACY = 56;
-
-    private static final int DIAL = 57;
-    private static final int DIAL_phone = 58;
-    private static final int DIAL_person = 59;
-    private static final int DIAL_voicemail = 60;
-    private static final int CALL_BUTTON = 61;
-    private static final int DIAL_tel = 62;
-    private static final int VIEW_tel = 63;
-    private static final int VIEW_calllog = 64;
+        public static ContactsIntent get(int ordinal) {
+            return values()[ordinal];
+        }
+    }
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -141,7 +133,7 @@
     protected void onListItemClick(ListView l, View v, int position, long id) {
         super.onListItemClick(l, v, position, id);
 
-        switch (position) {
+        switch (ContactsIntent.get(position)) {
             case LIST_DEFAULT: {
                 startContactListActivity(
                         new Intent(Intent.ACTION_VIEW, Contacts.CONTENT_URI));
@@ -162,30 +154,16 @@
                         new Intent(UI.LIST_STARRED_ACTION, Contacts.CONTENT_URI));
                 break;
             }
-            case LIST_STARRED_ACTION_WITH_FILTER: {
-                startContactListActivity(buildFilterIntent(ContactsRequest.ACTION_STARRED, false));
-                break;
-            }
             case LIST_FREQUENT_ACTION: {
                 startContactListActivity(
                         new Intent(UI.LIST_FREQUENT_ACTION, Contacts.CONTENT_URI));
                 break;
             }
-            case LIST_FREQUENT_ACTION_WITH_FILTER: {
-                startContactListActivity(
-                        buildFilterIntent(ContactsRequest.ACTION_FREQUENT, false));
-                break;
-            }
             case LIST_STREQUENT_ACTION: {
                 startContactListActivity(
                         new Intent(UI.LIST_STREQUENT_ACTION, Contacts.CONTENT_URI));
                 break;
             }
-            case LIST_STREQUENT_ACTION_WITH_FILTER: {
-                startContactListActivity(
-                        buildFilterIntent(ContactsRequest.ACTION_STREQUENT, false));
-                break;
-            }
             case ACTION_PICK_CONTACT: {
                 startContactSelectionActivityForResult(
                         new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI));
@@ -222,12 +200,6 @@
                 startContactSelectionActivityForResult(intent);
                 break;
             }
-            case ACTION_CREATE_SHORTCUT_CONTACT_FILTER: {
-                startContactSelectionActivityForResult(
-                        buildFilterIntent(ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT,
-                                false));
-                break;
-            }
             case ACTION_CREATE_SHORTCUT_DIAL: {
                 Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
                 intent.setComponent(
@@ -235,12 +207,6 @@
                 startActivityForResult(intent, 0);
                 break;
             }
-            case ACTION_CREATE_SHORTCUT_DIAL_FILTER: {
-                startContactSelectionActivityForResult(
-                        buildFilterIntent(ContactsRequest.ACTION_CREATE_SHORTCUT_CALL,
-                                false));
-                break;
-            }
             case ACTION_CREATE_SHORTCUT_MESSAGE: {
                 Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
                 intent.setComponent(
@@ -248,11 +214,6 @@
                 startActivityForResult(intent, 0);
                 break;
             }
-            case ACTION_CREATE_SHORTCUT_MESSAGE_FILTER: {
-                startContactSelectionActivityForResult(
-                        buildFilterIntent(ContactsRequest.ACTION_CREATE_SHORTCUT_CALL, false));
-                break;
-            }
             case ACTION_GET_CONTENT_CONTACT: {
                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
@@ -265,28 +226,12 @@
                 startContactSelectionActivityForResult(intent);
                 break;
             }
-            case ACTION_GET_CONTENT_CONTACT_FILTER: {
-                startContactSelectionActivityForResult(
-                        buildFilterIntent(ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT, false));
-                break;
-            }
-            case ACTION_GET_CONTENT_CONTACT_FILTER_LEGACY: {
-                startContactSelectionActivityForResult(
-                        buildFilterIntent(ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT,
-                                true));
-                break;
-            }
             case ACTION_GET_CONTENT_PHONE: {
                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                 intent.setType(Phone.CONTENT_ITEM_TYPE);
                 startContactSelectionActivityForResult(intent);
                 break;
             }
-            case ACTION_GET_CONTENT_PHONE_FILTER: {
-                startContactSelectionActivityForResult(
-                        buildFilterIntent(ContactsRequest.ACTION_PICK_PHONE, true));
-                break;
-            }
             case ACTION_GET_CONTENT_PHONE_LEGACY: {
                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                 intent.setType(Phones.CONTENT_ITEM_TYPE);
@@ -299,11 +244,6 @@
                 startContactSelectionActivityForResult(intent);
                 break;
             }
-            case ACTION_GET_CONTENT_POSTAL_FILTER: {
-                startContactSelectionActivityForResult(
-                        buildFilterIntent(ContactsRequest.ACTION_PICK_POSTAL, false));
-                break;
-            }
             case ACTION_GET_CONTENT_POSTAL_LEGACY: {
                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                 intent.setType(ContactMethods.CONTENT_POSTAL_ITEM_TYPE);
@@ -546,9 +486,9 @@
     private Intent buildFilterIntent(int actionCode, boolean legacy) {
         Intent intent = new Intent(UI.FILTER_CONTACTS_ACTION);
         intent.putExtra(UI.FILTER_TEXT_EXTRA_KEY, "A");
-        ContactsRequest request = new ContactsRequest();
-        request.setActionCode(actionCode);
-        intent.putExtra("originalRequest", request);
+//        ContactsRequest request = new ContactsRequest();
+//        request.setActionCode(actionCode);
+//        intent.putExtra("originalRequest", request);
         return intent;
     }
 
@@ -627,7 +567,7 @@
 
     @Override
     public void onAccountChosen(Account account, int tag) {
-        switch (tag) {
+        switch (ContactsIntent.get(tag)) {
             case EDIT_NEW_CONTACT_FOR_ACCOUNT: {
                 final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
                 intent.putExtra(Insert.ACCOUNT, account);
@@ -643,6 +583,8 @@
                 startActivity(intent);
                 break;
             }
+            default:
+                break;
         }
     }
 
