diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8a50b01..f8df82e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -209,7 +209,8 @@
         <activity android:name=".search.SearchActivity"
                   android:label="@string/search_settings"
                   android:icon="@drawable/ic_search_history"
-                  android:parentActivityName="Settings">
+                  android:parentActivityName="Settings"
+                  android:theme="@style/Theme.Settings.NoActionBar">
         </activity>
 
         <!-- Top-level settings -->
diff --git a/res/layout/search_main.xml b/res/layout/search_main.xml
index ab728cd..6de344d 100644
--- a/res/layout/search_main.xml
+++ b/res/layout/search_main.xml
@@ -18,7 +18,6 @@
 -->
 
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-             android:id="@+id/main_content"
-             android:layout_height="match_parent"
-             android:layout_width="match_parent"
-             android:background="@color/material_grey_300"/>
+    android:id="@+id/main_content"
+    android:layout_height="match_parent"
+    android:layout_width="match_parent"/>
diff --git a/res/layout/search_panel.xml b/res/layout/search_panel.xml
index 9445e0c..d097cfe 100644
--- a/res/layout/search_panel.xml
+++ b/res/layout/search_panel.xml
@@ -15,71 +15,80 @@
 -->
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/search_panel"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@drawable/search_panel_list_background">
 
-    <LinearLayout android:id="@+id/layout_recent_searches"
-                  android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:layout_gravity="center"
-                  android:orientation="vertical"
-                  android:layout_alignParentTop="true">
+    <FrameLayout
+        android:id="@+id/layout_results"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@id/feedback_popup"
+        android:orientation="vertical">
 
         <!-- Padding is included in the background -->
-        <android.support.v7.widget.RecyclerView android:id="@+id/list_recent_searches"
-                  android:layout_width="match_parent"
-                  android:layout_height="match_parent"
-                  android:paddingStart="@dimen/dashboard_padding_start"
-                  android:paddingEnd="@dimen/dashboard_padding_end"
-                  android:paddingTop="@dimen/dashboard_padding_top"
-                  android:paddingBottom="@dimen/dashboard_padding_bottom"
-                  android:scrollbarStyle="outsideOverlay"
-                  android:headerDividersEnabled="false"
-                  android:elevation="@dimen/search_panel_elevation"/>
-    </LinearLayout>
-
-    <LinearLayout android:id="@+id/layout_results"
-                  android:layout_width="match_parent"
-                  android:layout_height="fill_parent"
-                  android:layout_above="@id/feedback_popup"
-                  android:orientation="vertical">
-
-        <!-- Padding is included in the background -->
-        <android.support.v7.widget.RecyclerView android:id="@+id/list_results"
-                  android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:paddingStart="@dimen/dashboard_padding_start"
-                  android:paddingEnd="@dimen/dashboard_padding_end"
-                  android:paddingTop="@dimen/dashboard_padding_top"
-                  android:paddingBottom="@dimen/dashboard_padding_bottom"
-                  android:scrollbarStyle="outsideOverlay"
-                  android:scrollbars="vertical"/>
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/list_results"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingStart="@dimen/dashboard_padding_start"
+            android:paddingEnd="@dimen/dashboard_padding_end"
+            android:paddingTop="@dimen/dashboard_padding_top"
+            android:paddingBottom="@dimen/dashboard_padding_bottom"
+            android:scrollbarStyle="outsideOverlay"
+            android:scrollbars="vertical"/>
 
         <LinearLayout
             android:id="@+id/no_results_layout"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:paddingTop="80dp"
+            android:paddingTop="96dp"
             android:orientation="vertical"
             android:visibility="gone">
 
+            <Space
+                android:layout_width="match_parent"
+                android:layout_height="?android:attr/actionBarSize"/>
+
             <ImageView
-            android:layout_height="160dp"
-            android:layout_width="160dp"
-            android:layout_gravity="center_horizontal"
-            android:src="@drawable/empty_search_results"/>
+                android:layout_height="160dp"
+                android:layout_width="160dp"
+                android:layout_gravity="center_horizontal"
+                android:src="@drawable/empty_search_results"/>
 
             <TextView
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:paddingTop="24dp"
-            android:textSize="18sp"
-            android:text="@string/search_settings_no_results"
-            android:gravity="center"/>
+                android:layout_height="wrap_content"
+                android:layout_width="match_parent"
+                android:paddingTop="24dp"
+                android:textSize="18sp"
+                android:text="@string/search_settings_no_results"
+                android:gravity="center"/>
+
         </LinearLayout>
