diff --git a/res/menu/search.xml b/res/menu/search.xml
new file mode 100644
index 0000000..4e2e8e3
--- /dev/null
+++ b/res/menu/search.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/menu_search"
+        android:icon="@android:drawable/ic_menu_search"
+        android:title="@string/menu_search" />
+
+</menu>
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index 683fea4..093aec6 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -88,7 +88,6 @@
     private static final int SUBACTIVITY_VIEW_CONTACT = 2;
     private static final int SUBACTIVITY_DISPLAY_GROUP = 3;
     private static final int SUBACTIVITY_SEARCH = 4;
-    protected static final int SUBACTIVITY_FILTER = 5;
 
     private static final String[] RAW_CONTACTS_PROJECTION = new String[] {
         RawContacts._ID, //0
@@ -260,6 +259,7 @@
                 ContactPickerFragment fragment = new ContactPickerFragment();
                 fragment.setOnContactPickerActionListener(new ContactPickerActionListener());
                 fragment.setLegacyCompatibilityMode(mRequest.isLegacyCompatibilityMode());
+                fragment.setSearchMode(mRequest.isSearchMode());
                 mListFragment = fragment;
                 break;
             }
@@ -267,7 +267,7 @@
             case ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT: {
                 ContactPickerFragment fragment = new ContactPickerFragment();
                 fragment.setOnContactPickerActionListener(new ContactPickerActionListener());
-                fragment.setCreateContactEnabled(true);
+                fragment.setCreateContactEnabled(!mRequest.isSearchMode());
                 fragment.setLegacyCompatibilityMode(mRequest.isLegacyCompatibilityMode());
                 mListFragment = fragment;
                 break;
@@ -276,8 +276,9 @@
             case ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT: {
                 ContactPickerFragment fragment = new ContactPickerFragment();
                 fragment.setOnContactPickerActionListener(new ContactPickerActionListener());
-                fragment.setCreateContactEnabled(true);
+                fragment.setCreateContactEnabled(!mRequest.isSearchMode());
                 fragment.setLegacyCompatibilityMode(mRequest.isLegacyCompatibilityMode());
+                fragment.setSearchMode(mRequest.isSearchMode());
                 fragment.setShortcutRequested(true);
                 mListFragment = fragment;
                 break;
@@ -326,6 +327,7 @@
             default:
                 throw new IllegalStateException("Invalid action code: " + mActionCode);
         }
+        mListFragment.setContactsRequest(mRequest);
     }
 
     private final class ContactBrowserActionListener implements OnContactBrowserActionListener {
@@ -453,19 +455,26 @@
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
 
-        // TODO what other actions need the menu?
+        MenuInflater inflater = getMenuInflater();
         if (mActionCode == ContactsRequest.ACTION_DEFAULT ||
                 mActionCode == ContactsRequest.ACTION_STREQUENT) {
-            MenuInflater inflater = getMenuInflater();
             inflater.inflate(R.menu.list, menu);
+            return true;
+        } else if (!mListFragment.isSearchMode()) {
+            inflater.inflate(R.menu.search, menu);
+            return true;
+        } else {
+            return false;
         }
-        return true;
     }
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
-        menu.findItem(R.id.menu_display_groups).setVisible(
-                mActionCode == ContactsRequest.ACTION_DEFAULT);
+        MenuItem displayGroups = menu.findItem(R.id.menu_display_groups);
+        if (displayGroups != null) {
+            displayGroups.setVisible(
+                    mActionCode == ContactsRequest.ACTION_DEFAULT);
+        }
         return true;
     }
 
@@ -513,14 +522,7 @@
         if (globalSearch) {
             super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
         } else {
-//            if (!mSearchMode && (mMode & MODE_MASK_NO_FILTER) == 0) {
-//                if ((mMode & MODE_MASK_PICKER) != 0) {
-//                    ContactsSearchManager.startSearchForResult(this, initialQuery,
-//                            SUBACTIVITY_FILTER, null);
-//                } else {
-                    ContactsSearchManager.startSearch(this, initialQuery, mRequest);
-//                }
-//            }
+            mListFragment.startSearch(initialQuery);
         }
     }
 
@@ -722,16 +724,17 @@
         AccountSelectionUtil.doImport(this, resId, (size == 1 ? accountList.get(0) : null));
     }
 
