diff --git a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
index 092c098..c8f8f0c 100644
--- a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
+++ b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
@@ -20,8 +20,8 @@
 import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.v7.widget.RecyclerView;
-import com.android.dialer.blocking.BlockReportSpamDialogs;
 import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.blockreportspam.BlockReportSpamDialogs;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.logging.ContactSource;
 import com.android.dialer.logging.DialerImpression;
diff --git a/java/com/android/dialer/blocking/res/values/colors.xml b/java/com/android/dialer/blocking/res/values/colors.xml
index d1a567d..374ba8d 100644
--- a/java/com/android/dialer/blocking/res/values/colors.xml
+++ b/java/com/android/dialer/blocking/res/values/colors.xml
@@ -15,9 +15,6 @@
 -->
 <resources>
 
-  <!-- 87% black -->
-  <color name="block_report_spam_primary_text_color">#de000000</color>
-
   <!-- Note, this is also used by InCallUi. -->
   <color name="blocked_contact_background">#A52714</color>
 
diff --git a/java/com/android/dialer/blocking/res/values/strings.xml b/java/com/android/dialer/blocking/res/values/strings.xml
index 8abff45..a660731 100644
--- a/java/com/android/dialer/blocking/res/values/strings.xml
+++ b/java/com/android/dialer/blocking/res/values/strings.xml
@@ -24,54 +24,59 @@
   <!-- Positive confirmation button for the dialog which opens when the user needs to migrate to the framework blocking implementation [CHAR LIMIT=NONE]-->
   <string name="migrate_blocked_numbers_dialog_allow_button">Allow</string>
 
-  <!-- Do not translate -->
-  <string name="migrate_blocked_numbers_dialog_cancel_button">@android:string/cancel</string>
+  <string name="migrate_blocked_numbers_dialog_cancel_button" translatable="false">
+    @android:string/cancel
+  </string>
 
   <!-- Confirmation dialog title for blocking a number. [CHAR LIMIT=NONE] -->
-    <string name="block_number_confirmation_title">Block
-        <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?</string>
+  <string name="block_number_confirmation_title">
+    Block<xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?
+  </string>
 
   <!-- Confirmation dialog message for blocking a number with visual voicemail active.
        [CHAR LIMIT=NONE] -->
-    <string name="block_number_confirmation_message_vvm">
-        Calls from this number will be blocked and voicemails will be automatically deleted.
-    </string>
+  <string name="block_number_confirmation_message_vvm">
+    Calls from this number will be blocked and voicemails will be automatically deleted.
+  </string>
 
   <!-- Confirmation dialog message for blocking a number with no visual voicemail.
        [CHAR LIMIT=NONE] -->
-    <string name="block_number_confirmation_message_no_vvm">
-        Calls from this number will be blocked, but the caller may still be able to leave you voicemails.
-    </string>
+  <string name="block_number_confirmation_message_no_vvm">
+    Calls from this number will be blocked, but the caller may still be able to leave you voicemails.
+  </string>
 
   <!-- Confirmation dialog message for blocking a number with new filtering enabled.
        [CHAR LIMIT=NONE] -->
-    <string name="block_number_confirmation_message_new_filtering">
-        You will no longer receive calls or texts from this number.
-    </string>
+  <string name="block_number_confirmation_message_new_filtering">
+    You will no longer receive calls or texts from this number.
+  </string>
 
   <!-- Block number alert dialog button [CHAR LIMIT=32] -->
   <string name="block_number_ok">BLOCK</string>
 
   <!-- Confirmation dialog for unblocking a number. [CHAR LIMIT=NONE] -->
-    <string name="unblock_number_confirmation_title">Unblock
-        <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?</string>
+  <string name="unblock_number_confirmation_title">
+    Unblock<xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?
+  </string>
 
   <!-- Unblock number alert dialog button [CHAR LIMIT=32] -->
   <string name="unblock_number_ok">UNBLOCK</string>
 
   <!-- Error message shown when user tries to add invalid number to the block list.
       [CHAR LIMIT=64] -->
-    <string name="invalidNumber"><xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>
-        is invalid.</string>
+  <string name="invalidNumber">
+    <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>is invalid.
+  </string>
 
   <!-- Text for snackbar to undo blocking a number. [CHAR LIMIT=64] -->
-    <string name="snackbar_number_blocked">
-        <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g> blocked</string>
+  <string name="snackbar_number_blocked">
+    <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g> blocked
+  </string>
 
   <!-- Text for snackbar to undo unblocking a number. [CHAR LIMIT=64] -->
