diff --git a/java/com/android/dialer/calllog/ui/menu/DeleteCallLogItemModule.java b/java/com/android/dialer/calllog/ui/menu/DeleteCallLogItemModule.java
index ac2e3b3..ad5671e 100644
--- a/java/com/android/dialer/calllog/ui/menu/DeleteCallLogItemModule.java
+++ b/java/com/android/dialer/calllog/ui/menu/DeleteCallLogItemModule.java
@@ -28,13 +28,13 @@
 import com.android.dialer.common.concurrent.DialerExecutor.Worker;
 import com.android.dialer.common.concurrent.DialerExecutorComponent;
 import com.android.dialer.common.database.Selection;
-import com.android.dialer.contactactions.ContactActionModule;
+import com.android.dialer.historyitemactions.HistoryItemActionModule;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
 
-/** {@link ContactActionModule} for deleting a call log item in the new call log. */
-public final class DeleteCallLogItemModule implements ContactActionModule {
+/** {@link HistoryItemActionModule} for deleting a call log item in the new call log. */
+public final class DeleteCallLogItemModule implements HistoryItemActionModule {
   private static final String TAG = DeleteCallLogItemModule.class.getName();
 
   private final Context context;
diff --git a/java/com/android/dialer/calllog/ui/menu/Modules.java b/java/com/android/dialer/calllog/ui/menu/Modules.java
index d86c04d..1479727 100644
--- a/java/com/android/dialer/calllog/ui/menu/Modules.java
+++ b/java/com/android/dialer/calllog/ui/menu/Modules.java
@@ -25,36 +25,42 @@
 import com.android.dialer.calllog.model.CoalescedRow;
 import com.android.dialer.calllogutils.CallLogContactTypes;
 import com.android.dialer.calllogutils.PhoneNumberDisplayUtil;
-import com.android.dialer.contactactions.ContactActionModule;
-import com.android.dialer.contactactions.DividerModule;
-import com.android.dialer.contactactions.IntentModule;
-import com.android.dialer.contactactions.SharedModules;
 import com.android.dialer.dialercontact.DialerContact;
+import com.android.dialer.historyitemactions.DividerModule;
+import com.android.dialer.historyitemactions.HistoryItemActionModule;
+import com.android.dialer.historyitemactions.IntentModule;
+import com.android.dialer.historyitemactions.SharedModules;
 import com.android.dialer.logging.ReportingLocation;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
 import com.android.dialer.telecom.TelecomUtil;
 import com.google.common.base.Optional;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
  * Configures the modules for the bottom sheet; these are the rows below the top row (primary
  * action) in the bottom sheet.
  */
+@SuppressWarnings("Guava")
 final class Modules {
 
-  static List<ContactActionModule> fromRow(Context context, CoalescedRow row) {
+  static List<HistoryItemActionModule> fromRow(Context context, CoalescedRow row) {
     // Conditionally add each module, which are items in the bottom sheet's menu.
-    List<ContactActionModule> modules = new ArrayList<>();
+    List<HistoryItemActionModule> modules = new ArrayList<>();
 
     String normalizedNumber = row.number().getNormalizedNumber();
     boolean canPlaceCalls =
         PhoneNumberHelper.canPlaceCallsTo(normalizedNumber, row.numberPresentation());
 
     if (canPlaceCalls) {
-      addModuleForCalls(context, modules, row, normalizedNumber);
-      SharedModules.maybeAddModuleForSendingTextMessage(
-          context, modules, normalizedNumber, row.numberAttributes().getIsBlocked());
+      modules.addAll(createModulesForCalls(context, row, normalizedNumber));
+      Optional<HistoryItemActionModule> moduleForSendingTextMessage =
+          SharedModules.createModuleForSendingTextMessage(
+              context, normalizedNumber, row.numberAttributes().getIsBlocked());
+      if (moduleForSendingTextMessage.isPresent()) {
+        modules.add(moduleForSendingTextMessage.get());
+      }
     }
 
     if (!modules.isEmpty()) {
@@ -65,45 +71,52 @@
     // TODO(zachh): Module for CallComposer.
 
     if (canPlaceCalls) {
-      SharedModules.maybeAddModuleForAddingToContacts(
-          context,
-          modules,
-          row.number(),
-          row.numberAttributes().getName(),
-          row.numberAttributes().getLookupUri(),
-          row.numberAttributes().getIsBlocked(),
-          row.numberAttributes().getIsSpam());
-      SharedModules.addModulesHandlingBlockedOrSpamNumber(
-          context,
-          modules,
-          row.number().getNormalizedNumber(),
-          row.number().getCountryIso(),
-          row.callType(),
-          row.numberAttributes().getIsBlocked(),
-          row.numberAttributes().getIsSpam(),
-          ReportingLocation.Type.CALL_LOG_HISTORY);
-      SharedModules.maybeAddModuleForCopyingNumber(context, modules, normalizedNumber);
+      Optional<HistoryItemActionModule> moduleForAddingToContacts =
+          SharedModules.createModuleForAddingToContacts(
+              context,
+              row.number(),
+              row.numberAttributes().getName(),
+              row.numberAttributes().getLookupUri(),
+              row.numberAttributes().getIsBlocked(),
+              row.numberAttributes().getIsSpam());
+      if (moduleForAddingToContacts.isPresent()) {
+        modules.add(moduleForAddingToContacts.get());
+      }
+
+      modules.addAll(
+          SharedModules.createModulesHandlingBlockedOrSpamNumber(
+              context,
+              row.number().getNormalizedNumber(),
+              row.number().getCountryIso(),
+              row.callType(),
+              row.numberAttributes().getIsBlocked(),
+              row.numberAttributes().getIsSpam(),
+              ReportingLocation.Type.CALL_LOG_HISTORY));
+
+      Optional<HistoryItemActionModule> moduleForCopyingNumber =
+          SharedModules.createModuleForCopyingNumber(context, normalizedNumber);
+      if (moduleForCopyingNumber.isPresent()) {
+        modules.add(moduleForCopyingNumber.get());
+      }
     }
 
     // TODO(zachh): Revisit if DialerContact is the best thing to pass to CallDetails; could
-    // it use a ContactPrimaryActionInfo instead?
-    addModuleForAccessingCallDetails(context, modules, row);
+    // it use a HistoryItemPrimaryActionInfo instead?
+    modules.add(createModuleForAccessingCallDetails(context, row));
 
     modules.add(new DeleteCallLogItemModule(context, row.coalescedIds()));
 
     return modules;
   }
 
-  private static void addModuleForCalls(
-      Context context,
-      List<ContactActionModule> modules,
-      CoalescedRow row,
-      String normalizedNumber) {
+  private static List<HistoryItemActionModule> createModulesForCalls(
+      Context context, CoalescedRow row, String normalizedNumber) {
     // Don't add call options if a number is blocked.
     if (row.numberAttributes().getIsBlocked()) {
-      return;
+      return Collections.emptyList();
     }
 
+    List<HistoryItemActionModule> modules = new ArrayList<>();
     PhoneAccountHandle phoneAccountHandle =
         TelecomUtil.composePhoneAccountHandle(
             row.phoneAccountComponentName(), row.phoneAccountId());
@@ -123,24 +136,25 @@
 
     // TODO(zachh): Also show video option if the call log entry is for an audio call but video
     // capabilities are present?
+
+    return modules;
   }
 
-  private static void addModuleForAccessingCallDetails(
-      Context context, List<ContactActionModule> modules, CoalescedRow row) {
+  private static HistoryItemActionModule createModuleForAccessingCallDetails(
+      Context context, CoalescedRow row) {
     boolean canReportAsInvalidNumber = row.numberAttributes().getCanReportAsInvalidNumber();
     boolean canSupportAssistedDialing = !TextUtils.isEmpty(row.numberAttributes().getLookupUri());
 
-    modules.add(
-        new IntentModule(
+    return new IntentModule(
+        context,
+        CallDetailsActivity.newInstance(
             context,
-            CallDetailsActivity.newInstance(
-                context,
-                row.coalescedIds(),
-                createDialerContactFromRow(context, row),
-                canReportAsInvalidNumber,
-                canSupportAssistedDialing),
-            R.string.call_details_menu_label,
-            R.drawable.quantum_ic_info_outline_vd_theme_24));
+            row.coalescedIds(),
+            createDialerContactFromRow(context, row),
+            canReportAsInvalidNumber,
+            canSupportAssistedDialing),
+        R.string.call_details_menu_label,
+        R.drawable.quantum_ic_info_outline_vd_theme_24);
   }
 
   private static DialerContact createDialerContactFromRow(Context context, CoalescedRow row) {
diff --git a/java/com/android/dialer/calllog/ui/menu/NewCallLogMenu.java b/java/com/android/dialer/calllog/ui/menu/NewCallLogMenu.java
index 02724e6..9efe907 100644
--- a/java/com/android/dialer/calllog/ui/menu/NewCallLogMenu.java
+++ b/java/com/android/dialer/calllog/ui/menu/NewCallLogMenu.java
@@ -22,8 +22,8 @@
 import com.android.dialer.calllog.CallLogComponent;
 import com.android.dialer.calllog.model.CoalescedRow;
 import com.android.dialer.common.concurrent.DefaultFutureCallback;
-import com.android.dialer.contactactions.ContactActionBottomSheet;
 import com.android.dialer.glidephotomanager.GlidePhotoManager;
+import com.android.dialer.historyitemactions.HistoryItemActionBottomSheet;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.MoreExecutors;
 
@@ -34,7 +34,7 @@
   public static View.OnClickListener createOnClickListener(
       Context context, CoalescedRow row, GlidePhotoManager glidePhotoManager) {
     return view -> {
-      ContactActionBottomSheet.show(
+      HistoryItemActionBottomSheet.show(
           context,
           PrimaryAction.fromRow(context, row),
           Modules.fromRow(context, row),
diff --git a/java/com/android/dialer/calllog/ui/menu/PrimaryAction.java b/java/com/android/dialer/calllog/ui/menu/PrimaryAction.java
index 92a8453..de4a70c 100644
--- a/java/com/android/dialer/calllog/ui/menu/PrimaryAction.java
+++ b/java/com/android/dialer/calllog/ui/menu/PrimaryAction.java
@@ -22,14 +22,14 @@
 import com.android.dialer.calllogutils.CallLogEntryText;
 import com.android.dialer.calllogutils.CallLogIntents;
 import com.android.dialer.calllogutils.NumberAttributesConverter;
-import com.android.dialer.contactactions.ContactPrimaryActionInfo;
+import com.android.dialer.historyitemactions.HistoryItemPrimaryActionInfo;
 
 /** Configures the primary action row (top row) for the bottom sheet. */
 final class PrimaryAction {
 
-  static ContactPrimaryActionInfo fromRow(Context context, CoalescedRow row) {
+  static HistoryItemPrimaryActionInfo fromRow(Context context, CoalescedRow row) {
     CharSequence primaryText = CallLogEntryText.buildPrimaryText(context, row);
-    return ContactPrimaryActionInfo.builder()
+    return HistoryItemPrimaryActionInfo.builder()
         .setNumber(row.number())
         .setPhotoInfo(
             NumberAttributesConverter.toPhotoInfoBuilder(row.numberAttributes())
diff --git a/java/com/android/dialer/contactactions/SharedModules.java b/java/com/android/dialer/contactactions/SharedModules.java
deleted file mode 100644
index 3007a59..0000000
--- a/java/com/android/dialer/contactactions/SharedModules.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 2017 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.contactactions;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-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.ShowBlockReportSpamDialogNotifier;
-import com.android.dialer.clipboard.ClipboardUtils;
-import com.android.dialer.logging.ReportingLocation;
-import com.android.dialer.util.IntentUtil;
-import com.android.dialer.util.UriUtils;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Modules for the bottom sheet that are shared between NewVoicemailFragment and NewCallLogFragment
- */
-public class SharedModules {
-
-  public static void maybeAddModuleForAddingToContacts(
-      Context context,
-      List<ContactActionModule> modules,
-      DialerPhoneNumber dialerPhoneNumber,
-      String name,
-      String lookupUri,
-      boolean isBlocked,
-      boolean isSpam) {
-    // Skip showing the menu item for a spam/blocked number.
-    if (isBlocked || isSpam) {
-      return;
-    }
-
-    // Skip showing the menu item for existing contacts.
-    if (isExistingContact(lookupUri)) {
-      return;
-    }
-
-    // Skip showing the menu item if there is no number.
-    String normalizedNumber = dialerPhoneNumber.getNormalizedNumber();
-    if (TextUtils.isEmpty(normalizedNumber)) {
-      return;
-    }
-
-    Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
-    intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
-    intent.putExtra(ContactsContract.Intents.Insert.PHONE, normalizedNumber);
-
-    if (!TextUtils.isEmpty(name)) {
-      intent.putExtra(ContactsContract.Intents.Insert.NAME, name);
-    }
-    modules.add(
-        new IntentModule(
-            context,
-            intent,
-            R.string.add_to_contacts,
-            R.drawable.quantum_ic_person_add_vd_theme_24));
-  }
-
-  /**
-   * Lookup URIs are currently fetched from the cached column of the system call log. This URI
-   * contains encoded information for non-contacts for the purposes of populating contact cards.
-   *
-   * <p>We infer whether a contact is existing or not by checking if the lookup URI is "encoded" or
-   * not.
-   *
-   * <p>TODO(zachh): We should revisit this once the contact URI is no longer being read from the
-   * cached column in the system database, in case we decide not to overload the column.
-   */
-  public static boolean isExistingContact(@Nullable String lookupUri) {
-    return !TextUtils.isEmpty(lookupUri) && !UriUtils.isEncodedContactUri(Uri.parse(lookupUri));
-  }
-
-  public static void maybeAddModuleForSendingTextMessage(
-      Context context,
-      List<ContactActionModule> modules,
-      String normalizedNumber,
-      boolean isBlocked) {
-    // Don't show the option to send a text message if the number is blocked.
-    if (isBlocked) {
-      return;
-    }
-
-    // TODO(zachh): There are some conditions where this module should not be shown; consider
-    // voicemail, business numbers, etc.
-
-    if (!TextUtils.isEmpty(normalizedNumber)) {
-      modules.add(
-          new IntentModule(
-              context,
-              IntentUtil.getSendSmsIntent(normalizedNumber),
-              R.string.send_a_message,
-              R.drawable.quantum_ic_message_vd_theme_24));
-    }
-  }
-
-  /**
-   * 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}
-   * @param reportingLocation The location where the number is reported. See {@link
-   *     ReportingLocation.Type}.
-   */
-  public static void addModulesHandlingBlockedOrSpamNumber(
-      Context context,
-      List<ContactActionModule> modules,
-      String normalizedNumber,
-      String countryIso,
-      int callType,
-      boolean isBlocked,
-      boolean isSpam,
-      ReportingLocation.Type reportingLocation) {
-    // For a spam number, add two options:
-    // (1) "Not spam" and "Block", or
-    // (2) "Not spam" and "Unblock".
-    if (isSpam) {
-      addModuleForMarkingNumberAsNonSpam(
-          context, modules, normalizedNumber, countryIso, callType, reportingLocation);
-      addModuleForBlockingOrUnblockingNumber(context, modules, normalizedNumber, isBlocked);
-      return;
-    }
-
-    // For a blocked non-spam number, add "Unblock" option.
-    if (isBlocked) {
-      addModuleForBlockingOrUnblockingNumber(context, modules, normalizedNumber, isBlocked);
-      return;
-    }
-
-    // For a number that is neither a spam number nor blocked, add "Block/Report spam" option.
-    addModuleForBlockingNumberAndOptionallyReportingSpam(
-        context, modules, normalizedNumber, countryIso, callType, reportingLocation);
-  }
-
-  /**
-   * 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}
-   * @param reportingLocation The location where the number is reported. See {@link
-   *     ReportingLocation.Type}.
-   */
-  private static void addModuleForMarkingNumberAsNonSpam(
-      Context context,
-      List<ContactActionModule> modules,
-      String normalizedNumber,
-      String countryIso,
-      int callType,
-      ReportingLocation.Type reportingLocation) {
-    modules.add(
-        new ContactActionModule() {
-          @Override
-          public int getStringId() {
-            return R.string.not_spam;
-          }
-
-          @Override
-          public int getDrawableId() {
-            return R.drawable.quantum_ic_report_off_vd_theme_24;
-          }
-
-          @Override
-          public boolean onClick() {
-            ShowBlockReportSpamDialogNotifier.notifyShowDialogToReportNotSpam(
-                context, normalizedNumber, countryIso, callType, reportingLocation);
-            return true; // Close the bottom sheet.
-          }
-        });
-  }
-
-  private static void addModuleForBlockingOrUnblockingNumber(
-      Context context,
-      List<ContactActionModule> modules,
-      String normalizedNumber,
-      boolean isBlocked) {
-    modules.add(
-        new ContactActionModule() {
-          @Override
-          public int getStringId() {
-            return isBlocked ? R.string.unblock_number : R.string.block_number;
-          }
-
-          @Override
-          public int getDrawableId() {
-            return isBlocked
-                ? R.drawable.ic_unblock // TODO(a bug): use a vector icon
-                : R.drawable.quantum_ic_block_vd_theme_24;
-          }
-
-          @Override
-          public boolean onClick() {
-            // TODO(a bug): implement this method.
-            Toast.makeText(
-                    context,
-                    String.format(
-                        Locale.ENGLISH,
-                        "TODO: " + (isBlocked ? "Unblock " : "Block ") + " number %s.",
-                        normalizedNumber),
-                    Toast.LENGTH_SHORT)
-                .show();
-            return true; // Close the bottom sheet.
-          }
-        });
-  }
-
-  /**
-   * 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}
-   * @param reportingLocation The location where the number is reported. See {@link
-   *     ReportingLocation.Type}.
-   */
-  private static void addModuleForBlockingNumberAndOptionallyReportingSpam(
-      Context context,
-      List<ContactActionModule> modules,
-      String normalizedNumber,
-      String countryIso,
-      int callType,
-      ReportingLocation.Type reportingLocation) {
-    modules.add(
-        new ContactActionModule() {
-          @Override
-          public int getStringId() {
-            return R.string.block_and_optionally_report_spam;
-          }
-
-          @Override
-          public int getDrawableId() {
-            return R.drawable.quantum_ic_block_vd_theme_24;
-          }
-
-          @Override
-          public boolean onClick() {
-            ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumberAndOptionallyReportSpam(
-                context, normalizedNumber, countryIso, callType, reportingLocation);
-            return true; // Close the bottom sheet.
-          }
-        });
-  }
-
-  public static void maybeAddModuleForCopyingNumber(
-      Context context, List<ContactActionModule> modules, String normalizedNumber) {
-    if (TextUtils.isEmpty(normalizedNumber)) {
-      return;
-    }
-    modules.add(
-        new ContactActionModule() {
-          @Override
-          public int getStringId() {
-            return R.string.copy_number;
-          }
-
-          @Override
-          public int getDrawableId() {
-            return R.drawable.quantum_ic_content_copy_vd_theme_24;
-          }
-
-          @Override
-          public boolean onClick() {
-            ClipboardUtils.copyText(context, null, normalizedNumber, true);
-            return false;
-          }
-        });
-  }
-}
diff --git a/java/com/android/dialer/contactactions/AndroidManifest.xml b/java/com/android/dialer/historyitemactions/AndroidManifest.xml
similarity index 90%
rename from java/com/android/dialer/contactactions/AndroidManifest.xml
rename to java/com/android/dialer/historyitemactions/AndroidManifest.xml
index a64066e..4d30268 100644
--- a/java/com/android/dialer/contactactions/AndroidManifest.xml
+++ b/java/com/android/dialer/historyitemactions/AndroidManifest.xml
@@ -13,4 +13,4 @@
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License
  -->
-<manifest package="com.android.dialer.contactactions"/>
+<manifest package="com.android.dialer.historyitemactions"/>
diff --git a/java/com/android/dialer/contactactions/DividerModule.java b/java/com/android/dialer/historyitemactions/DividerModule.java
similarity index 79%
rename from java/com/android/dialer/contactactions/DividerModule.java
rename to java/com/android/dialer/historyitemactions/DividerModule.java
index aabd160..a5ca62a 100644
--- a/java/com/android/dialer/contactactions/DividerModule.java
+++ b/java/com/android/dialer/historyitemactions/DividerModule.java
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.dialer.contactactions;
+package com.android.dialer.historyitemactions;
 
 import com.android.dialer.common.Assert;
 
 /**
- * A module that inserts a grey line divider into {@link ContactActionModule}. Layout it provided in
- * R.layout.divider_layout.xml
+ * A module that inserts a grey line divider into {@link HistoryItemActionModule}. Layout it
+ * provided in R.layout.divider_layout.xml
  */
-public final class DividerModule implements ContactActionModule {
+public final class DividerModule implements HistoryItemActionModule {
 
   @Override
   public int getStringId() {
diff --git a/java/com/android/dialer/contactactions/ContactActionBottomSheet.java b/java/com/android/dialer/historyitemactions/HistoryItemActionBottomSheet.java
similarity index 64%
rename from java/com/android/dialer/contactactions/ContactActionBottomSheet.java
rename to java/com/android/dialer/historyitemactions/HistoryItemActionBottomSheet.java
index 98a5dd1..47aa100 100644
--- a/java/com/android/dialer/contactactions/ContactActionBottomSheet.java
+++ b/java/com/android/dialer/historyitemactions/HistoryItemActionBottomSheet.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.dialer.contactactions;
+package com.android.dialer.historyitemactions;
 
 import android.content.Context;
 import android.os.Bundle;
@@ -32,37 +32,38 @@
 import java.util.List;
 
 /**
- * {@link BottomSheetDialog} used for building a list of contact actions in a bottom sheet menu.
+ * {@link BottomSheetDialog} used to show a list of actions in a bottom sheet menu.
  *
- * <p>{@link #show(Context, ContactPrimaryActionInfo, List)} should be used to create and display
- * the menu. Modules are built using {@link ContactActionModule} and some defaults are provided by
- * {@link IntentModule} and {@link DividerModule}.
+ * <p>{@link #show(Context, HistoryItemPrimaryActionInfo, List, GlidePhotoManager)} should be used
+ * to create and display the menu. Modules are built using {@link HistoryItemActionModule} and some
+ * defaults are provided by {@link IntentModule} and {@link DividerModule}.
  */
-public class ContactActionBottomSheet extends BottomSheetDialog implements OnClickListener {
+public class HistoryItemActionBottomSheet extends BottomSheetDialog implements OnClickListener {
 
-  private final List<ContactActionModule> modules;
-  private final ContactPrimaryActionInfo contactPrimaryActionInfo;
+  private final List<HistoryItemActionModule> modules;
+  private final HistoryItemPrimaryActionInfo historyItemPrimaryActionInfo;
   private final GlidePhotoManager glidePhotoManager;
 
-  private ContactActionBottomSheet(
+  private HistoryItemActionBottomSheet(
       Context context,
-      ContactPrimaryActionInfo contactPrimaryActionInfo,
-      List<ContactActionModule> modules,
+      HistoryItemPrimaryActionInfo historyItemPrimaryActionInfo,
+      List<HistoryItemActionModule> modules,
       GlidePhotoManager glidePhotoManager) {
     super(context);
     this.modules = modules;
-    this.contactPrimaryActionInfo = contactPrimaryActionInfo;
+    this.historyItemPrimaryActionInfo = historyItemPrimaryActionInfo;
     this.glidePhotoManager = glidePhotoManager;
     setContentView(LayoutInflater.from(context).inflate(R.layout.sheet_layout, null));
   }
 
-  public static ContactActionBottomSheet show(
+  public static HistoryItemActionBottomSheet show(
       Context context,
-      ContactPrimaryActionInfo contactPrimaryActionInfo,
-      List<ContactActionModule> modules,
+      HistoryItemPrimaryActionInfo historyItemPrimaryActionInfo,
+      List<HistoryItemActionModule> modules,
       GlidePhotoManager glidePhotoManager) {
-    ContactActionBottomSheet sheet =
-        new ContactActionBottomSheet(context, contactPrimaryActionInfo, modules, glidePhotoManager);
+    HistoryItemActionBottomSheet sheet =
+        new HistoryItemActionBottomSheet(
+            context, historyItemPrimaryActionInfo, modules, glidePhotoManager);
     sheet.show();
     return sheet;
   }
@@ -73,7 +74,7 @@
     LinearLayout container = Assert.isNotNull(findViewById(R.id.action_container));
     container.addView(getContactView(container));
 
-    for (ContactActionModule module : modules) {
+    for (HistoryItemActionModule module : modules) {
       if (module instanceof DividerModule) {
         container.addView(getDividerView(container));
       } else {
@@ -88,22 +89,23 @@
 
     // TODO(zachh): The contact image should be badged with a video icon if it is for a video call.
     glidePhotoManager.loadQuickContactBadge(
-        contactView.findViewById(R.id.quick_contact_photo), contactPrimaryActionInfo.photoInfo());
+        contactView.findViewById(R.id.quick_contact_photo),
+        historyItemPrimaryActionInfo.photoInfo());
 
     TextView primaryTextView = contactView.findViewById(R.id.primary_text);
     TextView secondaryTextView = contactView.findViewById(R.id.secondary_text);
 
-    primaryTextView.setText(contactPrimaryActionInfo.primaryText());
-    if (!TextUtils.isEmpty(contactPrimaryActionInfo.secondaryText())) {
-      secondaryTextView.setText(contactPrimaryActionInfo.secondaryText());
+    primaryTextView.setText(historyItemPrimaryActionInfo.primaryText());
+    if (!TextUtils.isEmpty(historyItemPrimaryActionInfo.secondaryText())) {
+      secondaryTextView.setText(historyItemPrimaryActionInfo.secondaryText());
     } else {
       secondaryTextView.setVisibility(View.GONE);
       secondaryTextView.setText(null);
     }
-    if (contactPrimaryActionInfo.intent() != null) {
+    if (historyItemPrimaryActionInfo.intent() != null) {
       contactView.setOnClickListener(
           (view) -> {
-            getContext().startActivity(contactPrimaryActionInfo.intent());
+            getContext().startActivity(historyItemPrimaryActionInfo.intent());
             dismiss();
           });
     }
@@ -115,7 +117,7 @@
     return inflater.inflate(R.layout.divider_layout, container, false);
   }
 
-  private View getModuleView(ViewGroup container, ContactActionModule module) {
+  private View getModuleView(ViewGroup container, HistoryItemActionModule module) {
     LayoutInflater inflater = LayoutInflater.from(getContext());
     View moduleView = inflater.inflate(R.layout.module_layout, container, false);
     ((TextView) moduleView.findViewById(R.id.module_text)).setText(module.getStringId());
@@ -128,7 +130,7 @@
 
   @Override
   public void onClick(View view) {
-    if (((ContactActionModule) view.getTag()).onClick()) {
+    if (((HistoryItemActionModule) view.getTag()).onClick()) {
       dismiss();
     }
   }
diff --git a/java/com/android/dialer/contactactions/ContactActionModule.java b/java/com/android/dialer/historyitemactions/HistoryItemActionModule.java
similarity index 72%
rename from java/com/android/dialer/contactactions/ContactActionModule.java
rename to java/com/android/dialer/historyitemactions/HistoryItemActionModule.java
index 8089edc..d64cbca 100644
--- a/java/com/android/dialer/contactactions/ContactActionModule.java
+++ b/java/com/android/dialer/historyitemactions/HistoryItemActionModule.java
@@ -14,18 +14,17 @@
  * limitations under the License.
  */
 
-package com.android.dialer.contactactions;
+package com.android.dialer.historyitemactions;
 
 import android.support.annotation.DrawableRes;
 import android.support.annotation.StringRes;
 
 /**
- * Modules used to build {@link ContactActionBottomSheet}.
+ * Modules used to build {@link HistoryItemActionBottomSheet}.
  *
- * <p>Contacts as they relate to this class should be thought of as any entity that an action can be
- * performed on like unknown/restricted contacts, along with saved and non-saved contacts.
+ * <p>A history item is one that is displayed in the call log or the voicemail fragment.
  */
-public interface ContactActionModule {
+public interface HistoryItemActionModule {
 
   @StringRes
   int getStringId();
diff --git a/java/com/android/dialer/contactactions/ContactPrimaryActionInfo.java b/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
similarity index 82%
rename from java/com/android/dialer/contactactions/ContactPrimaryActionInfo.java
rename to java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
index 5017d83..f4338ce 100644
--- a/java/com/android/dialer/contactactions/ContactPrimaryActionInfo.java
+++ b/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.dialer.contactactions;
+package com.android.dialer.historyitemactions;
 
 import android.content.Intent;
 import android.support.annotation.NonNull;
@@ -23,13 +23,12 @@
 import com.google.auto.value.AutoValue;
 
 /**
- * Contains information necessary to construct the primary action for a contact bottom sheet.
+ * Contains information necessary to construct the primary action for a history item's bottom sheet.
  *
- * <p>This may include information about the call, for instance when the bottom sheet is shown from
- * the call log.
+ * <p>A history item is one that is displayed in the call log or the voicemail fragment.
  */
 @AutoValue
-public abstract class ContactPrimaryActionInfo {
+public abstract class HistoryItemPrimaryActionInfo {
 
   @Nullable
   public abstract DialerPhoneNumber number();
@@ -52,7 +51,7 @@
 
   // TODO(zachh): Add SIM info here if should be shown in bottom sheet.
 
-  /** Builder for {@link ContactPrimaryActionInfo}. */
+  /** Builder for {@link HistoryItemPrimaryActionInfo}. */
   @AutoValue.Builder
   public abstract static class Builder {
     public abstract Builder setNumber(@Nullable DialerPhoneNumber dialerPhoneNumber);
@@ -65,10 +64,10 @@
 
     public abstract Builder setIntent(@Nullable Intent intent);
 
-    public abstract ContactPrimaryActionInfo build();
+    public abstract HistoryItemPrimaryActionInfo build();
   }
 
   public static Builder builder() {
-    return new AutoValue_ContactPrimaryActionInfo.Builder();
+    return new AutoValue_HistoryItemPrimaryActionInfo.Builder();
   }
 }
diff --git a/java/com/android/dialer/contactactions/IntentModule.java b/java/com/android/dialer/historyitemactions/IntentModule.java
similarity index 92%
rename from java/com/android/dialer/contactactions/IntentModule.java
rename to java/com/android/dialer/historyitemactions/IntentModule.java
index 9a345c6..dfe9bb0 100644
--- a/java/com/android/dialer/contactactions/IntentModule.java
+++ b/java/com/android/dialer/historyitemactions/IntentModule.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.dialer.contactactions;
+package com.android.dialer.historyitemactions;
 
 import android.content.Context;
 import android.content.Intent;
@@ -28,9 +28,10 @@
 import com.android.dialer.util.DialerUtils;
 
 /**
- * {@link ContactActionModule} useful for making easy to build modules based on starting an intent.
+ * {@link HistoryItemActionModule} useful for making easy to build modules based on starting an
+ * intent.
  */
-public class IntentModule implements ContactActionModule {
+public class IntentModule implements HistoryItemActionModule {
 
   private final Context context;
   private final Intent intent;
diff --git a/java/com/android/dialer/historyitemactions/SharedModules.java b/java/com/android/dialer/historyitemactions/SharedModules.java
new file mode 100644
index 0000000..7cfee37
--- /dev/null
+++ b/java/com/android/dialer/historyitemactions/SharedModules.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2017 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.historyitemactions;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+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.ShowBlockReportSpamDialogNotifier;
+import com.android.dialer.clipboard.ClipboardUtils;
+import com.android.dialer.logging.ReportingLocation;
+import com.android.dialer.util.IntentUtil;
+import com.android.dialer.util.UriUtils;
+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
+ */
+@SuppressWarnings("Guava")
+public class SharedModules {
+
+  public static Optional<HistoryItemActionModule> createModuleForAddingToContacts(
+      Context context,
+      DialerPhoneNumber dialerPhoneNumber,
+      String name,
+      String lookupUri,
+      boolean isBlocked,
+      boolean isSpam) {
+    // Skip showing the menu item for a spam/blocked number.
+    if (isBlocked || isSpam) {
+      return Optional.absent();
+    }
+
+    // Skip showing the menu item for existing contacts.
+    if (isExistingContact(lookupUri)) {
+      return Optional.absent();
+    }
+
+    // Skip showing the menu item if there is no number.
+    String normalizedNumber = dialerPhoneNumber.getNormalizedNumber();
+    if (TextUtils.isEmpty(normalizedNumber)) {
+      return Optional.absent();
+    }
+
+    Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
+    intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
+    intent.putExtra(ContactsContract.Intents.Insert.PHONE, normalizedNumber);
+
+    if (!TextUtils.isEmpty(name)) {
+      intent.putExtra(ContactsContract.Intents.Insert.NAME, name);
+    }
+
+    return Optional.of(
+        new IntentModule(
+            context,
+            intent,
+            R.string.add_to_contacts,
+            R.drawable.quantum_ic_person_add_vd_theme_24));
+  }
+
+  /**
+   * Lookup URIs are currently fetched from the cached column of the system call log. This URI
+   * contains encoded information for non-contacts for the purposes of populating contact cards.
+   *
+   * <p>We infer whether a contact is existing or not by checking if the lookup URI is "encoded" or
+   * not.
+   *
+   * <p>TODO(zachh): We should revisit this once the contact URI is no longer being read from the
+   * cached column in the system database, in case we decide not to overload the column.
+   */
+  private static boolean isExistingContact(@Nullable String lookupUri) {
+    return !TextUtils.isEmpty(lookupUri) && !UriUtils.isEncodedContactUri(Uri.parse(lookupUri));
+  }
+
+  public static Optional<HistoryItemActionModule> createModuleForSendingTextMessage(
+      Context context, String normalizedNumber, boolean isBlocked) {
+    // Don't show the option to send a text message if the number is blocked.
+    if (isBlocked) {
+      return Optional.absent();
+    }
+
+    // TODO(zachh): There are some conditions where this module should not be shown; consider
+    // voicemail, business numbers, etc.
+
+    return !TextUtils.isEmpty(normalizedNumber)
+        ? Optional.of(
+            new IntentModule(
+                context,
+                IntentUtil.getSendSmsIntent(normalizedNumber),
+                R.string.send_a_message,
+                R.drawable.quantum_ic_message_vd_theme_24))
+        : Optional.absent();
+  }
+
+  /**
+   * 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}
+   * @param reportingLocation The location where the number is reported. See {@link
+   *     ReportingLocation.Type}.
+   */
+  public static List<HistoryItemActionModule> createModulesHandlingBlockedOrSpamNumber(
+      Context context,
+      String normalizedNumber,
+      String countryIso,
+      int callType,
+      boolean isBlocked,
+      boolean isSpam,
+      ReportingLocation.Type reportingLocation) {
+    List<HistoryItemActionModule> modules = new ArrayList<>();
+
+    // For a spam number, add two options:
+    // (1) "Not spam" and "Block", or
+    // (2) "Not spam" and "Unblock".
+    if (isSpam) {
+      modules.add(
+          createModuleForMarkingNumberAsNonSpam(
+              context, normalizedNumber, countryIso, callType, reportingLocation));
+      modules.add(createModuleForBlockingOrUnblockingNumber(context, normalizedNumber, isBlocked));
+      return modules;
+    }
+
+    // For a blocked non-spam number, add "Unblock" option.
+    if (isBlocked) {
+      modules.add(createModuleForBlockingOrUnblockingNumber(context, normalizedNumber, isBlocked));
+      return modules;
+    }
+
+    // For a number that is neither a spam number nor blocked, add "Block/Report spam" option.
+    modules.add(
+        createModuleForBlockingNumberAndOptionallyReportingSpam(
+            context, normalizedNumber, countryIso, callType, reportingLocation));
+    return modules;
+  }
+
+  /**
+   * 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}
+   * @param reportingLocation The location where the number is reported. See {@link
+   *     ReportingLocation.Type}.
+   */
+  private static HistoryItemActionModule createModuleForMarkingNumberAsNonSpam(
+      Context context,
+      String normalizedNumber,
+      String countryIso,
+      int callType,
+      ReportingLocation.Type reportingLocation) {
+    return new HistoryItemActionModule() {
+      @Override
+      public int getStringId() {
+        return R.string.not_spam;
+      }
+
+      @Override
+      public int getDrawableId() {
+        return R.drawable.quantum_ic_report_off_vd_theme_24;
+      }
+
+      @Override
+      public boolean onClick() {
+        ShowBlockReportSpamDialogNotifier.notifyShowDialogToReportNotSpam(
+            context, normalizedNumber, countryIso, callType, reportingLocation);
+        return true; // Close the bottom sheet.
+      }
+    };
+  }
+
+  private static HistoryItemActionModule createModuleForBlockingOrUnblockingNumber(
+      Context context, String normalizedNumber, boolean isBlocked) {
+    return new HistoryItemActionModule() {
+      @Override
+      public int getStringId() {
+        return isBlocked ? R.string.unblock_number : R.string.block_number;
+      }
+
+      @Override
+      public int getDrawableId() {
+        return isBlocked
+            ? R.drawable.ic_unblock // TODO(a bug): use a vector icon
+            : R.drawable.quantum_ic_block_vd_theme_24;
+      }
+
+      @Override
+      public boolean onClick() {
+        // TODO(a bug): implement this method.
+        Toast.makeText(
+                context,
+                String.format(
+                    Locale.ENGLISH,
+                    "TODO: " + (isBlocked ? "Unblock " : "Block ") + " number %s.",
+                    normalizedNumber),
+                Toast.LENGTH_SHORT)
+            .show();
+        return true; // Close the bottom sheet.
+      }
+    };
+  }
+
+  /**
+   * 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}
+   * @param reportingLocation The location where the number is reported. See {@link
+   *     ReportingLocation.Type}.
+   */
+  private static HistoryItemActionModule createModuleForBlockingNumberAndOptionallyReportingSpam(
+      Context context,
+      String normalizedNumber,
+      String countryIso,
+      int callType,
+      ReportingLocation.Type reportingLocation) {
+    return new HistoryItemActionModule() {
+      @Override
+      public int getStringId() {
+        return R.string.block_and_optionally_report_spam;
+      }
+
+      @Override
+      public int getDrawableId() {
+        return R.drawable.quantum_ic_block_vd_theme_24;
+      }
+
+      @Override
+      public boolean onClick() {
+        ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumberAndOptionallyReportSpam(
+            context, normalizedNumber, countryIso, callType, reportingLocation);
+        return true; // Close the bottom sheet.
+      }
+    };
+  }
+
+  public static Optional<HistoryItemActionModule> createModuleForCopyingNumber(
+      Context context, String normalizedNumber) {
+    if (TextUtils.isEmpty(normalizedNumber)) {
+      return Optional.absent();
+    }
+    return Optional.of(
+        new HistoryItemActionModule() {
+          @Override
+          public int getStringId() {
+            return R.string.copy_number;
+          }
+
+          @Override
+          public int getDrawableId() {
+            return R.drawable.quantum_ic_content_copy_vd_theme_24;
+          }
+
+          @Override
+          public boolean onClick() {
+            ClipboardUtils.copyText(context, null, normalizedNumber, true);
+            return false;
+          }
+        });
+  }
+}
diff --git a/java/com/android/dialer/contactactions/res/drawable-xxxhdpi/ic_unblock.png b/java/com/android/dialer/historyitemactions/res/drawable-xxxhdpi/ic_unblock.png
similarity index 100%
rename from java/com/android/dialer/contactactions/res/drawable-xxxhdpi/ic_unblock.png
rename to java/com/android/dialer/historyitemactions/res/drawable-xxxhdpi/ic_unblock.png
Binary files differ
diff --git a/java/com/android/dialer/contactactions/res/layout/contact_layout.xml b/java/com/android/dialer/historyitemactions/res/layout/contact_layout.xml
similarity index 100%
rename from java/com/android/dialer/contactactions/res/layout/contact_layout.xml
rename to java/com/android/dialer/historyitemactions/res/layout/contact_layout.xml
diff --git a/java/com/android/dialer/contactactions/res/layout/divider_layout.xml b/java/com/android/dialer/historyitemactions/res/layout/divider_layout.xml
similarity index 100%
rename from java/com/android/dialer/contactactions/res/layout/divider_layout.xml
rename to java/com/android/dialer/historyitemactions/res/layout/divider_layout.xml
diff --git a/java/com/android/dialer/contactactions/res/layout/module_layout.xml b/java/com/android/dialer/historyitemactions/res/layout/module_layout.xml
similarity index 100%
rename from java/com/android/dialer/contactactions/res/layout/module_layout.xml
rename to java/com/android/dialer/historyitemactions/res/layout/module_layout.xml
diff --git a/java/com/android/dialer/contactactions/res/layout/sheet_layout.xml b/java/com/android/dialer/historyitemactions/res/layout/sheet_layout.xml
similarity index 100%
rename from java/com/android/dialer/contactactions/res/layout/sheet_layout.xml
rename to java/com/android/dialer/historyitemactions/res/layout/sheet_layout.xml
diff --git a/java/com/android/dialer/contactactions/res/values/dimens.xml b/java/com/android/dialer/historyitemactions/res/values/dimens.xml
similarity index 100%
rename from java/com/android/dialer/contactactions/res/values/dimens.xml
rename to java/com/android/dialer/historyitemactions/res/values/dimens.xml
diff --git a/java/com/android/dialer/contactactions/res/values/strings.xml b/java/com/android/dialer/historyitemactions/res/values/strings.xml
similarity index 100%
rename from java/com/android/dialer/contactactions/res/values/strings.xml
rename to java/com/android/dialer/historyitemactions/res/values/strings.xml
diff --git a/java/com/android/dialer/voicemail/listui/menu/Modules.java b/java/com/android/dialer/voicemail/listui/menu/Modules.java
index 76ce172..9473b80 100644
--- a/java/com/android/dialer/voicemail/listui/menu/Modules.java
+++ b/java/com/android/dialer/voicemail/listui/menu/Modules.java
@@ -17,11 +17,12 @@
 package com.android.dialer.voicemail.listui.menu;
 
 import android.content.Context;
-import com.android.dialer.contactactions.ContactActionModule;
-import com.android.dialer.contactactions.DividerModule;
-import com.android.dialer.contactactions.SharedModules;
+import com.android.dialer.historyitemactions.DividerModule;
+import com.android.dialer.historyitemactions.HistoryItemActionModule;
+import com.android.dialer.historyitemactions.SharedModules;
 import com.android.dialer.logging.ReportingLocation;
 import com.android.dialer.voicemail.model.VoicemailEntry;
+import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -29,43 +30,57 @@
  * Configures the modules for the voicemail bottom sheet; these are the rows below the top row
  * (primary action) in the bottom sheet.
  */
+@SuppressWarnings("Guava")
 final class Modules {
 
-  static List<ContactActionModule> fromVoicemailEntry(
+  static List<HistoryItemActionModule> fromVoicemailEntry(
       Context context, VoicemailEntry voicemailEntry) {
     // Conditionally add each module, which are items in the bottom sheet's menu.
-    List<ContactActionModule> modules = new ArrayList<>();
+    List<HistoryItemActionModule> modules = new ArrayList<>();
 
     // TODO(uabdullah): Handle maybeAddModuleForVideoOrAudioCall(context, modules, row);
-    SharedModules.maybeAddModuleForAddingToContacts(
-        context,
-        modules,
-        voicemailEntry.number(),
-        voicemailEntry.numberAttributes().getName(),
-        voicemailEntry.numberAttributes().getLookupUri(),
-        voicemailEntry.numberAttributes().getIsBlocked(),
-        voicemailEntry.numberAttributes().getIsSpam());
+    Optional<HistoryItemActionModule> moduleForAddingContacts =
+        SharedModules.createModuleForAddingToContacts(
+            context,
+            voicemailEntry.number(),
+            voicemailEntry.numberAttributes().getName(),
+            voicemailEntry.numberAttributes().getLookupUri(),
+            voicemailEntry.numberAttributes().getIsBlocked(),
+            voicemailEntry.numberAttributes().getIsSpam());
+    if (moduleForAddingContacts.isPresent()) {
+      modules.add(moduleForAddingContacts.get());
+    }
 
-    String normalizedNumber = voicemailEntry.number().getNormalizedNumber();
-    SharedModules.maybeAddModuleForSendingTextMessage(
-        context, modules, normalizedNumber, voicemailEntry.numberAttributes().getIsBlocked());
+    Optional<HistoryItemActionModule> moduleForSendingTextMessage =
+        SharedModules.createModuleForSendingTextMessage(
+            context,
+            voicemailEntry.number().getNormalizedNumber(),
+            voicemailEntry.numberAttributes().getIsBlocked());
+    if (moduleForSendingTextMessage.isPresent()) {
+      modules.add(moduleForSendingTextMessage.get());
+    }
 
     if (!modules.isEmpty()) {
       modules.add(new DividerModule());
     }
 
-    SharedModules.addModulesHandlingBlockedOrSpamNumber(
-        context,
-        modules,
-        voicemailEntry.number().getNormalizedNumber(),
-        voicemailEntry.number().getCountryIso(),
-        voicemailEntry.callType(),
-        voicemailEntry.numberAttributes().getIsBlocked(),
-        voicemailEntry.numberAttributes().getIsSpam(),
-        ReportingLocation.Type.VOICEMAIL_HISTORY);
+    modules.addAll(
+        SharedModules.createModulesHandlingBlockedOrSpamNumber(
+            context,
+            voicemailEntry.number().getNormalizedNumber(),
+            voicemailEntry.number().getCountryIso(),
+            voicemailEntry.callType(),
+            voicemailEntry.numberAttributes().getIsBlocked(),
+            voicemailEntry.numberAttributes().getIsSpam(),
+            ReportingLocation.Type.VOICEMAIL_HISTORY));
 
     // TODO(zachh): Module for CallComposer.
-    SharedModules.maybeAddModuleForCopyingNumber(context, modules, normalizedNumber);
+    Optional<HistoryItemActionModule> moduleForCopyingNumber =
+        SharedModules.createModuleForCopyingNumber(
+            context, voicemailEntry.number().getNormalizedNumber());
+    if (moduleForCopyingNumber.isPresent()) {
+      modules.add(moduleForCopyingNumber.get());
+    }
 
     return modules;
   }
diff --git a/java/com/android/dialer/voicemail/listui/menu/NewVoicemailMenu.java b/java/com/android/dialer/voicemail/listui/menu/NewVoicemailMenu.java
index fbd7fe8..7c669e1 100644
--- a/java/com/android/dialer/voicemail/listui/menu/NewVoicemailMenu.java
+++ b/java/com/android/dialer/voicemail/listui/menu/NewVoicemailMenu.java
@@ -18,8 +18,8 @@
 
 import android.content.Context;
 import android.view.View;
-import com.android.dialer.contactactions.ContactActionBottomSheet;
 import com.android.dialer.glidephotomanager.GlidePhotoManager;
+import com.android.dialer.historyitemactions.HistoryItemActionBottomSheet;
 import com.android.dialer.voicemail.model.VoicemailEntry;
 
 /** Handles configuration of the bottom sheet menus for voicemail entries. */
@@ -29,7 +29,7 @@
   public static View.OnClickListener createOnClickListener(
       Context context, VoicemailEntry voicemailEntry, GlidePhotoManager glidePhotoManager) {
     return (view) ->
-        ContactActionBottomSheet.show(
+        HistoryItemActionBottomSheet.show(
             context,
             PrimaryAction.fromVoicemailEntry(context, voicemailEntry),
             Modules.fromVoicemailEntry(context, voicemailEntry),
diff --git a/java/com/android/dialer/voicemail/listui/menu/PrimaryAction.java b/java/com/android/dialer/voicemail/listui/menu/PrimaryAction.java
index 91f505c..9a5aa18 100644
--- a/java/com/android/dialer/voicemail/listui/menu/PrimaryAction.java
+++ b/java/com/android/dialer/voicemail/listui/menu/PrimaryAction.java
@@ -19,7 +19,7 @@
 import android.content.Context;
 import android.text.TextUtils;
 import com.android.dialer.calllogutils.NumberAttributesConverter;
-import com.android.dialer.contactactions.ContactPrimaryActionInfo;
+import com.android.dialer.historyitemactions.HistoryItemPrimaryActionInfo;
 import com.android.dialer.voicemail.model.VoicemailEntry;
 
 /** Configures the primary action row (top row) for theottom sheet for the Voicemail Tab */
@@ -31,9 +31,9 @@
   // setIntent - allow video calling
   // setPrimaryText - check in with UX
   // setSecondaryText - check in with UX
-  static ContactPrimaryActionInfo fromVoicemailEntry(
+  static HistoryItemPrimaryActionInfo fromVoicemailEntry(
       Context context, VoicemailEntry voicemailEntry) {
-    return ContactPrimaryActionInfo.builder()
+    return HistoryItemPrimaryActionInfo.builder()
         .setNumber(voicemailEntry.number())
         .setPhotoInfo(
             NumberAttributesConverter.toPhotoInfoBuilder(voicemailEntry.numberAttributes())
diff --git a/packages.mk b/packages.mk
index abe9eb5..187f969 100644
--- a/packages.mk
+++ b/packages.mk
@@ -27,7 +27,6 @@
 	com.android.dialer.commandline \
 	com.android.dialer.common \
 	com.android.dialer.configprovider \
-	com.android.dialer.contactactions \
 	com.android.dialer.contactphoto \
 	com.android.dialer.contactsfragment \
 	com.android.dialer.databasepopulator \
@@ -35,6 +34,7 @@
 	com.android.dialer.enrichedcall.simulator \
 	com.android.dialer.feedback \
 	com.android.dialer.glidephotomanager.impl \
+  com.android.dialer.historyitemactions \
 	com.android.dialer.interactions \
 	com.android.dialer.lettertile \
 	com.android.dialer.location \
