diff --git a/res/layout/block_report_spam_dialog.xml b/res/layout/block_report_spam_dialog.xml
new file mode 100644
index 0000000..a731dec
--- /dev/null
+++ b/res/layout/block_report_spam_dialog.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:padding="25dp">
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/block_report_number_alert_details"
+            android:layout_marginBottom="10dp"
+            android:textColor="@color/call_log_primary_color"
+            android:textSize="@dimen/blocked_number_settings_description_text_size"/>
+
+        <CheckBox
+            android:id="@+id/report_number_as_spam_action"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/checkbox_report_as_spam_action"
+            android:textSize="@dimen/blocked_number_settings_description_text_size"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5fca528..2907615 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1066,4 +1066,31 @@
 
     <!-- Label under the name of a spam number in the call log. [CHAR LIMIT=15] -->
     <string name="spam_number_call_log_label">Spam</string>
+
+    <!-- Title of alert dialog after clicking on Block/report as spam.  [CHAR LIMIT=100] -->
+    <string name="block_report_number_alert_title">Block <xliff:g id="number">%1$s</xliff:g>?</string>
+
+    <!-- Text in alert dialog after clicking on Block/report as spam.  [CHAR LIMIT=100] -->
+    <string name="block_report_number_alert_details">Future calls and voicemails from this number will be blocked.</string>
+
+    <!-- Label for checkbox in the Alert dialog to allow the user to report the number as spam as well.  [CHAR LIMIT=30] -->
+    <string name="checkbox_report_as_spam_action">Report call as spam</string>
+
+    <!-- Text in alert dialog after clicking on Block.  [CHAR LIMIT=100] -->
+    <string name="block_number_alert_details">Future calls and voicemails from this number will be blocked. This call will be reported as spam.</string>
+
+    <!-- Title of alert dialog after clicking on Unblock.  [CHAR LIMIT=100] -->
+    <string name="unblock_report_number_alert_title">Unblock <xliff:g id="number">%1$s</xliff:g>?</string>
+
+    <!-- Text in alert dialog after clicking on Unblock.  [CHAR LIMIT=100] -->
+    <string name="unblock_number_alert_details">This number will be unblocked and reported as not spam. Future calls and voicemails won\'t be identified as spam.</string>
+
+    <!-- Title of alert dialog after clicking on Report as not spam.  [CHAR LIMIT=100] -->
+    <string name="report_not_spam_alert_title">Whitelist <xliff:g id="number">%1$s</xliff:g>?</string>
+
+    <!-- Report not spam number alert dialog button [CHAR LIMIT=32] -->
+    <string name="report_not_spam_alert_button">Whitelist</string>
+
+    <!-- Text in alert dialog after clicking on Report as not spam.  [CHAR LIMIT=100] -->
+    <string name="report_not_spam_alert_details">Future calls and voicemails from this number won\'t be identified as spam. This number will be reported as not spam.</string>
 </resources>