-    <string name="snackbar_number_unblocked">
-        <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>
-        unblocked</string>
+  <string name="snackbar_number_unblocked">
+    <xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>unblocked
+  </string>
 
   <!-- Text for undo button in snackbar for blocking/unblocking number. [CHAR LIMIT=10] -->
   <string name="block_number_undo">UNDO</string>
@@ -81,42 +86,15 @@
 
   <!-- 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>
+  <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>
-
-  <!-- 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">You will no longer receive calls from this number.</string>
-
-  <!-- Text in alert dialog after clicking on Block.  [CHAR LIMIT=100] -->
-  <string name="block_number_alert_details"><xliff:g id="text">%1$s</xliff:g> This call will be reported as spam.</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 won\'t be identified 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>
-
-  <!-- Report not spam number alert dialog button [CHAR LIMIT=32] -->
-  <string name="report_not_spam_alert_button">Report</string>
-
-  <!-- Title of alert dialog after clicking on Report as not spam.  [CHAR LIMIT=100] -->
-  <string name="report_not_spam_alert_title">Report a mistake?</string>
-
-  <!-- Text in alert dialog after clicking on Report as not spam.  [CHAR LIMIT=100] -->
-  <string name="report_not_spam_alert_details">Future calls from <xliff:g id="number">%1$s</xliff:g> will no longer be identified as spam.</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>
+  <string name="call_blocking_disabled_notification_text">
+    Disabled because an emergency call was made.
+  </string>
 
 </resources>
diff --git a/java/com/android/dialer/blockreportspam/AndroidManifest.xml b/java/com/android/dialer/blockreportspam/AndroidManifest.xml
new file mode 100644
index 0000000..6e08043
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 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
+  -->
+
+<manifest package="com.android.dialer.blockreportspam"/>
\ No newline at end of file
diff --git a/java/com/android/dialer/blocking/BlockReportSpamDialogs.java b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
similarity index 85%
rename from java/com/android/dialer/blocking/BlockReportSpamDialogs.java
rename to java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
index 255d7cb..b75669f 100644
--- a/java/com/android/dialer/blocking/BlockReportSpamDialogs.java
+++ b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.dialer.blocking;
+package com.android.dialer.blockreportspam;
 
 import android.app.Activity;
 import android.app.AlertDialog;
@@ -26,11 +26,13 @@
 import android.support.annotation.Nullable;
 import android.view.View;
 import android.widget.CheckBox;
-import android.widget.CompoundButton;
 import android.widget.TextView;
+import com.android.dialer.blocking.FilteredNumberCompat;
 
