diff --git a/src/com/android/dialer/list/SearchFragment.java b/src/com/android/dialer/list/SearchFragment.java
index d993b23..3bea170 100644
--- a/src/com/android/dialer/list/SearchFragment.java
+++ b/src/com/android/dialer/list/SearchFragment.java
@@ -146,15 +146,6 @@
     }
 
     @Override
-    protected void configureAdapter() {
-        super.configureAdapter();
-        final ContactEntryListAdapter adapter = getAdapter();
-        if (adapter != null) {
-            getAdapter().setPinnedPartitionHeadersEnabled(false);
-        }
-    }
-
-    @Override
     protected void onItemClick(int position, long id) {
         final DialerPhoneNumberListAdapter adapter = (DialerPhoneNumberListAdapter) getAdapter();
         final int shortcutType = adapter.getShortcutTypeFromPosition(position);
diff --git a/src/com/android/dialer/list/SmartDialNumberPickerFragment.java b/src/com/android/dialer/list/SmartDialNumberPickerFragment.java
deleted file mode 100644
index 0892de6..0000000
--- a/src/com/android/dialer/list/SmartDialNumberPickerFragment.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2013 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.dialer.list;
-
-import android.content.Loader;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.ContactsContract.Directory;
-import android.util.Log;
-
-import com.android.contacts.common.list.ContactEntryListAdapter;
-import com.android.contacts.common.list.PhoneNumberPickerFragment;
-import com.android.dialer.dialpad.SmartDialCursorLoader;
-
-/**
- * Implements a fragment to load and display SmartDial search results.
- */
-public class SmartDialNumberPickerFragment extends PhoneNumberPickerFragment {
-
-    private static final String TAG = SmartDialNumberPickerFragment.class.getSimpleName();
-
-    /**
-     * Creates a SmartDialListAdapter to display and operate on search results.
-     * @return
-     */
-    @Override
-    protected ContactEntryListAdapter createListAdapter() {
-        SmartDialNumberListAdapter adapter = new SmartDialNumberListAdapter(getActivity());
-        adapter.setDisplayPhotos(true);
-        adapter.setUseCallableUri(super.usesCallableUri());
-        return adapter;
-    }
-
-    /**
-     * Creates a SmartDialCursorLoader object to load query results.
-     */
-    @Override
-    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
-        /** SmartDial does not support Directory Load, falls back to normal search instead. */
-        if (id == getDirectoryLoaderId()) {
-            Log.v(TAG, "Directory load");
-            return super.onCreateLoader(id, args);
-        } else {
-            Log.v(TAG, "Creating loader");
-            final SmartDialNumberListAdapter adapter = (SmartDialNumberListAdapter) getAdapter();
-            SmartDialCursorLoader loader = new SmartDialCursorLoader(super.getContext());
-            adapter.configureLoader(loader);
-            return loader;
-        }
-    }
-
-    /**
-     * Gets the Phone Uri of an entry for calling.
-     * @param position Location of the data of interest.
-     * @return Phone Uri to establish a phone call.
-     */
-    @Override
-    protected Uri getPhoneUri(int position) {
-        final SmartDialNumberListAdapter adapter = (SmartDialNumberListAdapter) getAdapter();
-        return adapter.getDataUri(position);
-    }
-}