diff --git a/src/com/android/dialer/calllog/BlockReportSpamListener.java b/src/com/android/dialer/calllog/BlockReportSpamListener.java
new file mode 100644
index 0000000..bda4ee5
--- /dev/null
+++ b/src/com/android/dialer/calllog/BlockReportSpamListener.java
@@ -0,0 +1,158 @@
+package com.android.dialer.calllog;
+
+import android.app.AlertDialog;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.net.Uri;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.CheckBox;
+
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.service.ExtendedCallInfoService;
+import com.android.dialer.R;
+
+/**
+ * Listener to show dialogs for block and report spam actions.
+ */
+public class BlockReportSpamListener implements CallLogListItemViewHolder.OnClickListener {
+
+    private final Context mContext;
+    private final RecyclerView.Adapter mAdapter;
+    private final ExtendedCallInfoService mExtendedCallInfoService;
+    private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+
+    public BlockReportSpamListener(Context context, RecyclerView.Adapter adapter,
+                                   ExtendedCallInfoService extendedCallInfoService,
+                                   FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler) {
+        mContext = context;
+        mAdapter = adapter;
+        mExtendedCallInfoService = extendedCallInfoService;
+        mFilteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler;
+    }
+
+    @Override
+    public void onBlockReportSpam(String displayNumber, final String number,
+                                  final String countryIso, final int callType) {
+        final View dialogView = View.inflate(mContext, R.layout.block_report_spam_dialog, null);
+
+        AlertDialog.Builder alertDialogBuilder = createDialogBuilder();
+        alertDialogBuilder
+                .setView(dialogView)
+                .setTitle(mContext.getString(
+                        R.string.block_report_number_alert_title, displayNumber))
+                .setPositiveButton(mContext.getString(R.string.block_number_ok),
+                        new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                                CheckBox isSpamCheckbox = (CheckBox) dialogView
+                                        .findViewById(R.id.report_number_as_spam_action);
+                                if (isSpamCheckbox.isChecked()) {
+                                    mExtendedCallInfoService.reportSpam(
+                                            number, countryIso, callType);
+                                }
+                                mFilteredNumberAsyncQueryHandler.blockNumber(
+                                        new FilteredNumberAsyncQueryHandler.OnBlockNumberListener() {
+                                            @Override
+                                            public void onBlockComplete(Uri uri) {
+                                                mAdapter.notifyDataSetChanged();
+                                            }
+                                        },
+                                        number,
+                                        countryIso);
+                            }
+                        });
+        alertDialogBuilder.show();
+    }
+
+    @Override
+    public void onBlock(String displayNumber, final String number, final String countryIso,
+                        final int callType) {
+        AlertDialog.Builder alertDialogBuilder = createDialogBuilder();
+        alertDialogBuilder
+                .setTitle(mContext.getString(
+                        R.string.block_report_number_alert_title, displayNumber))
+                .setMessage(R.string.block_number_alert_details)
+                .setPositiveButton(mContext.getString(R.string.block_number_ok),
+                        new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                                mExtendedCallInfoService.reportSpam(number, countryIso, callType);
+                                mFilteredNumberAsyncQueryHandler.blockNumber(
+                                        new FilteredNumberAsyncQueryHandler.OnBlockNumberListener() {
+                                            @Override
+                                            public void onBlockComplete(Uri uri) {
+                                                mAdapter.notifyDataSetChanged();
+                                            }
+                                        },
+                                        number,
+                                        countryIso);
+                            }
+                        });
+        alertDialogBuilder.show();
+    }
+
+    @Override
+    public void onUnblock(String displayNumber, final String number, final String countryIso,
+                          final Integer blockId, final boolean isSpam, final int callType) {
+        AlertDialog.Builder alertDialogBuilder = createDialogBuilder();
+        if (isSpam) {
+            alertDialogBuilder.setMessage(R.string.unblock_number_alert_details);
+        }
+        alertDialogBuilder
+                .setTitle(mContext.getString(
+                        R.string.unblock_report_number_alert_title, displayNumber))
+                .setPositiveButton(R.string.unblock_number_ok,
+                        new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                                if (isSpam) {
+                                    mExtendedCallInfoService.reportNotSpam(
+                                            number, countryIso, callType);
+                                }
+                                mFilteredNumberAsyncQueryHandler.unblock(
+                                        new FilteredNumberAsyncQueryHandler.OnUnblockNumberListener() {
+                                            @Override
+                                            public void onUnblockComplete(int rows, ContentValues values) {
+                                                mAdapter.notifyDataSetChanged();
+                                            }
+                                        },
+                                        blockId);
+                            }
+                        });
+        alertDialogBuilder.show();
+    }
+
+    @Override
+    public void onReportNotSpam(String displayNumber, final String number, final String countryIso,
+                                final int callType) {
+        AlertDialog.Builder alertDialogBuilder = createDialogBuilder();
+        alertDialogBuilder
+                .setTitle(mContext.getString(
+                        R.string.report_not_spam_alert_title, displayNumber))
+                .setMessage(R.string.report_not_spam_alert_details)
+                .setPositiveButton(R.string.report_not_spam_alert_button,
+                        new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                                mExtendedCallInfoService.reportNotSpam(
+                                        number, countryIso, callType);
+                                mAdapter.notifyDataSetChanged();
+                            }
+                        });
+        alertDialogBuilder.show();
+    }
+
+    private AlertDialog.Builder createDialogBuilder() {
+        return new AlertDialog.Builder(mContext)
+                .setCancelable(true)
+                .setNegativeButton(mContext.getString(android.R.string.cancel),
+                        new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                                dialog.cancel();
+                            }
+                        });
+    }
+}
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index e826867..506dafd 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -16,14 +16,15 @@
 
 package com.android.dialer.calllog;
 