-/** Helper class for creating block/report dialog fragments. */
-public class BlockReportSpamDialogs {
+/**
+ * Helper class for creating dialog fragments to block a number and/or report it as spam/not spam.
+ */
+public final class BlockReportSpamDialogs {
 
   public static final String BLOCK_REPORT_SPAM_DIALOG_TAG = "BlockReportSpamDialog";
   public static final String BLOCK_DIALOG_TAG = "BlockDialog";
@@ -42,14 +44,7 @@
       Activity activity, final DialogFragment fragment) {
     return new AlertDialog.Builder(activity, R.style.AlertDialogTheme)
         .setCancelable(true)
-        .setNegativeButton(
-            android.R.string.cancel,
-            new DialogInterface.OnClickListener() {
-              @Override
-              public void onClick(DialogInterface dialog, int which) {
-                fragment.dismiss();
-              }
-            });
+        .setNegativeButton(android.R.string.cancel, (dialog, which) -> fragment.dismiss());
   }
 
   /**
@@ -58,12 +53,9 @@
    */
   private static DialogInterface.OnClickListener createGenericOnClickListener(
       final DialogFragment fragment, final OnConfirmListener listener) {
-    return new DialogInterface.OnClickListener() {
-      @Override
-      public void onClick(DialogInterface dialog, int which) {
-        fragment.dismiss();
-        listener.onClick();
-      }
+    return (dialog, which) -> {
+      fragment.dismiss();
+      listener.onClick();
     };
   }
 
@@ -98,8 +90,8 @@
     void onClick();
   }
 
-  /** Contains the common attributes between all block/unblock/report dialog fragments. */
-  private static class CommonDialogsFragment extends DialogFragment {
+  /** Contains the common attributes between all block/unblock/report spam dialog fragments. */
+  private abstract static class CommonDialogsFragment extends DialogFragment {
 
     /** The number to display in the dialog title. */
     protected String displayNumber;
@@ -133,7 +125,7 @@
   public static class BlockReportSpamDialogFragment extends CommonDialogsFragment {
 
     /** Called when dialog positive button is pressed. */
-    private OnSpamDialogClickListener positiveListener;
+    private OnSpamDialogClickListener onSpamDialogClickListener;
 
     /** Whether the mark as spam checkbox is checked before displaying the dialog. */
     private boolean spamChecked;
@@ -141,12 +133,12 @@
     public static DialogFragment newInstance(
         String displayNumber,
         boolean spamChecked,
-        OnSpamDialogClickListener positiveListener,
+        OnSpamDialogClickListener onSpamDialogClickListener,
         @Nullable DialogInterface.OnDismissListener dismissListener) {
       BlockReportSpamDialogFragment fragment = new BlockReportSpamDialogFragment();
       fragment.spamChecked = spamChecked;
       fragment.displayNumber = displayNumber;
-      fragment.positiveListener = positiveListener;
+      fragment.onSpamDialogClickListener = onSpamDialogClickListener;
       fragment.dismissListener = dismissListener;
       return fragment;
     }
@@ -159,34 +151,25 @@
           (CheckBox) dialogView.findViewById(R.id.report_number_as_spam_action);
       // Listen for changes on the checkbox and update if orientation changes
       isSpamCheckbox.setChecked(spamChecked);
-      isSpamCheckbox.setOnCheckedChangeListener(
-          new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-              spamChecked = isChecked;
-            }
-          });
+      isSpamCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> spamChecked = isChecked);
 
       TextView details = (TextView) dialogView.findViewById(R.id.block_details);
       details.setText(getBlockMessage(getContext()));
 
       AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this);
-      Dialog dialog =
+      Dialog blockReportSpamDialog =
           alertDialogBuilder
               .setView(dialogView)
               .setTitle(getString(R.string.block_report_number_alert_title, displayNumber))
               .setPositiveButton(
                   R.string.block_number_ok,
-                  new DialogInterface.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                      dismiss();
-                      positiveListener.onClick(isSpamCheckbox.isChecked());
-                    }
+                  (dialog, which) -> {
+                    dismiss();
+                    onSpamDialogClickListener.onClick(isSpamCheckbox.isChecked());
                   })
               .create();
-      dialog.setCanceledOnTouchOutside(true);
-      return dialog;
+      blockReportSpamDialog.setCanceledOnTouchOutside(true);
+      return blockReportSpamDialog;
     }
   }
 