-//    @Override
-//    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-//        switch (requestCode) {
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        switch (requestCode) {
 //            case SUBACTIVITY_NEW_CONTACT:
 //                if (resultCode == RESULT_OK) {
-////                    returnPickerResult(null, data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME),
-////                            data.getData());
+//                    returnPickerResult(null, data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME),
+//                            data.getData());
+//                    setRe
 //                }
 //                break;
-//
+
 //            case SUBACTIVITY_VIEW_CONTACT:
 //                if (resultCode == RESULT_OK) {
 //                    mAdapter.notifyDataSetChanged();
@@ -743,20 +746,23 @@
 ////                mJustCreated = true;
 //                break;
 //
-//            case SUBACTIVITY_FILTER:
+            case ContactEntryListFragment.ACTIVITY_REQUEST_CODE_FILTER:
 //            case SUBACTIVITY_SEARCH:
-//                // Pass through results of filter or search UI
-//                if (resultCode == RESULT_OK) {
-//                    setResult(RESULT_OK, data);
-//                    finish();
-//                } else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
+                // Pass through results of filter or search UI
+                if (resultCode == RESULT_OK) {
+                    setResult(RESULT_OK, data);
+                    finish();
+                }
+
+// TODO fix or remove multipicker code
+//                else if (resultCode == RESULT_CANCELED && mMode == MODE_PICK_MULTIPLE_PHONES) {
 //                    // Finish the activity if the sub activity was canceled as back key is used
 //                    // to confirm user selection in MODE_PICK_MULTIPLE_PHONES.
 //                    finish();
 //                }
 //                break;
-//        }
-//    }
+        }
+    }
 
     @Override
     public boolean onContextItemSelected(MenuItem item) {
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 44c50af..8c2abb3 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -19,6 +19,7 @@
 import com.android.contacts.ContactEntryListView;
 import com.android.contacts.ContactListEmptyView;
 import com.android.contacts.ContactPhotoLoader;
+import com.android.contacts.ContactsSearchManager;
 import com.android.contacts.R;
 import com.android.contacts.ui.ContactsPreferences;
 import com.android.contacts.widget.ContextMenuAdapter;
@@ -76,6 +77,7 @@
         extends LoaderManagingFragment<Cursor>
         implements OnItemClickListener, OnScrollListener, OnFocusChangeListener, OnTouchListener {
 
+    public static final int ACTIVITY_REQUEST_CODE_FILTER = 1;
 
     private static final String TAG = "ContactEntryListFragment";
 
@@ -122,6 +124,8 @@
      */
     private boolean mInitialLoadComplete;
 
+    private ContactsRequest mRequest;
+
     private static final class DirectoryQuery {
         public static final Uri URI = Directory.CONTENT_URI;
         public static final String ORDER_BY = Directory._ID;
@@ -170,6 +174,20 @@
     protected void onInitializeLoaders() {
     }
 
+    /**
+     * Returns the parsed intent that started the activity hosting this fragment.
+     */
+    public ContactsRequest getContactsRequest() {
+        return mRequest;
+    }
+
+    /**
+     * Sets a parsed intent that started the activity hosting this fragment.
+     */
+    public void setContactsRequest(ContactsRequest request) {
+        mRequest = request;
+    }
+
     @Override
     public void onStart() {
         if (mContactsPrefs == null) {
@@ -939,6 +957,14 @@
         return telephonyManager.hasIccCard();
     }
 
+    /**
+     * Processes a user request to start search. This may be triggered by the
+     * search key, a menu item or some other user action.
+     */
+    public void startSearch(String initialQuery) {
+        ContactsSearchManager.startSearch(getActivity(), initialQuery, mRequest);
+    }
+
     // TODO integrate into picker fragments
 //    protected Uri buildCallingPackageUri(Uri uri) {
 //        String callingPackage = getContext().getCallingPackage();
diff --git a/src/com/android/contacts/list/ContactPickerFragment.java b/src/com/android/contacts/list/ContactPickerFragment.java
index 2907603..c3a50a0 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -15,6 +15,7 @@
  */
 package com.android.contacts.list;
 
+import com.android.contacts.ContactsSearchManager;
 import com.android.contacts.R;
 import com.android.contacts.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
 
@@ -38,6 +39,8 @@
 
     public ContactPickerFragment() {
         setPhotoLoaderEnabled(true);
+        setSectionHeaderDisplayEnabled(true);
+        setAizyEnabled(true);
     }
 
     public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
@@ -68,10 +71,6 @@
         }
     }
 
-    public boolean isSearchAllContactsItemPosition(int position) {
-        return isSearchMode() && position == getAdapter().getCount() - 1;
-    }
-
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         if (position == 0 && !isSearchMode() && mCreateContactEnabled) {
@@ -83,21 +82,17 @@
 
     @Override
     protected void onItemClick(int position, long id) {
-        if (isSearchAllContactsItemPosition(position)) {
-            mListener.onSearchAllContactsAction((String)null);
+        Uri uri;
+        if (isLegacyCompatibilityMode()) {
+            uri = ((LegacyContactListAdapter)getAdapter()).getPersonUri(position);
         } else {
-            Uri uri;
-            if (isLegacyCompatibilityMode()) {
-                uri = ((LegacyContactListAdapter)getAdapter()).getPersonUri(position);
-            } else {
-                uri = ((ContactListAdapter)getAdapter()).getContactUri(position);
-            }
-            if (mShortcutRequested) {
-                ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this);
-                builder.createContactShortcutIntent(uri);
-            } else {
-                mListener.onPickContactAction(uri);
-            }
+            uri = ((ContactListAdapter)getAdapter()).getContactUri(position);
+        }
+        if (mShortcutRequested) {
+            ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this);
+            builder.createContactShortcutIntent(uri);
+        } else {
+            mListener.onPickContactAction(uri);
         }
     }
 
@@ -120,7 +115,11 @@
     @Override
     protected void configureAdapter() {
         super.configureAdapter();
+
         ContactEntryListAdapter adapter = getAdapter();
+        if (adapter instanceof DefaultContactListAdapter) {
+            ((DefaultContactListAdapter)adapter).setVisibleContactsOnly(true);
+        }
 
         // If "Create new contact" is shown, don't display the empty list UI
         adapter.setEmptyListEnabled(!isCreateContactEnabled());
@@ -128,13 +127,7 @@
 
     @Override
     protected View inflateView(LayoutInflater inflater, ViewGroup container) {
-        if (isSearchMode()) {
-            return inflater.inflate(R.layout.contacts_search_content, null);
-        } else if (isSearchResultsMode()) {
-            return inflater.inflate(R.layout.contacts_list_search_results, null);
-        } else {
-            return inflater.inflate(R.layout.contacts_list_content, null);
-        }
+        return inflater.inflate(R.layout.contacts_list_content, null);
     }
 
     @Override
@@ -167,4 +160,10 @@
     public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) {
         mListener.onShortcutIntentCreated(shortcutIntent);
     }
+
+    @Override
+    public void startSearch(String initialQuery) {
+        ContactsSearchManager.startSearchForResult(getActivity(), initialQuery,
+                ACTIVITY_REQUEST_CODE_FILTER, getContactsRequest());
+    }
 }
