diff --git a/Android.mk b/Android.mk
index 0d7754c..bd0c9de 100644
--- a/Android.mk
+++ b/Android.mk
@@ -7,6 +7,12 @@
 contacts_common_dir := ../ContactsCommon
 phone_common_dir := ../PhoneCommon
 
+ifeq ($(TARGET_BUILD_APPS),)
+support_library_root_dir := frameworks/support
+else
+support_library_root_dir := prebuilts/sdk/current/support
+endif
+
 src_dirs := src \
     $(incallui_dir)/src \
     $(contacts_common_dir)/src \
@@ -19,10 +25,10 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
 LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs)) \
-    frameworks/support/v7/appcompat/res \
-    frameworks/support/v7/cardview/res \
-    frameworks/support/v7/recyclerview/res \
-    frameworks/support/design/res
+    $(support_library_root_dir)/v7/cardview/res \
+    $(support_library_root_dir)/v7/recyclerview/res \
+    $(support_library_root_dir)/v7/appcompat/res \
+    $(support_library_root_dir)/design/res
 
 LOCAL_AAPT_FLAGS := \
     --auto-add-overlay \
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7d6e505..9267d06 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -17,8 +17,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.dialer"
     coreApp="true"
-    android:versionCode="20302"
-    android:versionName="2.3.02">
+    android:versionCode="20303"
+    android:versionName="2.3.03">
 
     <uses-sdk
         android:minSdkVersion="23"
@@ -148,7 +148,7 @@
               android:exported="false">
         </activity>
 
-        <activity android:name="com.android.dialer.filterednumber.ManageBlockedNumbersActivity"
+        <activity android:name="com.android.dialer.filterednumber.BlockedNumbersSettingsActivity"
             android:label="@string/manage_blocked_numbers_label"
             android:parentActivityName="com.android.dialer.settings.DialerSettingsActivity"
             android:theme="@style/ManageBlockedNumbersStyle"
diff --git a/res/drawable/blocked_number_item_background.xml b/res/drawable/ic_blocked_numbers_settings_add.xml
similarity index 63%
rename from res/drawable/blocked_number_item_background.xml
rename to res/drawable/ic_blocked_numbers_settings_add.xml
index acfea20..adcf906 100644
--- a/res/drawable/blocked_number_item_background.xml
+++ b/res/drawable/ic_blocked_numbers_settings_add.xml
@@ -15,15 +15,6 @@
      limitations under the License.
 -->
 
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-    <item>
-        <shape android:shape="rectangle">
-            <solid android:color="@color/divider_line_color" />
-        </shape>
-    </item>
-    <item android:bottom="1dp">
-        <shape android:shape="rectangle">
-            <solid android:color="@android:color/white" />
-        </shape>
-    </item>
-</layer-list>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_add_24dp"
+    android:tint="@color/blocked_number_icon_tint" />
diff --git a/res/layout/blocked_number_fragment.xml b/res/layout/blocked_number_fragment.xml
index 7aff06e..4bc2085 100644
--- a/res/layout/blocked_number_fragment.xml
+++ b/res/layout/blocked_number_fragment.xml
@@ -18,7 +18,6 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
-    android:paddingTop="?android:attr/actionBarSize"
     android:background="@color/blocked_number_background">
 
     <ListView android:id="@id/android:list"
diff --git a/res/layout/blocked_number_header.xml b/res/layout/blocked_number_header.xml
index ce1d4fe..50a3dc8 100644
--- a/res/layout/blocked_number_header.xml
+++ b/res/layout/blocked_number_header.xml
@@ -17,7 +17,8 @@
     xmlns:card_view="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:focusable="false">
 
     <LinearLayout android:id="@+id/blocked_numbers_disabled_for_emergency"
         android:layout_width="match_parent"
@@ -25,6 +26,7 @@
         android:orientation="vertical"
         android:layout_marginBottom="8dp"
         android:padding="16dp"
+        android:focusable="true"
         android:visibility="gone">
 
         <TextView
@@ -43,39 +45,6 @@
 
     </LinearLayout>
 
-
-    <android.support.v7.widget.CardView
-        android:id="@+id/hide_blocked_calls_setting"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="8dp"
-        card_view:cardCornerRadius="0dp">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:gravity="center_vertical"
-            android:padding="16dp"
-            android:paddingEnd="8dp"
-            android:background="@android:color/white">
-
-            <TextView
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:text="@string/blocked_call_settings_hide_setting"
-                style="@style/BlockedNumbersDescriptionTextStyle" />
-
-            <Switch android:id="@+id/hide_blocked_calls_switch"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginLeft="40dp" />
-
-        </LinearLayout>
-
-    </android.support.v7.widget.CardView>
-
     <android.support.v7.widget.CardView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -85,7 +54,8 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"
-            android:background="@android:color/white">
+            android:background="@android:color/white"
+            android:focusable="true">
 
             <TextView android:id="@+id/textView"
                 android:layout_width="wrap_content"
@@ -131,18 +101,29 @@
                     android:layout_height="1dp"
                     android:layout_below="@id/import_button"
                     android:background="@color/divider_line_color"
-                    android:layout_marginTop="8dp"
-                    android:layout_marginBottom="8dp" />
+                    android:layout_marginTop="8dp" />
 
             </RelativeLayout>
 
-            <Button android:id="@+id/add_number_button"
-                android:layout_width="wrap_content"
+            <TextView android:id="@+id/add_number_textview"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_gravity="end"
-                android:layout_marginEnd="@dimen/blocked_number_container_padding"
-                android:layout_marginBottom="8dp"
-                android:text="@string/blockNumber" />
+                android:background="?android:attr/selectableItemBackground"
+                android:textColor="@color/blocked_number_primary_text_color"
+                android:textSize="@dimen/blocked_number_primary_text_size"
+                android:paddingTop="24dp"
+                android:paddingBottom="24dp"
+                android:paddingEnd="@dimen/blocked_number_container_padding"
+                android:paddingStart="24dp"
+                android:drawableStart="@drawable/ic_blocked_numbers_settings_add"
+                android:drawablePadding="24dp"
+                android:text="@string/addBlockedNumber" />
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginStart="72dp"
+                android:background="@color/divider_line_color" />
 
         </LinearLayout>
 
diff --git a/res/layout/blocked_number_item.xml b/res/layout/blocked_number_item.xml
index 79ca42e..82e2207 100644
--- a/res/layout/blocked_number_item.xml
+++ b/res/layout/blocked_number_item.xml
@@ -25,7 +25,7 @@
     android:gravity="center_vertical"
     android:orientation="horizontal"
     android:focusable="true"
-    android:background="@drawable/blocked_number_item_background">
+    android:background="@android:color/white">
 
     <QuickContactBadge
         android:id="@+id/quick_contact_photo"
@@ -69,7 +69,7 @@
         android:background="?android:attr/selectableItemBackgroundBorderless"
         android:src="@drawable/ic_remove"
         android:scaleType="center"
-        android:tint="@color/delete_icon_tint"
+        android:tint="@color/blocked_number_icon_tint"
         android:contentDescription="@string/description_blocked_number_list_delete" />
 
 </LinearLayout>
diff --git a/res/layout/blocked_numbers_activity.xml b/res/layout/blocked_numbers_activity.xml
index b5810b7..d28eaf8 100644
--- a/res/layout/blocked_numbers_activity.xml
+++ b/res/layout/blocked_numbers_activity.xml
@@ -17,5 +17,6 @@
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/blocked_numbers_activity_container"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:layout_marginTop="@dimen/action_bar_height">
 </FrameLayout>
diff --git a/res/layout/call_log_list_item_actions.xml b/res/layout/call_log_list_item_actions.xml
index 262a176..ca00405 100644
--- a/res/layout/call_log_list_item_actions.xml
+++ b/res/layout/call_log_list_item_actions.xml
@@ -19,7 +19,6 @@
     android:gravity="center_vertical"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingBottom="@dimen/call_log_actions_bottom_padding"
     android:orientation="vertical"
     android:visibility="visible"
     android:importantForAccessibility="1">
diff --git a/res/layout/view_numbers_to_import_fragment.xml b/res/layout/view_numbers_to_import_fragment.xml
index c79e69a..1836f8d 100644
--- a/res/layout/view_numbers_to_import_fragment.xml
+++ b/res/layout/view_numbers_to_import_fragment.xml
@@ -18,7 +18,6 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
-    android:paddingTop="?android:attr/actionBarSize"
     android:background="@color/blocked_number_background">
 
     <ListView android:id="@id/android:list"
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 76bc093..2ca697f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -127,7 +127,7 @@
     <color name="blocked_contact_background">#afafaf</color>
     <color name="blocked_number_primary_text_color">@color/dialtacts_primary_text_color</color>
     <color name="blocked_number_secondary_text_color">@color/dialtacts_secondary_text_color</color>
-    <color name="delete_icon_tint">#6D6D6D</color>
+    <color name="blocked_number_icon_tint">#616161</color>
     <color name="blocked_number_background">#E0E0E0</color>
     <color name="blocked_number_accent_color">#42A5F5</color>
     <color name="blocked_number_block_color">#F44336</color>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b5703c6..4d4fb1e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -855,12 +855,6 @@
         You previously marked some callers to be automatically sent to voicemail via other apps.
     </string>
 
-    <!-- Text for a setting to hide blocked calls and automatically delete new voicemail from block
-         numbers. [CHAR LIMIT=NONE] -->
-    <string name="blocked_call_settings_hide_setting">
-        Hide calls and automatically delete new voicemails from blocked numbers.
-    </string>
-
     <!-- Label for button to view numbers of contacts previous marked to be sent to voicemail.
          [CHAR_LIMIT=20] -->
     <string name="blocked_call_settings_view_numbers_button">View Numbers</string>