diff --git a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java
new file mode 100644
index 0000000..fd6a807
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.blockreportspam;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.content.LocalBroadcastManager;
+import com.android.dialer.common.LogUtil;
+
+/**
+ * Notifies that a dialog for blocking a number and/or marking it as spam/not spam should be shown.
+ */
+public final class ShowBlockReportSpamDialogNotifier {
+
+  private ShowBlockReportSpamDialogNotifier() {}
+
+  /**
+   * Notifies that a dialog for blocking a number and optionally report it as spam should be shown.
+   *
+   * @param context Context
+   * @param normalizedNumber The number to be blocked/marked as spam
+   * @param countryIso The ISO 3166-1 two letters country code for the number
+   * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+   */
+  public static void notifyShowDialogToBlockNumberAndOptionallyReportSpam(
+      Context context, String normalizedNumber, String countryIso, int callType) {
+    LogUtil.enterBlock(
+        "ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumberAndOptionallyReportSpam");
+
+    Intent intent = new Intent();
+    intent.setAction(
+        ShowBlockReportSpamDialogReceiver
+            .ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM);
+
+    intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_NUMBER, normalizedNumber);
+    intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_COUNTRY_ISO, countryIso);
+    intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_CALL_TYPE, callType);
+
+    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+  }
+
+  /**
+   * Notifies that a dialog for reporting a number as not spam should be shown.
+   *
+   * @param context Context
+   * @param normalizedNumber The number to be reported as not spam
+   * @param countryIso The ISO 3166-1 two letters country code for the number
+   * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+   */
+  public static void notifyShowDialogToReportNotSpam(
+      Context context, String normalizedNumber, String countryIso, int callType) {
+    LogUtil.enterBlock("ShowBlockReportSpamDialogNotifier.notifyShowDialogToReportNotSpam");
+
+    Intent intent = new Intent();
+    intent.setAction(ShowBlockReportSpamDialogReceiver.ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM);
+    intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_NUMBER, normalizedNumber);
+    intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_COUNTRY_ISO, countryIso);
+    intent.putExtra(ShowBlockReportSpamDialogReceiver.EXTRA_CALL_TYPE, callType);
+
+    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+  }
+}
diff --git a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
new file mode 100644
index 0000000..9642468
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.blockreportspam;
+
+import android.app.FragmentManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.widget.Toast;
+import com.android.dialer.blockreportspam.BlockReportSpamDialogs.OnConfirmListener;
+import com.android.dialer.blockreportspam.BlockReportSpamDialogs.OnSpamDialogClickListener;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.ContactSource;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ReportingLocation;
+import com.android.dialer.spam.Spam;
+import com.android.dialer.spam.SpamComponent;
+import java.util.Locale;
+
+/**
+ * A {@link BroadcastReceiver} that shows an appropriate dialog upon receiving notifications from
+ * {@link ShowBlockReportSpamDialogNotifier}.
+ */
+public final class ShowBlockReportSpamDialogReceiver extends BroadcastReceiver {
+
+  static final String ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM =
+      "show_dialog_to_block_number_and_optionally_report_spam";
+  static final String ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM = "show_dialog_to_report_not_spam";
+  static final String EXTRA_NUMBER = "number";
+  static final String EXTRA_COUNTRY_ISO = "country_iso";
+  static final String EXTRA_CALL_TYPE = "call_type";
+
+  /** {@link FragmentManager} needed to show a {@link android.app.DialogFragment}. */
+  private final FragmentManager fragmentManager;
+
+  /** Returns an {@link IntentFilter} containing all actions accepted by this broadcast receiver. */
+  public static IntentFilter getIntentFilter() {
+    IntentFilter intentFilter = new IntentFilter();
+    intentFilter.addAction(ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM);
+    intentFilter.addAction(ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM);
+    return intentFilter;
+  }
+
+  public ShowBlockReportSpamDialogReceiver(FragmentManager fragmentManager) {
+    this.fragmentManager = fragmentManager;
+  }
+
+  @Override
+  public void onReceive(Context context, Intent intent) {
+    LogUtil.enterBlock("ShowBlockReportSpamDialogReceiver.onReceive");
+
+    String action = intent.getAction();
+
+    switch (Assert.isNotNull(action)) {
+      case ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM:
+        showDialogToBlockNumberAndOptionallyReportSpam(context, intent);
+        break;
+      case ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM:
+        showDialogToReportNotSpam(context, intent);
+        break;
+      default:
+        throw new IllegalStateException("Unsupported action: " + action);
+    }
+  }
+
+  private void showDialogToBlockNumberAndOptionallyReportSpam(Context context, Intent intent) {
+    LogUtil.enterBlock(
+        "ShowBlockReportSpamDialogReceiver.showDialogToBlockNumberAndOptionallyReportSpam");
+
+    Assert.checkArgument(intent.hasExtra(EXTRA_NUMBER));
+    Assert.checkArgument(intent.hasExtra(EXTRA_COUNTRY_ISO));
+    Assert.checkArgument(intent.hasExtra(EXTRA_CALL_TYPE));
+
+    String normalizedNumber = intent.getStringExtra(EXTRA_NUMBER);
+    String countryIso = intent.getStringExtra(EXTRA_COUNTRY_ISO);
+    int callType = intent.getIntExtra(EXTRA_CALL_TYPE, 0);
+
+    Spam spam = SpamComponent.get(context).spam();
+
+    // Set up the positive listener for the dialog.
+    OnSpamDialogClickListener onSpamDialogClickListener =
+        reportSpam -> {
+          LogUtil.i(
+              "ShowBlockReportSpamDialogReceiver.showDialogToBlockNumberAndOptionallyReportSpam",
+              "confirmed");
+
+          if (reportSpam && spam.isSpamEnabled()) {
+            LogUtil.i(
+                "ShowBlockReportSpamDialogReceiver.showDialogToBlockNumberAndOptionallyReportSpam",
+                "report spam");
+            Logger.get(context)
+                .logImpression(
+                    DialerImpression.Type
+                        .REPORT_CALL_AS_SPAM_VIA_CALL_LOG_BLOCK_REPORT_SPAM_SENT_VIA_BLOCK_NUMBER_DIALOG);
+            spam.reportSpamFromCallHistory(
+                normalizedNumber,
+                countryIso,
+                callType,
+                ReportingLocation.Type.UNKNOWN_REPORTING_LOCATION /* TODO(a bug): Fix. */,
+                ContactSource.Type.UNKNOWN_SOURCE_TYPE /* TODO(a bug): Fix. */);
+          }
+
+          // TODO(a bug): Block the number.
+          Toast.makeText(
+                  context,
+                  String.format(Locale.ENGLISH, "TODO: " + "Block number %s.", normalizedNumber),
+                  Toast.LENGTH_SHORT)
+              .show();
+        };
+
+    // Create and show the dialog.
+    BlockReportSpamDialogs.BlockReportSpamDialogFragment.newInstance(
+            normalizedNumber,
+            spam.isDialogReportSpamCheckedByDefault(),
+            onSpamDialogClickListener,
+            /* dismissListener = */ null)
+        .show(fragmentManager, BlockReportSpamDialogs.BLOCK_REPORT_SPAM_DIALOG_TAG);
+  }
+
+  private void showDialogToReportNotSpam(Context context, Intent intent) {
+    LogUtil.enterBlock("ShowBlockReportSpamDialogReceiver.showDialogToReportNotSpam");
+
+    Assert.checkArgument(intent.hasExtra(EXTRA_NUMBER));
+    Assert.checkArgument(intent.hasExtra(EXTRA_COUNTRY_ISO));
+    Assert.checkArgument(intent.hasExtra(EXTRA_CALL_TYPE));
+
+    String normalizedNumber = intent.getStringExtra(EXTRA_NUMBER);
+    String countryIso = intent.getStringExtra(EXTRA_COUNTRY_ISO);
+    int callType = intent.getIntExtra(EXTRA_CALL_TYPE, 0);
+
+    // Set up the positive listener for the dialog.
+    OnConfirmListener onConfirmListener =
+        () -> {
+          LogUtil.i("ShowBlockReportSpamDialogReceiver.showDialogToReportNotSpam", "confirmed");
+
+          Spam spam = SpamComponent.get(context).spam();
+          if (spam.isSpamEnabled()) {
+            Logger.get(context)
+                .logImpression(DialerImpression.Type.DIALOG_ACTION_CONFIRM_NUMBER_NOT_SPAM);
+            spam.reportNotSpamFromCallHistory(
+                normalizedNumber,
+                countryIso,
+                callType,
+                ReportingLocation.Type.UNKNOWN_REPORTING_LOCATION /* TODO(a bug): Fix. */,
+                ContactSource.Type.UNKNOWN_SOURCE_TYPE /* TODO(a bug): Fix. */);
+          }
+        };
+
+    // Create & show the dialog.
+    BlockReportSpamDialogs.ReportNotSpamDialogFragment.newInstance(
+            normalizedNumber, onConfirmListener, /* dismissListener = */ null)
+        .show(fragmentManager, BlockReportSpamDialogs.NOT_SPAM_DIALOG_TAG);
+  }
+}
diff --git a/java/com/android/dialer/blocking/res/layout/block_report_spam_dialog.xml b/java/com/android/dialer/blockreportspam/res/layout/block_report_spam_dialog.xml
similarity index 100%
rename from java/com/android/dialer/blocking/res/layout/block_report_spam_dialog.xml
rename to java/com/android/dialer/blockreportspam/res/layout/block_report_spam_dialog.xml
diff --git a/java/com/android/dialer/blockreportspam/res/values/colors.xml b/java/com/android/dialer/blockreportspam/res/values/colors.xml
new file mode 100644
index 0000000..5fa45eb
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/res/values/colors.xml
@@ -0,0 +1,21 @@
+<!--
+  ~ Copyright (C) 2012 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
+-->
+<resources>
+
+  <!-- 87% black -->
+  <color name="block_report_spam_primary_text_color">#de000000</color>
+
+</resources>
diff --git a/java/com/android/dialer/blocking/res/values/dimens.xml b/java/com/android/dialer/blockreportspam/res/values/dimens.xml
similarity index 100%
rename from java/com/android/dialer/blocking/res/values/dimens.xml
rename to java/com/android/dialer/blockreportspam/res/values/dimens.xml
diff --git a/java/com/android/dialer/blockreportspam/res/values/strings.xml b/java/com/android/dialer/blockreportspam/res/values/strings.xml
new file mode 100644
index 0000000..e803a16
--- /dev/null
+++ b/java/com/android/dialer/blockreportspam/res/values/strings.xml
@@ -0,0 +1,63 @@
+<!--
+  ~ Copyright (C) 2016 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
+  -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+  <!-- Confirmation dialog title for blocking a number. [CHAR LIMIT=NONE] -->
+  <string name="block_number_confirmation_title">
+    Block<xliff:g example="(555) 555-5555" id="number">%1$s</xliff:g>?
+  </string>
+
+  <!-- Confirmation dialog message for blocking a number with new filtering enabled.
+       [CHAR LIMIT=NONE] -->
+  <string name="block_number_confirmation_message_new_filtering">
+    You will no longer receive calls or texts from this number.
+  </string>
+
+  <!-- Block number alert dialog button [CHAR LIMIT=32] -->
+  <string name="block_number_ok">BLOCK</string>
+
+  <!-- Unblock number alert dialog button [CHAR LIMIT=32] -->
+  <string name="unblock_number_ok">UNBLOCK</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">You will no longer receive calls from this number.</string>
+
+  <!-- Text in alert dialog after clicking on Block.  [CHAR LIMIT=100] -->
+  <string name="block_number_alert_details"><xliff:g id="text">%1$s</xliff:g> This call will be reported as spam.</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 won\'t be identified 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>
+
+  <!-- Report not spam number alert dialog button [CHAR LIMIT=32] -->
+  <string name="report_not_spam_alert_button">Report</string>
+
+  <!-- Title of alert dialog after clicking on Report as not spam.  [CHAR LIMIT=100] -->
+  <string name="report_not_spam_alert_title">Report a mistake?</string>
+
+  <!-- Text in alert dialog after clicking on Report as not spam.  [CHAR LIMIT=100] -->
+  <string name="report_not_spam_alert_details">Future calls from <xliff:g id="number">%1$s</xliff:g> will no longer be identified as spam.</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>
+
+</resources>
diff --git a/java/com/android/dialer/calllog/ui/menu/Modules.java b/java/com/android/dialer/calllog/ui/menu/Modules.java
index a13f2e3..48de03e 100644
--- a/java/com/android/dialer/calllog/ui/menu/Modules.java
+++ b/java/com/android/dialer/calllog/ui/menu/Modules.java
@@ -75,7 +75,9 @@
       SharedModules.addModulesHandlingBlockedOrSpamNumber(
           context,
           modules,
-          normalizedNumber,
+          row.number().getNormalizedNumber(),
+          row.number().getCountryIso(),
+          row.callType(),
           row.numberAttributes().getIsBlocked(),
           row.numberAttributes().getIsSpam());
       SharedModules.maybeAddModuleForCopyingNumber(context, modules, normalizedNumber);
