diff --git a/src/com/android/dialer/SpecialCharSequenceMgr.java b/src/com/android/dialer/SpecialCharSequenceMgr.java
index c212597..4303f3e 100644
--- a/src/com/android/dialer/SpecialCharSequenceMgr.java
+++ b/src/com/android/dialer/SpecialCharSequenceMgr.java
@@ -42,6 +42,7 @@
 
 import com.android.common.io.MoreCloseables;
 import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.TelephonyManagerCompat;
 import com.android.contacts.common.database.NoNullCursorAsyncQueryHandler;
 import com.android.contacts.common.util.ContactDisplayUtils;
 import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment;
@@ -252,12 +253,10 @@
                         TelecomUtil.getDefaultOutgoingPhoneAccount(applicationContext,
                                 PhoneAccount.SCHEME_TEL));
 
-                if (!CompatUtils.isMSIMCompatible()) {
-                    handleAdnQuery(handler, sc, Uri.parse("content://icc/adn"));
-                } else if (subscriptionAccountHandles.size() == 1 || hasUserSelectedDefault) {
+                if (subscriptionAccountHandles.size() <= 1 || hasUserSelectedDefault) {
                     Uri uri = TelecomUtil.getAdnUriForPhoneAccount(applicationContext, null);
                     handleAdnQuery(handler, sc, uri);
-                } else if (subscriptionAccountHandles.size() > 1){
+                } else {
                     SelectPhoneAccountListener callback = new HandleAdnEntryAccountSelectedCallback(
                             applicationContext, handler, sc);
 
@@ -265,8 +264,6 @@
                             subscriptionAccountHandles, callback);
                     dialogFragment.show(((Activity) context).getFragmentManager(),
                             TAG_SELECT_ACCT_FRAGMENT);
-                } else {
-                    return false;
                 }
 
                 return true;
@@ -305,12 +302,11 @@
             boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
                     TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_TEL));
 
