diff --git a/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
index 2ec5dbd..db5fe21 100644
--- a/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
+++ b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
@@ -264,8 +264,8 @@
   /**
    * Dialog for unblocking a number and marking it as not spam.
    *
-   * <p>This dialog is used in the old call log, where unblocking a number will also marking it as
-   * not spam.
+   * <p>This dialog is used in the old call log, where unblocking a number will also mark it as not
+   * spam.
    */
   public static class DialogFragmentForUnblockingNumberAndReportingAsNotSpam
       extends CommonDialogsFragment {
@@ -310,6 +310,43 @@
     }
   }
 
+  /**
+   * Dialog for unblocking a number.
+   *
+   * <p>This dialog is used in the new call log, where unblocking a number will *not* mark it as not
+   * spam.
+   */
+  public static class DialogFragmentForUnblockingNumber extends CommonDialogsFragment {
+
+    public static DialogFragment newInstance(
+        String displayNumber,
+        OnConfirmListener positiveListener,
+        @Nullable DialogInterface.OnDismissListener dismissListener) {
+      DialogFragmentForUnblockingNumberAndReportingAsNotSpam fragment =
+          new DialogFragmentForUnblockingNumberAndReportingAsNotSpam();
+      fragment.displayNumber = displayNumber;
+      fragment.positiveListener = positiveListener;
+      fragment.dismissListener = dismissListener;
+      return fragment;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+      super.onCreateDialog(savedInstanceState);
+      // Return the newly created dialog
+      AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this);
+      alertDialogBuilder.setMessage(
+          getString(R.string.unblock_report_number_alert_title, displayNumber));
+      Dialog dialog =
+          alertDialogBuilder
+              .setPositiveButton(
+                  R.string.unblock_number_ok, createGenericOnClickListener(this, positiveListener))
+              .create();
+      dialog.setCanceledOnTouchOutside(true);
+      return dialog;
+    }
+  }
+
   /** Dialog for reporting a number as not spam. */
   public static class DialogFragmentForReportingNotSpam extends CommonDialogsFragment {
 
diff --git a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java
index 2fccdd1..b33dc0f 100644
--- a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java
+++ b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java
@@ -72,4 +72,17 @@
 
     LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
   }
+
+  /** Notifies that a dialog for unblocking a number should be shown. */
+  public static void notifyShowDialogToUnblockNumber(
+      Context context, BlockReportSpamDialogInfo blockReportSpamDialogInfo) {
+    LogUtil.enterBlock("ShowBlockReportSpamDialogNotifier.notifyShowDialogToUnblockNumber");
+
+    Intent intent = new Intent();
+    intent.setAction(ShowBlockReportSpamDialogReceiver.ACTION_SHOW_DIALOG_TO_UNBLOCK_NUMBER);
+    ProtoParsers.put(
+        intent, ShowBlockReportSpamDialogReceiver.EXTRA_DIALOG_INFO, blockReportSpamDialogInfo);
+
+    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+  }
 }
diff --git a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
index 6b8f819..02aa994 100644
--- a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
+++ b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java
@@ -21,19 +21,24 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.support.annotation.Nullable;
 import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForBlockingNumber;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForBlockingNumberAndOptionallyReportingAsSpam;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForReportingNotSpam;
+import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForUnblockingNumber;
 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.common.concurrent.DialerExecutor.Worker;
+import com.android.dialer.common.concurrent.DialerExecutorComponent;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.protos.ProtoParsers;
 import com.android.dialer.spam.Spam;
 import com.android.dialer.spam.SpamComponent;
+import com.google.auto.value.AutoValue;
 
 /**
  * A {@link BroadcastReceiver} that shows an appropriate dialog upon receiving notifications from
@@ -45,6 +50,7 @@
   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 ACTION_SHOW_DIALOG_TO_UNBLOCK_NUMBER = "show_dialog_to_unblock_number";
   static final String EXTRA_DIALOG_INFO = "dialog_info";
 
   /** {@link FragmentManager} needed to show a {@link android.app.DialogFragment}. */
@@ -56,6 +62,7 @@
     intentFilter.addAction(ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM);
     intentFilter.addAction(ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER);
     intentFilter.addAction(ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM);
+    intentFilter.addAction(ACTION_SHOW_DIALOG_TO_UNBLOCK_NUMBER);
     return intentFilter;
   }
 
@@ -79,6 +86,9 @@
       case ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM:
         showDialogToReportNotSpam(context, intent);
         break;
+      case ACTION_SHOW_DIALOG_TO_UNBLOCK_NUMBER:
+        showDialogToUnblockNumber(context, intent);
+        break;
       default:
         throw new IllegalStateException("Unsupported action: " + action);
     }
@@ -197,4 +207,103 @@
             dialogInfo.getNormalizedNumber(), onConfirmListener, /* dismissListener = */ null)
         .show(fragmentManager, BlockReportSpamDialogs.NOT_SPAM_DIALOG_TAG);
   }