diff --git a/java/com/android/dialer/contactactions/SharedModules.java b/java/com/android/dialer/contactactions/SharedModules.java
index 6d97fcb..0689f98 100644
--- a/java/com/android/dialer/contactactions/SharedModules.java
+++ b/java/com/android/dialer/contactactions/SharedModules.java
@@ -24,6 +24,7 @@
 import android.text.TextUtils;
 import android.widget.Toast;
 import com.android.dialer.DialerPhoneNumber;
+import com.android.dialer.blockreportspam.ShowBlockReportSpamDialogNotifier;
 import com.android.dialer.clipboard.ClipboardUtils;
 import com.android.dialer.util.IntentUtil;
 import com.android.dialer.util.UriUtils;
@@ -38,7 +39,7 @@
   public static void maybeAddModuleForAddingToContacts(
       Context context,
       List<ContactActionModule> modules,
-      DialerPhoneNumber number,
+      DialerPhoneNumber dialerPhoneNumber,
       String name,
       String lookupUri,
       boolean isBlocked,
@@ -54,7 +55,7 @@
     }
 
     // Skip showing the menu item if there is no number.
-    String normalizedNumber = number.getNormalizedNumber();
+    String normalizedNumber = dialerPhoneNumber.getNormalizedNumber();
     if (TextUtils.isEmpty(normalizedNumber)) {
       return;
     }
