diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 9498241..5a228a8 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -50,7 +50,6 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.phone.settings.PhoneAccountSettingsFragment;
 import com.android.phone.settings.VoicemailSettingsActivity;
-import com.android.phone.settings.assisteddialing.AssistedDialingSettingActivity;
 import com.android.phone.settings.fdn.FdnSetting;
 
 import java.util.List;
@@ -84,12 +83,10 @@
     // persistent, they are used as the key to store shared preferences and the name should not be
     // changed unless the settings are also migrated.
     private static final String VOICEMAIL_SETTING_SCREEN_PREF_KEY = "button_voicemail_category_key";
-    private static final String BUTTON_FDN_KEY = "button_fdn_key";
-    private static final String BUTTON_RETRY_KEY = "button_auto_retry_key";
+    private static final String BUTTON_FDN_KEY   = "button_fdn_key";
+    private static final String BUTTON_RETRY_KEY       = "button_auto_retry_key";
     private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
     private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
-    private static final String BUTTON_ASSISTED_DIALING_KEY =
-            "assisted_dialing_settings_preference_key";
 
     private static final String PHONE_ACCOUNT_SETTINGS_KEY =
             "phone_account_settings_preference_screen";
@@ -147,7 +144,7 @@
                             }
                         };
                 builder.setMessage(getResources().getString(
-                        R.string.enable_video_calling_dialog_msg))
+                                R.string.enable_video_calling_dialog_msg))
                         .setNeutralButton(getResources().getString(
                                 R.string.enable_video_calling_dialog_settings),
                                 networkSettingsClickListener)
