diff --git a/src/com/android/contacts/CallUtil.java b/src/com/android/contacts/CallUtil.java
index d83b63d..ddde01c 100644
--- a/src/com/android/contacts/CallUtil.java
+++ b/src/com/android/contacts/CallUtil.java
@@ -116,13 +116,6 @@
     }
 
     /**
-     * @return Uri that directly dials a user's voicemail inbox.
-     */
-    public static Uri getVoicemailUri() {
-        return Uri.fromParts(PhoneAccount.SCHEME_VOICEMAIL, "", null);
-    }
-
-    /**
      * Determines if video calling is available, and if so whether presence checking is available
      * as well.
      *
@@ -166,23 +159,12 @@
             return VIDEO_CALLING_DISABLED;
         } catch (SecurityException e) {
             FeedbackHelper.sendFeedback(context, TAG,
-                    "Security exception when querying intent activities", e);
+                    "Security exception when getting call capable phone accounts", e);
             return VIDEO_CALLING_DISABLED;
         }
     }
 
     /**
-     * Determines if one of the call capable phone accounts defined supports video calling.
-     *
-     * @param context The context.
-     * @return {@code true} if one of the call capable phone accounts supports video calling,
-     *      {@code false} otherwise.
-     */
-    public static boolean isVideoEnabled(Context context) {
-        return (getVideoCallingAvailability(context) & VIDEO_CALLING_ENABLED) != 0;
-    }
-
-    /**
      * Determines if one of the call capable phone accounts defined supports calling with a subject
      * specified.
      *
@@ -201,13 +183,20 @@
             return false;
         }
 
-        List<PhoneAccountHandle> accountHandles = telecommMgr.getCallCapablePhoneAccounts();
-        for (PhoneAccountHandle accountHandle : accountHandles) {
-            PhoneAccount account = telecommMgr.getPhoneAccount(accountHandle);
-            if (account != null && account.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT)) {
-                return true;
+        try {
+            List<PhoneAccountHandle> accountHandles = telecommMgr.getCallCapablePhoneAccounts();
+            for (PhoneAccountHandle accountHandle : accountHandles) {
+                PhoneAccount account = telecommMgr.getPhoneAccount(accountHandle);
+                if (account != null && account.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT)) {
+                    return true;
+                }
             }
+            return false;
+        } catch (SecurityException e) {
+            FeedbackHelper.sendFeedback(context, TAG,
+                    "Security exception when getting call capable phone accounts", e);
+            return false;
         }
-        return false;
+
     }
 }
diff --git a/src/com/android/contacts/compat/telecom/TelecomManagerCompat.java b/src/com/android/contacts/compat/telecom/TelecomManagerCompat.java
index fbbc589..881c1a4 100644
--- a/src/com/android/contacts/compat/telecom/TelecomManagerCompat.java
+++ b/src/com/android/contacts/compat/telecom/TelecomManagerCompat.java
@@ -17,25 +17,15 @@
 
 import android.app.Activity;
 import android.content.Intent;
-import android.net.Uri;
 import android.support.annotation.Nullable;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
 
 import com.android.contacts.compat.CompatUtils;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * Compatibility class for {@link android.telecom.TelecomManager}.
  */
 public class TelecomManagerCompat {
-    public static final String TELECOM_MANAGER_CLASS = "android.telecom.TelecomManager";
     /**
      * Places a new outgoing call to the provided address using the system telecom service with
      * the specified intent.
@@ -55,226 +45,4 @@
         }
         activity.startActivityForResult(intent, 0);
     }
-
-    /**
-     * Get the URI for running an adn query.
-     *
-     * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
-     * @param accountHandle The handle for the account to derive an adn query URI for or
-     * {@code null} to return a URI which will use the default account.
-     * @return The URI (with the content:// scheme) specific to the specified {@link PhoneAccount}
-     * for the the content retrieve.
-     */
-    public static Uri getAdnUriForPhoneAccount(@Nullable TelecomManager telecomManager,
-            PhoneAccountHandle accountHandle) {
-        if (telecomManager != null && (CompatUtils.isMarshmallowCompatible()
-                || CompatUtils.isMethodAvailable(TELECOM_MANAGER_CLASS, "getAdnUriForPhoneAccount",
-                        PhoneAccountHandle.class))) {
-            return telecomManager.getAdnUriForPhoneAccount(accountHandle);
-        }
-        return Uri.parse("content://icc/adn");
-    }
-
-    /**
-     * Returns a list of {@link PhoneAccountHandle}s which can be used to make and receive phone
-     * calls. The returned list includes only those accounts which have been explicitly enabled
-     * by the user.
-     *
-     * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
-     * @return A list of PhoneAccountHandle objects.
-     */
-    public static List<PhoneAccountHandle> getCallCapablePhoneAccounts(
-            @Nullable TelecomManager telecomManager) {
-        if (telecomManager != null && (CompatUtils.isMarshmallowCompatible()
-                || CompatUtils.isMethodAvailable(TELECOM_MANAGER_CLASS,
-                        "getCallCapablePhoneAccounts"))) {
-            return telecomManager.getCallCapablePhoneAccounts();
-        }
-        return new ArrayList<>();
-    }
-
-    /**
-     * Used to determine the currently selected default dialer package.
-     *
-     * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
-     * @return package name for the default dialer package or null if no package has been
-     *         selected as the default dialer.
-     */
-    @Nullable
-    public static String getDefaultDialerPackage(@Nullable TelecomManager telecomManager) {
-        if (telecomManager != null && CompatUtils.isDefaultDialerCompatible()) {
-            return telecomManager.getDefaultDialerPackage();
-        }
-        return null;
-    }
-
-    /**
-     * Return the {@link PhoneAccount} which will be used to place outgoing calls to addresses with
-     * the specified {@code uriScheme}. This PhoneAccount will always be a member of the
-     * list which is returned from invoking {@link TelecomManager#getCallCapablePhoneAccounts()}.
-     * The specific account returned depends on the following priorities:
-     *
-     * 1. If the user-selected default PhoneAccount supports the specified scheme, it will
-     * be returned.
-     * 2. If there exists only one PhoneAccount that supports the specified scheme, it
-     * will be returned.
-     *
-     * If no PhoneAccount fits the criteria above, this method will return {@code null}.
-     *
-     * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
-     * @param uriScheme The URI scheme.
-     * @return The {@link PhoneAccountHandle} corresponding to the account to be used.
-     */
-    @Nullable
-    public static PhoneAccountHandle getDefaultOutgoingPhoneAccount(
-            @Nullable TelecomManager telecomManager, @Nullable String uriScheme) {
-        if (telecomManager != null && (CompatUtils.isMarshmallowCompatible()
-                || CompatUtils.isMethodAvailable(TELECOM_MANAGER_CLASS,
-                        "getDefaultOutgoingPhoneAccount", String.class))) {
-            return telecomManager.getDefaultOutgoingPhoneAccount(uriScheme);
-        }
-        return null;
-    }
-
-    /**
-     * Return the line 1 phone number for given phone account.
-     *
-     * @param telecomManager the {@link TelecomManager} to use in the event that
-     *    {@link TelecomManager#getLine1Number(PhoneAccountHandle)} is available
-     * @param telephonyManager the {@link TelephonyManager} to use if TelecomManager#getLine1Number
-     *    is unavailable
-     * @param phoneAccountHandle the phoneAccountHandle upon which to check the line one number
-     * @return the line one number
-     */
-    @Nullable
-    public static String getLine1Number(@Nullable TelecomManager telecomManager,
-            @Nullable TelephonyManager telephonyManager,
-            @Nullable PhoneAccountHandle phoneAccountHandle) {
-        if (telecomManager != null && CompatUtils.isMarshmallowCompatible()) {
-            return telecomManager.getLine1Number(phoneAccountHandle);
-        }
-        if (telephonyManager != null) {
-            return telephonyManager.getLine1Number();
-        }
-        return null;
-    }
-
-    /**
-     * Return whether a given phone number is the configured voicemail number for a
-     * particular phone account.
-     *
-     * @param telecomManager the {@link TelecomManager} to use for checking the number.
-     * @param accountHandle The handle for the account to check the voicemail number against
-     * @param number The number to look up.
-     */
-    public static boolean isVoiceMailNumber(@Nullable TelecomManager telecomManager,
-            @Nullable PhoneAccountHandle accountHandle, @Nullable String number) {
-        if (telecomManager != null && (CompatUtils.isMarshmallowCompatible()
-                || CompatUtils.isMethodAvailable(TELECOM_MANAGER_CLASS, "isVoiceMailNumber",
-                        PhoneAccountHandle.class, String.class))) {
-            return telecomManager.isVoiceMailNumber(accountHandle, number);
-        }
-        return PhoneNumberUtils.isVoiceMailNumber(number);
-    }
-
-    /**
-     * Return the {@link PhoneAccount} for a specified {@link PhoneAccountHandle}. Object includes
-     * resources which can be used in a user interface.
-     *
-     * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
-     * @param account The {@link PhoneAccountHandle}.
-     * @return The {@link PhoneAccount} object or null if it doesn't exist.
-     */
-    @Nullable
-    public static PhoneAccount getPhoneAccount(@Nullable TelecomManager telecomManager,
-            @Nullable PhoneAccountHandle accountHandle) {
-        if (telecomManager != null && (CompatUtils.isMethodAvailable(
-                TELECOM_MANAGER_CLASS, "getPhoneAccount", PhoneAccountHandle.class))) {
-            return telecomManager.getPhoneAccount(accountHandle);
-        }
-        return null;
-    }
-
-    /**
-     * Return the voicemail number for a given phone account.
-     *
-     * @param telecomManager The {@link TelecomManager} object to use for retrieving the voicemail
-     * number if accountHandle is specified.
-     * @param telephonyManager The {@link TelephonyManager} object to use for retrieving the
-     * voicemail number if accountHandle is null.
-     * @param accountHandle The handle for the phone account.
-     * @return The voicemail number for the phone account, and {@code null} if one has not been
-     *         configured.
-     */
-    @Nullable
-    public static String getVoiceMailNumber(@Nullable TelecomManager telecomManager,
-            @Nullable TelephonyManager telephonyManager,
-            @Nullable PhoneAccountHandle accountHandle) {
-        if (telecomManager != null && (CompatUtils.isMethodAvailable(
-                TELECOM_MANAGER_CLASS, "getVoiceMailNumber", PhoneAccountHandle.class))) {
-            return telecomManager.getVoiceMailNumber(accountHandle);
-        } else if (telephonyManager != null){
-            return telephonyManager.getVoiceMailNumber();
-        }
-        return null;
-    }
-
-    /**
-     * Processes the specified dial string as an MMI code.
-     * MMI codes are any sequence of characters entered into the dialpad that contain a "*" or "#".
-     * Some of these sequences launch special behavior through handled by Telephony.
-     *
-     * @param telecomManager The {@link TelecomManager} object to use for handling MMI.
-     * @param dialString The digits to dial.
-     * @return {@code true} if the digits were processed as an MMI code, {@code false} otherwise.
-     */
-    public static boolean handleMmi(@Nullable TelecomManager telecomManager,
-            @Nullable String dialString, @Nullable PhoneAccountHandle accountHandle) {
-        if (telecomManager == null || TextUtils.isEmpty(dialString)) {
-            return false;
-        }
-        if (CompatUtils.isMarshmallowCompatible()) {
-            return telecomManager.handleMmi(dialString, accountHandle);
-        }
-
-        Object handleMmiResult = CompatUtils.invokeMethod(
-                telecomManager,
-                "handleMmi",
-                new Class<?>[] {PhoneAccountHandle.class, String.class},
-                new Object[] {accountHandle, dialString});
-        if (handleMmiResult != null) {
-            return (boolean) handleMmiResult;
-        }
-
-        return telecomManager.handleMmi(dialString);
-    }
-
-    /**
-     * Silences the ringer if a ringing call exists. Noop if {@link TelecomManager#silenceRinger()}
-     * is unavailable.
-     *
-     * @param telecomManager the TelecomManager to use to silence the ringer.
-     */
-    public static void silenceRinger(@Nullable TelecomManager telecomManager) {
-        if (telecomManager != null && (CompatUtils.isMarshmallowCompatible() || CompatUtils
-                .isMethodAvailable(TELECOM_MANAGER_CLASS, "silenceRinger"))) {
-            telecomManager.silenceRinger();
-        }
-    }
-
-    /**
-     * Returns the current SIM call manager. Apps must be prepared for this method to return null,
-     * indicating that there currently exists no registered SIM call manager.
-     *
-     * @param telecomManager the {@link TelecomManager} to use to fetch the SIM call manager.
-     * @return The phone account handle of the current sim call manager.
-     */
-    @Nullable
-    public static PhoneAccountHandle getSimCallManager(TelecomManager telecomManager) {
-        if (telecomManager != null && (CompatUtils.isMarshmallowCompatible() || CompatUtils
-                .isMethodAvailable(TELECOM_MANAGER_CLASS, "getSimCallManager"))) {
-            return telecomManager.getSimCallManager();
-        }
-        return null;
-    }
 }