@@ -111,17 +112,26 @@
     }
   }
 
+  /**
+   * Add modules related to blocking/unblocking a number and/or reporting it as spam/not spam.
+   *
+   * @param normalizedNumber The number to be blocked / unblocked / marked as spam/not spam
+   * @param countryIso The ISO 3166-1 two letters country code for the number
+   * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+   */
   public static void addModulesHandlingBlockedOrSpamNumber(
       Context context,
       List<ContactActionModule> modules,
       String normalizedNumber,
+      String countryIso,
+      int callType,
       boolean isBlocked,
       boolean isSpam) {
     // For a spam number, add two options:
     // (1) "Not spam" and "Block", or
     // (2) "Not spam" and "Unblock".
     if (isSpam) {
-      addModuleForMarkingNumberAsNonSpam(context, modules, normalizedNumber);
+      addModuleForMarkingNumberAsNonSpam(context, modules, normalizedNumber, countryIso, callType);
       addModuleForBlockingOrUnblockingNumber(context, modules, normalizedNumber, isBlocked);
       return;
     }
@@ -133,11 +143,23 @@
     }
 
     // For a number that is neither a spam number nor blocked, add "Block/Report spam" option.
-    addModuleForBlockingNumberAndOptionallyReportingSpam(context, modules, normalizedNumber);
+    addModuleForBlockingNumberAndOptionallyReportingSpam(
+        context, modules, normalizedNumber, countryIso, callType);
   }
 
