diff --git a/java/com/android/dialer/app/AccountSelectionActivity.java b/java/com/android/dialer/app/AccountSelectionActivity.java
new file mode 100644
index 0000000..de84a36
--- /dev/null
+++ b/java/com/android/dialer/app/AccountSelectionActivity.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2018 The LineageOS 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.app;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.text.TextUtils;
+
+import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment;
+import com.android.contacts.common.widget.SelectPhoneAccountDialogOptions;
+import com.android.contacts.common.widget.SelectPhoneAccountDialogOptionsUtil;
+import com.android.dialer.callintent.CallInitiationType;
+import com.android.dialer.callintent.CallIntentBuilder;
+import com.android.dialer.util.CallUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AccountSelectionActivity extends AppCompatActivity {
+  public static Intent createIntent(Context context, String number,
+          CallInitiationType.Type initiationType) {
+    if (TextUtils.isEmpty(number)) {
+      return null;
+    }
+
+    List<PhoneAccount> accounts =
+        CallUtil.getCallCapablePhoneAccounts(context, PhoneAccount.SCHEME_TEL);
+    if (accounts == null || accounts.size() <= 1) {
+      return null;
+    }
+    ArrayList<PhoneAccountHandle> accountHandles = new ArrayList<>();
+    for (PhoneAccount account : accounts) {
+      accountHandles.add(account.getAccountHandle());
+    }
+
+    return new Intent(context, AccountSelectionActivity.class)
+        .putExtra("number", number)
+        .putExtra("accountHandles", accountHandles)
+        .putExtra("type", initiationType.ordinal());
+  }
+
+  private String number;
+  private CallInitiationType.Type initiationType;
+
+  private SelectPhoneAccountDialogFragment.SelectPhoneAccountListener listener =
+      new SelectPhoneAccountDialogFragment.SelectPhoneAccountListener() {
+    @Override
+    public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle,
+        boolean setDefault, String callId) {
+      Intent intent = new CallIntentBuilder(number, initiationType)
+          .setPhoneAccountHandle(selectedAccountHandle)
+          .build();
+      startActivity(intent);
+      finish();
+    }
+
+    @Override
+    public void onDialogDismissed(String callId) {
+      finish();
+    }
+  };
+
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+
+    number = getIntent().getStringExtra("number");
+    initiationType = CallInitiationType.Type.values()[getIntent().getIntExtra("type", 0)];
+
+    if (getFragmentManager().findFragmentByTag("dialog") == null) {
+      List<PhoneAccountHandle> handles = getIntent().getParcelableArrayListExtra("accountHandles");
+      SelectPhoneAccountDialogOptions options = SelectPhoneAccountDialogOptionsUtil
+          .builderWithAccounts(handles)
+          .setTitle(R.string.call_via_dialog_title)
+          .setCanSetDefault(false)
+          .build();
+      SelectPhoneAccountDialogFragment dialog =
+          SelectPhoneAccountDialogFragment.newInstance(options, listener);
+
+      dialog.show(getFragmentManager(), "dialog");
+    }
+  }
+}
diff --git a/java/com/android/dialer/app/AndroidManifest.xml b/java/com/android/dialer/app/AndroidManifest.xml
index 190f098..78b50b6 100644
--- a/java/com/android/dialer/app/AndroidManifest.xml
+++ b/java/com/android/dialer/app/AndroidManifest.xml
@@ -78,6 +78,10 @@
       android:theme="@style/DialtactsTheme">
     </activity>
 
+    <activity android:name="com.android.dialer.app.AccountSelectionActivity"
+      android:theme="@style/TransparentTheme"
+      android:exported="false" />
+
     <receiver android:name="com.android.dialer.app.calllog.CallLogReceiver">
       <intent-filter>
         <action android:name="android.intent.action.NEW_VOICEMAIL"/>
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index 25a6956..318f9a1 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -769,9 +769,10 @@
         String number = data.getStringExtra(OldCallDetailsActivity.EXTRA_PHONE_NUMBER);
         int snackbarDurationMillis = 5_000;
         Snackbar.make(parentLayout, getString(R.string.ec_data_deleted), snackbarDurationMillis)