@@ -288,11 +285,11 @@
 
         if (mImsMgr.isVtEnabledByPlatform() && mImsMgr.isVtProvisionedOnDevice()
                 && (carrierConfig.getBoolean(
-                CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
+                        CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
                 || mPhone.mDcTracker.isDataEnabled())) {
             boolean currentValue =
                     mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()
-                            ? PhoneGlobals.getInstance().phoneMgr.isVideoCallingEnabled(
+                    ? PhoneGlobals.getInstance().phoneMgr.isVideoCallingEnabled(
                             getOpPackageName()) : false;
             mEnableVideoCalling.setChecked(currentValue);
             mEnableVideoCalling.setOnPreferenceChangeListener(this);
@@ -302,7 +299,7 @@
 
         if (mImsMgr.isVolteEnabledByPlatform()
                 && !carrierConfig.getBoolean(
-                CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL)) {
+                        CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL)) {
             TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
             /* tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); */
         }
@@ -363,8 +360,6 @@
             prefSet.removePreference(wifiCallingSettings);
             prefSet.removePreference(mEnableVideoCalling);
         }
-
-        updateAssistedDialingButton();
     }
 
     /**
@@ -412,31 +407,6 @@
         mPhone = mSubscriptionInfoHelper.getPhone();
     }
 
-    private void updateAssistedDialingButton() {
-        Log.i(LOG_TAG, "updateAssistedDialingButton, subId: " + mPhone.getSubId());
-        PreferenceScreen preferenceScreen = getPreferenceScreen();
-        Preference preference = preferenceScreen.findPreference(BUTTON_ASSISTED_DIALING_KEY);
-        Intent intent = mSubscriptionInfoHelper.getIntent(AssistedDialingSettingActivity.class);
-        intent.putExtra(SubscriptionInfoHelper.SUB_ID_EXTRA, mPhone.getSubId());
-        preference.setIntent(intent);
-
-        if (!shouldShowAssistedDialingButton()) {
-            preferenceScreen.removePreference(preference);
-        }
-    }
-
-    private boolean shouldShowAssistedDialingButton() {
-        // Allow carriers to disable this feature.
-        PersistableBundle carrierConfig =
-                PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
-        if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_ASSISTED_DIALING_ENABLED_BOOL)) {
-            Log.i(LOG_TAG, "shouldShowAssistedDialingButton, disabled by carrier config");
-            return false;
-        }
-
-        return true;
-    }
-
     private static void log(String msg) {
         Log.d(LOG_TAG, msg);
     }
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index da45900..062286c 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -49,7 +49,6 @@
 import android.util.Log;
 import android.widget.Toast;
 
-import com.android.i18n.phonenumbers.PhoneNumberUtil;
 import com.android.internal.telephony.Call;
 import com.android.internal.telephony.CallManager;
 import com.android.internal.telephony.IccCardConstants;
@@ -181,8 +180,6 @@
 
     private final SettingsObserver mSettingsObserver;
 
-    private final PhoneNumberUtil mPhoneNumberUtil = PhoneNumberUtil.getInstance();
-
     Handler mHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
@@ -196,7 +193,7 @@
                             CarrierConfigManager.KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL)) {
                         // Some products don't have the concept of a "SIM network lock"
                         Log.i(LOG_TAG, "Ignoring EVENT_SIM_NETWORK_LOCKED event; "
-                                + "not showing 'SIM network unlock' PIN entry screen");
+                              + "not showing 'SIM network unlock' PIN entry screen");
                     } else {
                         // Normal case: show the "SIM network unlock" PIN entry screen.
                         // The user won't be able to do anything else until
@@ -434,10 +431,6 @@
         return mCM;
     }
 
-    public PhoneNumberUtil getPhoneNumberUtil() {
-        return mPhoneNumberUtil;
-    }
-
     public PersistableBundle getCarrierConfig() {
         return getCarrierConfigForSubId(SubscriptionManager.getDefaultSubscriptionId());
     }
@@ -651,7 +644,7 @@
     private void setRadioPowerOff(Context context) {
         Log.i(LOG_TAG, "Turning radio off - airplane");
         Settings.Global.putInt(context.getContentResolver(), Settings.Global.CELL_ON,
-                PhoneConstants.CELL_OFF_DUE_TO_AIRPLANE_MODE_FLAG);
+                 PhoneConstants.CELL_OFF_DUE_TO_AIRPLANE_MODE_FLAG);
         SystemProperties.set("persist.radio.airplane_mode_on", "1");
         Settings.Global.putInt(getContentResolver(), Settings.Global.ENABLE_CELLULAR_ON_BOOT, 0);
         PhoneUtils.setRadioPower(false);
diff --git a/src/com/android/phone/assisteddialing/AssistedDialingMediator.java b/src/com/android/phone/assisteddialing/AssistedDialingMediator.java
deleted file mode 100755
index f02dae3..0000000
--- a/src/com/android/phone/assisteddialing/AssistedDialingMediator.java
+++ /dev/null
@@ -1,43 +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.phone.assisteddialing;
-
-import android.support.annotation.NonNull;
-import android.telecom.TransformationInfo;
-
-import java.util.Optional;
-
-/**
- * The core interface for the AssistedDialingMediator.
- */
-public interface AssistedDialingMediator {
-
-    /**
-     * Returns {@code true} if the current client platform supports Assisted Dialing.
-     */
-    boolean isPlatformEligible();
-
-    /**
-     * Returns the country code in which the library thinks the user typically resides.
-     */
-    Optional<String> userHomeCountryCode();
-
-    /**
-     * Attempts to perform the assisted dialing action on the supplied number.
-     */
-    Optional<TransformationInfo> attemptAssistedDial(@NonNull String numberToTransform);
-}
diff --git a/src/com/android/phone/assisteddialing/AssistedDialingMediatorImpl.java b/src/com/android/phone/assisteddialing/AssistedDialingMediatorImpl.java
deleted file mode 100755
index 37ae15d..0000000
--- a/src/com/android/phone/assisteddialing/AssistedDialingMediatorImpl.java
+++ /dev/null
@@ -1,87 +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.phone.assisteddialing;
-
-import android.support.annotation.NonNull;
-import android.telecom.TransformationInfo;
-import android.util.Log;
-
-import java.util.Optional;
-
-/**
- * The Mediator for Assisted Dialing.
- * <p>
- * <p>This class is responsible for mediating location discovery of the user, determining if the
- * call is eligible for assisted dialing, and performing the transformation of numbers eligible for
- * assisted dialing.
- */
-final class AssistedDialingMediatorImpl implements AssistedDialingMediator {
-
-    private final LocationDetector mLocationDetector;
-    private final NumberTransformer mNumberTransformer;
-    private static final String LOG_TAG = "AssistedDialingMediatorImpl";
-
-    AssistedDialingMediatorImpl(
-            @NonNull LocationDetector locationDetector,
-            @NonNull NumberTransformer numberTransformer) {
-        if (locationDetector == null) {
-            throw new NullPointerException("locationDetector was null");
-        }
-
-        if (numberTransformer == null) {
-            throw new NullPointerException("numberTransformer was null");
-        }
-        this.mLocationDetector = locationDetector;
-        this.mNumberTransformer = numberTransformer;
-    }
-
-    @Override
-    public boolean isPlatformEligible() {
-        // This impl is only instantiated if it passes platform checks in ConcreteCreator,
-        // so we return true here.
-        return true;
-    }
-
-    /**
-     * Returns the country code in which the library thinks the user typically resides.
-     */
-    @Override
-    public Optional<String> userHomeCountryCode() {
-        return mLocationDetector.getUpperCaseUserHomeCountry();
-    }
-
-    /**
-     * Returns an Optional of type String containing the transformed number that was provided. The
-     * transformed number should be capable of dialing out of the User's current country and
-     * successfully connecting with a contact in the User's home country.
-     */
-    @Override
-    public Optional<TransformationInfo> attemptAssistedDial(@NonNull String numberToTransform) {
-        Optional<String> userHomeCountryCode = mLocationDetector.getUpperCaseUserHomeCountry();
-        Optional<String> userRoamingCountryCode = mLocationDetector
-                .getUpperCaseUserRoamingCountry();
-
-        if (!userHomeCountryCode.isPresent() || !userRoamingCountryCode.isPresent()) {
-            Log.i(LOG_TAG,
-                    "Unable to determine country codes");
-            return Optional.empty();
-        }
-
-        return mNumberTransformer.doAssistedDialingTransformation(
-                numberToTransform, userHomeCountryCode.get(), userRoamingCountryCode.get());
-    }
-}
diff --git a/src/com/android/phone/assisteddialing/AssistedDialingMediatorStub.java b/src/com/android/phone/assisteddialing/AssistedDialingMediatorStub.java
deleted file mode 100755
index 6c282e6..0000000
--- a/src/com/android/phone/assisteddialing/AssistedDialingMediatorStub.java
+++ /dev/null
@@ -1,49 +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.phone.assisteddialing;
-
-import android.support.annotation.NonNull;
-import android.telecom.TransformationInfo;
-
-import java.util.Optional;
-
-/**
- * A stub assisted dialing implementation.
- */
-public final class AssistedDialingMediatorStub implements AssistedDialingMediator {
-
-    /**
-     * Always returns an empty Optional.
-     */
-    @Override
-    public Optional<TransformationInfo> attemptAssistedDial(@NonNull String numberToTransform) {
-        return Optional.empty();
-    }
-
-    /**
-     * Always returns an empty Optional.
-     */
-    @Override
-    public Optional<String> userHomeCountryCode() {
-        return Optional.empty();
-    }
-
-    @Override
-    public boolean isPlatformEligible() {
-        return false;
-    }
-}
diff --git a/src/com/android/phone/assisteddialing/ConcreteCreator.java b/src/com/android/phone/assisteddialing/ConcreteCreator.java
deleted file mode 100755
index a9ea0ab..0000000
--- a/src/com/android/phone/assisteddialing/ConcreteCreator.java
+++ /dev/null
@@ -1,92 +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.phone.assisteddialing;
-
-import android.content.Context;
-import android.os.UserManager;
-import android.preference.PreferenceManager;
-import android.support.annotation.NonNull;
-import android.telephony.TelephonyManager;
-import android.util.Log;
-
-/**
- * A Creator for AssistedDialingMediators.
- * <p>
- * <p>This helps keep the dependencies required by AssistedDialingMediator for assisted dialing
- * explicit.
- */
-public final class ConcreteCreator {
-
-    private static final String LOG_TAG = "ConcreteCreator";
-
-    /**
-     * Creates a new AssistedDialingMediator
-     *
-     * @param telephonyManager The telephony manager used to determine user location.
-     * @param context          The context used to determine whether or not a provided number is an
-     *                        emergency
-     *                         number.
-     * @return An AssistedDialingMediator
-     */
-    public static AssistedDialingMediator createNewAssistedDialingMediator(
-            @NonNull TelephonyManager telephonyManager, @NonNull Context context) {
-
-        if (telephonyManager == null) {
-            Log.i(
-                    LOG_TAG,
-                    "provided TelephonyManager was null");
-            return new AssistedDialingMediatorStub();
-        }
-        if (context == null) {
-            Log.i(LOG_TAG, "provided context was null");
-            return new AssistedDialingMediatorStub();
-        }
-
-        UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        if (!userManager.isUserUnlocked()) {
-            // To avoid any issues reading preferences, we disable the feature when the user is in a
-            // locked state.
-            Log.i(LOG_TAG, "user is locked");
-            return new AssistedDialingMediatorStub();
-        }
-
-        if (!PreferenceManager.getDefaultSharedPreferences(context)
-                .getBoolean(context.getString(
-                        R.string.assisted_dialing_setting_toggle_key), true)) {
-            Log.i(LOG_TAG, "disabled by local setting");
-
-            return new AssistedDialingMediatorStub();
-        }
-
-        Constraints constraints = new Constraints(context, getCountryCodeProvider());
-        return new AssistedDialingMediatorImpl(
-                new LocationDetector(
-                        telephonyManager,
-                        PreferenceManager.getDefaultSharedPreferences(context)
-                                .getString(context.getString(
-                                        R.string.assisted_dialing_setting_cc_key), null)),
-                new NumberTransformer(constraints));
-    }
-
-    /**
-     * Returns a CountryCodeProvider responsible for providing countries eligible for
-     * assisted Dialing
-     */
-    public static CountryCodeProvider getCountryCodeProvider() {
-        return new CountryCodeProvider();
-    }
-}
diff --git a/src/com/android/phone/assisteddialing/Constraints.java b/src/com/android/phone/assisteddialing/Constraints.java
deleted file mode 100755
index f5f0933..0000000
--- a/src/com/android/phone/assisteddialing/Constraints.java
+++ /dev/null
@@ -1,217 +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.phone.assisteddialing;
-
-import android.content.Context;
-import android.support.annotation.NonNull;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.i18n.phonenumbers.NumberParseException;
-import com.android.i18n.phonenumbers.PhoneNumberUtil;
-import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
-import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource;
-import com.android.phone.PhoneGlobals;
-
-import java.util.Locale;
-import java.util.Optional;
-
-/**
- * Ensures that a number is eligible for Assisted Dialing
- */
-final class Constraints {
-    private final PhoneNumberUtil mPhoneNumberUtil = PhoneGlobals.getInstance()
-            .getPhoneNumberUtil();
-    private final Context mContext;
-    private final CountryCodeProvider mCountryCodeProvider;
-    private static final String LOG_TAG = "Constraints";
-
-    /**
-     * Create a new instance of Constraints.
-     *
-     * @param mContext                   The mContext used to determine whether or not a number
-     *                                   is an emergency number.
-     * @param configProviderCountryCodes A csv of supported country codes, e.g. "US,CA"
-     */
-    Constraints(@NonNull Context context, @NonNull CountryCodeProvider countryCodeProvider) {
-        this.mContext = context;
-        this.mCountryCodeProvider = countryCodeProvider;
-    }
-
-    /**
-     * Determines whether or not we think Assisted Dialing is possible.
-     *
-     * @param numberToCheck          A string containing the phone number.
-     * @param userHomeCountryCode    A string containing an ISO 3166-1 alpha-2 country code
-     *                               representing the user's home country.
-     * @param userRoamingCountryCode A string containing an ISO 3166-1 alpha-2 country code
-     *                               representing the user's roaming country.
-     * @return A boolean indicating whether or not the provided values are eligible for assisted
-     * dialing.
-     */
-    public boolean meetsPreconditions(
-            @NonNull String numberToCheck,
-            @NonNull String userHomeCountryCode,
-            @NonNull String userRoamingCountryCode) {
-        if (this.mContext == null) {
-            Log.i(LOG_TAG, "Provided context cannot be null");
-            return false;
-        }
-
-        if (this.mCountryCodeProvider == null) {
-            Log.i(LOG_TAG, "Provided configProviderCountryCodes cannot be null");
-            return false;
-        }
-
-        if (TextUtils.isEmpty(numberToCheck)) {
-            Log.i(LOG_TAG, "numberToCheck was empty");
-            return false;
-        }
-
-        if (TextUtils.isEmpty(userHomeCountryCode)) {
-            Log.i(LOG_TAG, "userHomeCountryCode was empty");
-            return false;
-        }
-
-        if (TextUtils.isEmpty(userRoamingCountryCode)) {
-            Log.i(LOG_TAG, "userRoamingCountryCode was empty");
-            return false;
-        }
-
-        userHomeCountryCode = userHomeCountryCode.toUpperCase(Locale.US);
-        userRoamingCountryCode = userRoamingCountryCode.toUpperCase(Locale.US);
-
-        Optional<PhoneNumber> parsedPhoneNumber = parsePhoneNumber(numberToCheck,
-                userHomeCountryCode);
-
-        if (!parsedPhoneNumber.isPresent()) {
-            Log.i(LOG_TAG, "parsedPhoneNumber was empty");
-            return false;
-        }
-
-        return areSupportedCountryCodes(userHomeCountryCode, userRoamingCountryCode)
-                && isUserRoaming(userHomeCountryCode, userRoamingCountryCode)
-                && !isInternationalNumber(parsedPhoneNumber)
-                && !isEmergencyNumber(numberToCheck, mContext)
-                && isValidNumber(parsedPhoneNumber)
-                && !hasExtension(parsedPhoneNumber);
-    }
-
-    /**
-     * Returns a boolean indicating the value equivalence of the provided country codes.
-     */
-    private boolean isUserRoaming(
-            @NonNull String userHomeCountryCode, @NonNull String userRoamingCountryCode) {
-        boolean result = !userHomeCountryCode.equals(userRoamingCountryCode);
-        Log.i(LOG_TAG, "isUserRoaming = " + String.valueOf(result));
-        return result;
-    }
-
-    /**
-     * Returns a boolean indicating the support of both provided country codes for assisted dialing.
-     * Both country codes must be allowed for the return value to be true.
-     */
-    private boolean areSupportedCountryCodes(
-            @NonNull String userHomeCountryCode, @NonNull String userRoamingCountryCode) {
-        if (TextUtils.isEmpty(userHomeCountryCode)) {
-            Log.i(LOG_TAG, "userHomeCountryCode was empty");
-            return false;
-        }
-
-        if (TextUtils.isEmpty(userRoamingCountryCode)) {
-            Log.i(LOG_TAG, "userRoamingCountryCode was empty");
-            return false;
-        }
-
-        boolean result =
-                mCountryCodeProvider.isSupportedCountryCode(userHomeCountryCode)
-                        && mCountryCodeProvider.isSupportedCountryCode(userRoamingCountryCode);
-        Log.i("Constraints.areSupportedCountryCodes", String.valueOf(result));
-        return result;
-    }
-
-    /**
-     * A convenience method to take a number as a String and a specified country code, and return a
-     * PhoneNumber object.
-     */
-    private Optional<PhoneNumber> parsePhoneNumber(
-            @NonNull String numberToParse, @NonNull String userHomeCountryCode) {
-        try {
-            return Optional.of(mPhoneNumberUtil.parseAndKeepRawInput(numberToParse,
-                    userHomeCountryCode));
-        } catch (NumberParseException e) {
-            Log.i(LOG_TAG, "could not parse the number");
-            return Optional.empty();
-        }
-    }
-
-    /**
-     * Returns a boolean indicating if the provided number is already internationally formatted.
-     */
-    private boolean isInternationalNumber(@NonNull Optional<PhoneNumber> parsedPhoneNumber) {
-
-        if (parsedPhoneNumber.get().hasCountryCode()
-                && parsedPhoneNumber.get().getCountryCodeSource()
-                != CountryCodeSource.FROM_DEFAULT_COUNTRY) {
-            Log.i(
-                    LOG_TAG,
-                    "phone number already provided the country code");
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Returns a boolean indicating if the provided number has an extension.
-     * <p>
-     * <p>Extensions are currently stripped when formatting a number for mobile dialing, so we don't
-     * want to purposefully truncate a number.
-     */
-    private boolean hasExtension(@NonNull Optional<PhoneNumber> parsedPhoneNumber) {
-
-        if (parsedPhoneNumber.get().hasExtension()
-                && !TextUtils.isEmpty(parsedPhoneNumber.get().getExtension())) {
-            Log.i(LOG_TAG, "phone number has an extension");
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Returns a boolean indicating if the provided number is considered to be a valid number.
-     */
-    private boolean isValidNumber(@NonNull Optional<PhoneNumber> parsedPhoneNumber) {
-        boolean result = PhoneNumberUtil.getInstance().isValidNumber(parsedPhoneNumber.get());
-        Log.i(LOG_TAG, "isValidNumber = " + String.valueOf(result));
-
-        return result;
-    }
-
-    /**
-     * Returns a boolean indicating if the provided number is an emergency number.
-     */
-    private boolean isEmergencyNumber(@NonNull String numberToCheck, @NonNull Context mContext) {
-        // isEmergencyNumber may depend on network state, so also use isLocalEmergencyNumber when
-        // roaming and out of service.
-        boolean result =
-                PhoneNumberUtils.isEmergencyNumber(numberToCheck)
-                        || PhoneNumberUtils.isLocalEmergencyNumber(mContext, numberToCheck);
-        Log.i("Constraints.isEmergencyNumber", String.valueOf(result));
-        return result;
-    }
-}
diff --git a/src/com/android/phone/assisteddialing/CountryCodeProvider.java b/src/com/android/phone/assisteddialing/CountryCodeProvider.java
deleted file mode 100755
index 5dac283..0000000
--- a/src/com/android/phone/assisteddialing/CountryCodeProvider.java
+++ /dev/null
@@ -1,45 +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.phone.assisteddialing;
-
-import android.support.annotation.VisibleForTesting;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * A class to provide the appropriate country codes related to assisted dialing.
- */
-public final class CountryCodeProvider {
-
-    // ISO 3166-1 alpha-2 Country Codes that are eligible for assisted dialing.
-    @VisibleForTesting
-    static final List<String> DEFAULT_COUNTRY_CODES =
-            Arrays.asList(
-                    "CA" /* Canada */,
-                    "GB" /* United Kingdom */,
-                    "JP" /* Japan */,
-                    "MX" /* Mexico */,
-                    "US" /* United States */);
-
-    /**
-     * Checks whether a supplied country code is supported.
-     */
-    public boolean isSupportedCountryCode(String countryCode) {
-        return DEFAULT_COUNTRY_CODES.contains(countryCode);
-    }
-}
diff --git a/src/com/android/phone/assisteddialing/LocationDetector.java b/src/com/android/phone/assisteddialing/LocationDetector.java
deleted file mode 100755
index a601167..0000000
--- a/src/com/android/phone/assisteddialing/LocationDetector.java
+++ /dev/null
@@ -1,87 +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.phone.assisteddialing;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.util.Locale;
-import java.util.Optional;
-
-/**
- * LocationDetector is responsible for determining the Roaming location of the User, in addition to
- * User's home country.
- */
-final class LocationDetector {
-
-    private final TelephonyManager mTelephonyManager;
-    private final String mUserProvidedHomeCountry;
-    private static final String LOG_TAG = "LocationDetector";
-
-    LocationDetector(
-            @NonNull TelephonyManager telephonyManager, @Nullable String userProvidedHomeCountry) {
-        this.mTelephonyManager = telephonyManager;
-        this.mUserProvidedHomeCountry = userProvidedHomeCountry;
-    }
-
-    /**
-     * Returns what we believe to be the User's home country. This should resolve to
-     * PROPERTY_ICC_OPERATOR_ISO_COUNTRY
-     */
-    public Optional<String> getUpperCaseUserHomeCountry() {
-        if (mTelephonyManager == null) {
-            Log.i(LOG_TAG, "Provided TelephonyManager was null");
-            return Optional.empty();
-        }
-
-
-        if (!TextUtils.isEmpty(mUserProvidedHomeCountry)) {
-            Log.i(
-                    LOG_TAG,
-                    "user provided home country code");
-            return Optional.of(mUserProvidedHomeCountry.toUpperCase(Locale.US));
-        }
-
-        String simCountryIso = mTelephonyManager.getSimCountryIso();
-        if (simCountryIso != null) {
-            Log.i(LOG_TAG, "using sim country iso");
-            return Optional.of(mTelephonyManager.getSimCountryIso().toUpperCase(Locale.US));
-        }
-        Log.i(LOG_TAG, "user home country was null");
-        return Optional.empty();
-    }
-
-    /**
-     * Returns what we believe to be the User's current (roaming) country
-     */
-    public Optional<String> getUpperCaseUserRoamingCountry() {
-        if (mTelephonyManager == null) {
-            Log.i(LOG_TAG, "Provided TelephonyManager was null");
-            return Optional.empty();
-        }
-
-        String networkCountryIso = mTelephonyManager.getNetworkCountryIso();
-        if (networkCountryIso != null) {
-            return Optional.of(mTelephonyManager.getNetworkCountryIso().toUpperCase(Locale.US));
-        }
-        Log.i(LOG_TAG, "user roaming country was null");
-        return Optional.empty();
-    }
-}
diff --git a/src/com/android/phone/assisteddialing/NumberTransformer.java b/src/com/android/phone/assisteddialing/NumberTransformer.java
deleted file mode 100755
index ea0bd8f..0000000
--- a/src/com/android/phone/assisteddialing/NumberTransformer.java
+++ /dev/null
@@ -1,103 +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.phone.assisteddialing;
-
-import android.support.annotation.NonNull;
-import android.telecom.TransformationInfo;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.i18n.phonenumbers.NumberParseException;
-import com.android.i18n.phonenumbers.PhoneNumberUtil;
-import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
-import com.android.phone.PhoneGlobals;
-
-import java.util.Optional;
-
-/**
- * Responsible for transforming numbers to make them dialable and valid when roaming.
- */
-final class NumberTransformer {
-
-    private final PhoneNumberUtil mPhoneNumberUtil = PhoneGlobals.getInstance()
-            .getPhoneNumberUtil();
-    private final Constraints mConstraints;
-    private static final String LOG_TAG = "NumberTransformer";
-
-    NumberTransformer(Constraints constraints) {
-        this.mConstraints = constraints;
-    }
-
-    /**
-     * Returns a boolean for callers to quickly determine whether or not the AssistedDialingMediator
-     * thinks an attempt at assisted dialing is likely to succeed.
-     */
-    public boolean canDoAssistedDialingTransformation(
-            @NonNull String numberToCheck,
-            @NonNull String userHomeCountryCode,
-            @NonNull String userRoamingCountryCode) {
-        return mConstraints.meetsPreconditions(
-                numberToCheck, userHomeCountryCode, userRoamingCountryCode);
-    }
-
-    /**
-     * A method to do assisted dialing transformations.
-     * <p>
-     * <p>The library will do its best to attempt a transformation, but, if for any reason the
-     * transformation fails, we return an empty optional. The operation can be considered a success
-     * when the Optional we return has a value set.
-     */
-    public Optional<TransformationInfo> doAssistedDialingTransformation(
-            String numbertoTransform, String userHomeCountryCode, String userRoamingCountryCode) {
-
-        if (!mConstraints.meetsPreconditions(
-                numbertoTransform, userHomeCountryCode, userRoamingCountryCode)) {
-            Log.i(
-                    LOG_TAG,
-                    "assisted dialing failed preconditions");
-            return Optional.empty();
-        }
-
-        PhoneNumber phoneNumber;
-        try {
-            phoneNumber = mPhoneNumberUtil.parse(numbertoTransform, userHomeCountryCode);
-        } catch (NumberParseException e) {
-            Log.i(LOG_TAG, "number failed to parse");
-            return Optional.empty();
-        }
-
-        String transformedNumber =
-                mPhoneNumberUtil.formatNumberForMobileDialing(phoneNumber, userRoamingCountryCode,
-                        true);
-
-        // formatNumberForMobileDialing may return an empty String.
-        if (TextUtils.isEmpty(transformedNumber)) {
-            Log.i(
-                    LOG_TAG,
-                    "formatNumberForMobileDialing returned an empty string");
-            return Optional.empty();
-        }
-
-        return Optional.of(
-                new TransformationInfo(
-                        numbertoTransform,
-                        transformedNumber,
-                        userHomeCountryCode,
-                        userRoamingCountryCode,
-                        phoneNumber.getCountryCode()));
-    }
-}
diff --git a/src/com/android/phone/assisteddialing/res/values/strings.xml b/src/com/android/phone/assisteddialing/res/values/strings.xml
deleted file mode 100755
index f9cb123..0000000
--- a/src/com/android/phone/assisteddialing/res/values/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<resources>
-  <!-- Key for the assisted dialing setting toggle-->
-  <string name="assisted_dialing_setting_toggle_key" translatable="false">assisted_dialing_setting_toggle_key</string>
-
-  <!-- Key for the assisted dialing home country setting-->
-  <string name="assisted_dialing_setting_cc_key" translatable="false">assisted_dialing_setting_cc_key</string>
-</resources>
\ No newline at end of file
diff --git a/src/com/android/phone/settings/assisteddialing/AssistedDialingSettingActivity.java b/src/com/android/phone/settings/assisteddialing/AssistedDialingSettingActivity.java
deleted file mode 100755
index 7386e45..0000000
--- a/src/com/android/phone/settings/assisteddialing/AssistedDialingSettingActivity.java
+++ /dev/null
@@ -1,46 +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.phone.settings.assisteddialing;
-
-import android.os.Bundle;
-import android.preference.PreferenceActivity;
-import android.view.MenuItem;
-
-/**
- * The Settings Activity for Assisted Dialing.
- */
-public class AssistedDialingSettingActivity extends PreferenceActivity {
-
-    @Override
-    protected void onCreate(Bundle bundle) {
-        super.onCreate(bundle);
-
-        getFragmentManager()
-                .beginTransaction()
-                .replace(android.R.id.content, new AssistedDialingSettingFragment())
-                .commit();
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        if (item.getItemId() == android.R.id.home) {
-            onBackPressed();
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-}
diff --git a/src/com/android/phone/settings/assisteddialing/AssistedDialingSettingFragment.java b/src/com/android/phone/settings/assisteddialing/AssistedDialingSettingFragment.java
deleted file mode 100755
index ec255ca..0000000
--- a/src/com/android/phone/settings/assisteddialing/AssistedDialingSettingFragment.java
+++ /dev/null
@@ -1,227 +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.phone.settings.assisteddialing;
-
-import android.icu.util.ULocale;
-import android.icu.util.ULocale.Builder;
-import android.os.Bundle;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.SwitchPreference;
-import android.telephony.TelephonyManager;
-import android.util.Log;
-
-import com.android.phone.assisteddialing.AssistedDialingMediator;
-import com.android.phone.assisteddialing.ConcreteCreator;
-import com.android.phone.assisteddialing.CountryCodeProvider;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * The setting for Assisted Dialing
- */
-public class AssistedDialingSettingFragment extends PreferenceFragment {
-
-    private CountryCodeProvider mCountryCodeProvider;
-    private AssistedDialingMediator mAssistedDialingMediator;
-    private static final String LOG_TAG = "AssistedDialingSettingFragment";
-
-    final class DisplayNameAndCountryCodeTuple {
-
-        private final CharSequence mCountryDisplayname;
-        private final CharSequence mCountryCode;
-
-        DisplayNameAndCountryCodeTuple(
-                CharSequence mCountryDisplayname,
-                CharSequence mCountryCode) {
-            if (mCountryDisplayname == null) {
-                throw new NullPointerException("Null mCountryDisplayname");
-            }
-            this.mCountryDisplayname = mCountryDisplayname;
-            if (mCountryCode == null) {
-                throw new NullPointerException("Null mCountryCode");
-            }
-            this.mCountryCode = mCountryCode;
-        }
-
-        CharSequence countryDisplayname() {
-            return mCountryDisplayname;
-        }
-
-        CharSequence countryCode() {
-            return mCountryCode;
-        }
-
-        public String toString() {
-            return "DisplayNameAndCountryCodeTuple{"
-                    + "mCountryDisplayname=" + mCountryDisplayname + ", "
-                    + "mCountryCode=" + mCountryCode
-                    + "}";
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o == this) {
-                return true;
-            }
-            if (o instanceof AssistedDialingSettingFragment.DisplayNameAndCountryCodeTuple) {
-                AssistedDialingSettingFragment.DisplayNameAndCountryCodeTuple that = (
-                        AssistedDialingSettingFragment.DisplayNameAndCountryCodeTuple) o;
-                return (this.mCountryDisplayname.equals(that.countryDisplayname()))
-                        && (this.mCountryCode.equals(that.countryCode()));
-            }
-            return false;
-        }
-
-        @Override
-        public int hashCode() {
-            int h = 1;
-            h *= 1000003;
-            h ^= this.mCountryDisplayname.hashCode();
-            h *= 1000003;
-            h ^= this.mCountryCode.hashCode();
-            return h;
-        }
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mAssistedDialingMediator =
-                ConcreteCreator.createNewAssistedDialingMediator(
-                        getContext().getSystemService(TelephonyManager.class), getContext());
-
-        mCountryCodeProvider =
-                ConcreteCreator.getCountryCodeProvider();
-
-        // Load the preferences from an XML resource
-        addPreferencesFromResource(R.xml.assisted_dialing_setting);
-        SwitchPreference switchPref =
-                (SwitchPreference)
-                        findPreference(getContext().getString(
-                                R.string.assisted_dialing_setting_toggle_key));
-
-        ListPreference countryChooserPref =
-                (ListPreference)
-                        findPreference(getContext().getString(
-                                R.string.assisted_dialing_setting_cc_key));
-
-        updateCountryChoices(countryChooserPref);
-        updateCountryChooserSummary(countryChooserPref);
-
-        countryChooserPref.setOnPreferenceChangeListener(this::updateListSummary);
-    }
-
-    private void updateCountryChooserSummary(ListPreference countryChooserPref) {
-        String defaultSummaryText = countryChooserPref.getEntries()[0].toString();
-
-        if (countryChooserPref.getEntry().equals(defaultSummaryText)) {
-            Optional<String> userHomeCountryCode = mAssistedDialingMediator.userHomeCountryCode();
-            if (userHomeCountryCode.isPresent()) {
-                CharSequence[] entries = countryChooserPref.getEntries();
-                try {
-                    CharSequence regionalDisplayName =
-                            entries[countryChooserPref.findIndexOfValue(userHomeCountryCode.get())];
-                    countryChooserPref.setSummary(
-                            getContext()
-                                    .getString(
-                                            R.string.assisted_dialing_setting_cc_default_summary,
-                                            regionalDisplayName));
-                } catch (ArrayIndexOutOfBoundsException e) {
-                    // This might happen if there is a mismatch between the automatically
-                    // detected home country, and the countries currently eligible to select in
-                    // the settings.
-                    Log.i(
-                            LOG_TAG,
-                            "Failed to find human readable mapping for country, using default.");
-                }
-            }
-        } else {
-            countryChooserPref.setSummary(countryChooserPref.getEntry());
-        }
-    }
-
-    /**
-     * Filters the default entries in the country chooser by only showing those countries in which
-     * the feature in enabled.
-     */
-    private void updateCountryChoices(ListPreference countryChooserPref) {
-
-        List<DisplayNameAndCountryCodeTuple> defaultCountryChoices =
-                buildDefaultCountryChooserKeysAndValues(countryChooserPref);
-
-        // Always include the default preference.
-        List<CharSequence> newKeys = new ArrayList<>();
-        List<CharSequence> newValues = new ArrayList<>();
-        newKeys.add(countryChooserPref.getEntries()[0]);
-        newValues.add(countryChooserPref.getEntryValues()[0]);
-
-        for (DisplayNameAndCountryCodeTuple tuple : defaultCountryChoices) {
-            if (mCountryCodeProvider.isSupportedCountryCode(tuple.countryCode().toString())) {
-                newKeys.add(tuple.countryDisplayname());
-                newValues.add(tuple.countryCode());
-            }
-        }
-
-        countryChooserPref.setEntries(newKeys.toArray(new CharSequence[newKeys.size()]));
-        countryChooserPref.setEntryValues(newValues.toArray(new CharSequence[newValues.size()]));
-    }
-
-    private List<DisplayNameAndCountryCodeTuple> buildDefaultCountryChooserKeysAndValues(
-            ListPreference countryChooserPref) {
-        CharSequence[] keys = countryChooserPref.getEntries();
-        CharSequence[] values = countryChooserPref.getEntryValues();
-
-        if (keys.length != values.length) {
-            throw new IllegalStateException(
-                    "Unexpected mismatch in country chooser key/value size");
-        }
-
-        List<DisplayNameAndCountryCodeTuple> displayNamesandCountryCodes = new ArrayList<>();
-        // getCountry() is actually getRegion() and conforms to the iso standards of input for the
-        // builder.
-        ULocale userLocale =
-                new ULocale.Builder()
-                        .setRegion(getResources().getConfiguration().getLocales().get(0)
-                                .getCountry())
-                        .setLanguage(getResources().getConfiguration().getLocales().get(0)
-                                .getLanguage())
-                        .build();
-        for (int i = 0; i < keys.length; i++) {
-            ULocale settingRowDisplayCountry = new Builder().setRegion(values[i].toString())
-                    .build();
-            String localizedDisplayCountry = settingRowDisplayCountry.getDisplayCountry(userLocale);
-            String settingDisplayName = localizedDisplayCountry + " " + keys[i];
-            displayNamesandCountryCodes.add(
-                    new DisplayNameAndCountryCodeTuple(settingDisplayName, values[i]));
-        }
-
-        return displayNamesandCountryCodes;
-    }
-
-    boolean updateListSummary(Preference pref, Object newValue) {
-        ListPreference listPref = (ListPreference) pref;
-        CharSequence[] entries = listPref.getEntries();
-        listPref.setSummary(entries[listPref.findIndexOfValue(newValue.toString())]);
-        return true;
-    }
-
-}
diff --git a/src/com/android/phone/settings/assisteddialing/res/values/strings.xml b/src/com/android/phone/settings/assisteddialing/res/values/strings.xml
deleted file mode 100755
index 417191e..0000000
--- a/src/com/android/phone/settings/assisteddialing/res/values/strings.xml
+++ /dev/null
@@ -1,531 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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
-  -->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Label for a setting enabling assisted dialing [CHAR LIMIT=40]-->
-  <string name="assisted_dialing_setting_title">Assisted dialing</string>
-
-  <!-- Label for a setting enabling assisted dialing switch preference-->
-  <string name="assisted_dialing_setting_summary">Predict and add a country code when you call while traveling abroad</string>
-
-  <!-- Indicates the default state for the home country selector-->
-  <string name="assisted_dialing_setting_cc_default_summary">Automatically detected • <xliff:g example="United Kingdom (+44)" id="ad_country_code_info">%1$s</xliff:g></string>
-
-  <!-- Indicates the default failure state for the home country selector-->
-  <string name="assisted_dialing_setting_cc_default_summary_fallback">Automatically detected</string>
-
-  <!-- Category title for the country code picker in assisted dialing [CHAR LIMIT=40]-->
-  <string name="assisted_dialing_setting_cc_category_title">Home country</string>
-
-  <!-- Label for the country code picker in assisted dialing [CHAR LIMIT=40]-->
-  <string name="assisted_dialing_setting_cc_title">Default home country</string>
-
-  <!-- Composed from https://www.iso.org/obp/ui/#search and
-       https://github.com/googlei18n/libphonenumber/blob/master/javascript/i18n/phonenumbers/metadata.js#L34 -->
-  <!-- Excluding ['Antarctica', 'Bouvet Island', 'French Southern Territories (the)', 'Heard Island and McDonald Islands', 'Pitcairn', 'South Georgia and the South Sandwich Islands', 'United States Minor Outlying Islands (the)'] -->
-  <!-- DO NOT TRANSLATE. Country codes used in assisted dialing. [CHAR LIMIT=40] -->
-  <string-array name="assisted_dialing_cc_entries" translatable="false">
-    <item>@string/assisted_dialing_setting_cc_default_summary_fallback</item>
-    <item>(+93)</item>
-    <item>(+358)</item>
-    <item>(+355)</item>
-    <item>(+213)</item>
-    <item>(+1)</item>
-    <item>(+376)</item>
-    <item>(+244)</item>
-    <item>(+1)</item>
-    <item>(+1)</item>
-    <item>(+54)</item>
-    <item>(+374)</item>
-    <item>(+297)</item>
-    <item>(+61)</item>
-    <item>(+43)</item>
-    <item>(+994)</item>
-    <item>(+1)</item>
-    <item>(+973)</item>
-    <item>(+880)</item>
-    <item>(+1)</item>
-    <item>(+375)</item>
-    <item>(+32)</item>
-    <item>(+501)</item>
-    <item>(+229)</item>
-    <item>(+1)</item>
-    <item>(+975)</item>
-    <item>(+591)</item>
-    <item>(+599)</item>
-    <item>(+387)</item>
-    <item>(+267)</item>
-    <item>(+55)</item>
-    <item>(+246)</item>
-    <item>(+673)</item>
-    <item>(+359)</item>
-    <item>(+226)</item>
-    <item>(+257)</item>
-    <item>(+238)</item>
-    <item>(+855)</item>
-    <item>(+237)</item>
-    <item>(+1)</item>
-    <item>(+1)</item>
-    <item>(+236)</item>
-    <item>(+235)</item>
-    <item>(+56)</item>
-    <item>(+86)</item>
-    <item>(+61)</item>
-    <item>(+61)</item>
-    <item>(+57)</item>
-    <item>(+269)</item>
-    <item>(+243)</item>
-    <item>(+242)</item>
-    <item>(+682)</item>
-    <item>(+506)</item>
-    <item>(+225)</item>
-    <item>(+385)</item>
-    <item>(+53)</item>
-    <item>(+599)</item>
-    <item>(+357)</item>
-    <item>(+420)</item>
-    <item>(+45)</item>
-    <item>(+253)</item>
-    <item>(+1)</item>
-    <item>(+1)</item>
-    <item>(+593)</item>
-    <item>(+20)</item>
-    <item>(+503)</item>
-    <item>(+240)</item>
-    <item>(+291)</item>
-    <item>(+372)</item>
-    <item>(+251)</item>
-    <item>(+500)</item>
-    <item>(+298)</item>
-    <item>(+679)</item>
-    <item>(+358)</item>
-    <item>(+33)</item>
-    <item>(+594)</item>
-    <item>(+689)</item>
-    <item>(+241)</item>
-    <item>(+220)</item>
-    <item>(+995)</item>
-    <item>(+49)</item>
-    <item>(+233)</item>
-    <item>(+350)</item>
-    <item>(+30)</item>
-    <item>(+299)</item>
-    <item>(+1)</item>
-    <item>(+590)</item>
-    <item>(+1)</item>
-    <item>(+502)</item>
-    <item>(+44)</item>
-    <item>(+224)</item>
-    <item>(+245)</item>
-    <item>(+592)</item>
-    <item>(+509)</item>
-    <item>(+39)</item>
-    <item>(+504)</item>
-    <item>(+852)</item>
-    <item>(+36)</item>
-    <item>(+354)</item>
-    <item>(+91)</item>
-    <item>(+62)</item>
-    <item>(+98)</item>
-    <item>(+964)</item>
-    <item>(+353)</item>
-    <item>(+44)</item>
-    <item>(+972)</item>
-    <item>(+39)</item>
-    <item>(+1)</item>
-    <item>(+81)</item>
-    <item>(+44)</item>
-    <item>(+962)</item>
-    <item>(+7)</item>
-    <item>(+254)</item>
-    <item>(+686)</item>
-    <item>(+850)</item>
-    <item>(+82)</item>
-    <item>(+965)</item>
-    <item>(+996)</item>
-    <item>(+856)</item>
-    <item>(+371)</item>
-    <item>(+961)</item>
-    <item>(+266)</item>
-    <item>(+231)</item>
-    <item>(+218)</item>
-    <item>(+423)</item>
-    <item>(+370)</item>
-    <item>(+352)</item>
-    <item>(+853)</item>
-    <item>(+389)</item>
-    <item>(+261)</item>
-    <item>(+265)</item>
-    <item>(+60)</item>
-    <item>(+960)</item>
-    <item>(+223)</item>
-    <item>(+356)</item>
-    <item>(+692)</item>
-    <item>(+596)</item>
-    <item>(+222)</item>
-    <item>(+230)</item>
-    <item>(+262)</item>
-    <item>(+52)</item>
-    <item>(+691)</item>
-    <item>(+373)</item>
-    <item>(+377)</item>
-    <item>(+976)</item>
-    <item>(+382)</item>
-    <item>(+1)</item>
-    <item>(+212)</item>
-    <item>(+258)</item>
-    <item>(+95)</item>
-    <item>(+264)</item>
-    <item>(+674)</item>
-    <item>(+977)</item>
-    <item>(+31)</item>
-    <item>(+687)</item>
-    <item>(+64)</item>
-    <item>(+505)</item>
-    <item>(+227)</item>
-    <item>(+234)</item>
-    <item>(+683)</item>
-    <item>(+672)</item>
-    <item>(+1)</item>
-    <item>(+47)</item>
-    <item>(+968)</item>
-    <item>(+92)</item>
-    <item>(+680)</item>
-    <item>(+970)</item>
-    <item>(+507)</item>
-    <item>(+675)</item>
-    <item>(+595)</item>
-    <item>(+51)</item>
-    <item>(+63)</item>
-    <item>(+48)</item>
-    <item>(+351)</item>
-    <item>(+1)</item>
-    <item>(+974)</item>
-    <item>(+262)</item>
-    <item>(+40)</item>
-    <item>(+7)</item>
-    <item>(+250)</item>
-    <item>(+590)</item>
-    <item>(+290)</item>
-    <item>(+1)</item>
-    <item>(+1)</item>
-    <item>(+590)</item>
-    <item>(+508)</item>
-    <item>(+1)</item>
-    <item>(+685)</item>
-    <item>(+378)</item>
-    <item>(+239)</item>
-    <item>(+966)</item>
-    <item>(+221)</item>
-    <item>(+381)</item>
-    <item>(+248)</item>
-    <item>(+232)</item>
-    <item>(+65)</item>
-    <item>(+1)</item>
-    <item>(+421)</item>
-    <item>(+386)</item>
-    <item>(+677)</item>
-    <item>(+252)</item>
-    <item>(+27)</item>
-    <item>(+211)</item>
-    <item>(+34)</item>
-    <item>(+94)</item>
-    <item>(+249)</item>
-    <item>(+597)</item>
-    <item>(+47)</item>
-    <item>(+268)</item>
-    <item>(+46)</item>
-    <item>(+41)</item>
-    <item>(+963)</item>
-    <item>(+886)</item>
-    <item>(+992)</item>
-    <item>(+255)</item>
-    <item>(+66)</item>
-    <item>(+670)</item>
-    <item>(+228)</item>
-    <item>(+690)</item>
-    <item>(+676)</item>
-    <item>(+1)</item>
-    <item>(+216)</item>
-    <item>(+90)</item>
-    <item>(+993)</item>
-    <item>(+1)</item>
-    <item>(+688)</item>
-    <item>(+256)</item>
-    <item>(+380)</item>
-    <item>(+971)</item>
-    <item>(+44)</item>
-    <item>(+1)</item>
-    <item>(+598)</item>
-    <item>(+998)</item>
-    <item>(+678)</item>
-    <item>(+58)</item>
-    <item>(+84)</item>
-    <item>(+1)</item>
-    <item>(+1)</item>
-    <item>(+681)</item>
-    <item>(+212)</item>
-    <item>(+967)</item>
-    <item>(+260)</item>
-    <item>(+263)</item>
-  </string-array>
-  <string-array name="assisted_dialing_cc_values" translatable="false">
-    <item></item>
-    <item>AF</item>
-    <item>AX</item>
-    <item>AL</item>
-    <item>DZ</item>
-    <item>AS</item>
-    <item>AD</item>
-    <item>AO</item>
-    <item>AI</item>
-    <item>AG</item>
-    <item>AR</item>
-    <item>AM</item>
-    <item>AW</item>
-    <item>AU</item>
-    <item>AT</item>
-    <item>AZ</item>
-    <item>BS</item>
-    <item>BH</item>
-    <item>BD</item>
-    <item>BB</item>
-    <item>BY</item>
-    <item>BE</item>
-    <item>BZ</item>
-    <item>BJ</item>
-    <item>BM</item>
-    <item>BT</item>
-    <item>BO</item>
-    <item>BQ</item>
-    <item>BA</item>
-    <item>BW</item>
-    <item>BR</item>
-    <item>IO</item>
-    <item>BN</item>
-    <item>BG</item>
-    <item>BF</item>
-    <item>BI</item>
-    <item>CV</item>
-    <item>KH</item>
-    <item>CM</item>
-    <item>CA</item>
-    <item>KY</item>
-    <item>CF</item>
-    <item>TD</item>
-    <item>CL</item>
-    <item>CN</item>
-    <item>CX</item>
-    <item>CC</item>
-    <item>CO</item>
-    <item>KM</item>
-    <item>CD</item>
-    <item>CG</item>
-    <item>CK</item>
-    <item>CR</item>
-    <item>CI</item>
-    <item>HR</item>
-    <item>CU</item>
-    <item>CW</item>
-    <item>CY</item>
-    <item>CZ</item>
-    <item>DK</item>
-    <item>DJ</item>
-    <item>DM</item>
-    <item>DO</item>
-    <item>EC</item>
-    <item>EG</item>
-    <item>SV</item>
-    <item>GQ</item>
-    <item>ER</item>
-    <item>EE</item>
-    <item>ET</item>
-    <item>FK</item>
-    <item>FO</item>
-    <item>FJ</item>
-    <item>FI</item>
-    <item>FR</item>
-    <item>GF</item>
-    <item>PF</item>
-    <item>GA</item>
-    <item>GM</item>
-    <item>GE</item>
-    <item>DE</item>
-    <item>GH</item>
-    <item>GI</item>
-    <item>GR</item>
-    <item>GL</item>
-    <item>GD</item>
-    <item>GP</item>
-    <item>GU</item>
-    <item>GT</item>
-    <item>GG</item>
-    <item>GN</item>
-    <item>GW</item>
-    <item>GY</item>
-    <item>HT</item>
-    <item>VA</item>
-    <item>HN</item>
-    <item>HK</item>
-    <item>HU</item>
-    <item>IS</item>
-    <item>IN</item>
-    <item>ID</item>
-    <item>IR</item>
-    <item>IQ</item>
-    <item>IE</item>
-    <item>IM</item>
-    <item>IL</item>
-    <item>IT</item>
-    <item>JM</item>
-    <item>JP</item>
-    <item>JE</item>
-    <item>JO</item>
-    <item>KZ</item>
-    <item>KE</item>
-    <item>KI</item>
-    <item>KP</item>
-    <item>KR</item>
-    <item>KW</item>
-    <item>KG</item>
-    <item>LA</item>
-    <item>LV</item>
-    <item>LB</item>
-    <item>LS</item>
-    <item>LR</item>
-    <item>LY</item>
-    <item>LI</item>
-    <item>LT</item>
-    <item>LU</item>
-    <item>MO</item>
-    <item>MK</item>
-    <item>MG</item>
-    <item>MW</item>
-    <item>MY</item>
-    <item>MV</item>
-    <item>ML</item>
-    <item>MT</item>
-    <item>MH</item>
-    <item>MQ</item>
-    <item>MR</item>
-    <item>MU</item>
-    <item>YT</item>
-    <item>MX</item>
-    <item>FM</item>
-    <item>MD</item>
-    <item>MC</item>
-    <item>MN</item>
-    <item>ME</item>
-    <item>MS</item>
-    <item>MA</item>
-    <item>MZ</item>
-    <item>MM</item>
-    <item>NA</item>
-    <item>NR</item>
-    <item>NP</item>
-    <item>NL</item>
-    <item>NC</item>
-    <item>NZ</item>
-    <item>NI</item>
-    <item>NE</item>
-    <item>NG</item>
-    <item>NU</item>
-    <item>NF</item>
-    <item>MP</item>
-    <item>NO</item>
-    <item>OM</item>
-    <item>PK</item>
-    <item>PW</item>
-    <item>PS</item>
-    <item>PA</item>
-    <item>PG</item>
-    <item>PY</item>
-    <item>PE</item>
-    <item>PH</item>
-    <item>PL</item>
-    <item>PT</item>
-    <item>PR</item>
-    <item>QA</item>
-    <item>RE</item>
-    <item>RO</item>
-    <item>RU</item>
-    <item>RW</item>
-    <item>BL</item>
-    <item>SH</item>
-    <item>KN</item>
-    <item>LC</item>
-    <item>MF</item>
-    <item>PM</item>
-    <item>VC</item>
-    <item>WS</item>
-    <item>SM</item>
-    <item>ST</item>
-    <item>SA</item>
-    <item>SN</item>
-    <item>RS</item>
-    <item>SC</item>
-    <item>SL</item>
-    <item>SG</item>
-    <item>SX</item>
-    <item>SK</item>
-    <item>SI</item>
-    <item>SB</item>
-    <item>SO</item>
-    <item>ZA</item>
-    <item>SS</item>
-    <item>ES</item>
-    <item>LK</item>
-    <item>SD</item>
-    <item>SR</item>
-    <item>SJ</item>
-    <item>SZ</item>
-    <item>SE</item>
-    <item>CH</item>
-    <item>SY</item>
-    <item>TW</item>
-    <item>TJ</item>
-    <item>TZ</item>
-    <item>TH</item>
-    <item>TL</item>
-    <item>TG</item>
-    <item>TK</item>
-    <item>TO</item>
-    <item>TT</item>
-    <item>TN</item>
-    <item>TR</item>
-    <item>TM</item>
-    <item>TC</item>
-    <item>TV</item>
-    <item>UG</item>
-    <item>UA</item>
-    <item>AE</item>
-    <item>GB</item>
-    <item>US</item>
-    <item>UY</item>
-    <item>UZ</item>
-    <item>VU</item>
-    <item>VE</item>
-    <item>VN</item>
-    <item>VG</item>
-    <item>VI</item>
-    <item>WF</item>
-    <item>EH</item>
-    <item>YE</item>
-    <item>ZM</item>
-    <item>ZW</item>
-  </string-array>
-</resources>
diff --git a/src/com/android/phone/settings/assisteddialing/res/xml/assisted_dialing_setting.xml b/src/com/android/phone/settings/assisteddialing/res/xml/assisted_dialing_setting.xml
deleted file mode 100755
index 9fb61a1..0000000
--- a/src/com/android/phone/settings/assisteddialing/res/xml/assisted_dialing_setting.xml
+++ /dev/null
@@ -1,38 +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.
-  -->
-
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android">
-
-  <SwitchPreference
-      android:defaultValue="true"
-      android:key="@string/assisted_dialing_setting_toggle_key"
-      android:summary="@string/assisted_dialing_setting_summary"
-      android:title="@string/assisted_dialing_setting_title"/>
-
-  <PreferenceCategory
-      android:title="@string/assisted_dialing_setting_cc_category_title">
-    <ListPreference
-        android:dependency="@string/assisted_dialing_setting_toggle_key"
-        android:defaultValue=""
-        android:entries="@array/assisted_dialing_cc_entries"
-        android:entryValues="@array/assisted_dialing_cc_values"
-        android:key="@string/assisted_dialing_setting_cc_key"
-        android:summary="@string/assisted_dialing_setting_cc_default_summary_fallback"
-        android:title="@string/assisted_dialing_setting_cc_title"/>
-  </PreferenceCategory>
-
-</PreferenceScreen>
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index e2f596f..630ada6 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -31,7 +31,6 @@
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
-import android.telecom.TransformationInfo;
 import android.telecom.VideoProfile;
 import android.telephony.CarrierConfigManager;
 import android.telephony.PhoneNumberUtils;
@@ -56,8 +55,6 @@
 import com.android.phone.MMIDialogActivity;
 import com.android.phone.PhoneUtils;
 import com.android.phone.R;
-import com.android.phone.assisteddialing.AssistedDialingMediator;
-import com.android.phone.assisteddialing.ConcreteCreator;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -66,7 +63,6 @@
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Optional;
 import java.util.Queue;
 import java.util.regex.Pattern;
 
@@ -81,39 +77,39 @@
 
     private final TelephonyConnectionServiceProxy mTelephonyConnectionServiceProxy =
             new TelephonyConnectionServiceProxy() {
-                @Override
-                public Collection<Connection> getAllConnections() {
-                    return TelephonyConnectionService.this.getAllConnections();
-                }
-                @Override
-                public void addConference(TelephonyConference mTelephonyConference) {
-                    TelephonyConnectionService.this.addConference(mTelephonyConference);
-                }
-                @Override
-                public void addConference(ImsConference mImsConference) {
-                    TelephonyConnectionService.this.addConference(mImsConference);
-                }
-                @Override
-                public void removeConnection(Connection connection) {
-                    TelephonyConnectionService.this.removeConnection(connection);
-                }
-                @Override
-                public void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
-                                                  Connection connection) {
-                    TelephonyConnectionService.this
-                            .addExistingConnection(phoneAccountHandle, connection);
-                }
-                @Override
-                public void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
-                                                  Connection connection, Conference conference) {
-                    TelephonyConnectionService.this
-                            .addExistingConnection(phoneAccountHandle, connection, conference);
-                }
-                @Override
-                public void addConnectionToConferenceController(TelephonyConnection connection) {
-                    TelephonyConnectionService.this.addConnectionToConferenceController(connection);
-                }
-            };
+        @Override
+        public Collection<Connection> getAllConnections() {
+            return TelephonyConnectionService.this.getAllConnections();
+        }
+        @Override
+        public void addConference(TelephonyConference mTelephonyConference) {
+            TelephonyConnectionService.this.addConference(mTelephonyConference);
+        }
+        @Override
+        public void addConference(ImsConference mImsConference) {
+            TelephonyConnectionService.this.addConference(mImsConference);
+        }
+        @Override
+        public void removeConnection(Connection connection) {
+            TelephonyConnectionService.this.removeConnection(connection);
+        }
+        @Override
+        public void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
+                                          Connection connection) {
+            TelephonyConnectionService.this
+                    .addExistingConnection(phoneAccountHandle, connection);
+        }
+        @Override
+        public void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
+                Connection connection, Conference conference) {
+            TelephonyConnectionService.this
+                    .addExistingConnection(phoneAccountHandle, connection, conference);
+        }
+        @Override
+        public void addConnectionToConferenceController(TelephonyConnection connection) {
+            TelephonyConnectionService.this.addConnectionToConferenceController(connection);
+        }
+    };
 
     private final Connection.Listener mConnectionListener = new Connection.Listener() {
         @Override
@@ -247,17 +243,16 @@
      */
     private final TelephonyConnection.TelephonyConnectionListener mTelephonyConnectionListener =
             new TelephonyConnection.TelephonyConnectionListener() {
-                @Override
-                public void onOriginalConnectionConfigured(TelephonyConnection c) {
-                    addConnectionToConferenceController(c);
-                }
+        @Override
+        public void onOriginalConnectionConfigured(TelephonyConnection c) {
+            addConnectionToConferenceController(c);
+        }
 
-                @Override
-                public void onOriginalConnectionRetry(TelephonyConnection c,
-                                                      boolean isPermanentFailure) {
-                    retryOutgoingOriginalConnection(c, isPermanentFailure);
-                }
-            };
+        @Override
+        public void onOriginalConnectionRetry(TelephonyConnection c, boolean isPermanentFailure) {
+            retryOutgoingOriginalConnection(c, isPermanentFailure);
+        }
+    };
 
     @Override
     public void onCreate() {
@@ -404,13 +399,13 @@
                         // been powered on and isn't in the UNAVAILABLE state, even if it is
                         // reporting the OUT_OF_SERVICE state.
                         return (phone.getState() == PhoneConstants.State.OFFHOOK)
-                                || phone.getServiceStateTracker().isRadioOn();
+                            || phone.getServiceStateTracker().isRadioOn();
                     } else {
                         // It is not an emergency number, so wait until we are in service and ready
                         // to make calls. This can happen when we power down the radio on bluetooth
                         // to save power on watches.
                         return (phone.getState() == PhoneConstants.State.OFFHOOK)
-                                || serviceState == ServiceState.STATE_IN_SERVICE;
+                            || serviceState == ServiceState.STATE_IN_SERVICE;
                     }
                 }
             });