-            if (!CompatUtils.isMSIMCompatible() || subscriptionAccountHandles.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 TelecomUtil.handleMmi(context, input, null);
-            } else if (subscriptionAccountHandles.size() > 1){
+            } else {
                 SelectPhoneAccountListener listener =
                         new HandleMmiAccountSelectedCallback(context, input);
 
@@ -335,15 +331,17 @@
                     R.string.imei : R.string.meid;
 
             List<String> deviceIds = new ArrayList<String>();
-            if (!CompatUtils.isMSIMCompatible()) {
-                deviceIds.add(telephonyManager.getDeviceId());
-            } else {
+            if (TelephonyManagerCompat.getPhoneCount(telephonyManager) > 1 &&
+                    CompatUtils.isMethodAvailable(TelephonyManagerCompat.TELEPHONY_MANAGER_CLASS,
+                            "getDeviceId", Integer.TYPE)) {
                 for (int slot = 0; slot < telephonyManager.getPhoneCount(); slot++) {
                     String deviceId = telephonyManager.getDeviceId(slot);
                     if (!TextUtils.isEmpty(deviceId)) {
                         deviceIds.add(deviceId);
                     }
                 }
+            } else {
+                deviceIds.add(telephonyManager.getDeviceId());
             }
 
             AlertDialog alert = new AlertDialog.Builder(context)
diff --git a/src/com/android/dialer/calllog/PhoneAccountUtils.java b/src/com/android/dialer/calllog/PhoneAccountUtils.java
index 7dc3292..8c3985b 100644
--- a/src/com/android/dialer/calllog/PhoneAccountUtils.java
+++ b/src/com/android/dialer/calllog/PhoneAccountUtils.java
@@ -18,11 +18,12 @@
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.support.annotation.Nullable;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
 import android.text.TextUtils;
 
+import com.android.contacts.common.compat.CompatUtils;
 import com.android.dialer.util.TelecomUtil;
 
 import java.util.ArrayList;
@@ -36,14 +37,11 @@
      * Return a list of phone accounts that are subscription/SIM accounts.
      */
     public static List<PhoneAccountHandle> getSubscriptionPhoneAccounts(Context context) {
-        final TelecomManager telecomManager =
-                (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
-
         List<PhoneAccountHandle> subscriptionAccountHandles = new ArrayList<PhoneAccountHandle>();
         final List<PhoneAccountHandle> accountHandles =
                 TelecomUtil.getCallCapablePhoneAccounts(context);
         for (PhoneAccountHandle accountHandle : accountHandles) {
-            PhoneAccount account = telecomManager.getPhoneAccount(accountHandle);
+            PhoneAccount account = TelecomUtil.getPhoneAccount(context, accountHandle);
             if (account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) {
                 subscriptionAccountHandles.add(accountHandle);
             }
@@ -54,7 +52,9 @@
     /**
      * Compose PhoneAccount object from component name and account id.
      */
-    public static PhoneAccountHandle getAccount(String componentString, String accountId) {
+    @Nullable
+    public static PhoneAccountHandle getAccount(@Nullable String componentString,
+            @Nullable String accountId) {
         if (TextUtils.isEmpty(componentString) || TextUtils.isEmpty(accountId)) {
             return null;
         }
@@ -65,7 +65,9 @@
     /**
      * Extract account label from PhoneAccount object.
      */
-    public static String getAccountLabel(Context context, PhoneAccountHandle accountHandle) {
+    @Nullable
+    public static String getAccountLabel(Context context,
+            @Nullable PhoneAccountHandle accountHandle) {
         PhoneAccount account = getAccountOrNull(context, accountHandle);
         if (account != null && account.getLabel() != null) {
             return account.getLabel().toString();
@@ -76,10 +78,8 @@
     /**
      * Extract account color from PhoneAccount object.
      */
-    public static int getAccountColor(Context context, PhoneAccountHandle accountHandle) {
-        TelecomManager telecomManager =
-                (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
-        final PhoneAccount account = telecomManager.getPhoneAccount(accountHandle);
+    public static int getAccountColor(Context context, @Nullable PhoneAccountHandle accountHandle) {
+        final PhoneAccount account = TelecomUtil.getPhoneAccount(context, accountHandle);
 
         // For single-sim devices the PhoneAccount will be NO_HIGHLIGHT_COLOR by default, so it is
         // safe to always use the account highlight color.
@@ -92,10 +92,8 @@
      * @return {@code true} if call subjects are supported, {@code false} otherwise.
      */
     public static boolean getAccountSupportsCallSubject(Context context,
-            PhoneAccountHandle accountHandle) {
-        TelecomManager telecomManager =
-                (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
-        final PhoneAccount account = telecomManager.getPhoneAccount(accountHandle);
+            @Nullable PhoneAccountHandle accountHandle) {
+        final PhoneAccount account = TelecomUtil.getPhoneAccount(context, accountHandle);
 
         return account == null ? false :
                 account.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT);
@@ -105,14 +103,12 @@
      * Retrieve the account metadata, but if the account does not exist or the device has only a
      * single registered and enabled account, return null.
      */
-     static PhoneAccount getAccountOrNull(Context context,
-            PhoneAccountHandle accountHandle) {
-        TelecomManager telecomManager =
-                (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
-        final PhoneAccount account = telecomManager.getPhoneAccount(accountHandle);
-        if (telecomManager.getCallCapablePhoneAccounts().size() <= 1) {
+    @Nullable
+    private static PhoneAccount getAccountOrNull(Context context,
+            @Nullable PhoneAccountHandle accountHandle) {
+        if (TelecomUtil.getCallCapablePhoneAccounts(context).size() <= 1) {
             return null;
         }
-        return account;
+        return TelecomUtil.getPhoneAccount(context, accountHandle);
     }
 }
diff --git a/src/com/android/dialer/calllog/calllogcache/CallLogCache.java b/src/com/android/dialer/calllog/calllogcache/CallLogCache.java
index e64c012..dc1217c 100644
--- a/src/com/android/dialer/calllog/calllogcache/CallLogCache.java
+++ b/src/com/android/dialer/calllog/calllogcache/CallLogCache.java
@@ -49,7 +49,7 @@
      * Return the most compatible version of the TelecomCallLogCache.
      */
     public static CallLogCache getCallLogCache(Context context) {
-        if (CompatUtils.isMSIMCompatible()) {
+        if (CompatUtils.isClassAvailable("android.telecom.PhoneAccountHandle")) {
             return new CallLogCacheLollipopMr1(context);
         }
         return new CallLogCacheLollipop(context);
diff --git a/src/com/android/dialer/compat/DialerCompatUtils.java b/src/com/android/dialer/compat/DialerCompatUtils.java
index 1bcdd14..a9c9c53 100644
--- a/src/com/android/dialer/compat/DialerCompatUtils.java
+++ b/src/com/android/dialer/compat/DialerCompatUtils.java
@@ -15,23 +15,10 @@
  */
 package com.android.dialer.compat;
 
-import android.os.Build;
-
-import com.android.contacts.common.compat.SdkVersionOverride;
+import com.android.contacts.common.compat.CompatUtils;
 
 public final class DialerCompatUtils {
     /**
-     * Determines if this version is compatible with a default dialer. Can also force the version to
-     * be lower through SdkVersionOverride.
-     *
-     * @return {@code true} if default dialer is a feature on this device, {@code false} otherwise.
-     */
-    public static boolean isDefaultDialerCompatible() {
-        return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.LOLLIPOP)
-                >= Build.VERSION_CODES.M;
-    }
-
-    /**
      * Determines if this version has access to the
      * {@link android.provider.CallLog.Calls.CACHED_PHOTO_URI} column
      *
@@ -39,7 +26,6 @@
      * {@code false} otherwise
      */
     public static boolean isCallsCachedPhotoUriCompatible() {
-        return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M)
-                >= Build.VERSION_CODES.M;
+        return CompatUtils.isMarshmallowCompatible();
     }
 }
\ No newline at end of file
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index 13d1965..a187157 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -30,6 +30,7 @@
 
 import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.common.compat.SdkVersionOverride;
+import com.android.contacts.common.compat.TelephonyManagerCompat;
 import com.android.dialer.R;
 import com.android.dialer.compat.SettingsCompat;
 import com.android.dialer.compat.UserManagerCompat;
@@ -59,8 +60,7 @@
         soundSettingsHeader.id = R.id.settings_header_sounds_and_vibration;
         target.add(soundSettingsHeader);
 
-        if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M)
-                >= Build.VERSION_CODES.M) {
+        if (CompatUtils.isMarshmallowCompatible()) {
             Header quickResponseSettingsHeader = new Header();
             Intent quickResponseSettingsIntent =
                     new Intent(TelecomManager.ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS);
@@ -69,7 +69,6 @@
             target.add(quickResponseSettingsHeader);
         }
 
-
         TelephonyManager telephonyManager =
                 (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
 
@@ -78,7 +77,8 @@
         // primary user and there are multiple SIMs. In N+, "Calling accounts" is shown whenever
         // "Call Settings" is not shown.
         boolean isPrimaryUser = isPrimaryUser();
-        if (isPrimaryUser && telephonyManager.getPhoneCount() <= 1) {
+        if (isPrimaryUser
+                && TelephonyManagerCompat.getPhoneCount(telephonyManager) <= 1) {
             Header callSettingsHeader = new Header();
             Intent callSettingsIntent = new Intent(TelecomManager.ACTION_SHOW_CALL_SETTINGS);
             callSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
@@ -102,10 +102,9 @@
             blockedCallsHeader.intent = new Intent(this, BlockedNumbersSettingsActivity.class);
             target.add(blockedCallsHeader);
 
-            if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M)
-                    >= Build.VERSION_CODES.M
-                    && (telephonyManager.isTtyModeSupported()
-                    || telephonyManager.isHearingAidCompatibilitySupported())) {
+            if (TelephonyManagerCompat.isTtyModeSupported(telephonyManager)
+                    || TelephonyManagerCompat
+                    .isHearingAidCompatibilitySupported(telephonyManager)) {
                 Header accessibilitySettingsHeader = new Header();
                 Intent accessibilitySettingsIntent =
                         new Intent(TelecomManager.ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS);
diff --git a/src/com/android/dialer/util/TelecomUtil.java b/src/com/android/dialer/util/TelecomUtil.java
index 1792cd0..bd201c4 100644
--- a/src/com/android/dialer/util/TelecomUtil.java
+++ b/src/com/android/dialer/util/TelecomUtil.java
@@ -23,7 +23,9 @@
 import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.provider.CallLog.Calls;
+import android.support.annotation.Nullable;
 import android.support.v4.content.ContextCompat;
+import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.PhoneNumberUtils;
@@ -83,7 +85,8 @@
     public static Uri getAdnUriForPhoneAccount(Context context, PhoneAccountHandle handle) {
         if (hasModifyPhoneStatePermission(context)) {
             try {
-                return getTelecomManager(context).getAdnUriForPhoneAccount(handle);
+                return TelecomManagerCompat.getAdnUriForPhoneAccount(
+                        getTelecomManager(context), handle);
             } catch (SecurityException e) {
                 Log.w(TAG, "TelecomManager.getAdnUriForPhoneAccount called without permission.");
             }
@@ -95,11 +98,8 @@
             PhoneAccountHandle handle) {
         if (hasModifyPhoneStatePermission(context)) {
             try {
-                if (handle == null) {
-                    return getTelecomManager(context).handleMmi(dialString);
-                } else {
-                    return getTelecomManager(context).handleMmi(dialString, handle);
-                }
+                return TelecomManagerCompat.handleMmi(
+                        getTelecomManager(context), dialString, handle);
             } catch (SecurityException e) {
                 Log.w(TAG, "TelecomManager.handleMmi called without permission.");
             }
@@ -107,17 +107,23 @@
         return false;
     }
 
+    @Nullable
     public static PhoneAccountHandle getDefaultOutgoingPhoneAccount(Context context,
             String uriScheme) {
         if (hasReadPhoneStatePermission(context)) {
-            return getTelecomManager(context).getDefaultOutgoingPhoneAccount(uriScheme);
+            return TelecomManagerCompat.getDefaultOutgoingPhoneAccount(
+                    getTelecomManager(context), uriScheme);
         }
         return null;
     }
 
+    public static PhoneAccount getPhoneAccount(Context context, PhoneAccountHandle handle) {
+        return TelecomManagerCompat.getPhoneAccount(getTelecomManager(context), handle);
+    }
+
     public static List<PhoneAccountHandle> getCallCapablePhoneAccounts(Context context) {
-        if (hasReadPhoneStatePermission(context) && CompatUtils.isMSIMCompatible()) {
-            return getTelecomManager(context).getCallCapablePhoneAccounts();
+        if (hasReadPhoneStatePermission(context)) {
+            return TelecomManagerCompat.getCallCapablePhoneAccounts(getTelecomManager(context));
         }
         return new ArrayList<>();
     }
@@ -132,22 +138,17 @@
     public static boolean isVoicemailNumber(Context context, PhoneAccountHandle accountHandle,
             String number) {
         if (hasReadPhoneStatePermission(context)) {
-            if (CompatUtils.isMSIMCompatible()) {
-                return getTelecomManager(context).isVoiceMailNumber(accountHandle, number);
-            } else {
-                return PhoneNumberUtils.isVoiceMailNumber(number);
-            }
+            return TelecomManagerCompat.isVoiceMailNumber(getTelecomManager(context),
+                    accountHandle, number);
         }
         return false;
     }
 
+    @Nullable
     public static String getVoicemailNumber(Context context, PhoneAccountHandle accountHandle) {
         if (hasReadPhoneStatePermission(context)) {
-            if (CompatUtils.isMSIMCompatible()) {
-                return getTelecomManager(context).getVoiceMailNumber(accountHandle);
-            } else {
-                return getTelephonyManager(context).getVoiceMailNumber();
-            }
+            return TelecomManagerCompat.getVoiceMailNumber(getTelecomManager(context),
+                    getTelephonyManager(context), accountHandle);
         }
         return null;
     }
@@ -156,8 +157,7 @@
      * Tries to place a call using the {@link TelecomManager}.
      *
      * @param activity a valid activity.
-     * @param address Handle to call.
-     * @param extras Bundle of extras to attach to the call intent.
+     * @param intent the call intent.
      *
      * @return {@code true} if we successfully attempted to place the call, {@code false} if it
      *         failed due to a permission check.
@@ -202,12 +202,8 @@
     }
 
     public static boolean isDefaultDialer(Context context) {
-        if (!DialerCompatUtils.isDefaultDialerCompatible()) {
-            return false;
-        }
-
         final boolean result = TextUtils.equals(context.getPackageName(),
-                getTelecomManager(context).getDefaultDialerPackage());
+                TelecomManagerCompat.getDefaultDialerPackage(getTelecomManager(context)));
         if (result) {
             sWarningLogged = false;
         } else {