-            .setAction(
-                R.string.view_conversation,
-                v -> startActivity(IntentProvider.getSendSmsIntentProvider(number).getIntent(this)))
+            .setAction(R.string.view_conversation, v -> {
+                IntentProvider provider = IntentProvider.getSendSmsIntentProvider(number);
+                startActivity(provider.getClickIntent(this));
+            })
             .setActionTextColor(getResources().getColor(R.color.dialer_snackbar_action_text_color))
             .show();
       }
diff --git a/java/com/android/dialer/app/calllog/CallLogActivity.java b/java/com/android/dialer/app/calllog/CallLogActivity.java
index fdfb3ab..f28aa0f 100644
--- a/java/com/android/dialer/app/calllog/CallLogActivity.java
+++ b/java/com/android/dialer/app/calllog/CallLogActivity.java
@@ -284,9 +284,10 @@
           && data.getBooleanExtra(OldCallDetailsActivity.EXTRA_HAS_ENRICHED_CALL_DATA, false)) {
         String number = data.getStringExtra(OldCallDetailsActivity.EXTRA_PHONE_NUMBER);
         Snackbar.make(findViewById(R.id.calllog_frame), getString(R.string.ec_data_deleted), 5_000)
-            .setAction(
-                R.string.view_conversation,
-                v -> startActivity(IntentProvider.getSendSmsIntentProvider(number).getIntent(this)))
+            .setAction(R.string.view_conversation, v -> {
+                IntentProvider provider = IntentProvider.getSendSmsIntentProvider(number);
+                startActivity(provider.getClickIntent(this));
+            })
             .setActionTextColor(getResources().getColor(R.color.dialer_snackbar_action_text_color))
             .show();
       }
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index e044460..1d50a82 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -106,6 +106,7 @@
  */
 public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
     implements View.OnClickListener,
+        View.OnLongClickListener,
         MenuItem.OnMenuItemClickListener,
         View.OnCreateContextMenuListener {
 
@@ -306,6 +307,7 @@
     quickContactView.setOverlay(null);
     quickContactView.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
     primaryActionButtonView.setOnClickListener(this);
+    primaryActionButtonView.setOnLongClickListener(this);
     primaryActionView.setOnClickListener(this.expandCollapseListener);
     if (this.voicemailPlaybackPresenter != null
         && ConfigProviderComponent.get(this.context)
@@ -519,6 +521,7 @@
         primaryActionButtonView.setContentDescription(
             TextUtils.expandTemplate(
                 context.getString(R.string.description_voicemail_action), validNameOrNumber));
+        primaryActionButtonView.setTag(null);
         primaryActionButtonView.setVisibility(View.VISIBLE);
       } else {
         primaryActionButtonView.setVisibility(View.GONE);
@@ -1053,7 +1056,8 @@
       return;
     }
     intentProvider.logInteraction(context);
-    final Intent intent = intentProvider.getIntent(context);
+
+    final Intent intent = intentProvider.getClickIntent(context);
     // See IntentProvider.getCallDetailIntentProvider() for why this may be null.
     if (intent == null) {
       return;
@@ -1073,6 +1077,18 @@
     }
   }
 
+  @Override
+  public boolean onLongClick(View view) {
+    final IntentProvider intentProvider = (IntentProvider) view.getTag();
+    final Intent intent = intentProvider != null
+        ? intentProvider.getLongClickIntent(context) : null;
+    if (intent != null) {
+      DialerUtils.startActivityWithErrorToast(context, intent);
+      return true;
+    }
+    return false;
+  }
+
   private static boolean isNonContactEntry(ContactInfo info) {
     if (info == null || info.sourceType != Type.SOURCE_TYPE_DIRECTORY) {
       return true;
diff --git a/java/com/android/dialer/app/calllog/IntentProvider.java b/java/com/android/dialer/app/calllog/IntentProvider.java
index 21f3418..ed6d543 100644
--- a/java/com/android/dialer/app/calllog/IntentProvider.java
+++ b/java/com/android/dialer/app/calllog/IntentProvider.java
@@ -26,6 +26,7 @@
 import android.telephony.TelephonyManager;
 import com.android.contacts.common.model.Contact;
 import com.android.contacts.common.model.ContactLoader;
+import com.android.dialer.app.AccountSelectionActivity;
 import com.android.dialer.calldetails.CallDetailsEntries;
 import com.android.dialer.calldetails.OldCallDetailsActivity;
 import com.android.dialer.callintent.CallInitiationType;
@@ -55,12 +56,18 @@
       final String number, final PhoneAccountHandle accountHandle) {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return PreCall.getIntent(
             context,
             new CallIntentBuilder(number, CallInitiationType.Type.CALL_LOG)
                 .setPhoneAccountHandle(accountHandle));
       }
+
+      @Override
+      public Intent getLongClickIntent(Context context) {
+        return AccountSelectionActivity.createIntent(context, number,
+            CallInitiationType.Type.CALL_LOG);
+      }
     };
   }
 