+  /**
+   * Add "Not spam" module.
+   *
+   * @param normalizedNumber The number to be marked as not spam
+   * @param countryIso The ISO 3166-1 two letters country code for the number
+   * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+   */
   private static void addModuleForMarkingNumberAsNonSpam(
-      Context context, List<ContactActionModule> modules, String normalizedNumber) {
+      Context context,
+      List<ContactActionModule> modules,
+      String normalizedNumber,
+      String countryIso,
+      int callType) {
     modules.add(
         new ContactActionModule() {
           @Override
@@ -152,12 +174,8 @@
 
           @Override
           public boolean onClick() {
-            // TODO(a bug): implement this method.
-            Toast.makeText(
-                    context,
-                    String.format(Locale.ENGLISH, "TODO: Report %s as non-spam", normalizedNumber),
-                    Toast.LENGTH_SHORT)
-                .show();
+            ShowBlockReportSpamDialogNotifier.notifyShowDialogToReportNotSpam(
+                context, normalizedNumber, countryIso, callType);
             return true; // Close the bottom sheet.
           }
         });
@@ -198,8 +216,19 @@
         });
   }
 
+  /**
+   * Add "Block/Report spam" module
+   *
+   * @param normalizedNumber The number to be blocked / unblocked / marked as spam/not spam
+   * @param countryIso The ISO 3166-1 two letters country code for the number
+   * @param callType Call type defined in {@link android.provider.CallLog.Calls}
+   */
   private static void addModuleForBlockingNumberAndOptionallyReportingSpam(
-      Context context, List<ContactActionModule> modules, String normalizedNumber) {
+      Context context,
+      List<ContactActionModule> modules,
+      String normalizedNumber,
+      String countryIso,
+      int callType) {
     modules.add(
         new ContactActionModule() {
           @Override
@@ -214,15 +243,8 @@
 
           @Override
           public boolean onClick() {
-            // TODO(a bug): implement this method.
-            Toast.makeText(
-                    context,
-                    String.format(
-                        Locale.ENGLISH,
-                        "TODO: Block and optionally report as spam %s.",
-                        normalizedNumber),
-                    Toast.LENGTH_SHORT)
-                .show();
+            ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumberAndOptionallyReportSpam(
+                context, normalizedNumber, countryIso, callType);
             return true; // Close the bottom sheet.
           }
         });
diff --git a/java/com/android/dialer/main/MainActivityPeer.java b/java/com/android/dialer/main/MainActivityPeer.java
index 9c5627b..31af9ad 100644
--- a/java/com/android/dialer/main/MainActivityPeer.java
+++ b/java/com/android/dialer/main/MainActivityPeer.java
@@ -28,6 +28,8 @@
 
   void onUserLeaveHint();
 
+  void onActivityPause();
+
   void onActivityStop();
 
   void onActivityDestroyed();
diff --git a/java/com/android/dialer/main/impl/MainActivity.java b/java/com/android/dialer/main/impl/MainActivity.java
index 1646bec..fbcbeff 100644
--- a/java/com/android/dialer/main/impl/MainActivity.java
+++ b/java/com/android/dialer/main/impl/MainActivity.java
@@ -99,6 +99,12 @@
   }
 
   @Override