@@ -878,17 +872,11 @@
     <string name="description_blocked_number_list_delete">Unblock number</string>
 
     <!-- Button to bring up UI to add a number to the blocked call list. [CHAR LIMIT=40] -->
-    <string name="blockNumber">Add number</string>
+    <string name="addBlockedNumber">Add number</string>
 
     <!-- Heading for the block list in the "Spam and blocked cal)ls" settings. [CHAR LIMIT=64] -->
     <string name="blockList">Block list</string>
 
-    <!-- Label for progress dialog when validating a number to be added to the block list.
-        [CHAR LIMIT=64] -->
-    <string name="checkingNumber">Checking
-        <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
-    </string>
-
     <!-- Error message shown when user tries to add invalid number to the block list.
         [CHAR LIMIT=64] -->
     <string name="invalidNumber"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
@@ -899,6 +887,19 @@
     <string name="alreadyBlocked"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
         is already blocked.</string>
 
+    <!-- Title of notification telling the user that call blocking has been temporarily disabled.
+         [CHAR LIMIT=56] -->
+    <string name="call_blocking_disabled_notification_title">
+        Call blocking disabled for 48 hours
+    </string>
+
+    <!-- Text for notification which provides the reason that call blocking has been temporarily
+         disabled. Namely, we disable call blocking after an emergency call in case of return
+         phone calls made by emergency services. [CHAR LIMIT=64] -->
+    <string name="call_blocking_disabled_notification_text">
+        Disabled because an emergency call was made.
+    </string>
+
     <!-- Label for the phone account settings [CHAR LIMIT=30] -->
     <string name="phone_account_settings_label">Calling accounts</string>
 
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 2121e98..ab63ddc 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -55,7 +55,7 @@
 import com.android.dialer.calllog.PhoneAccountUtils;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.IntentUtil.CallIntentBuilder;
@@ -71,7 +71,7 @@
  */
 public class CallDetailActivity extends AppCompatActivity
         implements MenuItem.OnMenuItemClickListener, View.OnClickListener,
