diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index ad6589e..122e97b 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -88,6 +88,7 @@
 import android.provider.ContactsContract.Intents.UI;
 import android.telephony.TelephonyManager;
 import android.text.Editable;
+import android.text.Html;
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.Log;
@@ -447,6 +448,7 @@
     private int mProviderStatus = ProviderStatus.STATUS_NORMAL;
 
     private boolean mSearchMode;
+    private boolean mSearchResultsMode;
     private boolean mShowNumberOfContacts;
 
     private boolean mShowSearchSnippets;
@@ -713,6 +715,7 @@
                 mShowSearchSnippets = true;
                 mInitialFilter = getIntent().getStringExtra(SearchManager.QUERY);
             }
+            mSearchResultsMode = true;
         } else if (ACTION_SEARCH_INTERNAL.equals(action)) {
             String originalAction = null;
             Bundle extras = intent.getExtras();
@@ -735,6 +738,7 @@
                 mShowSearchSnippets = true;
                 mInitialFilter = getIntent().getStringExtra(SearchManager.QUERY);
             }
+            mSearchResultsMode = true;
         // Since this is the filter activity it receives all intents
         // dispatched from the SearchManager for security reasons
         // so we need to re-dispatch from here to the intended target.
@@ -797,7 +801,8 @@
             mMode = MODE_DEFAULT;
         }
 
-        if ((mMode & MODE_MASK_SHOW_NUMBER_OF_CONTACTS) != 0 || mSearchMode) {
+        if (((mMode & MODE_MASK_SHOW_NUMBER_OF_CONTACTS) != 0 || mSearchMode)
+                && !mSearchResultsMode) {
             mShowNumberOfContacts = true;
         }
 
@@ -811,6 +816,11 @@
             mJoinModeShowAllContacts = true;
         } else if (mSearchMode) {
             setContentView(R.layout.contacts_search_content);
+        } else if (mSearchResultsMode) {
+            setContentView(R.layout.contacts_list_search_results);
+            TextView titleText = (TextView)findViewById(R.id.search_results_for);
+            titleText.setText(Html.fromHtml(getString(R.string.search_results_for,
+                    "<b>" + mInitialFilter + "</b>")));
         } else {
             setContentView(R.layout.contacts_list_content);
         }
@@ -1297,7 +1307,7 @@
             return;
         }
 
-        Intent intent = new Intent(this, ContactsListActivity.class);
+        Intent intent = new Intent(this, SearchResultsActivity.class);
         Intent originalIntent = getIntent();
         Bundle originalExtras = originalIntent.getExtras();
         if (originalExtras != null) {
@@ -2349,6 +2359,11 @@
         // Set the proper empty string
         setEmptyText();
 
+        if (mSearchResultsMode) {
+            TextView foundContactsText = (TextView)findViewById(R.id.search_results_found);
+            foundContactsText.setText(R.string.search_results_searching);
+        }
+
         mAdapter.setLoading(true);
 
         // Cancel any pending queries
@@ -2648,6 +2663,16 @@
         return null;
     }
 
+    // TODO: fix PluralRules to handle zero correctly and use Resources.getQuantityText directly
+    protected String getQuantityText(int count, int zeroResourceId, int pluralResourceId) {
+        if (count == 0) {
+            return getString(zeroResourceId);
+        } else {
+            String format = getResources().getQuantityText(pluralResourceId, count).toString();
+            return String.format(format, count);
+        }
+    }
+
     /**
      * Signal an error to the user.
      */
@@ -2956,11 +2981,7 @@
             String text;
             int count = getRealCount();
 
-            if (mMode == MODE_QUERY || mMode == MODE_QUERY_PICK || mMode == MODE_QUERY_PICK_PHONE
-                    || mMode == MODE_QUERY_PICK_TO_EDIT) {
-                text = getQuantityText(count, R.string.listFoundAllContactsZero,
-                        R.plurals.listFoundAllContacts);
-            } else if (mSearchMode && !TextUtils.isEmpty(getTextFilter())) {
+            if (mSearchMode && !TextUtils.isEmpty(getTextFilter())) {
                 text = getQuantityText(count, R.string.listFoundAllContactsZero,
                         R.plurals.searchFoundContacts);
             } else {
@@ -2976,16 +2997,6 @@
             return view;
         }
 
-        // TODO: fix PluralRules to handle zero correctly and use Resources.getQuantityText directly
-        private String getQuantityText(int count, int zeroResourceId, int pluralResourceId) {
-            if (count == 0) {
-                return getString(zeroResourceId);
-            } else {
-                String format = getResources().getQuantityText(pluralResourceId, count).toString();
-                return String.format(format, count);
-            }
-        }
-
         private boolean isShowAllContactsItemPosition(int position) {
             return mMode == MODE_JOIN_CONTACT && mJoinModeShowAllContacts
                     && mSuggestionsCursorCount != 0 && position == mSuggestionsCursorCount + 2;
@@ -3319,6 +3330,13 @@
                 }
             }
 
+            if (cursor != null && mSearchResultsMode) {
+                TextView foundContactsText = (TextView)findViewById(R.id.search_results_found);
+                String text = getQuantityText(cursor.getCount(), R.string.listFoundAllContactsZero,
+                        R.plurals.listFoundAllContacts);
+                foundContactsText.setText(text);
+            }
+
             super.changeCursor(cursor);
             // Update the indexer for the fast scroll widget
             updateIndexer(cursor);
diff --git a/src/com/android/contacts/SearchResultsActivity.java b/src/com/android/contacts/SearchResultsActivity.java
new file mode 100644
index 0000000..09f0014
--- /dev/null
+++ b/src/com/android/contacts/SearchResultsActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2007 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;
+
+/**
+ * The activity that displays the list of contact search results.  We need a separate
+ * class because it uses a different theme from {@link ContactsListActivity}.
+ */
+public class SearchResultsActivity extends ContactsListActivity {
+}