-    </LinearLayout>
+
+        <android.support.v7.widget.CardView
+            android:id="@+id/search_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/search_bar_margin"
+            app:cardCornerRadius="2dp"
+            app:cardBackgroundColor="?android:attr/colorBackground"
+            app:cardElevation="2dp">
+
+            <SearchView
+                android:id="@+id/search_view"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:iconifiedByDefault="false"
+                android:imeOptions="actionSearch|flagNoExtractUi"
+                android:theme="?android:attr/actionBarTheme"/>
+
+        </android.support.v7.widget.CardView>
+
+    </FrameLayout>
 
     <include layout="@layout/search_feedback"/>
+
 </RelativeLayout>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 006788f..0b883e4 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -206,6 +206,12 @@
         <item name="switchBarTheme">@style/ThemeOverlay.SwitchBar.SubSettings</item>
     </style>
 
+    <!-- Variant of the settings theme with no action bar. -->
+    <style name="Theme.Settings.NoActionBar">
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowNoTitle">true</item>
+    </style>
+
     <style name="Theme.ProvisioningActivity" parent="@android:style/Theme.Translucent.NoTitleBar">
         <item name="android:windowAnimationStyle">@null</item>
         <item name="android:windowIsTranslucent">true</item>
diff --git a/src/com/android/settings/search/HeaderDecorator.java b/src/com/android/settings/search/HeaderDecorator.java
new file mode 100644
index 0000000..bff344b
--- /dev/null
+++ b/src/com/android/settings/search/HeaderDecorator.java
@@ -0,0 +1,43 @@
+/*
+ * 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.settings.search;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Rect;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import com.android.settings.R;
+
+public class HeaderDecorator extends RecyclerView.ItemDecoration {
+    @Override
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
+            RecyclerView.State state) {
+        super.getItemOffsets(outRect, view, parent, state);
+        if (parent.getChildAdapterPosition(view) > 0) {
+            return;
+        }
+
+        Context context = view.getContext();
+        TypedArray ta = context.obtainStyledAttributes(new int[]{android.R.attr.actionBarSize});
+        outRect.top = ta.getDimensionPixelSize(0, 0);
+        ta.recycle();
+
+        outRect.top += 2 * context.getResources().getDimensionPixelSize(R.dimen.search_bar_margin);
+    }
+}
diff --git a/src/com/android/settings/search/SearchFragment.java b/src/com/android/settings/search/SearchFragment.java
index 1271900..6b07f2d 100644
--- a/src/com/android/settings/search/SearchFragment.java
+++ b/src/com/android/settings/search/SearchFragment.java
@@ -17,7 +17,6 @@
 
 package com.android.settings.search;
 
-import android.app.ActionBar;
 import android.app.Activity;
 import android.app.LoaderManager;
 import android.content.Context;
@@ -34,7 +33,6 @@
 import android.view.ViewGroup;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.LinearLayout;
-import android.widget.LinearLayout.LayoutParams;
 import android.widget.SearchView;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -64,9 +62,6 @@
         LoaderManager.LoaderCallbacks<Set<? extends SearchResult>>, IndexingCallback {
     private static final String TAG = "SearchFragment";
 
-    @VisibleForTesting
-    static final int SEARCH_TAG = "SearchViewTag".hashCode();
-
     // State values
     private static final String STATE_QUERY = "state_query";
     private static final String STATE_SHOWING_SAVED_QUERY = "state_showing_saved_query";
@@ -99,12 +94,12 @@
     @VisibleForTesting
     SavedQueryController mSavedQueryController;
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     SearchFeatureProvider mSearchFeatureProvider;
 
     private SearchResultsAdapter mSearchAdapter;
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     RecyclerView mResultsRecyclerView;
     @VisibleForTesting
     SearchView mSearchView;
@@ -153,13 +148,6 @@
         }
 
         final Activity activity = getActivity();
-        final ActionBar actionBar = activity.getActionBar();
-        mSearchView = makeSearchView(actionBar, mQuery);
-        actionBar.setCustomView(mSearchView);
-        actionBar.setDisplayShowCustomEnabled(true);
-        actionBar.setDisplayShowTitleEnabled(false);
-        mSearchView.requestFocus();
-
         // Run the Index update only if we have some space
         if (!Utils.isLowStorage(activity)) {
             mSearchFeatureProvider.updateIndex(activity, this /* indexingCallback */);
@@ -176,8 +164,14 @@
         mResultsRecyclerView.setAdapter(mSearchAdapter);
         mResultsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
         mResultsRecyclerView.addOnScrollListener(mScrollListener);
+        mResultsRecyclerView.addItemDecoration(new HeaderDecorator());
 
         mNoResultsView = view.findViewById(R.id.no_results_layout);
