diff --git a/src/com/android/dialer/SpecialCharSequenceMgr.java b/src/com/android/dialer/SpecialCharSequenceMgr.java
index 2e35019..f466c41 100644
--- a/src/com/android/dialer/SpecialCharSequenceMgr.java
+++ b/src/com/android/dialer/SpecialCharSequenceMgr.java
@@ -205,16 +205,16 @@
 
                 final TelecomManager telecomManager =
                         (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
-                List<PhoneAccountHandle> phoneAccountHandles =
+                List<PhoneAccountHandle> subscriptionAccountHandles =
                         PhoneAccountUtils.getSubscriptionPhoneAccounts(context);
 
-                boolean hasUserSelectedDefault = hasDefaultSubscriptionAccount(
-                        telecomManager.getUserSelectedOutgoingPhoneAccount(), phoneAccountHandles);
+                boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
+                        telecomManager.getUserSelectedOutgoingPhoneAccount());
 
-                if (phoneAccountHandles.size() == 1 || hasUserSelectedDefault) {
+                if (subscriptionAccountHandles.size() == 1 || hasUserSelectedDefault) {
                     Uri uri = telecomManager.getAdnUriForPhoneAccount(null);
                     handleAdnQuery(handler, sc, uri);
-                } else if (phoneAccountHandles.size() > 1){
+                } else if (subscriptionAccountHandles.size() > 1){
                     SelectPhoneAccountListener listener = new SelectPhoneAccountListener() {
                         @Override
                         public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle,
@@ -229,7 +229,7 @@
                     };
 
                     SelectPhoneAccountDialogFragment.showAccountDialog(
-                            ((Activity) context).getFragmentManager(), phoneAccountHandles,
+                            ((Activity) context).getFragmentManager(), subscriptionAccountHandles,
                             listener);
                 } else {
                     return false;
@@ -268,16 +268,16 @@
         if ((input.startsWith("**04") || input.startsWith("**05")) && input.endsWith("#")) {
             final TelecomManager telecomManager =
                     (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
-            List<PhoneAccountHandle> phoneAccountHandles =
+            List<PhoneAccountHandle> subscriptionAccountHandles =
                     PhoneAccountUtils.getSubscriptionPhoneAccounts(context);
-            boolean hasUserSelectedDefault = hasDefaultSubscriptionAccount(
-                    telecomManager.getUserSelectedOutgoingPhoneAccount(), phoneAccountHandles);
+            boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
+                    telecomManager.getUserSelectedOutgoingPhoneAccount());
 
-            if (phoneAccountHandles.size() == 1 || hasUserSelectedDefault) {
+            if (subscriptionAccountHandles.size() == 1 || hasUserSelectedDefault) {
                 // Don't bring up the dialog for single-SIM or if the default outgoing account is
                 // a subscription account.
                 return telecomManager.handleMmi(input);
-            } else if (phoneAccountHandles.size() > 1){
+            } else if (subscriptionAccountHandles.size() > 1){
                 SelectPhoneAccountListener listener = new SelectPhoneAccountListener() {
                     @Override
                     public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle,
@@ -290,7 +290,7 @@
                 };
 
                 SelectPhoneAccountDialogFragment.showAccountDialog(
-                        ((Activity) context).getFragmentManager(), phoneAccountHandles,
+                        ((Activity) context).getFragmentManager(), subscriptionAccountHandles,
                         listener);
             }
             return true;
@@ -298,20 +298,6 @@
         return false;
     }
 
-    /**
-     * Check if the default outgoing phone account set is a subscription phone account.
-     */
-    static private boolean hasDefaultSubscriptionAccount(PhoneAccountHandle defaultOutgoingAccount,
-            List<PhoneAccountHandle> phoneAccountHandles) {
-        for (PhoneAccountHandle accountHandle : phoneAccountHandles) {
-            if (accountHandle.equals(defaultOutgoingAccount)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-
     // TODO: Use TelephonyCapabilities.getDeviceIdLabel() to get the device id label instead of a
     // hard-coded string.
     static boolean handleDeviceIdDisplay(Context context, String input) {
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index 3212076..0f5a333 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -39,6 +39,7 @@
 import android.provider.Contacts.PhonesColumns;
 import android.provider.Settings;
 import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.PhoneStateListener;
@@ -77,6 +78,7 @@
 import com.android.dialer.NeededForReflection;
 import com.android.dialer.R;
 import com.android.dialer.SpecialCharSequenceMgr;
+import com.android.dialer.calllog.PhoneAccountUtils;
 import com.android.dialer.util.DialerUtils;
 import com.android.phone.common.CallLogAsync;
 import com.android.phone.common.HapticFeedback;
@@ -87,6 +89,7 @@
 import com.google.common.annotations.VisibleForTesting;
 
 import java.util.HashSet;
+import java.util.List;
 
 /**
  * Fragment that displays a twelve-key phone dialpad.
@@ -908,7 +911,16 @@
                     // We'll try to initiate voicemail and thus we want to remove irrelevant string.
                     removePreviousDigitIfPossible();
 
-                    if (isVoicemailAvailable()) {
+                    List<PhoneAccountHandle> subscriptionAccountHandles =
+                            PhoneAccountUtils.getSubscriptionPhoneAccounts(getActivity());
+                    boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
+                            getTelecomManager().getUserSelectedOutgoingPhoneAccount());
+                    boolean multiSim = subscriptionAccountHandles.size() > 1;
+
+                    if ((multiSim && !hasUserSelectedDefault) || isVoicemailAvailable()) {
+                        // On a multi-SIM phone, if the user has not selected a default
+                        // subscription, initiate a call to voicemail so they can select an account
+                        // from the "Call with" dialog.
                         callVoicemail();
                     } else if (getActivity() != null) {
                         // Voicemail is unavailable maybe because Airplane mode is turned on.