-import com.android.dialer.compat.FilteredNumberCompat;
 import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.service.ExtendedCallInfoService;
 import com.android.dialerbind.ObjectFactory;
 import com.google.common.annotations.VisibleForTesting;
 
-import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ContentValues;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.res.Resources;
@@ -44,6 +45,7 @@
 import android.view.View.AccessibilityDelegate;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
+import android.widget.CheckBox;
 
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.compat.CompatUtils;
@@ -70,8 +72,7 @@
  */
 public class CallLogAdapter extends GroupingListAdapter
         implements CallLogGroupBuilder.GroupCreator,
-                VoicemailPlaybackPresenter.OnVoicemailDeletedListener,
-                CallLogListItemViewHolder.OnClickListener {
+                VoicemailPlaybackPresenter.OnVoicemailDeletedListener {
 
     // Types of activities the call log adapter is used for
     public static final int ACTIVITY_TYPE_CALL_LOG = 1;
@@ -140,6 +141,7 @@
                 public void onChangeFilteredNumberUndo() {
                 }
             };
+    private CallLogListItemViewHolder.OnClickListener mBlockReportSpamListener;
 
     /**
      *  Hashmap, keyed by call Id, used to track the day group for a call.  As call log entries are
@@ -319,6 +321,8 @@
         maybeShowVoicemailPromoCard();
 
         mExtendedCallInfoService = ObjectFactory.newExtendedCallInfoService(context);
+        mBlockReportSpamListener = new BlockReportSpamListener(mContext, this,
+                mExtendedCallInfoService, mFilteredNumberAsyncQueryHandler);
         setHasStableIds(true);
     }
 
@@ -336,36 +340,6 @@
         }
     }
 
-    @Override
-    public void onBlockReportSpam(String number, String countryIso, String displayNumber) {
-        mExtendedCallInfoService.reportSpam(number, countryIso);
-        notifyDataSetChanged();
-    }
-
-    @Override
-    public void onBlock(String number, String countryIso, String displayNumber) {
-        FilteredNumberCompat
-                .showBlockNumberDialogFlow(mContext.getContentResolver(), null, number,
-                        countryIso, displayNumber, R.id.floating_action_button_container,
-                        ((Activity) mContext).getFragmentManager(),
-                        mBlockedNumberDialogCallback);
-    }
-
-    @Override
-    public void onUnblock(String number, String countryIso, Integer blockId, String displayNumber) {
-        FilteredNumberCompat
-                .showBlockNumberDialogFlow(mContext.getContentResolver(), blockId, number,
-                        countryIso, displayNumber, R.id.floating_action_button_container,
-                        ((Activity) mContext).getFragmentManager(),
-                        mBlockedNumberDialogCallback);
-    }
-
-    @Override
-    public void onReportNotSpam(String number, String countryIso, String displayNumber) {
-        mExtendedCallInfoService.reportNotSpam(number, countryIso);
-        notifyDataSetChanged();
-    }
-
     /**
      * Requery on background thread when {@link Cursor} changes.
      */
@@ -442,7 +416,7 @@
         CallLogListItemViewHolder viewHolder = CallLogListItemViewHolder.create(
                 view,
                 mContext,
-                this,
+                mBlockReportSpamListener,
                 mExpandCollapseListener,
                 mCallLogCache,
                 mCallLogListItemHelper,
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 53e6fbb..aaa9dc8 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -54,6 +54,7 @@
 import com.android.dialer.compat.FilteredNumberCompat;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.filterednumber.BlockNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockedNumbersMigrator;
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.ScreenEvent;
@@ -73,10 +74,12 @@
         View.OnCreateContextMenuListener {
 
     public interface OnClickListener {
-        void onBlockReportSpam(String number, String countryIso, String displayNumber);
-        void onBlock(String number, String countryIso, String displayNumber);
-        void onUnblock(String number, String countryIso, Integer blockId, String displayNumber);
-        void onReportNotSpam(String number, String countryIso, String displayNumber);
+        void onBlockReportSpam(
+                String displayNumber, String number, String countryIso, int callType);
+        void onBlock(String displayNumber, String number, String countryIso, int callType);
+        void onUnblock(String displayNumber, String number, String countryIso, Integer blockId,
+                       boolean isSpam, int callType);
+        void onReportNotSpam(String displayNumber, String number, String countryIso, int callType);
     }
 
     /** The root view of the call log list item */
@@ -672,13 +675,25 @@
                     numberType, /* phone number type (e.g. mobile) in second line of contact view */
                     accountHandle);
         } else if (view.getId() == R.id.block_report_action) {
-            mBlockReportListener.onBlockReportSpam(number, countryIso, displayNumber);
+            maybeShowBlockNumberMigrationDialog(new BlockedNumbersMigrator.Listener() {
+                @Override
+                public void onComplete() {
+                    mBlockReportListener.onBlockReportSpam(
+                            displayNumber, number, countryIso, callType);
+                }
+            });
         } else if (view.getId() == R.id.block_action) {
-            mBlockReportListener.onBlock(number, countryIso, displayNumber);
+            maybeShowBlockNumberMigrationDialog(new BlockedNumbersMigrator.Listener() {
+                @Override
+                public void onComplete() {
+                    mBlockReportListener.onBlock(displayNumber, number, countryIso, callType);
+                }
+            });
         } else if (view.getId() == R.id.unblock_action) {
-            mBlockReportListener.onUnblock(number, countryIso, blockId, displayNumber);
+            mBlockReportListener.onUnblock(
+                    displayNumber, number, countryIso, blockId, isSpam, callType);
         } else if (view.getId() == R.id.report_not_spam_action) {
-            mBlockReportListener.onReportNotSpam(number, countryIso, displayNumber);
+            mBlockReportListener.onReportNotSpam(displayNumber, number, countryIso, callType);
         } else {
             final IntentProvider intentProvider = (IntentProvider) view.getTag();
             if (intentProvider != null) {
@@ -691,6 +706,14 @@
         }
     }
 
+    private void maybeShowBlockNumberMigrationDialog(BlockedNumbersMigrator.Listener listener) {
+        if (!FilteredNumberCompat.maybeShowBlockNumberMigrationDialog(
+                mContext.getContentResolver(),
+                ((Activity) mContext).getFragmentManager(), listener)) {
+            listener.onComplete();
+        }
+    }
+
     @NeededForTesting
     public static CallLogListItemViewHolder createForTest(Context context) {
         Resources resources = context.getResources();
diff --git a/src/com/android/dialer/compat/FilteredNumberCompat.java b/src/com/android/dialer/compat/FilteredNumberCompat.java
index 91563dc..ea994c9 100644
--- a/src/com/android/dialer/compat/FilteredNumberCompat.java
+++ b/src/com/android/dialer/compat/FilteredNumberCompat.java
@@ -238,6 +238,27 @@
     }
 
     /**
+     * Shows block number migration dialog if necessary.
+     *
+     * @param fragmentManager The {@link FragmentManager} used to show fragments.
+     * @param listener The {@link BlockedNumbersMigrator.Listener} to call when migration is
+     *                 complete.
+     * @return boolean True if migration dialog is shown.
+     */
+    public static boolean maybeShowBlockNumberMigrationDialog(
+            ContentResolver contentResolver, FragmentManager fragmentManager,
+            BlockedNumbersMigrator.Listener listener) {
+        if (shouldShowMigrationDialog(true)) {
+            Log.i(TAG, "maybeShowBlockNumberMigrationDialog - showing migration dialog");
+            MigrateBlockedNumbersDialogFragment
+                    .newInstance(new BlockedNumbersMigrator(contentResolver), listener)
+                    .show(fragmentManager, "MigrateBlockedNumbers");
+            return true;
+        }
+        return false;
+    }
+
+    /**
      * Shows the flow of {@link android.app.DialogFragment}s for blocking or unblocking numbers.
      *
      * @param blockId The id into the blocked numbers database.
diff --git a/src/com/android/dialer/service/ExtendedCallInfoService.java b/src/com/android/dialer/service/ExtendedCallInfoService.java
index 412cece..0bf5bad 100644
--- a/src/com/android/dialer/service/ExtendedCallInfoService.java
+++ b/src/com/android/dialer/service/ExtendedCallInfoService.java
@@ -44,13 +44,17 @@
      * Reports number as spam.
      * @param number The number to be reported.
      * @param countryIso The country ISO of the number.
+     * @param callType    Whether the type of call is missed, voicemail, etc. Example of this is
+     *                    {@link android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
      */
-    void reportSpam(String number, String countryIso);
+    void reportSpam(String number, String countryIso, int callType);
 
     /**
      * Reports number as not spam.
      * @param number The number to be reported.
      * @param countryIso The country ISO of the number.
+     * @param callType    Whether the type of call is missed, voicemail, etc. Example of this is
+     *                    {@link android.provider.CallLog.Calls#VOICEMAIL_TYPE}.
      */
-    void reportNotSpam(String number, String countryIso);
+    void reportNotSpam(String number, String countryIso, int callType);
 }