@@ -68,12 +75,13 @@
       final String number, final Context context, final TelephonyManager telephonyManager) {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return PreCall.getIntent(
             context,
             new CallIntentBuilder(number, CallInitiationType.Type.CALL_LOG)
                 .setAllowAssistedDial(true));
       }
+
     };
   }
 
@@ -85,7 +93,7 @@
       final String number, final PhoneAccountHandle accountHandle) {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return PreCall.getIntent(
             context,
             new CallIntentBuilder(number, CallInitiationType.Type.CALL_LOG)
@@ -98,7 +106,7 @@
   public static IntentProvider getDuoVideoIntentProvider(String number, boolean isNonContact) {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return PreCall.getIntent(
             context,
             new CallIntentBuilder(number, CallInitiationType.Type.CALL_LOG)
@@ -122,7 +130,7 @@
   public static IntentProvider getInstallDuoIntentProvider() {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return DuoComponent.get(context).getDuo().getInstallDuoIntent().orNull();
       }
 
@@ -136,7 +144,7 @@
   public static IntentProvider getSetUpDuoIntentProvider() {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return DuoComponent.get(context).getDuo().getActivateIntent().orNull();
       }
 
@@ -150,7 +158,7 @@
   public static IntentProvider getDuoInviteIntentProvider(String number) {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return DuoComponent.get(context).getDuo().getInviteIntent(number).orNull();
       }
 
@@ -165,7 +173,7 @@
       @Nullable PhoneAccountHandle phoneAccountHandle) {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return PreCall.getIntent(
             context,
             CallIntentBuilder.forVoicemail(phoneAccountHandle, CallInitiationType.Type.CALL_LOG));
@@ -176,7 +184,7 @@
   public static IntentProvider getSendSmsIntentProvider(final String number) {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return IntentUtil.getSendSmsIntent(number);
       }
     };
@@ -198,7 +206,7 @@
       boolean canSupportAssistedDialing) {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         return OldCallDetailsActivity.newInstance(
             context, callDetailsEntries, contact, canReportCallerId, canSupportAssistedDialing);
       }
@@ -214,7 +222,7 @@
       final boolean isNewContact) {
     return new IntentProvider() {
       @Override
-      public Intent getIntent(Context context) {
+      public Intent getClickIntent(Context context) {
         Contact contactToSave = null;
 
         if (lookupUri != null) {
@@ -275,7 +283,9 @@
     };
   }
 
-  public abstract Intent getIntent(Context context);
-
+  public abstract Intent getClickIntent(Context context);
+  public Intent getLongClickIntent(Context context) {
+    return null;
+  }
   public void logInteraction(Context context) {}
 }
diff --git a/java/com/android/dialer/app/res/values/cm_strings.xml b/java/com/android/dialer/app/res/values/cm_strings.xml
index b28dcae..1e872c4 100644
--- a/java/com/android/dialer/app/res/values/cm_strings.xml
+++ b/java/com/android/dialer/app/res/values/cm_strings.xml
@@ -38,4 +38,7 @@
     <string name="call_recording_format">Audio format</string>
     <string name="wb_amr_format" translatable="false">AMR-WB</string>
     <string name="aac_format" translatable="false">AAC</string>
+
+    <string name="call_via">Call via</string>
+    <string name="call_via_dialog_title">Call via\u2026</string>
 </resources>
diff --git a/java/com/android/dialer/app/res/values/styles.xml b/java/com/android/dialer/app/res/values/styles.xml
index c2cad31..0fa3503 100644
--- a/java/com/android/dialer/app/res/values/styles.xml
+++ b/java/com/android/dialer/app/res/values/styles.xml
@@ -23,6 +23,16 @@
     <item name="android:textColorPrimary">?android:attr/textColorPrimaryInverse</item>
   </style>
 
+  <style name="TransparentTheme" parent="DialtactsTheme">
+    <item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
+    <item name="android:windowBackground">@android:color/transparent</item>
+    <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
+    <item name="android:windowContentOverlay">@null</item>
+    <item name="android:windowIsTranslucent">true</item>
+    <item name="android:windowNoTitle">true</item>
+    <item name="android:windowIsFloating">true</item>
+  </style>
+
   <style name="ActionModeStyle" parent="Widget.AppCompat.ActionMode">
     <item name="android:background">?android:attr/colorPrimary</item>
     <item name="background">?android:attr/colorPrimary</item>
diff --git a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
index f678061..13b03d0 100644
--- a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
@@ -17,18 +17,22 @@
 package com.android.dialer.calldetails;
 
 import android.content.Context;
+import android.content.Intent;
 import android.net.Uri;
 import android.support.v7.widget.RecyclerView;
 import android.telecom.PhoneAccount;
 import android.text.TextUtils;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.view.View.OnLongClickListener;
 import android.widget.ImageView;
 import android.widget.QuickContactBadge;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
+import com.android.dialer.app.AccountSelectionActivity;
 import com.android.dialer.calldetails.CallDetailsActivityCommon.AssistedDialingNumberParseWorker;
 import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry;
+import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.calllogutils.CallbackActionHelper.CallbackAction;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
@@ -41,6 +45,7 @@
 import com.android.dialer.logging.InteractionEvent;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
+import com.android.dialer.util.DialerUtils;
 import com.android.dialer.widget.BidiTextView;
 
 /**
@@ -49,7 +54,7 @@
  * <p>The header contains contact info and the primary callback button.
  */
 public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder
-    implements OnClickListener, FailureListener {
+    implements OnClickListener, OnLongClickListener, FailureListener {
 
   private final CallDetailsHeaderListener callDetailsHeaderListener;
   private final ImageView callbackButton;
@@ -86,6 +91,7 @@
         callDetailsHeaderListener::openAssistedDialingSettings);
 
     callbackButton.setOnClickListener(this);
+    callbackButton.setOnLongClickListener(this);
 
     this.number = number;
     this.postDialDigits = postDialDigits;
@@ -250,6 +256,19 @@
     }
   }
 
+  @Override
+  public boolean onLongClick(View view) {
+    if (view == callbackButton) {
+      Intent intent = AccountSelectionActivity.createIntent(view.getContext(),
+          number, CallInitiationType.Type.CALL_DETAILS);
+      if (intent != null) {
+        DialerUtils.startActivityWithErrorToast(view.getContext(), intent);
+        return true;
+      }
+    }
+    return false;
+  }
+
   /** Listener for the call details header */
   interface CallDetailsHeaderListener {
 
diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java
index 2d0eff5..cc16658 100644
--- a/java/com/android/dialer/dialpadview/DialpadFragment.java
+++ b/java/com/android/dialer/dialpadview/DialpadFragment.java
@@ -50,6 +50,7 @@
 import android.support.design.widget.FloatingActionButton;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
 import android.telephony.PhoneNumberFormattingTextWatcher;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.ServiceState;
@@ -64,6 +65,7 @@
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.SubMenu;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.Animation;
@@ -204,6 +206,8 @@
   private boolean isLayoutRtl;
   private boolean isLandscape;
 
+  private PhoneAccountHandle selectedAccount;
+
   private DialerExecutor<String> initPhoneNumberFormattingTextWatcherExecutor;
   private boolean isDialpadSlideUp;
 
@@ -1021,6 +1025,37 @@
                 item.setVisible(CallUtil.isCallWithSubjectSupported(getContext()));
               }
             }
+
+            final MenuItem callWithItem = menu.findItem(R.id.call_with);
+            List<PhoneAccount> accounts =
+                CallUtil.getCallCapablePhoneAccounts(getContext(), PhoneAccount.SCHEME_TEL);
+            if (accounts != null && accounts.size() > 1) {
+              final PhoneAccountHandle selected;
+              if (selectedAccount != null) {
+                selected = selectedAccount;
+              } else {
+                selected = TelecomUtil.getDefaultOutgoingPhoneAccount(getContext(),
+                    PhoneAccount.SCHEME_TEL);
+              }
+
+              SubMenu callWithMenu = callWithItem.getSubMenu();
+              callWithMenu.clear();
+
+              for (PhoneAccount account : accounts) {
+                final PhoneAccountHandle handle = account.getAccountHandle();
+                final Intent intent = new Intent()
+                    .putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, handle);
+
+                callWithMenu.add(Menu.FIRST, Menu.NONE, Menu.NONE, account.getLabel())
+                    .setIntent(intent)
+                    .setChecked(handle.equals(selected));
+              }
+              callWithMenu.setGroupCheckable(Menu.FIRST, true, true);
+              callWithItem.setVisible(callWithMenu.hasVisibleItems());
+            } else {
+              callWithItem.setVisible(false);
+            }
+
             super.show();
           }
         };