+
+  private void showDialogToUnblockNumber(Context context, Intent intent) {
+    LogUtil.enterBlock("ShowBlockReportSpamDialogReceiver.showDialogToUnblockNumber");
+
+    Assert.checkArgument(intent.hasExtra(EXTRA_DIALOG_INFO));
+    BlockReportSpamDialogInfo dialogInfo =
+        ProtoParsers.getTrusted(
+            intent, EXTRA_DIALOG_INFO, BlockReportSpamDialogInfo.getDefaultInstance());
+
+    FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler =
+        new FilteredNumberAsyncQueryHandler(context);
+
+    // Set up the positive listener for the dialog.
+    OnConfirmListener onConfirmListener =
+        () -> {
+          LogUtil.i("ShowBlockReportSpamDialogReceiver.showDialogToUnblockNumber", "confirmed");
+
+          DialerExecutorComponent.get(context)
+              .dialerExecutorFactory()
+              .createNonUiTaskBuilder(
+                  new GetIdForBlockedNumberWorker(filteredNumberAsyncQueryHandler))
+              .onSuccess(
+                  idForBlockedNumber -> {
+                    LogUtil.i(
+                        "ShowBlockReportSpamDialogReceiver.showDialogToUnblockNumber",
+                        "ID for the blocked number retrieved");
+                    if (idForBlockedNumber == null) {
+                      throw new IllegalStateException("ID for a blocked number is null.");
+                    }
+
+                    LogUtil.i(
+                        "ShowBlockReportSpamDialogReceiver.showDialogToUnblockNumber",
+                        "unblocking number");
+                    filteredNumberAsyncQueryHandler.unblock(
+                        (rows, values) ->
+                            Logger.get(context)
+                                .logImpression(DialerImpression.Type.USER_ACTION_UNBLOCKED_NUMBER),
+                        idForBlockedNumber);
+                  })
+              .onFailure(
+                  throwable -> {
+                    throw new RuntimeException(throwable);
+                  })
+              .build()
+              .executeSerial(
+                  NumberInfo.newBuilder()
+                      .setNormalizedNumber(dialogInfo.getNormalizedNumber())
+                      .setCountryIso(dialogInfo.getCountryIso())
+                      .build());
+        };
+
+    // Create & show the dialog.
+    DialogFragmentForUnblockingNumber.newInstance(
+            dialogInfo.getNormalizedNumber(), onConfirmListener, /* dismissListener = */ null)
+        .show(fragmentManager, BlockReportSpamDialogs.UNBLOCK_DIALOG_TAG);
+  }
+
+  /** A {@link Worker} that retrieves the ID of a blocked number from the database. */
+  private static final class GetIdForBlockedNumberWorker implements Worker<NumberInfo, Integer> {
+
+    private final FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler;
+
+    GetIdForBlockedNumberWorker(FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler) {
+      this.filteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler;
+    }
+
+    @Nullable
+    @Override
+    public Integer doInBackground(NumberInfo input) throws Throwable {
+      LogUtil.enterBlock("GetIdForBlockedNumberWorker.doInBackground");
+
+      return filteredNumberAsyncQueryHandler.getBlockedIdSynchronous(
+          input.getNormalizedNumber(), input.getCountryIso());
+    }
+  }
+
+  /**
+   * Contains information about a number and serves as the input to {@link
+   * GetIdForBlockedNumberWorker}.
+   */
+  @AutoValue
+  abstract static class NumberInfo {
+    static Builder newBuilder() {
+      return new AutoValue_ShowBlockReportSpamDialogReceiver_NumberInfo.Builder();
+    }
+
+    abstract String getNormalizedNumber();
+
+    abstract String getCountryIso();
+
+    @AutoValue.Builder
+    abstract static class Builder {
+      abstract Builder setNormalizedNumber(String normalizedNumber);
+
+      abstract Builder setCountryIso(String countryIso);
+
+      abstract NumberInfo build();
+    }
+  }
 }
diff --git a/java/com/android/dialer/historyitemactions/SharedModules.java b/java/com/android/dialer/historyitemactions/SharedModules.java
index 1147289..fa70626 100644
--- a/java/com/android/dialer/historyitemactions/SharedModules.java
+++ b/java/com/android/dialer/historyitemactions/SharedModules.java
@@ -22,7 +22,6 @@
 import android.provider.ContactsContract;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
-import android.widget.Toast;
 import com.android.dialer.DialerPhoneNumber;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogInfo;
 import com.android.dialer.blockreportspam.ShowBlockReportSpamDialogNotifier;
@@ -32,7 +31,6 @@
 import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 
 /**
  * Modules for the bottom sheet that are shared between NewVoicemailFragment and NewCallLogFragment
@@ -187,19 +185,12 @@
 
       @Override
       public boolean onClick() {
-        if (!isBlocked) {
-          ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumber(
+        if (isBlocked) {
+          ShowBlockReportSpamDialogNotifier.notifyShowDialogToUnblockNumber(
               context, blockReportSpamDialogInfo);
         } else {
-          // TODO(a bug): implement this method.
-          Toast.makeText(
-                  context,
-                  String.format(
-                      Locale.ENGLISH,
-                      "TODO: Unblock number %s.",
-                      blockReportSpamDialogInfo.getNormalizedNumber()),
-                  Toast.LENGTH_SHORT)
-              .show();
+          ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumber(
+              context, blockReportSpamDialogInfo);
         }
         return true; // Close the bottom sheet.
       }