-                FilterNumberDialogFragment.Callback {
+                BlockNumberDialogFragment.Callback {
     private static final String TAG = CallDetailActivity.class.getSimpleName();
 
      /** A long array extra containing ids of call log entries to display. */
@@ -196,7 +196,6 @@
     private PhoneCallDetails mDetails;
     protected String mNumber;
     private Uri mVoicemailUri;
-    private String mDefaultCountryIso;
     private String mDisplayNumber;
 
     private ListView mHistoryList;
@@ -242,7 +241,6 @@
         mCallerName = (TextView) findViewById(R.id.caller_name);
         mCallerNumber = (TextView) findViewById(R.id.caller_number);
         mAccountLabel = (TextView) findViewById(R.id.phone_account_label);
-        mDefaultCountryIso = GeoUtil.getCurrentCountryIso(this);
         mContactPhotoManager = ContactPhotoManager.getInstance(this);
 
         mCallButton = findViewById(R.id.call_back_button);
@@ -358,9 +356,8 @@
     public void onClick(View view) {
         switch(view.getId()) {
             case R.id.call_detail_action_block:
-                FilterNumberDialogFragment.show(
+                BlockNumberDialogFragment.show(
                         mBlockedNumberId,
-                        null /* normalizedNumber */,
                         mNumber,
                         mDetails.countryIso,
                         mDisplayNumber,
@@ -392,11 +389,12 @@
     }
 
     private void updatePhotoAndBlockActionItem() {
-        if (mDetails == null || !FilteredNumbersUtil.canBlockNumber(this, mNumber)) {
+        if (mDetails == null ||
+                !FilteredNumbersUtil.canBlockNumber(this, mNumber, mDetails.countryIso)) {
             return;
         }
 
-        boolean failed = mFilteredNumberAsyncQueryHandler.startBlockedQuery(
+        final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
                 new OnCheckBlockedListener() {
                     @Override
                     public void onCheckComplete(Integer id) {
@@ -405,9 +403,9 @@
                         updateContactPhoto();
                         updateBlockActionItem();
                     }
-                }, null, mNumber, mDetails.countryIso);
+                }, mNumber, mDetails.countryIso);
 
-        if (failed) {
+        if (!success) {
             updateContactPhoto();
             updateBlockActionItem();
         }
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index b395723..9f1af83 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -50,12 +50,13 @@
 import com.android.dialer.contactinfo.NumberWithCountryIso;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.util.PhoneNumberUtil;
 import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Adapter class to fill in data for the Call Log.
@@ -63,7 +64,7 @@
 public class CallLogAdapter extends GroupingListAdapter
         implements CallLogGroupBuilder.GroupCreator,
                 VoicemailPlaybackPresenter.OnVoicemailDeletedListener,
-                FilterNumberDialogFragment.Callback {
+                BlockNumberDialogFragment.Callback {
 
     /** Interface used to initiate a refresh of the content. */
     public interface CallFetcher {
@@ -71,6 +72,8 @@
     }
 
     private static final int NO_EXPANDED_LIST_ITEM = -1;
+    // ConcurrentHashMap doesn't store null values. Use this value for numbers which aren't blocked.
+    private static final int NOT_BLOCKED = -1;
 
     private static final int VOICEMAIL_PROMO_CARD_POSITION = 0;
 
@@ -91,7 +94,10 @@
     private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
 
     protected ContactInfoCache mContactInfoCache;
-    protected final Map<NumberWithCountryIso, Integer> mBlockedIdCache;
+    // Declaring static, since this can be shared across different instances, such as history and
+    // voicemail, so when the cache is cleared in one instance, it propagates across all instances.
+    private static final Map<NumberWithCountryIso, Integer> mBlockedIdCache =
+            new ConcurrentHashMap<>();
 
     private boolean mIsCallLogActivity;
 
@@ -214,8 +220,7 @@
                 // Only expand if actions are not already expanded, because triggering the expand
                 // function on clicks causes the action views to lose the focus indicator.
                 CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder) host.getTag();
-                if (mVoicemailPlaybackPresenter == null &&
-                        mCurrentlyExpandedPosition != viewHolder.getAdapterPosition()) {
+                if (mCurrentlyExpandedPosition != viewHolder.getAdapterPosition()) {
                     expandViewHolderActions((CallLogListItemViewHolder) host.getTag());
                 }
             }
@@ -258,7 +263,6 @@
         CallTypeHelper callTypeHelper = new CallTypeHelper(resources);
 
         mTelecomCallLogCache = new TelecomCallLogCache(mContext);
-        mBlockedIdCache = new HashMap<>();
         PhoneCallDetailsHelper phoneCallDetailsHelper =
                 new PhoneCallDetailsHelper(mContext, resources, mTelecomCallLogCache);
         mCallLogListItemHelper =
@@ -517,20 +521,21 @@
         // Update the photo, once we know whether the user's number is blocked or not.
         final NumberWithCountryIso blockedIdKey = new NumberWithCountryIso(number, countryIso);
         if (mBlockedIdCache.containsKey(blockedIdKey)) {
-            views.blockId = mBlockedIdCache.get(blockedIdKey);
+            int blockedId = mBlockedIdCache.get(blockedIdKey);
+            views.blockId = blockedId != NOT_BLOCKED ? blockedId : null;
             views.updatePhoto();
         } else {
             views.blockId = null;
-            boolean failed = mFilteredNumberAsyncQueryHandler.startBlockedQuery(
+            final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
                         new OnCheckBlockedListener() {
                     @Override
                     public void onCheckComplete(Integer id) {
-                        mBlockedIdCache.put(blockedIdKey, id);
+                        mBlockedIdCache.put(blockedIdKey, id != null ? id : NOT_BLOCKED);
                         views.blockId = id;
                         views.updatePhoto();
                     }
-                }, null, number, countryIso);
-            if (failed) {
+                }, number, countryIso);
+            if (!success) {
                 views.updatePhoto();
             }
         }
diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
index 2fffaff..7771563 100644
--- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
+++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
@@ -46,7 +46,7 @@
     public enum Tasks {
         DELETE_VOICEMAIL,
         DELETE_CALL,
-        MARK_BLOCKED,
+        DELETE_BLOCKED_CALL,
         MARK_VOICEMAIL_READ,
         GET_CALL_DETAILS,
     }
@@ -81,7 +81,7 @@
         static final int TRANSCRIPTION_COLUMN_INDEX = 11;
     }
 
-    private static class CallLogMarkBlockedQuery {
+    private static class CallLogDeleteBlockedCallQuery {
         static final String[] PROJECTION = new String[] {
             CallLog.Calls._ID,
             CallLog.Calls.DATE
@@ -104,7 +104,7 @@
     // Try to identify if a call log entry corresponds to a number which was blocked. We match by
     // by comparing its creation time to the time it was added in the InCallUi and seeing if they
     // fall within a certain threshold.
-    private static final int MATCH_BLOCKED_CALL_THRESHOLD_MS = 1500;
+    private static final int MATCH_BLOCKED_CALL_THRESHOLD_MS = 3000;
 
     private static AsyncTaskExecutor sAsyncTaskExecutor;
 
@@ -256,15 +256,16 @@
     }
 
     /**
-     * Marks last call made by the number the call type of the specified call as BLOCKED in the call log.
+     * Deletes the last call made by the number within a threshold of the call time added in the
+     * call log, assuming it is a blocked call for which no entry should be shown.
      *
      * @param context The context.
-     * @param number Number of which to mark the most recent call as BLOCKED.
+     * @param number Number of blocked call, for which to delete the call log entry.
      * @param timeAddedMs The time the number was added to InCall, in milliseconds.
      * @param listener The listener to invoke after looking up for a call log entry matching the
      *     number and time added.
      */
-    public static void markCallAsBlocked(
+    public static void deleteBlockedCall(
             final Context context,
             final String number,
             final long timeAddedMs,
@@ -273,23 +274,30 @@
             initTaskExecutor();
         }
 
-        sAsyncTaskExecutor.submit(Tasks.MARK_BLOCKED, new AsyncTask<Void, Void, Long>() {
+        sAsyncTaskExecutor.submit(Tasks.DELETE_BLOCKED_CALL, new AsyncTask<Void, Void, Long>() {
             @Override
             public Long doInBackground(Void... params) {
                 // First, lookup the call log entry of the most recent call with this number.
                 Cursor cursor = context.getContentResolver().query(
                         TelecomUtil.getCallLogUri(context),
-                        CallLogMarkBlockedQuery.PROJECTION,
+                        CallLogDeleteBlockedCallQuery.PROJECTION,
                         CallLog.Calls.NUMBER + "= ?",
                         new String[] { number },
                         CallLog.Calls.DATE + " DESC LIMIT 1");
 
-                // If found, return the call log entry id.
+                // If match is found, delete this call log entry and return the call log entry id.
                 if (cursor.moveToFirst()) {
-                    long creationTime = cursor.getLong(CallLogMarkBlockedQuery.DATE_COLUMN_INDEX);
+                    long creationTime =
+                            cursor.getLong(CallLogDeleteBlockedCallQuery.DATE_COLUMN_INDEX);
                     if (timeAddedMs > creationTime
                             && timeAddedMs - creationTime < MATCH_BLOCKED_CALL_THRESHOLD_MS) {
-                        return cursor.getLong(CallLogMarkBlockedQuery.ID_COLUMN_INDEX);
+                        long callLogEntryId =
+                                cursor.getLong(CallLogDeleteBlockedCallQuery.ID_COLUMN_INDEX);
+                        context.getContentResolver().delete(
+                                TelecomUtil.getCallLogUri(context),
+                                CallLog.Calls._ID + " IN (" + callLogEntryId + ")",
+                                null);
+                        return callLogEntryId;
                     }
                 }
                 return (long) -1;
@@ -300,20 +308,6 @@
                 if (listener != null) {
                     listener.onQueryFinished(callLogEntryId >= 0);
                 }
-
-                if (callLogEntryId < 0) {
-                    return;
-                }
-
-                // Then, update that call log entry to have type BLOCKED.
-                final ContentValues values = new ContentValues();
-                values.put(CallLog.Calls.TYPE, AppCompatConstants.CALLS_BLOCKED_TYPE);
-
-                context.getContentResolver().update(
-                        TelecomUtil.getCallLogUri(context),
-                        values,
-                        CallLog.Calls._ID + "= ?",
-                        new String[] { Long.toString(callLogEntryId) });
             }
         });
     }
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index f84ffd5..3cf58bd 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -125,7 +125,6 @@
     private boolean mRefreshDataRequired = true;
 
     private boolean mHasReadCallLogPermission = false;
-    private boolean mShouldHideBlockedCalls = false;
 
     // Exactly same variable is in Fragment as a package private.
     private boolean mMenuVisible = true;
@@ -211,8 +210,6 @@
         resolver.registerContentObserver(Status.CONTENT_URI, true, mVoicemailStatusObserver);
         setHasOptionsMenu(true);
 
-        mShouldHideBlockedCalls = FilteredNumbersUtil.shouldHideBlockedCalls(getActivity());
-
         if (mCallTypeFilter == Calls.VOICEMAIL_TYPE) {
             mVoicemailPlaybackPresenter = VoicemailPlaybackPresenter
                     .getInstance(activity, state);
@@ -342,10 +339,6 @@
             mRefreshDataRequired = true;
             updateEmptyMessage(mCallTypeFilter);
         }
-        if (mShouldHideBlockedCalls != FilteredNumbersUtil.shouldHideBlockedCalls(getActivity())) {
-            mShouldHideBlockedCalls = !mShouldHideBlockedCalls;
-            mRefreshDataRequired = true;
-        }
 
         mHasReadCallLogPermission = hasReadCallLogPermission;
         refreshData();
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 1bc4410..afe8208 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -48,7 +48,7 @@
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.R;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.PhoneNumberUtil;
@@ -184,7 +184,7 @@
     private final CallLogListItemHelper mCallLogListItemHelper;
     private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
     private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
-    private final FilterNumberDialogFragment.Callback mFilteredNumberDialogCallback;
+    private final BlockNumberDialogFragment.Callback mFilteredNumberDialogCallback;
 
     private final int mPhotoSize;
 
@@ -198,7 +198,7 @@
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter,
             FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
-            FilterNumberDialogFragment.Callback filteredNumberDialogCallback,
+            BlockNumberDialogFragment.Callback filteredNumberDialogCallback,
             View rootView,
             QuickContactBadge quickContactView,
             View primaryActionView,
@@ -247,7 +247,7 @@
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter,
             FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
-            FilterNumberDialogFragment.Callback filteredNumberDialogCallback) {
+            BlockNumberDialogFragment.Callback filteredNumberDialogCallback) {
 
         return new CallLogListItemViewHolder(
                 context,
@@ -303,8 +303,8 @@
                     .setOnMenuItemClickListener(this);
         }
 
-        if (FilteredNumbersUtil.canBlockNumber(mContext, number)) {
-            mFilteredNumberAsyncQueryHandler.startBlockedQuery(
+        if (FilteredNumbersUtil.canBlockNumber(mContext, number, countryIso)) {
+            mFilteredNumberAsyncQueryHandler.isBlockedNumber(
                     new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
                         @Override
                         public void onCheckComplete(Integer id) {
@@ -319,7 +319,7 @@
                             blockItem.setOnMenuItemClickListener(
                                     CallLogListItemViewHolder.this);
                         }
-                    }, info.normalizedNumber, number, countryIso);
+                    }, number, countryIso);
         }
     }
 
@@ -327,9 +327,8 @@
     public boolean onMenuItemClick(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.context_menu_block_number:
-                FilterNumberDialogFragment.show(
+                BlockNumberDialogFragment.show(
                         blockId,
-                        info.normalizedNumber,
                         number,
                         countryIso,
                         displayNumber,
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index 01489c1..3efdce7 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -191,13 +191,10 @@
             selectionArgs.add(Long.toString(newerThan));
         }
 
-        final boolean shouldHideBlockedCalls =
-                FilteredNumbersUtil.shouldHideBlockedCalls(mContext);
-        if (shouldHideBlockedCalls) {
-            where.append(" AND ");
-            where.append("(" + Calls.TYPE + " != ?)");
-            selectionArgs.add(Integer.toString(AppCompatConstants.CALLS_BLOCKED_TYPE));
-        }
+        // Always hide blocked calls.
+        where.append(" AND ");
+        where.append("(" + Calls.TYPE + " != ?)");
+        selectionArgs.add(Integer.toString(AppCompatConstants.CALLS_BLOCKED_TYPE));
 
         final int limit = (mLogLimit == -1) ? NUM_LOGS_TO_DISPLAY : mLogLimit;
         final String selection = where.length() > 0 ? where.toString() : null;
diff --git a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
index 1987b80..635e874 100644
--- a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
+++ b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
@@ -135,9 +135,8 @@
                     mContext, newCall.number, newCall.countryIso, newCall.dateMs)) {
                 itr.remove();
 
-                if (FilteredNumbersUtil.shouldHideBlockedCalls(mContext)) {
-                    mContext.getContentResolver().delete(newCall.voicemailUri, null, null);
-                }
+                // Delete the voicemail.
+                mContext.getContentResolver().delete(newCall.voicemailUri, null, null);
                 continue;
             }
 
diff --git a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
index 25613a6..06aca78 100644
--- a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
+++ b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
@@ -25,6 +25,7 @@
 import android.database.sqlite.SQLiteDatabaseCorruptException;
 import android.net.Uri;
 import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
 
 import com.android.contacts.common.util.PhoneNumberHelper;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
@@ -78,6 +79,14 @@
         public void onUnblockComplete(int rows, ContentValues values);
     }
 
+    public interface OnHasBlockedNumbersListener {
+        /**
+         * @param hasBlockedNumbers {@code true} if any blocked numbers are stored.
+         *     {@code false} otherwise.
+         */
+        public void onHasBlockedNumbers(boolean hasBlockedNumbers);
+    }
+
     @Override
     protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
         if (cookie != null) {
@@ -120,37 +129,34 @@
                 null, null, null);
     }
 
-    /**
-     * Check if the number + country iso given has been blocked.
-     * This method normalizes the number for the lookup if normalizedNumber is null.
-     * @return {@code true} if the number was invalid and couldn't be checked,
-     * {@code false} otherwise,
-     */
-    public final boolean startBlockedQuery(final OnCheckBlockedListener listener,
-                                        String normalizedNumber, String number, String countryIso) {
-        if (normalizedNumber == null) {
-            normalizedNumber = getNormalizedNumber(number, countryIso);
-            if (normalizedNumber == null) {
-                return true;
-            }
-        }
-        startBlockedQuery(listener, normalizedNumber);
-        return false;
-    }
-
-    public static String getNormalizedNumber(String number, String countryIso) {
-        if (PhoneNumberHelper.isUriNumber(number)) {
-            return number;
-        } else {
-            return PhoneNumberUtils.formatNumberToE164(number, countryIso);
-        }
+    public final void hasBlockedNumbers(final OnHasBlockedNumbersListener listener) {
+        startQuery(NO_TOKEN,
+                new Listener() {
+                    @Override
+                    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+                        listener.onHasBlockedNumbers(cursor.getCount() > 0);
+                    }
+                },
+                getContentUri(null),
+                new String[]{ FilteredNumberColumns._ID },
+                FilteredNumberColumns.TYPE + "=" + FilteredNumberTypes.BLOCKED_NUMBER,
+                null,
+                null);
     }
 
     /**
-     * Check if the normalized number given has been blocked.
+     * Check if this number has been blocked.
+     *
+     * @return {@code false} if the number was invalid and couldn't be checked,
+     *     {@code true} otherwise,
      */
-    public final void startBlockedQuery(final OnCheckBlockedListener listener,
-                                        String normalizedNumber) {
+    public final boolean isBlockedNumber(
+            final OnCheckBlockedListener listener, String number, String countryIso) {
+        final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+        if (TextUtils.isEmpty(normalizedNumber)) {
+            return false;
+        }
+
         startQuery(NO_TOKEN,
                 new Listener() {
                     @Override
@@ -170,19 +176,29 @@
                     }
                 },
                 getContentUri(null),
-                new String[]{FilteredNumberColumns._ID, FilteredNumberColumns.TYPE},
+                new String[]{ FilteredNumberColumns._ID, FilteredNumberColumns.TYPE },
                 FilteredNumberColumns.NORMALIZED_NUMBER + " = ?",
-                new String[]{normalizedNumber},
+                new String[]{ normalizedNumber },
                 null);
+
+        return true;
+    }
+
+    public final void blockNumber(
+            final OnBlockNumberListener listener, String number, String countryIso) {
+        blockNumber(listener, null, number, countryIso);
     }
 
     /**
      * Add a number manually blocked by the user.
      */
-    public final void blockNumber(final OnBlockNumberListener listener,
-                                  String normalizedNumber, String number, String countryIso) {
+    public final void blockNumber(
+            final OnBlockNumberListener listener,
+            String normalizedNumber,
+            String number,
+            String countryIso) {
         if (normalizedNumber == null) {
-            normalizedNumber = getNormalizedNumber(number, countryIso);
+            normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
         }
         ContentValues v = new ContentValues();
         v.put(FilteredNumberColumns.NORMALIZED_NUMBER, normalizedNumber);
diff --git a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java b/src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
similarity index 85%
rename from src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java
rename to src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
index 8473e32..7a94eeb 100644
--- a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java
+++ b/src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
@@ -21,11 +21,13 @@
 import android.app.DialogFragment;
 import android.app.FragmentManager;
 import android.content.ContentValues;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
 import android.support.design.widget.Snackbar;
+import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.Toast;
@@ -35,7 +37,11 @@
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
 
-public class FilterNumberDialogFragment extends DialogFragment {
+/**
+ * Fragment for confirming and enacting blocking/unblocking a number. Also invokes snackbar
+ * providing undo functionality.
+ */
+public class BlockNumberDialogFragment extends DialogFragment {
 
     /**
      * Use a callback interface to update UI after success/undo. Favor this approach over other
@@ -49,17 +55,17 @@
         public void onChangeFilteredNumberUndo();
     }
 
-    private static final String BLOCK_DIALOG_FRAGMENT = "blockUnblockNumberDialog";
+    private static final String BLOCK_DIALOG_FRAGMENT = "BlockNumberDialog";
 
     private static final String ARG_BLOCK_ID = "argBlockId";
-    private static final String ARG_NORMALIZED_NUMBER = "argNormalizedNumber";
     private static final String ARG_NUMBER = "argNumber";
     private static final String ARG_COUNTRY_ISO = "argCountryIso";
     private static final String ARG_DISPLAY_NUMBER = "argDisplayNumber";
     private static final String ARG_PARENT_VIEW_ID = "parentViewId";
 
+    private String mNumber;
     private String mDisplayNumber;
-    private String mNormalizedNumber;
+    private String mCountryIso;
 
     private FilteredNumberAsyncQueryHandler mHandler;
     private View mParentView;
@@ -67,28 +73,26 @@
 
     public static void show(
             Integer blockId,
-            String normalizedNumber,
             String number,
             String countryIso,
             String displayNumber,
             Integer parentViewId,
             FragmentManager fragmentManager,
             Callback callback) {
-        final FilterNumberDialogFragment newFragment = FilterNumberDialogFragment.newInstance(
-                blockId, normalizedNumber, number, countryIso, displayNumber, parentViewId);
+        final BlockNumberDialogFragment newFragment = BlockNumberDialogFragment.newInstance(
+                blockId, number, countryIso, displayNumber, parentViewId);
 
         newFragment.setCallback(callback);
-        newFragment.show(fragmentManager, FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
+        newFragment.show(fragmentManager, BlockNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
     }
 
-    private static FilterNumberDialogFragment newInstance(
+    private static BlockNumberDialogFragment newInstance(
             Integer blockId,
-            String normalizedNumber,
             String number,
             String countryIso,
             String displayNumber,
             Integer parentViewId) {
-        final FilterNumberDialogFragment fragment = new FilterNumberDialogFragment();
+        final BlockNumberDialogFragment fragment = new BlockNumberDialogFragment();
         final Bundle args = new Bundle();
         if (blockId != null) {
             args.putInt(ARG_BLOCK_ID, blockId.intValue());
@@ -96,7 +100,6 @@
         if (parentViewId != null) {
             args.putInt(ARG_PARENT_VIEW_ID, parentViewId.intValue());
         }
-        args.putString(ARG_NORMALIZED_NUMBER, normalizedNumber);
         args.putString(ARG_NUMBER, number);
         args.putString(ARG_COUNTRY_ISO, countryIso);
         args.putString(ARG_DISPLAY_NUMBER, displayNumber);
@@ -109,12 +112,12 @@
         super.onCreateDialog(savedInstanceState);
         final boolean isBlocked = getArguments().containsKey(ARG_BLOCK_ID);
 
+        mNumber = getArguments().getString(ARG_NUMBER);
         mDisplayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
-        if (TextUtils.isEmpty(mNormalizedNumber)) {
-            String number = getArguments().getString(ARG_NUMBER);
-            String countryIso = getArguments().getString(ARG_COUNTRY_ISO);
-            mNormalizedNumber =
-                    FilteredNumberAsyncQueryHandler.getNormalizedNumber(number, countryIso);
+        mCountryIso = getArguments().getString(ARG_COUNTRY_ISO);
+
+        if (TextUtils.isEmpty(mDisplayNumber)) {
+            mDisplayNumber = mNumber;
         }
 
         mHandler = new FilteredNumberAsyncQueryHandler(getContext().getContentResolver());
@@ -148,11 +151,9 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-        String number = getArguments().getString(ARG_NUMBER);
-        if (TextUtils.isEmpty(mNormalizedNumber) ||
-                !FilteredNumbersUtil.canBlockNumber(getActivity(), number)) {
+        if (!FilteredNumbersUtil.canBlockNumber(getActivity(), mNumber, mCountryIso)) {
             dismiss();
-            Toast.makeText(getContext(), getString(R.string.invalidNumber, number),
+            Toast.makeText(getContext(), getString(R.string.invalidNumber, mDisplayNumber),
                     Toast.LENGTH_SHORT).show();
         }
     }
@@ -187,6 +188,7 @@
         final String undoMessage = getUnblockedMessage();
         final Callback callback = mCallback;
         final int actionTextColor = getActionTextColor();
+        final Context context = getContext();
 
         final OnUnblockNumberListener onUndoListener = new OnUnblockNumberListener() {
             @Override
@@ -217,14 +219,17 @@
                 if (callback != null) {
                     callback.onChangeFilteredNumberSuccess();
                 }
+
+                if (context != null && FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
+                    FilteredNumbersUtil.maybeNotifyCallBlockingDisabled(context);
+                }
             }
         };
 
         mHandler.blockNumber(
                 onBlockNumberListener,
-                getArguments().getString(ARG_NORMALIZED_NUMBER),
-                getArguments().getString(ARG_NUMBER),
-                getArguments().getString(ARG_COUNTRY_ISO));
+                mNumber,
+                mCountryIso);
     }
 
     private void unblockNumber() {
diff --git a/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java b/src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
similarity index 90%
rename from src/com/android/dialer/filterednumber/BlockedNumberAdapter.java
rename to src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
index 7777aeb..ad9e7a6 100644
--- a/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
@@ -26,9 +26,9 @@
 import com.android.dialer.calllog.ContactInfoHelper;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
 
-public class BlockedNumberAdapter extends NumberAdapter {
+public class BlockedNumbersAdapter extends NumbersAdapter {
 
-    private BlockedNumberAdapter(
+    private BlockedNumbersAdapter(
             Context context,
             FragmentManager fragmentManager,
             ContactInfoHelper contactInfoHelper,
@@ -36,9 +36,9 @@
         super(context, fragmentManager, contactInfoHelper, contactPhotoManager);
     }
 
-    public static BlockedNumberAdapter newBlockedNumberAdapter(
+    public static BlockedNumbersAdapter newBlockedNumbersAdapter(
             Context context, FragmentManager fragmentManager) {
-        return new BlockedNumberAdapter(
+        return new BlockedNumbersAdapter(
                 context,
                 fragmentManager,
                 new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context)),
@@ -59,9 +59,8 @@
         deleteButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                FilterNumberDialogFragment.show(
+                BlockNumberDialogFragment.show(
                         id,
-                        normalizedNumber,
                         number,
                         countryIso,
                         number,
diff --git a/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java b/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
index 7788cbe..a2a716f 100644
--- a/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
@@ -15,6 +15,7 @@
  */
 package com.android.dialer.filterednumber;
 
+import android.app.Activity;
 import android.app.ListFragment;
 import android.app.LoaderManager;
 import android.content.Context;
@@ -35,7 +36,6 @@
 import android.widget.Switch;
 
 import com.android.dialer.R;
-import com.android.dialer.calllog.CallLogQueryHandler;
 import com.android.dialer.database.FilteredNumberContract;
 import com.android.dialer.filterednumber.FilteredNumbersUtil.CheckForSendToVoicemailContactListener;
 import com.android.dialer.filterednumber.FilteredNumbersUtil.ImportSendToVoicemailContactsListener;
@@ -43,14 +43,11 @@
 import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
 
 public class BlockedNumbersFragment extends ListFragment
-        implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener,
-                CallLogQueryHandler.Listener {
+        implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {
 
-    private BlockedNumberAdapter mAdapter;
-    private CallLogQueryHandler mCallLogQueryHandler;
+    private BlockedNumbersAdapter mAdapter;
     private VoicemailStatusHelper mVoicemailStatusHelper;
 
-    private Switch mHideSettingSwitch;
     private View mImportSettings;
     private View mBlockedNumbersDisabledForEmergency;
 
@@ -63,30 +60,20 @@
         getListView().addHeaderView(inflater.inflate(R.layout.blocked_number_header, null));
 
         if (mAdapter == null) {
-            mAdapter = BlockedNumberAdapter.newBlockedNumberAdapter(
+            mAdapter = BlockedNumbersAdapter.newBlockedNumbersAdapter(
                     getContext(), getActivity().getFragmentManager());
         }
         setListAdapter(mAdapter);
 
-        mCallLogQueryHandler
-                = new CallLogQueryHandler(getContext(), getContext().getContentResolver(), this);
         mVoicemailStatusHelper = new VoicemailStatusHelperImpl();
 
-        mHideSettingSwitch = (Switch) getActivity().findViewById(R.id.hide_blocked_calls_switch);
-        mHideSettingSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                FilteredNumbersUtil.setShouldHideBlockedCalls(getActivity(), isChecked);
-            }
-        });
-
         mImportSettings = getActivity().findViewById(R.id.import_settings);
         mBlockedNumbersDisabledForEmergency =
                 getActivity().findViewById(R.id.blocked_numbers_disabled_for_emergency);
 
         getActivity().findViewById(R.id.import_button).setOnClickListener(this);;
         getActivity().findViewById(R.id.view_numbers_button).setOnClickListener(this);
-        getActivity().findViewById(R.id.add_number_button).setOnClickListener(this);
+        getActivity().findViewById(R.id.add_number_textview).setOnClickListener(this);
     }
 
     @Override
@@ -109,7 +96,6 @@
         ColorDrawable backgroundDrawable =
                 new ColorDrawable(getActivity().getColor(R.color.dialer_theme_color));
         actionBar.setBackgroundDrawable(backgroundDrawable);
-        actionBar.setElevation(getResources().getDimensionPixelSize(R.dimen.action_bar_elevation));
         actionBar.setDisplayShowCustomEnabled(false);
         actionBar.setDisplayHomeAsUpEnabled(true);
         actionBar.setDisplayShowHomeEnabled(true);
@@ -125,9 +111,6 @@
                     }
                 });
 
-        mHideSettingSwitch.setChecked(FilteredNumbersUtil.shouldHideBlockedCalls(getContext()));
-        mCallLogQueryHandler.fetchVoicemailStatus();
-
         if (FilteredNumbersUtil.hasRecentEmergencyCall(getContext())) {
             mBlockedNumbersDisabledForEmergency.setVisibility(View.VISIBLE);
         } else {
@@ -138,8 +121,7 @@
     @Override
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.blocked_number_fragment, container, false);
-        return view;
+        return inflater.inflate(R.layout.blocked_number_fragment, container, false);
     }
 
     @Override
@@ -170,21 +152,20 @@
 
     @Override
     public void onClick(final View view) {
-        ManageBlockedNumbersActivity manageBlockedNumbersActivity =
-                (ManageBlockedNumbersActivity) getActivity();
-        if (manageBlockedNumbersActivity == null) {
+        BlockedNumbersSettingsActivity activity = (BlockedNumbersSettingsActivity) getActivity();
+        if (activity == null) {
             return;
         }
 
         switch (view.getId()) {
-            case R.id.add_number_button:
-                manageBlockedNumbersActivity.enterSearchUi();
+            case R.id.add_number_textview:
+                activity.showSearchUi();
                 break;
             case R.id.view_numbers_button:
-                manageBlockedNumbersActivity.showNumbersToImportPreviewUi();
+                activity.showNumbersToImportPreviewUi();
                 break;
             case R.id.import_button:
-                FilteredNumbersUtil.importSendToVoicemailContacts(manageBlockedNumbersActivity,
+                FilteredNumbersUtil.importSendToVoicemailContacts(activity,
                         new ImportSendToVoicemailContactsListener() {
                             @Override
                             public void onImportComplete() {
@@ -194,32 +175,4 @@
                 break;
         }
     }
-
-    @Override
-    public void onVoicemailStatusFetched(Cursor cursor) {
-        final View hideSetting = getActivity().findViewById(R.id.hide_blocked_calls_setting);
-        if (cursor == null) {
-            hideSetting.setVisibility(View.GONE);
-            return;
-        }
-
-        final boolean hasVisualVoicemailSource =
-                mVoicemailStatusHelper.getNumberActivityVoicemailSources(cursor) > 0;
-        if (hasVisualVoicemailSource) {
-            hideSetting.setVisibility(View.VISIBLE);
-        } else {
-            hideSetting.setVisibility(View.GONE);
-        }
-    }
-
-    @Override
-    public void onVoicemailUnreadCountFetched(Cursor cursor) {
-        // Do nothing.
-    }
-
-    @Override
-    public boolean onCallsFetched(Cursor cursor) {
-        // Do nothing.
-        return false;
-    }
 }
diff --git a/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java b/src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
similarity index 89%
rename from src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java
rename to src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
index f785cf7..1735ce5 100644
--- a/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
@@ -37,7 +37,7 @@
 import com.android.dialer.list.BlockedListSearchFragment;
 import com.android.dialer.list.SearchFragment;
 
-public class ManageBlockedNumbersActivity extends AppCompatActivity
+public class BlockedNumbersSettingsActivity extends AppCompatActivity
         implements SearchFragment.HostInterface {
 
     private static final String TAG_BLOCKED_MANAGEMENT_FRAGMENT = "blocked_management";
@@ -55,6 +55,9 @@
         }
     }
 
+    /**
+     * Shows fragment with the list of currently blocked numbers and settings related to blocking.
+     */
     public void showManagementUi() {
         BlockedNumbersFragment fragment = (BlockedNumbersFragment) getFragmentManager()
                 .findFragmentByTag(TAG_BLOCKED_MANAGEMENT_FRAGMENT);
@@ -68,7 +71,10 @@
                 .commit();
     }
 
-    public void enterSearchUi() {
+    /**
+     * Shows fragment with search UI for browsing/finding numbers to block.
+     */
+    public void showSearchUi() {
         BlockedListSearchFragment fragment = (BlockedListSearchFragment) getFragmentManager()
                 .findFragmentByTag(TAG_BLOCKED_SEARCH_FRAGMENT);
         if (fragment == null) {
@@ -85,6 +91,11 @@
                 .commit();
     }
 
+    /**
+     * Shows fragment with UI to preview the numbers of contacts currently marked as
+     * send-to-voicemail in Contacts. These numbers can be imported into Dialer's blocked number
+     * list.
+     */
     public void showNumbersToImportPreviewUi() {
         ViewNumbersToImportFragment fragment = (ViewNumbersToImportFragment) getFragmentManager()
                 .findFragmentByTag(TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT);
@@ -120,7 +131,7 @@
 
     @Override
     public boolean isActionBarShowing() {
-        return true;
+        return false;
     }
 
     @Override
@@ -135,11 +146,11 @@
 
     @Override
     public int getActionBarHideOffset() {
-        return getSupportActionBar().getHideOffset();
+        return 0;
     }
 
     @Override
     public int getActionBarHeight() {
-        return getSupportActionBar().getHeight();
+        return 0;
     }
 }
diff --git a/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
index 45fa6b7..4cc8e75 100644
--- a/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
+++ b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
@@ -15,8 +15,12 @@
  */
 package com.android.dialer.filterednumber;
 
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.Intent;
 import android.database.Cursor;
 import android.os.AsyncTask;
 import android.preference.PreferenceManager;
@@ -35,6 +39,7 @@
 import com.android.contacts.common.testing.NeededForTesting;
 import com.android.dialer.R;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
 
@@ -43,13 +48,20 @@
  */
 public class FilteredNumbersUtil {
 
-    private static final String HIDE_BLOCKED_CALLS_PREF_KEY = "hide_blocked_calls";
-    // Pref key for storing the time, in milliseconds after epoch, of end of the last emergency call.
-    private static final String LAST_EMERGENCY_CALL_PREF_KEY = "last_emergency_call";
-
     // Disable incoming call blocking if there was a call within the past 2 days.
     private static final long RECENT_EMERGENCY_CALL_THRESHOLD_MS = 1000 * 60 * 60 * 24 * 2;
 
+    // Pref key for storing the time of end of the last emergency call in milliseconds after epoch.
+    private static final String LAST_EMERGENCY_CALL_MS_PREF_KEY = "last_emergency_call_ms";
+
+    // Pref key for storing whether a notification has been dispatched to notify the user that call
+    // blocking has been disabled because of a recent emergency call.
+    private static final String NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY =
+            "notified_call_blocking_disabled_by_emergency_call";
+
+    public static final String CALL_BLOCKING_NOTIFICATION_TAG = "call_blocking";
+    public static final int CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID = 10;
+
     /**
      * Used for testing to specify that a custom threshold should be used instead of the default.
      * This custom threshold will only be used when setting this log tag to VERBOSE:
@@ -221,7 +233,7 @@
      * Use {@code FilteredNumberAsyncQueryHandler} to asynchronously check if a number is blocked.
      */
     public static boolean shouldBlockVoicemail(
-            Context context, String number, String countryIso, long dateMs) {
+            Context context, String number, String countryIso, long voicemailDateMs) {
         final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
         if (TextUtils.isEmpty(normalizedNumber)) {
             return false;
@@ -239,10 +251,11 @@
         boolean shouldBlock = false;
         if (cursor != null) {
             try {
-                cursor.moveToFirst();
-
-                // Block if number is found and it was added before this voicemail was received.
-                shouldBlock = cursor.getCount() > 0 && dateMs > cursor.getLong(0);
+                if (cursor.moveToFirst()) {
+                    // Block if number is found and it was added before this voicemail was received.
+                    final long numberBlockedTimeMs = cursor.getLong(0);
+                    shouldBlock = cursor.getCount() > 0 && voicemailDateMs > numberBlockedTimeMs;
+                }
             } finally {
                 cursor.close();
             }
@@ -251,31 +264,13 @@
         return shouldBlock;
     }
 
-    public static boolean shouldHideBlockedCalls(Context context) {
-        if (context == null) {
-            return false;
-        }
-        return PreferenceManager.getDefaultSharedPreferences(context)
-                .getBoolean(FilteredNumbersUtil.HIDE_BLOCKED_CALLS_PREF_KEY, false);
-    }
-
-    public static void setShouldHideBlockedCalls(Context context, boolean shouldHide) {
-        if (context == null) {
-            return;
-        }
-        PreferenceManager.getDefaultSharedPreferences(context)
-                .edit()
-                .putBoolean(HIDE_BLOCKED_CALLS_PREF_KEY, shouldHide)
-                .apply();
-    }
-
     public static boolean hasRecentEmergencyCall(Context context) {
         if (context == null) {
             return false;
         }
 
         Long lastEmergencyCallTime = PreferenceManager.getDefaultSharedPreferences(context)
-                .getLong(LAST_EMERGENCY_CALL_PREF_KEY, 0);
+                .getLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, 0);
         if (lastEmergencyCallTime == 0) {
             return false;
         }
@@ -288,14 +283,66 @@
         if (context == null) {
             return;
         }
+
         PreferenceManager.getDefaultSharedPreferences(context)
                 .edit()
-                .putLong(LAST_EMERGENCY_CALL_PREF_KEY, System.currentTimeMillis())
+                .putLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, System.currentTimeMillis())
+                .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)
                 .apply();
+
+        maybeNotifyCallBlockingDisabled(context);
     }
 
-    public static boolean canBlockNumber(Context context, String number) {
-        return !PhoneNumberUtils.isEmergencyNumber(number) && !TextUtils.isEmpty(number);
+    public static void maybeNotifyCallBlockingDisabled(final Context context) {
+        // Skip if the user has already received a notification for the most recent emergency call.
+        if (PreferenceManager.getDefaultSharedPreferences(context)
+                .getBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)) {
+            return;
+        }
+
+        // If the user has blocked numbers, notify that call blocking is temporarily disabled.
+        FilteredNumberAsyncQueryHandler queryHandler =
+                new FilteredNumberAsyncQueryHandler(context.getContentResolver());
+        queryHandler.hasBlockedNumbers(new OnHasBlockedNumbersListener() {
+            @Override
+            public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
+                if (context == null || !hasBlockedNumbers) {
+                    return;
+                }
+
+                NotificationManager notificationManager = (NotificationManager)
+                        context.getSystemService(Context.NOTIFICATION_SERVICE);
+                Notification.Builder builder = new Notification.Builder(context)
+                        .setSmallIcon(R.drawable.ic_block_24dp)
+                        .setContentTitle(context.getString(
+                                R.string.call_blocking_disabled_notification_title))
+                        .setContentText(context.getString(
+                                R.string.call_blocking_disabled_notification_text))
+                        .setAutoCancel(true);
+
+                final Intent contentIntent =
+                        new Intent(context, BlockedNumbersSettingsActivity.class);
+                builder.setContentIntent(PendingIntent.getActivity(
+                        context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+
+                notificationManager.notify(
+                        CALL_BLOCKING_NOTIFICATION_TAG,
+                        CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID,
+                        builder.build());
+
+                // Record that the user has been notified for this emergency call.
+                PreferenceManager.getDefaultSharedPreferences(context)
+                    .edit()
+                    .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, true)
+                    .apply();
+            }
+        });
+    }
+
+    public static boolean canBlockNumber(Context context, String number, String countryIso) {
+        final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+        return !TextUtils.isEmpty(normalizedNumber)
+                && !PhoneNumberUtils.isEmergencyNumber(normalizedNumber);
     }
 
     private static long getRecentEmergencyCallThresholdMs(Context context) {
diff --git a/src/com/android/dialer/filterednumber/NumberAdapter.java b/src/com/android/dialer/filterednumber/NumbersAdapter.java
similarity index 98%
rename from src/com/android/dialer/filterednumber/NumberAdapter.java
rename to src/com/android/dialer/filterednumber/NumbersAdapter.java
index b212fa3..1706107 100644
--- a/src/com/android/dialer/filterednumber/NumberAdapter.java
+++ b/src/com/android/dialer/filterednumber/NumbersAdapter.java
@@ -36,7 +36,7 @@
 import com.android.dialer.calllog.ContactInfoHelper;
 import com.android.dialer.util.PhoneNumberUtil;
 
-public class NumberAdapter extends SimpleCursorAdapter {
+public class NumbersAdapter extends SimpleCursorAdapter {
 
     private Context mContext;
     private FragmentManager mFragmentManager;
@@ -45,7 +45,7 @@
     private BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
     private ContactPhotoManager mContactPhotoManager;
 
-    public NumberAdapter(
+    public NumbersAdapter(
             Context context,
             FragmentManager fragmentManager,
             ContactInfoHelper contactInfoHelper,
diff --git a/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java b/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
index 40b81c7..58fe1d4 100644
--- a/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
+++ b/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
@@ -25,7 +25,7 @@
 import com.android.dialer.R;
 import com.android.dialer.calllog.ContactInfoHelper;
 
-public class ViewNumbersToImportAdapter extends NumberAdapter {
+public class ViewNumbersToImportAdapter extends NumbersAdapter {
 
     private ViewNumbersToImportAdapter(
             Context context,
diff --git a/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java b/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
index 947dc67..9912416 100644
--- a/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
+++ b/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
@@ -72,6 +72,10 @@
 
         ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
         actionBar.setTitle(R.string.import_send_to_voicemail_numbers_label);
+        actionBar.setDisplayShowCustomEnabled(false);
+        actionBar.setDisplayHomeAsUpEnabled(true);
+        actionBar.setDisplayShowHomeEnabled(true);
+        actionBar.setDisplayShowTitleEnabled(true);
 
         getActivity().findViewById(R.id.cancel_button).setOnClickListener(this);
         getActivity().findViewById(R.id.import_button).setOnClickListener(this);
diff --git a/src/com/android/dialer/list/BlockedListSearchAdapter.java b/src/com/android/dialer/list/BlockedListSearchAdapter.java
index aaea40b..1618826 100644
--- a/src/com/android/dialer/list/BlockedListSearchAdapter.java
+++ b/src/com/android/dialer/list/BlockedListSearchAdapter.java
@@ -84,7 +84,7 @@
                         }
                     }
                 };
-        mFilteredNumberAsyncQueryHandler.startBlockedQuery(
-                onCheckListener, null, number, countryIso);
+        mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+                onCheckListener, number, countryIso);
     }
 }
diff --git a/src/com/android/dialer/list/BlockedListSearchFragment.java b/src/com/android/dialer/list/BlockedListSearchFragment.java
index 8fc6f7a..08a9c49 100644
--- a/src/com/android/dialer/list/BlockedListSearchFragment.java
+++ b/src/com/android/dialer/list/BlockedListSearchFragment.java
@@ -15,13 +15,11 @@
  */
 package com.android.dialer.list;
 
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.net.Uri;
 import android.os.Bundle;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AppCompatActivity;
 import android.text.Editable;
+import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.Log;
 import android.util.TypedValue;
@@ -31,23 +29,25 @@
 import android.widget.Toast;
 
 import com.android.contacts.common.GeoUtil;
-import com.android.contacts.common.dialog.IndeterminateProgressDialog;
 import com.android.contacts.common.list.ContactEntryListAdapter;
 import com.android.contacts.common.list.ContactListItemView;
 import com.android.dialer.R;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
-import com.android.dialer.filterednumber.ManageBlockedNumbersActivity;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
 import com.android.dialer.widget.SearchEditTextLayout;
 
 public class BlockedListSearchFragment extends RegularSearchFragment
-        implements FilterNumberDialogFragment.Callback {
+        implements BlockNumberDialogFragment.Callback {
     private static final String TAG = BlockedListSearchFragment.class.getSimpleName();
 
+    private static final String KEY_SEARCH_QUERY = "search_query";
+
     private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
 
     private EditText mSearchView;
+    private String mSearchQuery;
 
     private final TextWatcher mPhoneSearchQueryTextListener = new TextWatcher() {
         @Override
@@ -56,7 +56,8 @@
 
         @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {
-            setQueryString(s.toString(), false);
+            mSearchQuery = s.toString();
+            setQueryString(mSearchQuery, false);
         }
 
         @Override
@@ -76,7 +77,6 @@
                 }
             };
 
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -86,6 +86,9 @@
 
         mFilteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(
                 getContext().getContentResolver());
+        if (savedInstanceState != null) {
+            mSearchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY);
+        }
     }
 
     @Override
@@ -94,8 +97,6 @@
 
         ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
         actionBar.setCustomView(R.layout.search_edittext);
-        actionBar.setBackgroundDrawable(null);
-        actionBar.setElevation(0);
         actionBar.setDisplayShowCustomEnabled(true);
         actionBar.setDisplayHomeAsUpEnabled(false);
         actionBar.setDisplayShowHomeEnabled(false);
@@ -104,21 +105,37 @@
                 .getCustomView().findViewById(R.id.search_view_container);
         searchEditTextLayout.expand(false, true);
         searchEditTextLayout.setCallback(mSearchLayoutCallback);
+        searchEditTextLayout.setBackgroundDrawable(null);
 
         mSearchView = (EditText) searchEditTextLayout.findViewById(R.id.search_view);
         mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener);
         mSearchView.setHint(R.string.block_number_search_hint);
 
+        searchEditTextLayout.findViewById(R.id.search_box_expanded)
+                .setBackgroundColor(getContext().getResources().getColor(android.R.color.white));
+
+        if (!TextUtils.isEmpty(mSearchQuery)) {
+            mSearchView.setText(mSearchQuery);
+        }
+
         // TODO: Don't set custom text size; use default search text size.
         mSearchView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                 getResources().getDimension(R.dimen.blocked_number_search_text_size));
     }
 
     @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putString(KEY_SEARCH_QUERY, getAdapter().getQueryString());
+    }
+
+    @Override
     protected ContactEntryListAdapter createListAdapter() {
         BlockedListSearchAdapter adapter = new BlockedListSearchAdapter(getActivity());
         adapter.setDisplayPhotos(true);
-        adapter.setUseCallableUri(usesCallableUri());
+        // Don't show SIP addresses.
+        adapter.setUseCallableUri(false);
+        adapter.setQueryString(mSearchQuery);
         return adapter;
     }
 
@@ -158,9 +175,8 @@
             @Override
             public void onCheckComplete(Integer id) {
                 if (id == null) {
-                    FilterNumberDialogFragment.show(
+                    BlockNumberDialogFragment.show(
                             id,
-                            null,
                             number,
                             countryIso,
                             number,
@@ -173,9 +189,9 @@
                 }
             }
         };
-        boolean failed = mFilteredNumberAsyncQueryHandler.startBlockedQuery(
-                onCheckListener, null, number, countryIso);
-        if (failed) {
+        final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+                onCheckListener, number, countryIso);
+        if (!success) {
             Toast.makeText(getContext(), getString(R.string.invalidNumber, number),
                     Toast.LENGTH_SHORT).show();
         }
@@ -183,12 +199,11 @@
 
     @Override
     public void onChangeFilteredNumberSuccess() {
-        ManageBlockedNumbersActivity activity = (ManageBlockedNumbersActivity) getActivity();
+        BlockedNumbersSettingsActivity activity = (BlockedNumbersSettingsActivity) getActivity();
         if (activity == null) {
             return;
         }
-
-        activity.showManagementUi();
+        activity.onBackPressed();
     }
 
     @Override
@@ -207,9 +222,8 @@
             return;
         }
 
-        FilterNumberDialogFragment.show(
+        BlockNumberDialogFragment.show(
                 blockId,
-                null,
                 number,
                 GeoUtil.getCurrentCountryIso(getContext()),
                 number,
diff --git a/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java b/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
index 05780c6..c12bed7 100644
--- a/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
@@ -95,6 +95,11 @@
         setMeasuredDimension(width, height);
     }
 
+    @Override
+    protected String getNameForView(ContactEntry contactEntry) {
+        return contactEntry.getPreferredDisplayName();
+    }
+
     public ContactEntry getContactEntry() {
         return mContactEntry;
     }
diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
index e957c83..cd4c10b 100644
--- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
@@ -38,13 +38,13 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
-import android.widget.FrameLayout;
 
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.ContactTileLoaderFactory;
 import com.android.contacts.common.list.ContactEntry;
 import com.android.contacts.common.list.ContactTileAdapter.DisplayType;
 import com.android.contacts.common.list.ContactTileView;
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.R;
 
 import java.util.ArrayList;
@@ -70,6 +70,7 @@
 
     private Context mContext;
     private Resources mResources;
+    private ContactsPreferences mContactsPreferences;
 
     /** Contact data stored in cache. This is used to populate the associated view. */
     protected ArrayList<ContactEntry> mContactEntries = null;
@@ -92,7 +93,8 @@
     protected int mIdIndex;
     protected int mLookupIndex;
     protected int mPhotoUriIndex;
-    protected int mNameIndex;
+    protected int mNamePrimaryIndex;
+    protected int mNameAlternativeIndex;
     protected int mPresenceIndex;
     protected int mStatusIndex;
 
@@ -124,9 +126,17 @@
         public int compare(ContactEntry lhs, ContactEntry rhs) {
             return ComparisonChain.start()
                     .compare(lhs.pinned, rhs.pinned)
-                    .compare(lhs.name, rhs.name)
+                    .compare(getPreferredSortName(lhs), getPreferredSortName(rhs))
                     .result();
         }
+
+        private String getPreferredSortName(ContactEntry contactEntry) {
+            if (mContactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY
+                    || TextUtils.isEmpty(contactEntry.nameAlternative)) {
+                return contactEntry.namePrimary;
+            }
+            return contactEntry.nameAlternative;
+        }
     };
 
     public interface OnDataSetChangedForAnimationListener {
@@ -140,6 +150,7 @@
         mListener = listener;
         mContext = context;
         mResources = context.getResources();
+        mContactsPreferences = new ContactsPreferences(mContext);
         mNumFrequents = 0;
         mContactEntries = new ArrayList<ContactEntry>();
 
@@ -172,19 +183,26 @@
      */
     protected void bindColumnIndices() {
         mIdIndex = ContactTileLoaderFactory.CONTACT_ID;
-        mLookupIndex = ContactTileLoaderFactory.LOOKUP_KEY;
-        mPhotoUriIndex = ContactTileLoaderFactory.PHOTO_URI;
-        mNameIndex = ContactTileLoaderFactory.DISPLAY_NAME;
+        mNamePrimaryIndex = ContactTileLoaderFactory.DISPLAY_NAME;
+        mNameAlternativeIndex = ContactTileLoaderFactory.DISPLAY_NAME_ALTERNATIVE;
         mStarredIndex = ContactTileLoaderFactory.STARRED;
-        mPresenceIndex = ContactTileLoaderFactory.CONTACT_PRESENCE;
-        mStatusIndex = ContactTileLoaderFactory.CONTACT_STATUS;
-
+        mPhotoUriIndex = ContactTileLoaderFactory.PHOTO_URI;
+        mLookupIndex = ContactTileLoaderFactory.LOOKUP_KEY;
         mPhoneNumberIndex = ContactTileLoaderFactory.PHONE_NUMBER;
         mPhoneNumberTypeIndex = ContactTileLoaderFactory.PHONE_NUMBER_TYPE;
         mPhoneNumberLabelIndex = ContactTileLoaderFactory.PHONE_NUMBER_LABEL;
-        mIsDefaultNumberIndex = ContactTileLoaderFactory.IS_DEFAULT_NUMBER;
         mPinnedIndex = ContactTileLoaderFactory.PINNED;
-        mContactIdIndex = ContactTileLoaderFactory.CONTACT_ID_FOR_DATA;
+        mContactIdIndex = ContactTileLoaderFactory.CONTACT_ID;
+
+
+        mPresenceIndex = ContactTileLoaderFactory.CONTACT_PRESENCE;
+        mStatusIndex = ContactTileLoaderFactory.CONTACT_STATUS;
+        mIsDefaultNumberIndex = ContactTileLoaderFactory.IS_DEFAULT_NUMBER;
+    }
+
+    public void refreshContactsPreferences() {
+        mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+        mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
     }
 
     /**
@@ -261,15 +279,19 @@
             final String photoUri = cursor.getString(mPhotoUriIndex);
             final String lookupKey = cursor.getString(mLookupIndex);
             final int pinned = cursor.getInt(mPinnedIndex);
-            final String name = cursor.getString(mNameIndex);
+            final String name = cursor.getString(mNamePrimaryIndex);
+            final String nameAlternative = cursor.getString(mNameAlternativeIndex);
             final boolean isStarred = cursor.getInt(mStarredIndex) > 0;
             final boolean isDefaultNumber = cursor.getInt(mIsDefaultNumberIndex) > 0;
 
             final ContactEntry contact = new ContactEntry();
 
             contact.id = id;
-            contact.name = (!TextUtils.isEmpty(name)) ? name :
+            contact.namePrimary = (!TextUtils.isEmpty(name)) ? name :
                     mResources.getString(R.string.missing_name);
+            contact.nameAlternative = (!TextUtils.isEmpty(nameAlternative)) ? nameAlternative :
+                    mResources.getString(R.string.missing_name);
+            contact.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
             contact.photoUri = (photoUri != null ? Uri.parse(photoUri) : null);
             contact.lookupKey = lookupKey;
             contact.lookupUri = ContentUris.withAppendedId(
diff --git a/src/com/android/dialer/list/SpeedDialFragment.java b/src/com/android/dialer/list/SpeedDialFragment.java
index 64129cd..e30f406 100644
--- a/src/com/android/dialer/list/SpeedDialFragment.java
+++ b/src/com/android/dialer/list/SpeedDialFragment.java
@@ -202,7 +202,9 @@
     public void onResume() {
         Trace.beginSection(TAG + " onResume");
         super.onResume();
-
+        if (mContactTileAdapter != null) {
+            mContactTileAdapter.refreshContactsPreferences();
+        }
         if (PermissionsUtil.hasContactsPermissions(getActivity())) {
             if (getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE) == null) {
                 getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null,
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index 6fcd221..d0bfbc2 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -28,7 +28,7 @@
 import android.widget.Toast;
 
 import com.android.dialer.R;
-import com.android.dialer.filterednumber.ManageBlockedNumbersActivity;
+import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
 
 import java.util.List;
 
@@ -88,7 +88,7 @@
 
             Header blockedCallsHeader = new Header();
             blockedCallsHeader.titleRes = R.string.manage_blocked_numbers_label;
-            blockedCallsHeader.intent = new Intent(this, ManageBlockedNumbersActivity.class);
+            blockedCallsHeader.intent = new Intent(this, BlockedNumbersSettingsActivity.class);
             target.add(blockedCallsHeader);
 
             if (telephonyManager.isTtyModeSupported()
diff --git a/src/com/android/dialer/widget/SearchEditTextLayout.java b/src/com/android/dialer/widget/SearchEditTextLayout.java
index 544749f..4f100dc 100644
--- a/src/com/android/dialer/widget/SearchEditTextLayout.java
+++ b/src/com/android/dialer/widget/SearchEditTextLayout.java
@@ -230,7 +230,6 @@
         setElevation(0);
         setPaddingRelative(paddingStart, paddingTop, paddingEnd, paddingBottom);
 
-        setElevation(0);
         if (requestFocus) {
             mSearchView.requestFocus();
         }
diff --git a/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java b/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
index d0547bd..8819384 100644
--- a/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
+++ b/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
@@ -1,5 +1,8 @@
 package com.android.dialer.list;
 
+import com.google.common.collect.Lists;
+
+import android.content.Context;
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.provider.ContactsContract.PinnedPositions;
@@ -8,15 +11,18 @@
 
 import com.android.contacts.common.ContactTileLoaderFactory;
 import com.android.contacts.common.list.ContactEntry;
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.list.PhoneFavoritesTileAdapter.OnDataSetChangedForAnimationListener;
 
+import junit.framework.Assert;
+
 import java.util.ArrayList;
 
 @SmallTest
 public class PhoneFavoritesTileAdapterTest extends AndroidTestCase {
-    private PhoneFavoritesTileAdapter mAdapter;
-    private static final OnDataSetChangedForAnimationListener
-            sOnDataSetChangedForAnimationListener = new OnDataSetChangedForAnimationListener() {
+
+    private static final OnDataSetChangedForAnimationListener NOOP_ANIMATION_LISTENER =
+            new OnDataSetChangedForAnimationListener() {
                 @Override
                 public void onDataSetChangedForAnimation(long... idsInPlace) {}
 
@@ -24,18 +30,161 @@
                 public void cacheOffsetsForDatasetChange() {}
             };
 
-    /**
-     * TODO: Add tests
-     *
-     * Test cases (various combinations of):
-     * No pinned contacts
-     * One pinned contact
-     * Multiple pinned contacts with differing pinned positions
-     * Multiple pinned contacts with conflicting pinned positions
-     * Pinned contacts with pinned positions at the start, middle, end, and outside the list
-     */
-    public void testArrangeContactsByPinnedPosition() {
+    private PhoneFavoritesTileAdapter mAdapter;
 
+    @Override
+    public void setUp() {
+        this.mAdapter = new PhoneFavoritesTileAdapter(getContext(), null, NOOP_ANIMATION_LISTENER);
+    }
+
+    /**
+     * For all arrangeContactsByPinnedPosition tests, the id for a particular ContactEntry
+     * represents the index at which it should be located after calling
+     * arrangeContactsByPinnedPosition
+     */
+
+    public void testArrangeContactsByPinnedPosition_NoPinned() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(1), getTestContactEntry(2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_NoPinned_RemoveDemoted() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(1));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 2);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_Beginning() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1),
+                getTestContactEntry(0, 1), getTestContactEntry(2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_Middle() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(1, 2), getTestContactEntry(2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_End() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(2, 3), getTestContactEntry(1));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_Outside() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(2, 5), getTestContactEntry(1));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_RemoveDemoted() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(0));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 2);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Split() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 1),
+                getTestContactEntry(1), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Adjacent() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(0), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_UnpinnedBefore() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(0), getTestContactEntry(2, 2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_UnpinnedAfter() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 1),
+                getTestContactEntry(2), getTestContactEntry(1, 1));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_RemoveDemoted() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(0, 2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 2);
+    }
+
+    public void testArrangeContactsByPinnedPosition_AllPinned() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(0, 1), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_AllPinned_TwoConflicts_ConflictsFirst() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(0, 2), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_AllPinned_TwoConflicts_ConflictsLast() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 2),
+                getTestContactEntry(1, 3), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_AllPinned_AllConflicts() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(2, 3),
+                getTestContactEntry(1, 3), getTestContactEntry(0, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_All_Pinned_AllConflicts_SortNameAlternative() {
+        Context context  = getContext();
+        context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit()
+                .putInt(ContactsPreferences.SORT_ORDER_KEY,
+                        ContactsPreferences.SORT_ORDER_ALTERNATIVE)
+                .commit();
+        ArrayList<ContactEntry> actual = Lists.newArrayList(
+                getTestContactEntry(1, 3, "2", "1"),
+                getTestContactEntry(2, 3, "0", "2"),
+                getTestContactEntry(0, 3, "1", "0")
+        );
+        mAdapter.arrangeContactsByPinnedPosition(actual);
+
+        assertContactEntryListPositionsMatchId(actual, 3);
     }
 
     /**
@@ -55,6 +204,45 @@
 
     }
 
+    public void testSetContactCursor_DisplayNameOrder_Primary() {
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+        Cursor testCursor = getCursorForTest(1, 0);
+        mAdapter.setContactCursor(testCursor);
+        Assert.assertEquals(1, mAdapter.mContactEntries.size());
+        Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
+                mAdapter.mContactEntries.get(0).nameDisplayOrder);
+    }
+
+    public void testSetContactCursor_DisplayNameOrder_Alternative() {
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+        Cursor testCursor = getCursorForTest(1, 0);
+        mAdapter.setContactCursor(testCursor);
+        Assert.assertEquals(1, mAdapter.mContactEntries.size());
+        Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE,
+                mAdapter.mContactEntries.get(0).nameDisplayOrder);
+    }
+
+    public void testSetContactCursor_DisplayNameOrder_Changed() {
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+        Cursor testCursor = getCursorForTest(1, 0);
+        mAdapter.setContactCursor(testCursor);
+        Assert.assertEquals(1, mAdapter.mContactEntries.size());
+        Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
+                mAdapter.mContactEntries.get(0).nameDisplayOrder);
+
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+        mAdapter.refreshContactsPreferences();
+        mAdapter.setContactCursor(testCursor);
+        Assert.assertEquals(1, mAdapter.mContactEntries.size());
+        Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE,
+                mAdapter.mContactEntries.get(0).nameDisplayOrder);
+    }
+
+    private void setNameDisplayOrder(Context context, int displayOrder) {
+        context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit().putInt(
+                ContactsPreferences.DISPLAY_ORDER_KEY, displayOrder).commit();
+    }
+
     /**
      * Returns a cursor containing starred and frequent contacts for test purposes.
      *
@@ -72,38 +260,42 @@
         // The only field that really matters for testing is the contact id.
         for (int i = 0; i < numStarred; i++) {
             c.addRow(new Object[] {countId, null, 1, null, null, 0, 0, null, 0,
-                    PinnedPositions.UNPINNED, countId});
+                    PinnedPositions.UNPINNED, countId, null});
             countId++;
         }
 
         // Add frequent contact entries. These entries have the starred field set to 0 (false).
         for (int i = 0; i < numFrequents; i++) {
             c.addRow(new Object[] {countId, null, 0, null, null, 0, 0, null, 0,
-                    PinnedPositions.UNPINNED, countId});
+                    PinnedPositions.UNPINNED, countId, null});
             countId++;
         }
         return c;
     }
 
-    /**
-     * Returns a ContactEntry with test data corresponding to the provided contact Id
-     *
-     * @param id Non-negative id
-     * @return ContactEntry item used for testing
-     */
-    private ContactEntry getTestContactEntry(int id, boolean isFavorite) {
+    private ContactEntry getTestContactEntry(int id) {
+        return getTestContactEntry(id, PinnedPositions.UNPINNED);
+    }
+
+    private ContactEntry getTestContactEntry(int id, int pinned) {
+        return getTestContactEntry(id, pinned, String.valueOf(id), String.valueOf(id));
+    }
+
+    private ContactEntry getTestContactEntry(int id, int pinned, String namePrimaryAppend,
+            String nameAlternativeAppend) {
         ContactEntry contactEntry = new ContactEntry();
         contactEntry.id = id;
-        contactEntry.isFavorite = isFavorite;
+        contactEntry.pinned = pinned;
+        contactEntry.namePrimary = namePrimaryAppend;
+        contactEntry.nameAlternative = nameAlternativeAppend;
         return contactEntry;
     }
 
-    private void assertContactEntryRowsEqual(ArrayList<ContactEntry> expected,
-            ArrayList<ContactEntry> actual) {
-        assertEquals(expected.size(), actual.size());
-        for (int i = 0; i < actual.size(); i++) {
-            assertEquals(expected.get(i).id, actual.get(i).id);
-            assertEquals(expected.get(i).isFavorite, actual.get(i).isFavorite);
+    private void assertContactEntryListPositionsMatchId(ArrayList<ContactEntry> contactEntries,
+            int expectedSize) {
+        Assert.assertEquals(expectedSize, contactEntries.size());
+        for (int i = 0; i < expectedSize; ++i) {
+            Assert.assertEquals(i, contactEntries.get(i).id);
         }
     }
 }