+
+        mSearchView = view.findViewById(R.id.search_view);
+        mSearchView.setQuery(mQuery, false /* submitQuery */);
+        mSearchView.setOnQueryTextListener(this);
+        mSearchView.requestFocus();
         return view;
     }
 
@@ -371,19 +365,6 @@
         onQueryTextChange(query);
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    SearchView makeSearchView(ActionBar actionBar, String query) {
-        final SearchView searchView = new SearchView(actionBar.getThemedContext());
-        searchView.setIconifiedByDefault(false);
-        searchView.setQuery(query, false /* submitQuery */);
-        searchView.setOnQueryTextListener(this);
-        searchView.setTag(SEARCH_TAG, searchView);
-        final LayoutParams lp =
-                new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
-        searchView.setLayoutParams(lp);
-        return searchView;
-    }
-
     private void hideKeyboard() {
         final Activity activity = getActivity();
         if (activity != null) {
diff --git a/tests/app/src/com/android/settings/search/SearchFragmentEspressoTest.java b/tests/app/src/com/android/settings/search/SearchFragmentEspressoTest.java
index 2d89721..d342881 100644
--- a/tests/app/src/com/android/settings/search/SearchFragmentEspressoTest.java
+++ b/tests/app/src/com/android/settings/search/SearchFragmentEspressoTest.java
@@ -28,11 +28,13 @@
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.matcher.ViewMatchers.hasFocus;
 import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
-import static android.support.test.espresso.matcher.ViewMatchers.withTagKey;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
 import static android.support.test.espresso.assertion.ViewAssertions.matches;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.core.AllOf.allOf;
 
+import com.android.settings.R;
+
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
@@ -43,7 +45,7 @@
 
     @Test
     public void test_OpenKeyboardOnSearchLaunch() {
-        onView(allOf(hasFocus(), withTagKey(SearchFragment.SEARCH_TAG)))
+        onView(allOf(hasFocus(), withId(R.id.search_view)))
                 .check(matches(withClassName(containsString(SearchView.class.getName()))));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/SettingsRobolectricTestRunner.java b/tests/robotests/src/com/android/settings/SettingsRobolectricTestRunner.java
index e063f88..80b95d8 100644
--- a/tests/robotests/src/com/android/settings/SettingsRobolectricTestRunner.java
+++ b/tests/robotests/src/com/android/settings/SettingsRobolectricTestRunner.java
@@ -93,6 +93,10 @@
                         getPackageName(),
                         Fs.fileFromPath("./frameworks/support/v7/appcompat/res"),
                         null));
+                paths.add(new ResourcePath(
+                        getPackageName(),
+                        Fs.fileFromPath("./frameworks/support/v7/cardview/res"),
+                        null));
                 return paths;
             }
         };
diff --git a/tests/robotests/src/com/android/settings/search/HeaderDecoratorTest.java b/tests/robotests/src/com/android/settings/search/HeaderDecoratorTest.java
new file mode 100644
index 0000000..4fe454a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/search/HeaderDecoratorTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.settings.search;
+
+import android.graphics.Rect;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class HeaderDecoratorTest {
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private View mView;
+    @Mock
+    private RecyclerView mRecyclerView;
+    @Mock
+    private RecyclerView.LayoutParams mLayoutParams;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mView.getLayoutParams()).thenReturn(mLayoutParams);
+    }
+
+    @Test
+    public void testgetItemOffsets_positionZero_headerAdded() {
+        HeaderDecorator decorator = new HeaderDecorator();
+        Rect outRect = new Rect();
+        when(mRecyclerView.getChildAdapterPosition(any(View.class))).thenReturn(0);
+        when(mView.getContext().obtainStyledAttributes(any(int[].class))
+                .getDimensionPixelSize(0, 0)).thenReturn(20);
+        when(mView.getContext().getResources().getDimensionPixelSize(R.dimen.search_bar_margin))
+                .thenReturn(5);
+
+        decorator.getItemOffsets(outRect, mView, mRecyclerView, null);
+
+        assertThat(outRect).isEqualTo(new Rect(0, 30, 0, 0));
+    }
+
+    @Test
+    public void testgetItemOffsets_positionGreaterThanZero_noDecoration() {
+        HeaderDecorator decorator = new HeaderDecorator();
+        Rect outRect = new Rect();
+        when(mRecyclerView.getChildAdapterPosition(any(View.class))).thenReturn(1);
+
+        decorator.getItemOffsets(outRect, mView, mRecyclerView, null);
+
+        assertThat(outRect).isEqualTo(new Rect(0, 0, 0, 0));
+    }
+}