@@ -1186,7 +1221,9 @@
         // Clear the digits just in case.
         clearDialpad();
       } else {
-        PreCall.start(getContext(), new CallIntentBuilder(number, CallInitiationType.Type.DIALPAD));
+        CallIntentBuilder builder = new CallIntentBuilder(number, CallInitiationType.Type.DIALPAD)
+            .setPhoneAccountHandle(selectedAccount);
+        PreCall.start(getContext(), builder);
         hideAndClearDialpad();
       }
     }
@@ -1196,6 +1233,7 @@
     if (digits != null) {
       digits.getText().clear();
     }
+    selectedAccount = null;
   }
 
   private void handleDialButtonClickWithEmptyDigits() {
@@ -1420,6 +1458,11 @@
 
   @Override
   public boolean onMenuItemClick(MenuItem item) {
+    if (item.getGroupId() == Menu.FIRST) {
+      Intent intent = item.getIntent();
+      selectedAccount = intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+      return true;
+    }
     int resId = item.getItemId();
     if (resId == R.id.menu_2s_pause) {
       updateDialString(PAUSE);
diff --git a/java/com/android/dialer/dialpadview/res/menu/dialpad_options.xml b/java/com/android/dialer/dialpadview/res/menu/dialpad_options.xml
index 2921ea3..760a004 100644
--- a/java/com/android/dialer/dialpadview/res/menu/dialpad_options.xml
+++ b/java/com/android/dialer/dialpadview/res/menu/dialpad_options.xml
@@ -14,7 +14,11 @@
      limitations under the License.
 -->
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-
+  <item
+    android:id="@+id/call_with"
+    android:title="@string/call_via">
+    <menu />
+  </item>
   <item
     android:id="@+id/menu_2s_pause"
     android:showAsAction="withText"
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index feb76ac..a1afc61 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -639,7 +639,7 @@
                 R.string.view_conversation,
                 v ->
                     activity.startActivity(
-                        IntentProvider.getSendSmsIntentProvider(number).getIntent(activity)))
+                        IntentProvider.getSendSmsIntentProvider(number).getClickIntent(activity)))
             .setActionTextColor(
                 ContextCompat.getColor(activity, R.color.dialer_snackbar_action_text_color))
             .show();