+  protected void onPause() {
+    super.onPause();
+    activePeer.onActivityPause();
+  }
+
+  @Override
   protected void onStop() {
     super.onStop();
     activePeer.onActivityStop();
diff --git a/java/com/android/dialer/main/impl/NewMainActivityPeer.java b/java/com/android/dialer/main/impl/NewMainActivityPeer.java
index 6f5c186..081559a 100644
--- a/java/com/android/dialer/main/impl/NewMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/NewMainActivityPeer.java
@@ -22,6 +22,8 @@
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
+import android.support.v4.content.LocalBroadcastManager;
+import com.android.dialer.blockreportspam.ShowBlockReportSpamDialogReceiver;
 import com.android.dialer.calllog.CallLogComponent;
 import com.android.dialer.calllog.ui.NewCallLogFragment;
 import com.android.dialer.common.concurrent.DefaultFutureCallback;
@@ -37,9 +39,12 @@
 public class NewMainActivityPeer implements MainActivityPeer {
 
   private final MainActivity mainActivity;
+  private final ShowBlockReportSpamDialogReceiver showBlockReportSpamDialogReceiver;
 
   public NewMainActivityPeer(MainActivity mainActivity) {
     this.mainActivity = mainActivity;
+    this.showBlockReportSpamDialogReceiver =
+        new ShowBlockReportSpamDialogReceiver(mainActivity.getFragmentManager());
   }
 
   @Override
@@ -54,12 +59,22 @@
   }
 
   @Override
-  public void onActivityResume() {}
+  public void onActivityResume() {
+    LocalBroadcastManager.getInstance(mainActivity)
+        .registerReceiver(
+            showBlockReportSpamDialogReceiver, ShowBlockReportSpamDialogReceiver.getIntentFilter());
+  }
 
   @Override
   public void onUserLeaveHint() {}
 
   @Override
+  public void onActivityPause() {
+    LocalBroadcastManager.getInstance(mainActivity)
+        .unregisterReceiver(showBlockReportSpamDialogReceiver);
+  }
+
+  @Override
   public void onActivityStop() {}
 
   @Override
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index cdbab5c..9ceea28 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -398,6 +398,9 @@
   }
 
   @Override
+  public void onActivityPause() {}
+
+  @Override
   public void onActivityStop() {
     lastTabController.onActivityStop();
     callLogFragmentListener.onActivityStop(
diff --git a/java/com/android/dialer/voicemail/listui/menu/Modules.java b/java/com/android/dialer/voicemail/listui/menu/Modules.java
index 7254ad6..84921bd 100644
--- a/java/com/android/dialer/voicemail/listui/menu/Modules.java
+++ b/java/com/android/dialer/voicemail/listui/menu/Modules.java
@@ -56,7 +56,9 @@
     SharedModules.addModulesHandlingBlockedOrSpamNumber(
         context,
         modules,
-        normalizedNumber,
+        voicemailEntry.number().getNormalizedNumber(),
+        voicemailEntry.number().getCountryIso(),
+        voicemailEntry.callType(),
         voicemailEntry.numberAttributes().getIsBlocked(),
         voicemailEntry.numberAttributes().getIsSpam());
 
diff --git a/java/com/android/incallui/spam/SpamNotificationActivity.java b/java/com/android/incallui/spam/SpamNotificationActivity.java
index f6da2a3..6ba7c30 100644
--- a/java/com/android/incallui/spam/SpamNotificationActivity.java
+++ b/java/com/android/incallui/spam/SpamNotificationActivity.java
@@ -28,10 +28,10 @@
 import android.support.v4.app.FragmentActivity;
 import android.telephony.PhoneNumberUtils;
 import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
-import com.android.dialer.blocking.BlockReportSpamDialogs;
 import com.android.dialer.blocking.BlockedNumbersMigrator;
 import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.blocking.FilteredNumberCompat;
+import com.android.dialer.blockreportspam.BlockReportSpamDialogs;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.location.GeoUtil;
 import com.android.dialer.logging.ContactLookupResult;
diff --git a/packages.mk b/packages.mk
index 304db49..abe9eb5 100644
--- a/packages.mk
+++ b/packages.mk
@@ -13,6 +13,7 @@
 	com.android.dialer.binary.aosp.testing \
 	com.android.dialer.binary.google \
 	com.android.dialer.blocking \
+	com.android.dialer.blockreportspam \
 	com.android.dialer.callcomposer \
 	com.android.dialer.callcomposer.camera \
 	com.android.dialer.callcomposer.camera.camerafocus \