diff --git a/tests/src/com/android/dialer/calllog/BlockReportSpamListenerTest.java b/tests/src/com/android/dialer/calllog/BlockReportSpamListenerTest.java
new file mode 100644
index 0000000..f505818
--- /dev/null
+++ b/tests/src/com/android/dialer/calllog/BlockReportSpamListenerTest.java
@@ -0,0 +1,70 @@
+package com.android.dialer.calllog;
+
+import android.support.v7.widget.RecyclerView;
+import android.test.ActivityInstrumentationTestCase2;
+
+import com.android.dialer.DialtactsActivity;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.service.ExtendedCallInfoService;
+
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Unit tests for {@link BlockReportSpamListener}.
+ */
+public class BlockReportSpamListenerTest extends ActivityInstrumentationTestCase2<DialtactsActivity> {
+
+    private static final String TEST_DISPLAY_NUMBER = "(123)456-7890";
+    private static final String TEST_NUMBER = "1234567890";
+    private static final String TEST_COUNTRY_ISO = "us";
+    private static final int TEST_CALL_TYPE = 0;
+    private static final int TEST_CALL_BLOCK_ID = 1;
+
+    private BlockReportSpamListener blockReportSpamListener;
+
+    @Mock private RecyclerView.Adapter adapter;
+    @Mock private ExtendedCallInfoService extendedCallInfoService;
+    @Mock private FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler;
+
+    public BlockReportSpamListenerTest() {
+        super(DialtactsActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        MockitoAnnotations.initMocks(this);
+
+        blockReportSpamListener = new BlockReportSpamListener(getActivity(), adapter,
+                extendedCallInfoService, filteredNumberAsyncQueryHandler);
+    }
+
+    public void testOnBlockReportSpam() {
+        blockReportSpamListener.onBlockReportSpam(
+                TEST_DISPLAY_NUMBER, TEST_NUMBER, TEST_COUNTRY_ISO, TEST_CALL_TYPE);
+    }
+
+    public void testOnBlock() {
+        blockReportSpamListener.onBlock(
+                TEST_DISPLAY_NUMBER, TEST_NUMBER, TEST_COUNTRY_ISO, TEST_CALL_TYPE);
+    }
+
+    public void testOnUnlock_isSpam() {
+        blockReportSpamListener.onUnblock(
+                TEST_DISPLAY_NUMBER, TEST_NUMBER, TEST_COUNTRY_ISO, TEST_CALL_BLOCK_ID,
+                true, TEST_CALL_TYPE);
+    }
+
+    public void testOnUnlock_isNotSpam() {
+        blockReportSpamListener.onUnblock(
+                TEST_DISPLAY_NUMBER, TEST_NUMBER, TEST_COUNTRY_ISO, TEST_CALL_BLOCK_ID,
+                false, TEST_CALL_TYPE);
+    }
+
+    public void testOnReportNotSpam() {
+        blockReportSpamListener.onReportNotSpam(
+                TEST_DISPLAY_NUMBER, TEST_NUMBER, TEST_COUNTRY_ISO, TEST_CALL_TYPE);
+    }
+}