diff --git a/java/com/android/dialer/util/CallUtil.java b/java/com/android/dialer/util/CallUtil.java
index 89af0b9..160a40f 100644
--- a/java/com/android/dialer/util/CallUtil.java
+++ b/java/com/android/dialer/util/CallUtil.java
@@ -24,6 +24,8 @@
 import android.telecom.TelecomManager;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
+
+import java.util.ArrayList;
 import java.util.List;
 
 /** Utilities related to calls that can be used by non system apps. */
@@ -89,6 +91,25 @@
   }
 
   /**
+   * Returns a list of phone accounts that are able to call to numbers with the supplied scheme
+   */
+  public static List<PhoneAccount> getCallCapablePhoneAccounts(Context context, String scheme) {
+    if (!PermissionsUtil.hasPermission(context, android.Manifest.permission.READ_PHONE_STATE)) {
+      return null;
+    }
+    TelecomManager tm = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
+    final ArrayList<PhoneAccount> accounts = new ArrayList<>();
+
+    for (PhoneAccountHandle handle : tm.getCallCapablePhoneAccounts()) {
+      final PhoneAccount account = tm.getPhoneAccount(handle);
+      if (account != null && account.supportsUriScheme(scheme)) {
+        accounts.add(account);
+      }
+    }
+    return accounts;
+  }
+
+  /**
    * Determines if one of the call capable phone accounts defined supports video calling.
    *
    * @param context The context.