@@ -436,28 +431,9 @@
             // If there was a failure, the resulting connection will not be a TelephonyConnection,
             // so don't place the call!
             if (resultConnection instanceof TelephonyConnection) {
-                CarrierConfigManager cfgManager = (CarrierConfigManager)
-                        phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
-
-                boolean hasAssistedDialingExtra = request.getExtras() != null && request.getExtras()
-                        .getBoolean(TelecomManager.EXTRA_USE_ASSISTED_DIALING, false);
-                boolean isConfigManagerEnabled = cfgManager != null
-                        && cfgManager.getConfigForSubId(phone.getSubId()).getBoolean(
-                        CarrierConfigManager.KEY_ASSISTED_DIALING_ENABLED_BOOL);
-
-                if (hasAssistedDialingExtra && isConfigManagerEnabled) {
-                    Optional<TransformationInfo> transformedNumber = doAssistedDialing(request,
-                            phone);
-                    if (transformedNumber.isPresent()) {
-                        resultConnection.setAddress(Uri.fromParts(PhoneAccount.SCHEME_TEL,
-                                transformedNumber.get().getTransformedNumber(), null),
-                                resultConnection.getAddressPresentation());
-                        resultConnection.putExtra(TelecomManager
-                                .EXTRA_ASSISTED_DIALING_TRANSFORMATION_INFO,
-                                transformedNumber.get());
-                        ((TelephonyConnection) resultConnection).setIsUsingAssistedDialing(true);
-                    }
-
+                if (request.getExtras() != null && request.getExtras().getBoolean(
+                        TelecomManager.EXTRA_USE_ASSISTED_DIALING, false)) {
+                    ((TelephonyConnection) resultConnection).setIsUsingAssistedDialing(true);
                 }
                 placeOutgoingConnection((TelephonyConnection) resultConnection, phone, request);
             }
@@ -466,37 +442,6 @@
     }
 
     /**
-     * Performs Assisted Dialing and updates the state of relevant call objects.
-     */
-    private Optional<TransformationInfo> doAssistedDialing(ConnectionRequest request, Phone phone) {
-        TelephonyManager telephonyManager = phone.getContext().getSystemService(TelephonyManager
-                .class);
-
-        if (telephonyManager == null) {
-            return Optional.empty();
-        }
-
-        TelephonyManager simSpecificTelephonyManager = telephonyManager
-                .createForPhoneAccountHandle(request.getAccountHandle());
-
-        if (simSpecificTelephonyManager == null) {
-            return Optional.empty();
-        }
-
-        AssistedDialingMediator assistedDialingMediator =
-                ConcreteCreator.createNewAssistedDialingMediator(
-                        simSpecificTelephonyManager, phone.getContext());
-        if (!assistedDialingMediator.isPlatformEligible()) {
-            return Optional.empty();
-        }
-        String phoneNumber =
-                request.getAddress().getScheme().equals(PhoneAccount.SCHEME_TEL)
-                        ? request.getAddress().getSchemeSpecificPart()
-                        : "";
-        return assistedDialingMediator.attemptAssistedDial(phoneNumber);
-    }
-
-    /**
      * Whether the cellular radio is power off because the device is on Bluetooth.
      */
     private boolean isRadioPowerDownOnBluetooth() {
@@ -513,8 +458,8 @@
      * Handle the onComplete callback of RadioOnStateListener.
      */
     private void handleOnComplete(boolean isRadioReady, boolean isEmergencyNumber,
-                                  Connection originalConnection, ConnectionRequest request,
-                                  String numberToDial, Uri handle, int originalPhoneType) {
+            Connection originalConnection, ConnectionRequest request, String numberToDial,
+            Uri handle, int originalPhoneType) {
         // Make sure the Call has not already been canceled by the user.
         if (originalConnection.getState() == Connection.STATE_DISCONNECTED) {
             Log.i(this, "Call disconnected before the outgoing call was placed. Skipping call "
@@ -575,8 +520,7 @@
     }
 
     private Connection getTelephonyConnection(final ConnectionRequest request, final String number,
-                                              boolean isEmergencyNumber, final Uri handle,
-                                              Phone phone) {
+            boolean isEmergencyNumber, final Uri handle, Phone phone) {
 
         if (phone == null) {
             final Context context = getApplicationContext();
@@ -754,7 +698,7 @@
 
         com.android.internal.telephony.Connection originalConnection =
                 call.getState() == Call.State.WAITING ?
-                        call.getLatestConnection() : call.getEarliestConnection();
+                    call.getLatestConnection() : call.getEarliestConnection();
         if (isOriginalConnectionKnown(originalConnection)) {
             Log.i(this, "onCreateIncomingConnection, original connection already registered");
             return Connection.createCanceledConnection();
@@ -800,7 +744,7 @@
 
     @Override
     public Connection onCreateUnknownConnection(PhoneAccountHandle connectionManagerPhoneAccount,
-                                                ConnectionRequest request) {
+            ConnectionRequest request) {
         Log.i(this, "onCreateUnknownConnection, request: " + request);
         // Use the registered emergency Phone if the PhoneAccountHandle is set to Telephony's
         // Emergency PhoneAccount
@@ -1005,12 +949,12 @@
     // number and then moving it to the back of the queue if it is not a permanent failure cause
     // from the modem.
     private void updateCachedConnectionPhonePair(TelephonyConnection c,
-                                                 boolean isPermanentFailure) {
+            boolean isPermanentFailure) {
         // No cache exists, create a new one.
         if (mEmergencyRetryCache == null) {
             Log.i(this, "updateCachedConnectionPhonePair, cache is null. Generating new cache");
             mEmergencyRetryCache = makeCachedConnectionPhonePair(c);
-            // Cache is stale, create a new one with the new TelephonyConnection.
+        // Cache is stale, create a new one with the new TelephonyConnection.
         } else if (mEmergencyRetryCache.first.get() != c) {
             Log.i(this, "updateCachedConnectionPhonePair, cache is stale. Regenerating.");
             mEmergencyRetryCache = makeCachedConnectionPhonePair(c);
@@ -1417,10 +1361,10 @@
                     // this request to add a call.
                     if (cdmaConf.can(Connection.CAPABILITY_MERGE_CONFERENCE)) {
                         return Connection.createFailedConnection(new DisconnectCause(
-                                DisconnectCause.RESTRICTED,
-                                null,
-                                getResources().getString(R.string.callFailed_cdma_call_limit),
-                                "merge-capable call exists, prevent flash command."));
+                                    DisconnectCause.RESTRICTED,
+                                    null,
+                                    getResources().getString(R.string.callFailed_cdma_call_limit),
+                                    "merge-capable call exists, prevent flash command."));
                     }
                 }
             }
