diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 155cd41..4fe2be7 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -79,11 +79,11 @@
     <protected-broadcast android:name= "com.android.phone.vvm.ACTION_VISUAL_VOICEMAIL_SERVICE_EVENT" />
     <protected-broadcast android:name= "com.android.internal.telephony.CARRIER_VVM_PACKAGE_INSTALLED" />
     <protected-broadcast android:name= "com.android.cellbroadcastreceiver.GET_LATEST_CB_AREA_INFO" />
-    <protected-broadcast android:name= "android.intent.action.CURRENT_CARRIER_IDENTITY_CHANGED" />
     <protected-broadcast android:name= "com.android.internal.telephony.ACTION_CARRIER_CERTIFICATE_DOWNLOAD" />
     <protected-broadcast android:name= "android.telephony.action.SIM_CARD_STATE_CHANGED" />
     <protected-broadcast android:name= "android.telephony.action.SIM_APPLICATION_STATE_CHANGED" />
     <protected-broadcast android:name= "android.telephony.action.SIM_SLOT_STATUS_CHANGED" />
+    <protected-broadcast android:name= "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED" />
 
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
     <uses-permission android:name="android.permission.CALL_PHONE" />
@@ -154,9 +154,9 @@
     <uses-permission android:name="android.permission.BIND_CARRIER_SERVICES" />
     <!-- BIND_CARRIER_MESSAGING_SERVICE has been deprecated in favor of BIND_CARRIER_SERVICES. -->
     <uses-permission android:name="android.permission.BIND_CARRIER_MESSAGING_SERVICE" />
-    <uses-permission android:name="com.android.permission.BIND_EUICC_SERVICE" />
+    <uses-permission android:name="android.permission.BIND_EUICC_SERVICE" />
     <uses-permission android:name="com.android.permission.BIND_TELEPHONY_NETWORK_SERVICE" />
-    <uses-permission android:name="com.android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" />
+    <uses-permission android:name="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" />
     <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
@@ -173,6 +173,7 @@
     <uses-permission android:name="android.permission.READ_BLOCKED_NUMBERS" />
     <!-- Needed for emergency contact notification. -->
     <uses-permission android:name="android.permission.WRITE_BLOCKED_NUMBERS" />
+    <uses-permission android:name="android.permission.NETWORK_SETTINGS" />
 
     <!-- This tells the activity manager to not delay any of our activity
          start requests, even if they happen immediately after the user
@@ -241,104 +242,9 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="OutgoingCallBroadcaster"
-                android:enabled="false"
-                android:theme="@style/OutgoingCallBroadcasterTheme"
-                android:permission="android.permission.CALL_PHONE"
-                android:screenOrientation="nosensor"
-                android:configChanges="orientation|screenSize|keyboardHidden"
-                android:excludeFromRecents="true">
-            <!-- CALL action intent filters, for the various ways
-                 of initiating an outgoing call. -->
-            <intent-filter>
-                <action android:name="android.intent.action.CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="tel" />
-            </intent-filter>
-            <intent-filter android:icon="@drawable/ic_launcher_sip_call">
-                <action android:name="android.intent.action.CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="sip" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="android.intent.action.CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="voicemail" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="android.intent.action.CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/phone" />
-                <data android:mimeType="vnd.android.cursor.item/phone_v2" />
-                <data android:mimeType="vnd.android.cursor.item/person" />
-            </intent-filter>
-        </activity>
-
-        <activity-alias android:name="EmergencyOutgoingCallBroadcaster"
-                android:enabled="false"
-                android:targetActivity="OutgoingCallBroadcaster"
-                android:permission="android.permission.CALL_PRIVILEGED">
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_EMERGENCY" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="tel" />
-            </intent-filter>
-            <intent-filter android:icon="@drawable/ic_launcher_sip_call"
-                    android:priority="1000">
-                <action android:name="android.intent.action.CALL_EMERGENCY" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="sip" />
-            </intent-filter>
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_EMERGENCY" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="voicemail" />
-            </intent-filter>
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_EMERGENCY" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/phone" />
-                <data android:mimeType="vnd.android.cursor.item/person" />
-            </intent-filter>
-        </activity-alias>
-
-        <activity-alias android:name="PrivilegedOutgoingCallBroadcaster"
-                android:enabled="false"
-                android:targetActivity="OutgoingCallBroadcaster"
-                android:screenOrientation="nosensor"
-                android:permission="android.permission.CALL_PRIVILEGED">
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_PRIVILEGED" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="tel" />
-            </intent-filter>
-            <intent-filter android:icon="@drawable/ic_launcher_sip_call"
-                    android:priority="1000">
-                <action android:name="android.intent.action.CALL_PRIVILEGED" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="sip" />
-            </intent-filter>
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_PRIVILEGED" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="voicemail" />
-            </intent-filter>
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_PRIVILEGED" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/phone" />
-                <data android:mimeType="vnd.android.cursor.item/phone_v2" />
-                <data android:mimeType="vnd.android.cursor.item/person" />
-            </intent-filter>
-        </activity-alias>
-
-        <receiver android:name="ProcessOutgoingCallTest" android:exported="false"
-            android:enabled="false">
-            <intent-filter android:priority="1">
-                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </receiver>
+        <activity android:name="com.android.internal.telephony.uicc.InstallCarrierAppTrampolineActivity"
+                  android:theme="@android:style/Theme.Translucent.NoTitleBar"
+                  android:exported="false"/>
 
         <!-- "Mobile network settings" screen, used on both
              non-voice-capable tablets and regular phone devices. -->
@@ -584,13 +490,6 @@
 
         <!-- End SIP -->
 
-        <activity android:name="ErrorDialogActivity"
-                android:configChanges="orientation|screenSize|keyboardHidden"
-                android:excludeFromRecents="true"
-                android:launchMode="singleInstance"
-                android:theme="@style/Empty">
-        </activity>
-
         <activity android:name="MMIDialogActivity"
                 android:configChanges="orientation|screenSize|keyboardHidden"
                 android:excludeFromRecents="true"
@@ -643,6 +542,7 @@
                 <action android:name="android.telecom.ConnectionService" />
             </intent-filter>
         </service>
+
         <provider
                 android:name="PhoneSearchIndexablesProvider"
                 android:authorities="com.android.phone"
@@ -675,6 +575,10 @@
             </intent-filter>
         </receiver>
 
+        <receiver
+            android:name="com.android.internal.telephony.uicc.ShowInstallAppNotificationReceiver"
+            android:exported="false"/>
+
         <service
             android:name="com.android.phone.vvm.RemoteVvmTaskManager"
             android:exported="false"/>
diff --git a/OWNERS b/OWNERS
index e6fad06..f190411 100644
--- a/OWNERS
+++ b/OWNERS
@@ -6,5 +6,6 @@
 rgreenwalt@google.com
 tgunn@google.com
 refuhoo@google.com
-sanketpadawe@google.com
-mpq@google.com
\ No newline at end of file
+mpq@google.com
+jminjie@google.com
+shuoq@google.com
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2fb1ef7..ff84f29 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1608,7 +1608,6 @@
     <string name="clh_callFailed_protocol_Error_unspecified_txt">Protocol error, unspecified</string>
     <!-- In-call screen: call failure reason (Cause Number 127) -->
     <string name="clh_callFailed_interworking_unspecified_txt">Interworking, unspecified</string>
-
     <!-- Call settings screen, setting option name -->
     <string name="labelCallBarring">Call barring</string>
     <!-- Call barring settings screen, setting summary text when a call barring option is activated -->
@@ -1675,4 +1674,57 @@
     <string name="call_barring_settings">Call barring settings</string>
     <!-- Call barring settings screen, deactivate all call barring settings -->
     <string name="call_barring_deactivate_all_no_password">Deactivate all call barring settings?</string>
+    <!-- Message displayed to the user when an outgoing call is deflected.  This means that the
+         party the user is calling has chosen to send the call to another phone number. -->
+    <string name="supp_service_notification_call_deflected">Call deflected.</string>
+    <!-- Message displayed to the user when an outgoing call is forwarded to another number.
+         This happens because the party the user is calling has call forwarding active. -->
+    <string name="supp_service_notification_call_forwarded">Call forwarded.</string>
+    <!-- Message displayed to the user when an outgoing call is waiting.  This happens when the
+         party the user is calling is already in another call. -->
+    <string name="supp_service_notification_call_waiting">Call is waiting.</string>
+    <!-- Message displayed to the user when they have chosen to block their phone number for an
+         outgoing call, but the network has rejected that request. -->
+    <string name="supp_service_clir_suppression_rejected">Number blocking is rejected.</string>
+    <!-- Message displayed to the user to inform them that the call is to or from a number which is
+         part of a closed user group.  A closed user group is a network feature which restricts
+         calls on a device to members of the closed user group. -->
+    <string name="supp_service_closed_user_group_call">Closed user group call.</string>
+    <!-- Message displayed to the user when incoming call barring is active.  This means that the
+         user has enabled the network feature which prevents all incoming calls. -->
+    <string name="supp_service_incoming_calls_barred">Incoming calls barred.</string>
+    <!-- Message displayed to the user when outgoing call barring is active.  This means that the
+         user has enabled the network feature which prevents all outgoing calls. -->
+    <string name="supp_service_outgoing_calls_barred">Outgoing calls barred.</string>
+    <!-- Message displayed to the user to indicate that call forwarding is active. -->
+    <string name="supp_service_call_forwarding_active">Call forwarding active.</string>
+    <!-- Message displayed to the user when they receive multiple incoming calls at the same time
+         and one of them is forwarded to the network.  Phones can't handle multiple incoming calls
+         so the network will typically forward one of the calls to voicemail or another number
+         defined by the user. -->
+    <string name="supp_service_additional_call_forwarded">Additional call forwarded.</string>
+    <!-- Message displayed to the user to indicate that a call has been successfully transferred
+         to another phone number. -->
+    <string name="supp_service_additional_ect_connected">Explicit call transfer complete.</string>
+    <!-- Message displayed to the user to indicate that the call is in the process of being
+         transferred to another phone number.-->
+    <string name="supp_service_additional_ect_connecting">Explicit call transfer in progress.</string>
+    <!-- Message displayed to the user to indicate that the remote party has put the user
+         on hold. -->
+    <string name="supp_service_call_on_hold">Call on hold.</string>
+    <!-- Message displayed to the user to indicate that the remote party has taken the user
+         off hold. -->
+    <string name="supp_service_call_resumed">Call resumed.</string>
+    <!-- Message displayed to the user to indicate that an incoming call was deflected from another
+         number.  This means that the call originated as a result of the original caller choosing
+         to forward the call to the current user rather than answering it themselves. -->
+    <string name="supp_service_deflected_call">Call was deflected.</string>
+    <!-- Message displayed to the user to indicate that an incoming call was forwarded from another
+         number. -->
+    <string name="supp_service_forwarded_call">Forwarded call.</string>
+    <!-- Message displayed to the user to indicate that they are joining a conference call. -->
+    <string name="supp_service_conference_call">Joining conference call.</string>
+    <!-- Message displayed to the user to indicate that a held call has been released /
+         disconnected. -->
+    <string name="supp_service_held_call_released">Held call has been released.</string>
 </resources>
diff --git a/src/com/android/phone/CLIRListPreference.java b/src/com/android/phone/CLIRListPreference.java
index 939caf0..f5d14b8 100644
--- a/src/com/android/phone/CLIRListPreference.java
+++ b/src/com/android/phone/CLIRListPreference.java
@@ -52,6 +52,7 @@
         mPhone = phone;
         mTcpListener = listener;
         if (!skipReading) {
+            Log.i(LOG_TAG, "init: requesting CLIR");
             mPhone.getOutgoingCallerIdDisplay(mHandler.obtainMessage(MyHandler.MESSAGE_GET_CLIR,
                     MyHandler.MESSAGE_GET_CLIR, MyHandler.MESSAGE_GET_CLIR));
             if (mTcpListener != null) {
@@ -135,20 +136,19 @@
             }
             clirArray = null;
             if (ar.exception != null) {
-                if (DBG) Log.d(LOG_TAG, "handleGetCLIRResponse: ar.exception="+ar.exception);
+                Log.i(LOG_TAG, "handleGetCLIRResponse: ar.exception=" + ar.exception);
                 mTcpListener.onException(CLIRListPreference.this, (CommandException) ar.exception);
             } else if (ar.userObj instanceof Throwable) {
+                Log.i(LOG_TAG, "handleGetCLIRResponse: ar.throwable=" + ar.userObj);
                 mTcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR);
             } else {
                 int clirArray[] = (int[]) ar.result;
                 if (clirArray.length != 2) {
                     mTcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR);
                 } else {
-                    if (DBG) {
-                        Log.d(LOG_TAG, "handleGetCLIRResponse: CLIR successfully queried,"
+                    Log.i(LOG_TAG, "handleGetCLIRResponse: CLIR successfully queried,"
                                 + " clirArray[0]=" + clirArray[0]
                                 + ", clirArray[1]=" + clirArray[1]);
-                    }
                     handleGetCLIRResult(clirArray);
                 }
             }
diff --git a/src/com/android/phone/CallController.java b/src/com/android/phone/CallController.java
deleted file mode 100644
index a5d340c..0000000
--- a/src/com/android/phone/CallController.java
+++ /dev/null
@@ -1,671 +0,0 @@
-/*
- * Copyright (C) 2011 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;
-
-import com.android.internal.telephony.CallManager;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-import com.android.phone.CallGatewayManager.RawGatewayInfo;
-import com.android.phone.Constants.CallStatusCode;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemProperties;
-import android.provider.CallLog.Calls;
-import android.telecom.PhoneAccount;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.ServiceState;
-import android.util.Log;
-
-/**
- * Phone app module in charge of "call control".
- *
- * This is a singleton object which acts as the interface to the telephony layer
- * (and other parts of the Android framework) for all user-initiated telephony
- * functionality, like making outgoing calls.
- *
- * This functionality includes things like:
- *   - actually running the placeCall() method and handling errors or retries
- *   - running the whole "emergency call in airplane mode" sequence
- *   - running the state machine of MMI sequences
- *   - restoring/resetting mute and speaker state when a new call starts
- *   - updating the prox sensor wake lock state
- *   - resolving what the voicemail: intent should mean (and making the call)
- *
- * The single CallController instance stays around forever; it's not tied
- * to the lifecycle of any particular Activity (like the InCallScreen).
- * There's also no implementation of onscreen UI here (that's all in InCallScreen).
- *
- * Note that this class does not handle asynchronous events from the telephony
- * layer, like reacting to an incoming call; see CallNotifier for that.  This
- * class purely handles actions initiated by the user, like outgoing calls.
- */
-public class CallController extends Handler {
-    private static final String TAG = "CallController";
-    private static final boolean DBG =
-            (PhoneGlobals.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
-    // Do not check in with VDBG = true, since that may write PII to the system log.
-    private static final boolean VDBG = false;
-
-    /** The singleton CallController instance. */
-    private static CallController sInstance;
-
-    final private PhoneGlobals mApp;
-    final private CallManager mCM;
-    final private CallLogger mCallLogger;
-    final private CallGatewayManager mCallGatewayManager;
-
-    /** Helper object for emergency calls in some rare use cases.  Created lazily. */
-    private EmergencyCallHelper mEmergencyCallHelper;
-
-
-    //
-    // Message codes; see handleMessage().
-    //
-
-    private static final int THREEWAY_CALLERINFO_DISPLAY_DONE = 1;
-
-
-    //
-    // Misc constants.
-    //
-
-    // Amount of time the UI should display "Dialing" when initiating a CDMA
-    // 3way call.  (See comments on the THRWAY_ACTIVE case in
-    // placeCallInternal() for more info.)
-    private static final int THREEWAY_CALLERINFO_DISPLAY_TIME = 3000; // msec
-
-
-    /**
-     * Initialize the singleton CallController instance.
-     *
-     * This is only done once, at startup, from PhoneApp.onCreate().
-     * From then on, the CallController instance is available via the
-     * PhoneApp's public "callController" field, which is why there's no
-     * getInstance() method here.
-     */
-    /* package */ static CallController init(PhoneGlobals app, CallLogger callLogger,
-            CallGatewayManager callGatewayManager) {
-        synchronized (CallController.class) {
-            if (sInstance == null) {
-                sInstance = new CallController(app, callLogger, callGatewayManager);
-            } else {
-                Log.wtf(TAG, "init() called multiple times!  sInstance = " + sInstance);
-            }
-            return sInstance;
-        }
-    }
-
-    /**
-     * Private constructor (this is a singleton).
-     * @see init()
-     */
-    private CallController(PhoneGlobals app, CallLogger callLogger,
-            CallGatewayManager callGatewayManager) {
-        if (DBG) log("CallController constructor: app = " + app);
-        mApp = app;
-        mCM = app.mCM;
-        mCallLogger = callLogger;
-        mCallGatewayManager = callGatewayManager;
-    }
-
-    @Override
-    public void handleMessage(Message msg) {
-        if (VDBG) log("handleMessage: " + msg);
-        switch (msg.what) {
-
-            case THREEWAY_CALLERINFO_DISPLAY_DONE:
-                if (DBG) log("THREEWAY_CALLERINFO_DISPLAY_DONE...");
-
-                if (mApp.cdmaPhoneCallState.getCurrentCallState()
-                    == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
-                    // Reset the mThreeWayCallOrigStateDialing state
-                    mApp.cdmaPhoneCallState.setThreeWayCallOrigState(false);
-
-                    // TODO: Remove this code.
-                    //mApp.getCallModeler().setCdmaOutgoing3WayCall(null);
-                }
-                break;
-
-            default:
-                Log.wtf(TAG, "handleMessage: unexpected code: " + msg);
-                break;
-        }
-    }
-
-    //
-    // Outgoing call sequence
-    //
-
-    /**
-     * Initiate an outgoing call.
-     *
-     * Here's the most typical outgoing call sequence:
-     *
-     *  (1) OutgoingCallBroadcaster receives a CALL intent and sends the
-     *      NEW_OUTGOING_CALL broadcast
-     *
-     *  (2) The broadcast finally reaches OutgoingCallReceiver, which stashes
-     *      away a copy of the original CALL intent and launches
-     *      SipCallOptionHandler
-     *
-     *  (3) SipCallOptionHandler decides whether this is a PSTN or SIP call (and
-     *      in some cases brings up a dialog to let the user choose), and
-     *      ultimately calls CallController.placeCall() (from the
-     *      setResultAndFinish() method) with the stashed-away intent from step
-     *      (2) as the "intent" parameter.
-     *
-     *  (4) Here in CallController.placeCall() we read the phone number or SIP
-     *      address out of the intent and actually initiate the call, and
-     *      simultaneously launch the InCallScreen to display the in-call UI.
-     *
-     *  (5) We handle various errors by directing the InCallScreen to
-     *      display error messages or dialogs (via the InCallUiState
-     *      "pending call status code" flag), and in some cases we also
-     *      sometimes continue working in the background to resolve the
-     *      problem (like in the case of an emergency call while in
-     *      airplane mode).  Any time that some onscreen indication to the
-     *      user needs to change, we update the "status dialog" info in
-     *      the inCallUiState and (re)launch the InCallScreen to make sure
-     *      it's visible.
-     */
-    public void placeCall(Intent intent) {
-        log("placeCall()...  intent = " + intent);
-        if (VDBG) log("                extras = " + intent.getExtras());
-
-        // TODO: Do we need to hold a wake lock while this method runs?
-        //       Or did we already acquire one somewhere earlier
-        //       in this sequence (like when we first received the CALL intent?)
-
-        if (intent == null) {
-            Log.wtf(TAG, "placeCall: called with null intent");
-            throw new IllegalArgumentException("placeCall: called with null intent");
-        }
-
-        String action = intent.getAction();
-        Uri uri = intent.getData();
-        if (uri == null) {
-            Log.wtf(TAG, "placeCall: intent had no data");
-            throw new IllegalArgumentException("placeCall: intent had no data");
-        }
-
-        String scheme = uri.getScheme();
-        String number = PhoneNumberUtils.getNumberFromIntent(intent, mApp);
-        if (VDBG) {
-            log("- action: " + action);
-            log("- uri: " + uri);
-            log("- scheme: " + scheme);
-            log("- number: " + number);
-        }
-
-        // This method should only be used with the various flavors of CALL
-        // intents.  (It doesn't make sense for any other action to trigger an
-        // outgoing call!)
-        if (!(Intent.ACTION_CALL.equals(action)
-              || Intent.ACTION_CALL_EMERGENCY.equals(action)
-              || Intent.ACTION_CALL_PRIVILEGED.equals(action))) {
-            Log.wtf(TAG, "placeCall: unexpected intent action " + action);
-            throw new IllegalArgumentException("Unexpected action: " + action);
-        }
-
-        CallStatusCode status = placeCallInternal(intent);
-
-        switch (status) {
-            // Call was placed successfully:
-            case SUCCESS:
-            case EXITED_ECM:
-                if (DBG) log("==> placeCall(): success from placeCallInternal(): " + status);
-                break;
-
-            default:
-                // Any other status code is a failure.
-                log("==> placeCall(): failure code from placeCallInternal(): " + status);
-                // Handle the various error conditions that can occur when
-                // initiating an outgoing call, typically by directing the
-                // InCallScreen to display a diagnostic message (via the
-                // "pending call status code" flag.)
-                handleOutgoingCallError(status);
-                break;
-        }
-
-        // Finally, regardless of whether we successfully initiated the
-        // outgoing call or not, force the InCallScreen to come to the
-        // foreground.
-        //
-        // (For successful calls the the user will just see the normal
-        // in-call UI.  Or if there was an error, the InCallScreen will
-        // notice the InCallUiState pending call status code flag and display an
-        // error indication instead.)
-    }
-
-    /**
-     * Actually make a call to whomever the intent tells us to.
-     *
-     * Note that there's no need to explicitly update (or refresh) the
-     * in-call UI at any point in this method, since a fresh InCallScreen
-     * instance will be launched automatically after we return (see
-     * placeCall() above.)
-     *
-     * @param intent the CALL intent describing whom to call
-     * @return CallStatusCode.SUCCESS if we successfully initiated an
-     *    outgoing call.  If there was some kind of failure, return one of
-     *    the other CallStatusCode codes indicating what went wrong.
-     */
-    private CallStatusCode placeCallInternal(Intent intent) {
-        if (DBG) log("placeCallInternal()...  intent = " + intent);
-
-        // TODO: This method is too long.  Break it down into more
-        // manageable chunks.
-
-        final Uri uri = intent.getData();
-        final String scheme = (uri != null) ? uri.getScheme() : null;
-        String number;
-        Phone phone = null;
-
-        // Check the current ServiceState to make sure it's OK
-        // to even try making a call.
-        CallStatusCode okToCallStatus = checkIfOkToInitiateOutgoingCall(
-                mCM.getServiceState());
-
-        // TODO: Streamline the logic here.  Currently, the code is
-        // unchanged from its original form in InCallScreen.java.  But we
-        // should fix a couple of things:
-        // - Don't call checkIfOkToInitiateOutgoingCall() more than once
-        // - Wrap the try/catch for VoiceMailNumberMissingException
-        //   around *only* the call that can throw that exception.
-
-        try {
-            number = PhoneUtils.getInitialNumber(intent);
-            if (VDBG) log("- actual number to dial: '" + number + "'");
-
-            // find the phone first
-            // TODO Need a way to determine which phone to place the call
-            // It could be determined by SIP setting, i.e. always,
-            // or by number, i.e. for international,
-            // or by user selection, i.e., dialog query,
-            // or any of combinations
-            String sipPhoneUri = intent.getStringExtra(
-                    OutgoingCallBroadcaster.EXTRA_SIP_PHONE_URI);
-            ComponentName thirdPartyCallComponent = (ComponentName) intent.getParcelableExtra(
-                    OutgoingCallBroadcaster.EXTRA_THIRD_PARTY_CALL_COMPONENT);
-            phone = PhoneUtils.pickPhoneBasedOnNumber(mCM, scheme, number, sipPhoneUri,
-                    thirdPartyCallComponent);
-            if (VDBG) log("- got Phone instance: " + phone + ", class = " + phone.getClass());
-
-            // update okToCallStatus based on new phone
-            okToCallStatus = checkIfOkToInitiateOutgoingCall(
-                    phone.getServiceState().getState());
-
-        } catch (PhoneUtils.VoiceMailNumberMissingException ex) {
-            // If the call status is NOT in an acceptable state, it
-            // may effect the way the voicemail number is being
-            // retrieved.  Mask the VoiceMailNumberMissingException
-            // with the underlying issue of the phone state.
-            if (okToCallStatus != CallStatusCode.SUCCESS) {
-                if (DBG) log("Voicemail number not reachable in current SIM card state.");
-                return okToCallStatus;
-            }
-            if (DBG) log("VoiceMailNumberMissingException from getInitialNumber()");
-            return CallStatusCode.VOICEMAIL_NUMBER_MISSING;
-        }
-
-        if (number == null) {
-            Log.w(TAG, "placeCall: couldn't get a phone number from Intent " + intent);
-            return CallStatusCode.NO_PHONE_NUMBER_SUPPLIED;
-        }
-
-
-        // Sanity-check that ACTION_CALL_EMERGENCY is used if and only if
-        // this is a call to an emergency number
-        // (This is just a sanity-check; this policy *should* really be
-        // enforced in OutgoingCallBroadcaster.onCreate(), which is the
-        // main entry point for the CALL and CALL_* intents.)
-        boolean isEmergencyNumber = PhoneNumberUtils.isLocalEmergencyNumber(mApp, number);
-        boolean isPotentialEmergencyNumber =
-                PhoneNumberUtils.isPotentialLocalEmergencyNumber(mApp, number);
-        boolean isEmergencyIntent = Intent.ACTION_CALL_EMERGENCY.equals(intent.getAction());
-
-        if (isPotentialEmergencyNumber && !isEmergencyIntent) {
-            Log.e(TAG, "Non-CALL_EMERGENCY Intent " + intent
-                    + " attempted to call potential emergency number " + number
-                    + ".");
-            return CallStatusCode.CALL_FAILED;
-        } else if (!isPotentialEmergencyNumber && isEmergencyIntent) {
-            Log.e(TAG, "Received CALL_EMERGENCY Intent " + intent
-                    + " with non-potential-emergency number " + number
-                    + " -- failing call.");
-            return CallStatusCode.CALL_FAILED;
-        }
-
-        // If we're trying to call an emergency number, then it's OK to
-        // proceed in certain states where we'd otherwise bring up
-        // an error dialog:
-        // - If we're in EMERGENCY_ONLY mode, then (obviously) you're allowed
-        //   to dial emergency numbers.
-        // - If we're OUT_OF_SERVICE, we still attempt to make a call,
-        //   since the radio will register to any available network.
-
-        if (isEmergencyNumber
-            && ((okToCallStatus == CallStatusCode.EMERGENCY_ONLY)
-                || (okToCallStatus == CallStatusCode.OUT_OF_SERVICE))) {
-            if (DBG) log("placeCall: Emergency number detected with status = " + okToCallStatus);
-            okToCallStatus = CallStatusCode.SUCCESS;
-            if (DBG) log("==> UPDATING status to: " + okToCallStatus);
-        }
-
-        if (okToCallStatus != CallStatusCode.SUCCESS) {
-            // If this is an emergency call, launch the EmergencyCallHelperService
-            // to turn on the radio and retry the call.
-            if (isEmergencyNumber && (okToCallStatus == CallStatusCode.POWER_OFF)) {
-                Log.i(TAG, "placeCall: Trying to make emergency call while POWER_OFF!");
-
-                // If needed, lazily instantiate an EmergencyCallHelper instance.
-                synchronized (this) {
-                    if (mEmergencyCallHelper == null) {
-                        mEmergencyCallHelper = new EmergencyCallHelper(this);
-                    }
-                }
-
-                // ...and kick off the "emergency call from airplane mode" sequence.
-                mEmergencyCallHelper.startEmergencyCallFromAirplaneModeSequence(number);
-
-                // Finally, return CallStatusCode.SUCCESS right now so
-                // that the in-call UI will remain visible (in order to
-                // display the progress indication.)
-                // TODO: or maybe it would be more clear to return a whole
-                // new CallStatusCode called "TURNING_ON_RADIO" here.
-                // That way, we'd update inCallUiState.progressIndication from
-                // the handleOutgoingCallError() method, rather than here.
-                return CallStatusCode.SUCCESS;
-            } else {
-                // Otherwise, just return the (non-SUCCESS) status code
-                // back to our caller.
-                if (DBG) log("==> placeCallInternal(): non-success status: " + okToCallStatus);
-
-                // Log failed call.
-                // Note: Normally, many of these values we gather from the Connection object but
-                // since no such object is created for unconnected calls, we have to build them
-                // manually.
-                // TODO: Try to restructure code so that we can handle failure-
-                // condition call logging in a single place (placeCall()) that also has access to
-                // the number we attempted to dial (not placeCall()).
-                mCallLogger.logCall(null /* callerInfo */, number, 0 /* presentation */,
-                        Calls.OUTGOING_TYPE, System.currentTimeMillis(), 0 /* duration */);
-
-                return okToCallStatus;
-            }
-        }
-
-        // We have a valid number, so try to actually place a call:
-        // make sure we pass along the intent's URI which is a
-        // reference to the contact. We may have a provider gateway
-        // phone number to use for the outgoing call.
-        Uri contactUri = intent.getData();
-
-        // If a gateway is used, extract the data here and pass that into placeCall.
-        final RawGatewayInfo rawGatewayInfo = mCallGatewayManager.getRawGatewayInfo(intent, number);
-
-        // Watch out: PhoneUtils.placeCall() returns one of the
-        // CALL_STATUS_* constants, not a CallStatusCode enum value.
-        int callStatus = PhoneUtils.placeCall(mApp,
-                                              phone,
-                                              number,
-                                              contactUri,
-                                              (isEmergencyNumber || isEmergencyIntent),
-                                              rawGatewayInfo,
-                                              mCallGatewayManager);
-
-        switch (callStatus) {
-            case PhoneUtils.CALL_STATUS_DIALED:
-                if (VDBG) log("placeCall: PhoneUtils.placeCall() succeeded for regular call '"
-                             + number + "'.");
-
-
-                // TODO(OTASP): still need more cleanup to simplify the mApp.cdma*State objects:
-                // - Rather than checking inCallUiState.inCallScreenMode, the
-                //   code here could also check for
-                //   app.getCdmaOtaInCallScreenUiState() returning NORMAL.
-                // - But overall, app.inCallUiState.inCallScreenMode and
-                //   app.cdmaOtaInCallScreenUiState.state are redundant.
-                //   Combine them.
-
-                boolean voicemailUriSpecified = scheme != null &&
-                    scheme.equals(PhoneAccount.SCHEME_VOICEMAIL);
-                // Check for an obscure ECM-related scenario: If the phone
-                // is currently in ECM (Emergency callback mode) and we
-                // dial a non-emergency number, that automatically
-                // *cancels* ECM.  So warn the user about it.
-                // (See InCallScreen.showExitingECMDialog() for more info.)
-                boolean exitedEcm = false;
-                if (PhoneUtils.isPhoneInEcm(phone) && !isEmergencyNumber) {
-                    Log.i(TAG, "About to exit ECM because of an outgoing non-emergency call");
-                    exitedEcm = true;  // this will cause us to return EXITED_ECM from this method
-                }
-
-                if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
-                    // Start the timer for 3 Way CallerInfo
-                    if (mApp.cdmaPhoneCallState.getCurrentCallState()
-                            == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
-
-                        // This is a "CDMA 3-way call", which means that you're dialing a
-                        // 2nd outgoing call while a previous call is already in progress.
-                        //
-                        // Due to the limitations of CDMA this call doesn't actually go
-                        // through the DIALING/ALERTING states, so we can't tell for sure
-                        // when (or if) it's actually answered.  But we want to show
-                        // *some* indication of what's going on in the UI, so we "fake it"
-                        // by displaying the "Dialing" state for 3 seconds.
-
-                        // Set the mThreeWayCallOrigStateDialing state to true
-                        mApp.cdmaPhoneCallState.setThreeWayCallOrigState(true);
-
-                        // Schedule the "Dialing" indication to be taken down in 3 seconds:
-                        sendEmptyMessageDelayed(THREEWAY_CALLERINFO_DISPLAY_DONE,
-                                                THREEWAY_CALLERINFO_DISPLAY_TIME);
-                    }
-                }
-
-                // Success!
-                if (exitedEcm) {
-                    return CallStatusCode.EXITED_ECM;
-                } else {
-                    return CallStatusCode.SUCCESS;
-                }
-
-            case PhoneUtils.CALL_STATUS_DIALED_MMI:
-                if (DBG) log("placeCall: specified number was an MMI code: '" + number + "'.");
-                // The passed-in number was an MMI code, not a regular phone number!
-                // This isn't really a failure; the Dialer may have deliberately
-                // fired an ACTION_CALL intent to dial an MMI code, like for a
-                // USSD call.
-                //
-                // Presumably an MMI_INITIATE message will come in shortly
-                // (and we'll bring up the "MMI Started" dialog), or else
-                // an MMI_COMPLETE will come in (which will take us to a
-                // different Activity; see PhoneUtils.displayMMIComplete()).
-                return CallStatusCode.DIALED_MMI;
-
-            case PhoneUtils.CALL_STATUS_FAILED:
-                Log.w(TAG, "placeCall: PhoneUtils.placeCall() FAILED for number '"
-                      + number + "'.");
-                // We couldn't successfully place the call; there was some
-                // failure in the telephony layer.
-
-                // Log failed call.
-                mCallLogger.logCall(null /* callerInfo */, number, 0 /* presentation */,
-                        Calls.OUTGOING_TYPE, System.currentTimeMillis(), 0 /* duration */);
-
-                return CallStatusCode.CALL_FAILED;
-
-            default:
-                Log.wtf(TAG, "placeCall: unknown callStatus " + callStatus
-                        + " from PhoneUtils.placeCall() for number '" + number + "'.");
-                return CallStatusCode.SUCCESS;  // Try to continue anyway...
-        }
-    }
-
-    /**
-     * Checks the current ServiceState to make sure it's OK
-     * to try making an outgoing call to the specified number.
-     *
-     * @return CallStatusCode.SUCCESS if it's OK to try calling the specified
-     *    number.  If not, like if the radio is powered off or we have no
-     *    signal, return one of the other CallStatusCode codes indicating what
-     *    the problem is.
-     */
-    private CallStatusCode checkIfOkToInitiateOutgoingCall(int state) {
-        if (VDBG) log("checkIfOkToInitiateOutgoingCall: ServiceState = " + state);
-
-        switch (state) {
-            case ServiceState.STATE_IN_SERVICE:
-                // Normal operation.  It's OK to make outgoing calls.
-                return CallStatusCode.SUCCESS;
-
-            case ServiceState.STATE_POWER_OFF:
-                // Radio is explictly powered off.
-                return CallStatusCode.POWER_OFF;
-
-            case ServiceState.STATE_EMERGENCY_ONLY:
-                // The phone is registered, but locked. Only emergency
-                // numbers are allowed.
-                // Note that as of Android 2.0 at least, the telephony layer
-                // does not actually use ServiceState.STATE_EMERGENCY_ONLY,
-                // mainly since there's no guarantee that the radio/RIL can
-                // make this distinction.  So in practice the
-                // CallStatusCode.EMERGENCY_ONLY state and the string
-                // "incall_error_emergency_only" are totally unused.
-                return CallStatusCode.EMERGENCY_ONLY;
-
-            case ServiceState.STATE_OUT_OF_SERVICE:
-                // No network connection.
-                return CallStatusCode.OUT_OF_SERVICE;
-
-            default:
-                throw new IllegalStateException("Unexpected ServiceState: " + state);
-        }
-    }
-
-
-
-    /**
-     * Handles the various error conditions that can occur when initiating
-     * an outgoing call.
-     *
-     * Most error conditions are "handled" by simply displaying an error
-     * message to the user.
-     *
-     * @param status one of the CallStatusCode error codes.
-     */
-    private void handleOutgoingCallError(CallStatusCode status) {
-        if (DBG) log("handleOutgoingCallError(): status = " + status);
-        final Intent intent = new Intent(mApp, ErrorDialogActivity.class);
-        int errorMessageId = -1;
-        switch (status) {
-            case SUCCESS:
-                // This case shouldn't happen; you're only supposed to call
-                // handleOutgoingCallError() if there was actually an error!
-                Log.wtf(TAG, "handleOutgoingCallError: SUCCESS isn't an error");
-                break;
-
-            case CALL_FAILED:
-                // We couldn't successfully place the call; there was some
-                // failure in the telephony layer.
-                // TODO: Need UI spec for this failure case; for now just
-                // show a generic error.
-                errorMessageId = R.string.incall_error_call_failed;
-                break;
-            case POWER_OFF:
-                // Radio is explictly powered off, presumably because the
-                // device is in airplane mode.
-                //
-                // TODO: For now this UI is ultra-simple: we simply display
-                // a message telling the user to turn off airplane mode.
-                // But it might be nicer for the dialog to offer the option
-                // to turn the radio on right there (and automatically retry
-                // the call once network registration is complete.)
-                errorMessageId = R.string.incall_error_power_off;
-                break;
-            case EMERGENCY_ONLY:
-                // Only emergency numbers are allowed, but we tried to dial
-                // a non-emergency number.
-                // (This state is currently unused; see comments above.)
-                errorMessageId = R.string.incall_error_emergency_only;
-                break;
-            case OUT_OF_SERVICE:
-                // No network connection.
-                errorMessageId = R.string.incall_error_out_of_service;
-                break;
-            case NO_PHONE_NUMBER_SUPPLIED:
-                // The supplied Intent didn't contain a valid phone number.
-                // (This is rare and should only ever happen with broken
-                // 3rd-party apps.) For now just show a generic error.
-                errorMessageId = R.string.incall_error_no_phone_number_supplied;
-                break;
-
-            case VOICEMAIL_NUMBER_MISSING:
-                // Bring up the "Missing Voicemail Number" dialog, which
-                // will ultimately take us to some other Activity (or else
-                // just bail out of this activity.)
-
-                // Send a request to the InCallScreen to display the
-                // "voicemail missing" dialog when it (the InCallScreen)
-                // comes to the foreground.
-                intent.putExtra(ErrorDialogActivity.SHOW_MISSING_VOICEMAIL_NO_DIALOG_EXTRA, true);
-                break;
-
-            case DIALED_MMI:
-                // Our initial phone number was actually an MMI sequence.
-                // There's no real "error" here, but we do bring up the
-                // a Toast (as requested of the New UI paradigm).
-                //
-                // In-call MMIs do not trigger the normal MMI Initiate
-                // Notifications, so we should notify the user here.
-                // Otherwise, the code in PhoneUtils.java should handle
-                // user notifications in the form of Toasts or Dialogs.
-                //
-                // TODO: Rather than launching a toast from here, it would
-                // be cleaner to just set a pending call status code here,
-                // and then let the InCallScreen display the toast...
-                final Intent mmiIntent = new Intent(mApp, MMIDialogActivity.class);
-                mmiIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
-                        Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-                mApp.startActivity(mmiIntent);
-                return;
-            default:
-                Log.wtf(TAG, "handleOutgoingCallError: unexpected status code " + status);
-                // Show a generic "call failed" error.
-                errorMessageId = R.string.incall_error_call_failed;
-                break;
-        }
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-        if (errorMessageId != -1) {
-            intent.putExtra(ErrorDialogActivity.ERROR_MESSAGE_ID_EXTRA, errorMessageId);
-        }
-        mApp.startActivity(intent);
-    }
-
-    //
-    // Debugging
-    //
-
-    private static void log(String msg) {
-        Log.d(TAG, msg);
-    }
-}
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 9498241..3615621 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -197,7 +197,12 @@
         public void onCallStateChanged(int state, String incomingNumber) {
             if (DBG) log("PhoneStateListener onCallStateChanged: state is " + state);
             if (mEnableVideoCalling != null) {
-                mEnableVideoCalling.setEnabled(state == TelephonyManager.CALL_STATE_IDLE);
+                // Use TelephonyManager#getCallStete instead of 'state' parameter because it needs
+                // to check the current state of all phone calls.
+                TelephonyManager telephonyManager =
+                        (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+                mEnableVideoCalling.setEnabled(
+                        telephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE);
             }
         }
     };
diff --git a/src/com/android/phone/EmergencyCallHelper.java b/src/com/android/phone/EmergencyCallHelper.java
deleted file mode 100644
index 74ce088..0000000
--- a/src/com/android/phone/EmergencyCallHelper.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * Copyright (C) 2011 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;
-
-import com.android.internal.telephony.CallManager;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.telephony.DisconnectCause;
-import android.telephony.ServiceState;
-import android.util.Log;
-
-
-/**
- * Helper class for the {@link CallController} that implements special
- * behavior related to emergency calls.  Specifically, this class handles
- * the case of the user trying to dial an emergency number while the radio
- * is off (i.e. the device is in airplane mode), by forcibly turning the
- * radio back on, waiting for it to come up, and then retrying the
- * emergency call.
- *
- * This class is instantiated lazily (the first time the user attempts to
- * make an emergency call from airplane mode) by the the
- * {@link CallController} singleton.
- */
-public class EmergencyCallHelper extends Handler {
-    private static final String TAG = "EmergencyCallHelper";
-    private static final boolean DBG = false;
-
-    // Number of times to retry the call, and time between retry attempts.
-    public static final int MAX_NUM_RETRIES = 6;
-    public static final long TIME_BETWEEN_RETRIES = 5000;  // msec
-
-    // Timeout used with our wake lock (just as a safety valve to make
-    // sure we don't hold it forever).
-    public static final long WAKE_LOCK_TIMEOUT = 5 * 60 * 1000;  // 5 minutes in msec
-
-    // Handler message codes; see handleMessage()
-    private static final int START_SEQUENCE = 1;
-    private static final int SERVICE_STATE_CHANGED = 2;
-    private static final int DISCONNECT = 3;
-    private static final int RETRY_TIMEOUT = 4;
-
-    private CallController mCallController;
-    private PhoneGlobals mApp;
-    private CallManager mCM;
-    private String mNumber;  // The emergency number we're trying to dial
-    private int mNumRetriesSoFar;
-
-    // Wake lock we hold while running the whole sequence
-    private PowerManager.WakeLock mPartialWakeLock;
-
-    public EmergencyCallHelper(CallController callController) {
-        if (DBG) log("EmergencyCallHelper constructor...");
-        mCallController = callController;
-        mApp = PhoneGlobals.getInstance();
-        mCM =  mApp.mCM;
-    }
-
-    @Override
-    public void handleMessage(Message msg) {
-        switch (msg.what) {
-            case START_SEQUENCE:
-                startSequenceInternal(msg);
-                break;
-            case SERVICE_STATE_CHANGED:
-                onServiceStateChanged(msg);
-                break;
-            case DISCONNECT:
-                onDisconnect(msg);
-                break;
-            case RETRY_TIMEOUT:
-                onRetryTimeout();
-                break;
-            default:
-                Log.wtf(TAG, "handleMessage: unexpected message: " + msg);
-                break;
-        }
-    }
-
-    /**
-     * Starts the "emergency call from airplane mode" sequence.
-     *
-     * This is the (single) external API of the EmergencyCallHelper class.
-     * This method is called from the CallController placeCall() sequence
-     * if the user dials a valid emergency number, but the radio is
-     * powered-off (presumably due to airplane mode.)
-     *
-     * This method kicks off the following sequence:
-     * - Power on the radio
-     * - Listen for the service state change event telling us the radio has come up
-     * - Then launch the emergency call
-     * - Retry if the call fails with an OUT_OF_SERVICE error
-     * - Retry if we've gone 5 seconds without any response from the radio
-     * - Finally, clean up any leftover state (progress UI, wake locks, etc.)
-     *
-     * This method is safe to call from any thread, since it simply posts
-     * a message to the EmergencyCallHelper's handler (thus ensuring that
-     * the rest of the sequence is entirely serialized, and runs only on
-     * the handler thread.)
-     *
-     * This method does *not* force the in-call UI to come up; our caller
-     * is responsible for doing that (presumably by calling
-     * PhoneApp.displayCallScreen().)
-     */
-    public void startEmergencyCallFromAirplaneModeSequence(String number) {
-        if (DBG) log("startEmergencyCallFromAirplaneModeSequence('" + number + "')...");
-        Message msg = obtainMessage(START_SEQUENCE, number);
-        sendMessage(msg);
-    }
-
-    /**
-     * Actual implementation of startEmergencyCallFromAirplaneModeSequence(),
-     * guaranteed to run on the handler thread.
-     * @see #startEmergencyCallFromAirplaneModeSequence
-     */
-    private void startSequenceInternal(Message msg) {
-        if (DBG) log("startSequenceInternal(): msg = " + msg);
-
-        // First of all, clean up any state (including mPartialWakeLock!)
-        // left over from a prior emergency call sequence.
-        // This ensures that we'll behave sanely if another
-        // startEmergencyCallFromAirplaneModeSequence() comes in while
-        // we're already in the middle of the sequence.
-        cleanup();
-
-        mNumber = (String) msg.obj;
-        if (DBG) log("- startSequenceInternal: Got mNumber: '" + mNumber + "'");
-
-        mNumRetriesSoFar = 0;
-
-        // Wake lock to make sure the processor doesn't go to sleep midway
-        // through the emergency call sequence.
-        PowerManager pm = (PowerManager) mApp.getSystemService(Context.POWER_SERVICE);
-        mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
-        // Acquire with a timeout, just to be sure we won't hold the wake
-        // lock forever even if a logic bug (in this class) causes us to
-        // somehow never call cleanup().
-        if (DBG) log("- startSequenceInternal: acquiring wake lock");
-        mPartialWakeLock.acquire(WAKE_LOCK_TIMEOUT);
-
-        // No need to check the current service state here, since the only
-        // reason the CallController would call this method in the first
-        // place is if the radio is powered-off.
-        //
-        // So just go ahead and turn the radio on.
-
-        powerOnRadio();  // We'll get an onServiceStateChanged() callback
-                         // when the radio successfully comes up.
-
-        // Next step: when the SERVICE_STATE_CHANGED event comes in,
-        // we'll retry the call; see placeEmergencyCall();
-        // But also, just in case, start a timer to make sure we'll retry
-        // the call even if the SERVICE_STATE_CHANGED event never comes in
-        // for some reason.
-        startRetryTimer();
-
-        // (Our caller is responsible for calling mApp.displayCallScreen().)
-    }
-
-    /**
-     * Handles the SERVICE_STATE_CHANGED event.
-     *
-     * (Normally this event tells us that the radio has finally come
-     * up.  In that case, it's now safe to actually place the
-     * emergency call.)
-     */
-    private void onServiceStateChanged(Message msg) {
-        ServiceState state = (ServiceState) ((AsyncResult) msg.obj).result;
-        if (DBG) log("onServiceStateChanged()...  new state = " + state);
-
-        // Possible service states:
-        // - STATE_IN_SERVICE        // Normal operation
-        // - STATE_OUT_OF_SERVICE    // Still searching for an operator to register to,
-        //                           // or no radio signal
-        // - STATE_EMERGENCY_ONLY    // Phone is locked; only emergency numbers are allowed
-        // - STATE_POWER_OFF         // Radio is explicitly powered off (airplane mode)
-
-        // Once we reach either STATE_IN_SERVICE or STATE_EMERGENCY_ONLY,
-        // it's finally OK to place the emergency call.
-        boolean okToCall = (state.getState() == ServiceState.STATE_IN_SERVICE)
-                || (state.getState() == ServiceState.STATE_EMERGENCY_ONLY);
-
-        if (okToCall) {
-            // Woo hoo!  It's OK to actually place the call.
-            if (DBG) log("onServiceStateChanged: ok to call!");
-
-            // Deregister for the service state change events.
-            unregisterForServiceStateChanged();
-
-            placeEmergencyCall();
-        } else {
-            // The service state changed, but we're still not ready to call yet.
-            // (This probably was the transition from STATE_POWER_OFF to
-            // STATE_OUT_OF_SERVICE, which happens immediately after powering-on
-            // the radio.)
-            //
-            // So just keep waiting; we'll probably get to either
-            // STATE_IN_SERVICE or STATE_EMERGENCY_ONLY very shortly.
-            // (Or even if that doesn't happen, we'll at least do another retry
-            // when the RETRY_TIMEOUT event fires.)
-            if (DBG) log("onServiceStateChanged: not ready to call yet, keep waiting...");
-        }
-    }
-
-    /**
-     * Handles a DISCONNECT event from the telephony layer.
-     *
-     * Even after we successfully place an emergency call (after powering
-     * on the radio), it's still possible for the call to fail with the
-     * disconnect cause OUT_OF_SERVICE.  If so, schedule a retry.
-     */
-    private void onDisconnect(Message msg) {
-        Connection conn = (Connection) ((AsyncResult) msg.obj).result;
-        int cause = conn.getDisconnectCause();
-        if (DBG) log("onDisconnect: connection '" + conn
-                     + "', addr '" + conn.getAddress()
-                     + "', cause = " + DisconnectCause.toString(cause));
-
-        if (cause == DisconnectCause.OUT_OF_SERVICE) {
-            // Wait a bit more and try again (or just bail out totally if
-            // we've had too many failures.)
-            if (DBG) log("- onDisconnect: OUT_OF_SERVICE, need to retry...");
-            scheduleRetryOrBailOut();
-        } else {
-            // Any other disconnect cause means we're done.
-            // Either the emergency call succeeded *and* ended normally,
-            // or else there was some error that we can't retry.  In either
-            // case, just clean up our internal state.)
-
-            if (DBG) log("==> Disconnect event; clean up...");
-            cleanup();
-
-            // Nothing else to do here.  If the InCallScreen was visible,
-            // it would have received this disconnect event too (so it'll
-            // show the "Call ended" state and finish itself without any
-            // help from us.)
-        }
-    }
-
-    /**
-     * Handles the retry timer expiring.
-     */
-    private void onRetryTimeout() {
-        PhoneConstants.State phoneState = mCM.getState();
-        int serviceState = mCM.getDefaultPhone().getServiceState().getState();
-        if (DBG) log("onRetryTimeout():  phone state " + phoneState
-                     + ", service state " + serviceState
-                     + ", mNumRetriesSoFar = " + mNumRetriesSoFar);
-
-        // - If we're actually in a call, we've succeeded.
-        //
-        // - Otherwise, if the radio is now on, that means we successfully got
-        //   out of airplane mode but somehow didn't get the service state
-        //   change event.  In that case, try to place the call.
-        //
-        // - If the radio is still powered off, try powering it on again.
-
-        if (phoneState == PhoneConstants.State.OFFHOOK) {
-            if (DBG) log("- onRetryTimeout: Call is active!  Cleaning up...");
-            cleanup();
-            return;
-        }
-
-        if (serviceState != ServiceState.STATE_POWER_OFF) {
-            // Woo hoo -- we successfully got out of airplane mode.
-
-            // Deregister for the service state change events; we don't need
-            // these any more now that the radio is powered-on.
-            unregisterForServiceStateChanged();
-
-            placeEmergencyCall();  // If the call fails, placeEmergencyCall()
-                                   // will schedule a retry.
-        } else {
-            // Uh oh; we've waited the full TIME_BETWEEN_RETRIES and the
-            // radio is still not powered-on.  Try again...
-
-            if (DBG) log("- Trying (again) to turn on the radio...");
-            powerOnRadio();  // Again, we'll (hopefully) get an onServiceStateChanged()
-                             // callback when the radio successfully comes up.
-
-            // ...and also set a fresh retry timer (or just bail out
-            // totally if we've had too many failures.)
-            scheduleRetryOrBailOut();
-        }
-    }
-
-    /**
-     * Attempt to power on the radio (i.e. take the device out
-     * of airplane mode.)
-     *
-     * Additionally, start listening for service state changes;
-     * we'll eventually get an onServiceStateChanged() callback
-     * when the radio successfully comes up.
-     */
-    private void powerOnRadio() {
-        if (DBG) log("- powerOnRadio()...");
-
-        // We're about to turn on the radio, so arrange to be notified
-        // when the sequence is complete.
-        registerForServiceStateChanged();
-
-        // If airplane mode is on, we turn it off the same way that the
-        // Settings activity turns it off.
-        if (Settings.Global.getInt(mApp.getContentResolver(),
-                                   Settings.Global.AIRPLANE_MODE_ON, 0) > 0) {
-            if (DBG) log("==> Turning off airplane mode...");
-
-            // Change the system setting
-            Settings.Global.putInt(mApp.getContentResolver(),
-                                   Settings.Global.AIRPLANE_MODE_ON, 0);
-
-            // Post the intent
-            Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-            intent.putExtra("state", false);
-            mApp.sendBroadcastAsUser(intent, UserHandle.ALL);
-        } else {
-            // Otherwise, for some strange reason the radio is off
-            // (even though the Settings database doesn't think we're
-            // in airplane mode.)  In this case just turn the radio
-            // back on.
-            if (DBG) log("==> (Apparently) not in airplane mode; manually powering radio on...");
-            mCM.getDefaultPhone().setRadioPower(true);
-        }
-    }
-
-    /**
-     * Actually initiate the outgoing emergency call.
-     * (We do this once the radio has successfully been powered-up.)
-     *
-     * If the call succeeds, we're done.
-     * If the call fails, schedule a retry of the whole sequence.
-     */
-    private void placeEmergencyCall() {
-        if (DBG) log("placeEmergencyCall()...");
-
-        // Place an outgoing call to mNumber.
-        // Note we call PhoneUtils.placeCall() directly; we don't want any
-        // of the behavior from CallController.placeCallInternal() here.
-        // (Specifically, we don't want to start the "emergency call from
-        // airplane mode" sequence from the beginning again!)
-
-        registerForDisconnect();  // Get notified when this call disconnects
-
-        if (DBG) log("- placing call to '" + mNumber + "'...");
-        int callStatus = PhoneUtils.placeCall(mApp,
-                                              mCM.getDefaultPhone(),
-                                              mNumber,
-                                              null,  // contactUri
-                                              true); // isEmergencyCall
-        if (DBG) log("- PhoneUtils.placeCall() returned status = " + callStatus);
-
-        boolean success;
-        // Note PhoneUtils.placeCall() returns one of the CALL_STATUS_*
-        // constants, not a CallStatusCode enum value.
-        switch (callStatus) {
-            case PhoneUtils.CALL_STATUS_DIALED:
-                success = true;
-                break;
-
-            case PhoneUtils.CALL_STATUS_DIALED_MMI:
-            case PhoneUtils.CALL_STATUS_FAILED:
-            default:
-                // Anything else is a failure, and we'll need to retry.
-                Log.w(TAG, "placeEmergencyCall(): placeCall() failed: callStatus = " + callStatus);
-                success = false;
-                break;
-        }
-
-        if (success) {
-            if (DBG) log("==> Success from PhoneUtils.placeCall()!");
-            // Ok, the emergency call is (hopefully) under way.
-
-            // We're not done yet, though, so don't call cleanup() here.
-            // (It's still possible that this call will fail, and disconnect
-            // with cause==OUT_OF_SERVICE.  If so, that will trigger a retry
-            // from the onDisconnect() method.)
-        } else {
-            if (DBG) log("==> Failure.");
-            // Wait a bit more and try again (or just bail out totally if
-            // we've had too many failures.)
-            scheduleRetryOrBailOut();
-        }
-    }
-
-    /**
-     * Schedules a retry in response to some failure (either the radio
-     * failing to power on, or a failure when trying to place the call.)
-     * Or, if we've hit the retry limit, bail out of this whole sequence
-     * and display a failure message to the user.
-     */
-    private void scheduleRetryOrBailOut() {
-        mNumRetriesSoFar++;
-        if (DBG) log("scheduleRetryOrBailOut()...  mNumRetriesSoFar is now " + mNumRetriesSoFar);
-
-        if (mNumRetriesSoFar > MAX_NUM_RETRIES) {
-            Log.w(TAG, "scheduleRetryOrBailOut: hit MAX_NUM_RETRIES; giving up...");
-            cleanup();
-        } else {
-            if (DBG) log("- Scheduling another retry...");
-            startRetryTimer();
-        }
-    }
-
-    /**
-     * Clean up when done with the whole sequence: either after
-     * successfully placing *and* ending the emergency call, or after
-     * bailing out because of too many failures.
-     *
-     * The exact cleanup steps are:
-     * - Take down any progress UI (and also ask the in-call UI to refresh itself,
-     *   if it's still visible)
-     * - Double-check that we're not still registered for any telephony events
-     * - Clean up any extraneous handler messages (like retry timeouts) still in the queue
-     * - Make sure we're not still holding any wake locks
-     *
-     * Basically this method guarantees that there will be no more
-     * activity from the EmergencyCallHelper until the CallController
-     * kicks off the whole sequence again with another call to
-     * startEmergencyCallFromAirplaneModeSequence().
-     *
-     * Note we don't call this method simply after a successful call to
-     * placeCall(), since it's still possible the call will disconnect
-     * very quickly with an OUT_OF_SERVICE error.
-     */
-    private void cleanup() {
-        if (DBG) log("cleanup()...");
-
-        unregisterForServiceStateChanged();
-        unregisterForDisconnect();
-        cancelRetryTimer();
-
-        // Release / clean up the wake lock
-        if (mPartialWakeLock != null) {
-            if (mPartialWakeLock.isHeld()) {
-                if (DBG) log("- releasing wake lock");
-                mPartialWakeLock.release();
-            }
-            mPartialWakeLock = null;
-        }
-    }
-
-    private void startRetryTimer() {
-        removeMessages(RETRY_TIMEOUT);
-        sendEmptyMessageDelayed(RETRY_TIMEOUT, TIME_BETWEEN_RETRIES);
-    }
-
-    private void cancelRetryTimer() {
-        removeMessages(RETRY_TIMEOUT);
-    }
-
-    private void registerForServiceStateChanged() {
-        // Unregister first, just to make sure we never register ourselves
-        // twice.  (We need this because Phone.registerForServiceStateChanged()
-        // does not prevent multiple registration of the same handler.)
-        Phone phone = mCM.getDefaultPhone();
-        phone.unregisterForServiceStateChanged(this);  // Safe even if not currently registered
-        phone.registerForServiceStateChanged(this, SERVICE_STATE_CHANGED, null);
-    }
-
-    private void unregisterForServiceStateChanged() {
-        // This method is safe to call even if we haven't set mPhone yet.
-        Phone phone = mCM.getDefaultPhone();
-        if (phone != null) {
-            phone.unregisterForServiceStateChanged(this);  // Safe even if unnecessary
-        }
-        removeMessages(SERVICE_STATE_CHANGED);  // Clean up any pending messages too
-    }
-
-    private void registerForDisconnect() {
-        // Note: no need to unregister first, since
-        // CallManager.registerForDisconnect() automatically prevents
-        // multiple registration of the same handler.
-        mCM.registerForDisconnect(this, DISCONNECT, null);
-    }
-
-    private void unregisterForDisconnect() {
-        mCM.unregisterForDisconnect(this);  // Safe even if not currently registered
-        removeMessages(DISCONNECT);  // Clean up any pending messages too
-    }
-
-
-    //
-    // Debugging
-    //
-
-    private static void log(String msg) {
-        Log.d(TAG, msg);
-    }
-}
diff --git a/src/com/android/phone/EmergencyCallbackModeExitDialog.java b/src/com/android/phone/EmergencyCallbackModeExitDialog.java
index 765c52d..9d43d60 100644
--- a/src/com/android/phone/EmergencyCallbackModeExitDialog.java
+++ b/src/com/android/phone/EmergencyCallbackModeExitDialog.java
@@ -17,9 +17,9 @@
 package com.android.phone;
 
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.ProgressDialog;
-import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -28,7 +28,6 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
-import android.content.res.Resources;
 import android.os.AsyncResult;
 import android.os.Bundle;
 import android.os.CountDownTimer;
@@ -36,12 +35,10 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
-import android.os.SystemProperties;
 import android.util.Log;
 
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.telephony.TelephonyProperties;
 
 /**
  * Displays dialog that enables users to exit Emergency Callback Mode
@@ -80,12 +77,12 @@
 
         mPhone = PhoneGlobals.getInstance().getPhoneInEcm();
         // Check if phone is in Emergency Callback Mode. If not, exit.
-        final boolean isInEcm = mPhone.isInEcm();
-        Log.i(TAG, "ECMModeExitDialog launched - isInEcm: " + isInEcm + " phone:" + mPhone);
-        if (mPhone == null || !isInEcm) {
+        if (mPhone == null || !mPhone.isInEcm()) {
+            Log.i(TAG, "ECMModeExitDialog launched - isInEcm: false" + " phone:" + mPhone);
             finish();
             return;
         }
+        Log.i(TAG, "ECMModeExitDialog launched - isInEcm: true" + " phone:" + mPhone);
 
         mHandler = new Handler();
 
diff --git a/src/com/android/phone/ErrorDialogActivity.java b/src/com/android/phone/ErrorDialogActivity.java
deleted file mode 100644
index bf09376..0000000
--- a/src/com/android/phone/ErrorDialogActivity.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2013 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;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.phone.settings.VoicemailSettingsActivity;
-
-/**
- * Used to display an error dialog from within the Telephony service when an outgoing call fails
- */
-public class ErrorDialogActivity extends Activity {
-    private static final String TAG = ErrorDialogActivity.class.getSimpleName();
-
-    public static final String SHOW_MISSING_VOICEMAIL_NO_DIALOG_EXTRA = "show_missing_voicemail";
-    public static final String ERROR_MESSAGE_ID_EXTRA = "error_message_id";
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        final boolean showVoicemailDialog = getIntent().getBooleanExtra(
-                SHOW_MISSING_VOICEMAIL_NO_DIALOG_EXTRA, false);
-
-        if (showVoicemailDialog) {
-            showMissingVoicemailErrorDialog();
-        } else {
-            final int error = getIntent().getIntExtra(ERROR_MESSAGE_ID_EXTRA, -1);
-            if (error == -1) {
-                Log.e(TAG, "ErrorDialogActivity called with no error type extra.");
-                finish();
-            }
-            showGenericErrorDialog(error);
-        }
-    }
-
-    private void showGenericErrorDialog(int resid) {
-        final CharSequence msg = getResources().getText(resid);
-
-        final DialogInterface.OnClickListener clickListener;
-
-        final DialogInterface.OnCancelListener cancelListener;
-        clickListener = new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int which) {
-                finish();
-            }
-        };
-        cancelListener = new DialogInterface.OnCancelListener() {
-            @Override
-            public void onCancel(DialogInterface dialog) {
-                finish();
-            }
-        };
-
-        final AlertDialog errorDialog = new AlertDialog.Builder(this)
-                .setMessage(msg).setPositiveButton(R.string.ok, clickListener)
-                        .setOnCancelListener(cancelListener).create();
-
-        errorDialog.show();
-    }
-
-    private void showMissingVoicemailErrorDialog() {
-        final AlertDialog missingVoicemailDialog = new AlertDialog.Builder(this)
-        .setTitle(R.string.no_vm_number)
-        .setMessage(R.string.no_vm_number_msg)
-        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialog, int which) {
-                    dontAddVoiceMailNumber();
-                }})
-        .setNegativeButton(R.string.add_vm_number_str, new DialogInterface.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialog, int which) {
-                    addVoiceMailNumberPanel(dialog);
-                }})
-        .setOnCancelListener(new DialogInterface.OnCancelListener() {
-                @Override
-                public void onCancel(DialogInterface dialog) {
-                    dontAddVoiceMailNumber();
-                }}).show();
-    }
-
-
-    private void addVoiceMailNumberPanel(DialogInterface dialog) {
-        if (dialog != null) {
-            dialog.dismiss();
-        }
-
-        // navigate to the Voicemail setting in the Call Settings activity.
-        Intent intent = new Intent(VoicemailSettingsActivity.ACTION_ADD_VOICEMAIL);
-        intent.setClass(this, VoicemailSettingsActivity.class);
-        startActivity(intent);
-        finish();
-    }
-
-    private void dontAddVoiceMailNumber() {
-        finish();
-    }
-}
diff --git a/src/com/android/phone/MMIDialogActivity.java b/src/com/android/phone/MMIDialogActivity.java
index 4afa6be..c9be2ac 100644
--- a/src/com/android/phone/MMIDialogActivity.java
+++ b/src/com/android/phone/MMIDialogActivity.java
@@ -25,7 +25,6 @@
 import android.os.Message;
 import android.telephony.SubscriptionManager;
 import android.util.Log;
-import android.widget.Toast;
 
 import com.android.internal.telephony.CallManager;
 import com.android.internal.telephony.MmiCode;
@@ -56,6 +55,11 @@
         int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
                 SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
         mPhone = PhoneGlobals.getPhone(subId);
+        if (mPhone == null) {
+            Log.w(TAG, "onCreate: invalid subscription id (" + subId + ") lead to null"
+                    + " Phone.");
+            finish();
+        }
         mHandler = new Handler() {
                 @Override
                 public void handleMessage(Message msg) {
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index 8bc47ad..2edb749 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -275,8 +275,10 @@
 
         private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
             /*
-             * Enable/disable the 'Enhanced 4G LTE Mode' when in/out of a call
-             * and depending on TTY mode and TTY support over VoLTE.
+             * Enable/disable the 'Enhanced 4G LTE Mode' and 'Carrier video calling'
+             * when in/out of a call. 'Enhanced 4G LTE Mode' depends on TTY mode
+             * and TTY support over VoLTE.
+             *
              * @see android.telephony.PhoneStateListener#onCallStateChanged(int,
              * java.lang.String)
              */
@@ -292,6 +294,7 @@
                 Preference pref = getPreferenceScreen().findPreference(BUTTON_4G_LTE_KEY);
                 if (pref != null) pref.setEnabled(enabled && hasActiveSubscriptions());
 
+                updateVideoCallState();
             }
         };
 
@@ -1745,7 +1748,8 @@
                     mVideoCallingPref.setEnabled(false);
                     mVideoCallingPref.setChecked(false);
                 } else {
-                    mVideoCallingPref.setEnabled(true);
+                    mVideoCallingPref.setEnabled(
+                            mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE);
                     mVideoCallingPref.setChecked(mImsMgr.isVtEnabledByUser());
                     mVideoCallingPref.setOnPreferenceChangeListener(this);
                 }
diff --git a/src/com/android/phone/OutgoingCallBroadcaster.java b/src/com/android/phone/OutgoingCallBroadcaster.java
deleted file mode 100644
index 6bb1388..0000000
--- a/src/com/android/phone/OutgoingCallBroadcaster.java
+++ /dev/null
@@ -1,687 +0,0 @@
-/*
- * Copyright (C) 2008 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;
-
-import android.Manifest;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.app.AppOpsManager;
-import android.app.Dialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.SystemProperties;
-import android.os.UserHandle;
-import android.telecom.PhoneAccount;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.widget.ProgressBar;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-import com.android.internal.telephony.TelephonyCapabilities;
-
-/**
- * OutgoingCallBroadcaster receives CALL and CALL_PRIVILEGED Intents, and broadcasts the
- * ACTION_NEW_OUTGOING_CALL intent. ACTION_NEW_OUTGOING_CALL is an ordered broadcast intent which
- * contains the phone number being dialed. Applications can use this intent to (1) see which numbers
- * are being dialed, (2) redirect a call (change the number being dialed), or (3) prevent a call
- * from being placed.
- *
- * After the other applications have had a chance to see the
- * ACTION_NEW_OUTGOING_CALL intent, it finally reaches the
- * {@link OutgoingCallReceiver}, which passes the (possibly modified)
- * intent on to the {@link SipCallOptionHandler}, which will
- * ultimately start the call using the CallController.placeCall() API.
- *
- * Calls where no number is present (like for a CDMA "empty flash" or a nonexistent voicemail
- * number) are exempt from being broadcast.
- * Calls to emergency numbers are still broadcast for informative purposes. The call is placed
- * prior to sending ACTION_NEW_OUTGOING_CALL and cannot be redirected nor prevented.
- */
-public class OutgoingCallBroadcaster extends Activity
-        implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
-
-    private static final String TAG = "OutgoingCallBroadcaster";
-    private static final boolean DBG =
-            (PhoneGlobals.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
-    // Do not check in with VDBG = true, since that may write PII to the system log.
-    private static final boolean VDBG = false;
-
-    public static final String ACTION_SIP_SELECT_PHONE = "com.android.phone.SIP_SELECT_PHONE";
-    public static final String EXTRA_ALREADY_CALLED = "android.phone.extra.ALREADY_CALLED";
-    public static final String EXTRA_ORIGINAL_URI = "android.phone.extra.ORIGINAL_URI";
-    public static final String EXTRA_NEW_CALL_INTENT = "android.phone.extra.NEW_CALL_INTENT";
-    public static final String EXTRA_SIP_PHONE_URI = "android.phone.extra.SIP_PHONE_URI";
-    public static final String EXTRA_ACTUAL_NUMBER_TO_DIAL =
-            "android.phone.extra.ACTUAL_NUMBER_TO_DIAL";
-    public static final String EXTRA_THIRD_PARTY_CALL_COMPONENT =
-            "android.phone.extra.THIRD_PARTY_CALL_COMPONENT";
-
-    /**
-     * Identifier for intent extra for sending an empty Flash message for
-     * CDMA networks. This message is used by the network to simulate a
-     * press/depress of the "hookswitch" of a landline phone. Aka "empty flash".
-     *
-     * TODO: Receiving an intent extra to tell the phone to send this flash is a
-     * temporary measure. To be replaced with an external ITelephony call in the future.
-     * TODO: Keep in sync with the string defined in TwelveKeyDialer.java in Contacts app
-     * until this is replaced with the ITelephony API.
-     */
-    public static final String EXTRA_SEND_EMPTY_FLASH =
-            "com.android.phone.extra.SEND_EMPTY_FLASH";
-
-    // Dialog IDs
-    private static final int DIALOG_NOT_VOICE_CAPABLE = 1;
-
-    /** Note message codes < 100 are reserved for the PhoneApp. */
-    private static final int EVENT_OUTGOING_CALL_TIMEOUT = 101;
-    private static final int EVENT_DELAYED_FINISH = 102;
-
-    private static final int OUTGOING_CALL_TIMEOUT_THRESHOLD = 2000; // msec
-    private static final int DELAYED_FINISH_TIME = 2000; // msec
-
-    /**
-     * ProgressBar object with "spinner" style, which will be shown if we take more than
-     * {@link #EVENT_OUTGOING_CALL_TIMEOUT} msec to handle the incoming Intent.
-     */
-    private ProgressBar mWaitingSpinner;
-    private final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == EVENT_OUTGOING_CALL_TIMEOUT) {
-                Log.i(TAG, "Outgoing call takes too long. Showing the spinner.");
-                mWaitingSpinner.setVisibility(View.VISIBLE);
-            } else if (msg.what == EVENT_DELAYED_FINISH) {
-                finish();
-            } else {
-                Log.wtf(TAG, "Unknown message id: " + msg.what);
-            }
-        }
-    };
-
-    /**
-     * Starts the delayed finish() of OutgoingCallBroadcaster in order to give the UI
-     * some time to start up.
-     */
-    private void startDelayedFinish() {
-        mHandler.sendEmptyMessageDelayed(EVENT_DELAYED_FINISH, DELAYED_FINISH_TIME);
-    }
-
-    /**
-     * OutgoingCallReceiver finishes NEW_OUTGOING_CALL broadcasts, starting
-     * the InCallScreen if the broadcast has not been canceled, possibly with
-     * a modified phone number and optional provider info (uri + package name + remote views.)
-     */
-    public class OutgoingCallReceiver extends BroadcastReceiver {
-        private static final String TAG = "OutgoingCallReceiver";
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            mHandler.removeMessages(EVENT_OUTGOING_CALL_TIMEOUT);
-            final boolean isAttemptingCall = doReceive(context, intent);
-            if (DBG) Log.v(TAG, "OutgoingCallReceiver is going to finish the Activity itself.");
-
-            // We cannot finish the activity immediately here because it would cause the temporary
-            // black screen of OutgoingBroadcaster to go away and we need it to stay up until the
-            // UI (in a different process) has time to come up.
-            // However, if we know we are not attemping a call, we need to finish the activity
-            // immediately so that subsequent CALL intents will retrigger a new
-            // OutgoingCallReceiver. see b/10857203
-            if (isAttemptingCall) {
-                startDelayedFinish();
-            } else {
-                finish();
-            }
-        }
-
-
-        /**
-         * Handes receipt of ordered new_outgoing_call intent. Verifies that the return from the
-         * ordered intent is valid.
-         * @return true if the call is being attempted; false if we are canceling the call.
-         */
-        public boolean doReceive(Context context, Intent intent) {
-            if (DBG) Log.v(TAG, "doReceive: " + intent);
-
-            boolean alreadyCalled;
-            String number;
-            String originalUri;
-
-            alreadyCalled = intent.getBooleanExtra(
-                    OutgoingCallBroadcaster.EXTRA_ALREADY_CALLED, false);
-            if (alreadyCalled) {
-                if (DBG) Log.v(TAG, "CALL already placed -- returning.");
-                return false;
-            }
-
-            // Once the NEW_OUTGOING_CALL broadcast is finished, the resultData
-            // is used as the actual number to call. (If null, no call will be
-            // placed.)
-
-            number = getResultData();
-            if (VDBG) Log.v(TAG, "- got number from resultData: '" + number + "'");
-
-            final PhoneGlobals app = PhoneGlobals.getInstance();
-            final Phone phone = PhoneGlobals.getPhone();
-
-            if (number == null) {
-                if (DBG) Log.v(TAG, "CALL cancelled (null number), returning...");
-                return false;
-            } else if (TelephonyCapabilities.supportsOtasp(phone)
-                    && (phone.getState() != PhoneConstants.State.IDLE)
-                    && (phone.isOtaSpNumber(number))) {
-                if (DBG) Log.v(TAG, "Call is active, a 2nd OTA call cancelled -- returning.");
-                return false;
-            } else if (PhoneNumberUtils.isPotentialLocalEmergencyNumber(context, number)) {
-                // Just like 3rd-party apps aren't allowed to place emergency
-                // calls via the ACTION_CALL intent, we also don't allow 3rd
-                // party apps to use the NEW_OUTGOING_CALL broadcast to rewrite
-                // an outgoing call into an emergency number.
-                Log.w(TAG, "Cannot modify outgoing call to emergency number " + number + ".");
-                return false;
-            }
-
-            originalUri = intent.getStringExtra(
-                    OutgoingCallBroadcaster.EXTRA_ORIGINAL_URI);
-            if (originalUri == null) {
-                Log.e(TAG, "Intent is missing EXTRA_ORIGINAL_URI -- returning.");
-                return false;
-            }
-
-            Uri uri = Uri.parse(originalUri);
-
-            // We already called convertKeypadLettersToDigits() and
-            // stripSeparators() way back in onCreate(), before we sent out the
-            // NEW_OUTGOING_CALL broadcast.  But we need to do it again here
-            // too, since the number might have been modified/rewritten during
-            // the broadcast (and may now contain letters or separators again.)
-            number = PhoneNumberUtils.convertKeypadLettersToDigits(number);
-            number = PhoneNumberUtils.stripSeparators(number);
-
-            if (DBG) Log.v(TAG, "doReceive: proceeding with call...");
-            if (VDBG) Log.v(TAG, "- uri: " + uri);
-            if (VDBG) Log.v(TAG, "- actual number to dial: '" + number + "'");
-
-            startSipCallOptionHandler(context, intent, uri, number);
-
-            return true;
-        }
-    }
-
-    /**
-     * Launch the SipCallOptionHandler, which is the next step(*) in the
-     * outgoing-call sequence after the outgoing call broadcast is
-     * complete.
-     *
-     * (*) We now know exactly what phone number we need to dial, so the next
-     *     step is for the SipCallOptionHandler to decide which Phone type (SIP
-     *     or PSTN) should be used.  (Depending on the user's preferences, this
-     *     decision may also involve popping up a dialog to ask the user to
-     *     choose what type of call this should be.)
-     *
-     * @param context used for the startActivity() call
-     *
-     * @param intent the intent from the previous step of the outgoing-call
-     *   sequence.  Normally this will be the NEW_OUTGOING_CALL broadcast intent
-     *   that came in to the OutgoingCallReceiver, although it can also be the
-     *   original ACTION_CALL intent that started the whole sequence (in cases
-     *   where we don't do the NEW_OUTGOING_CALL broadcast at all, like for
-     *   emergency numbers or SIP addresses).
-     *
-     * @param uri the data URI from the original CALL intent, presumably either
-     *   a tel: or sip: URI.  For tel: URIs, note that the scheme-specific part
-     *   does *not* necessarily have separators and keypad letters stripped (so
-     *   we might see URIs like "tel:(650)%20555-1234" or "tel:1-800-GOOG-411"
-     *   here.)
-     *
-     * @param number the actual number (or SIP address) to dial.  This is
-     *   guaranteed to be either a PSTN phone number with separators stripped
-     *   out and keypad letters converted to digits (like "16505551234"), or a
-     *   raw SIP address (like "user@example.com").
-     */
-    private void startSipCallOptionHandler(Context context, Intent intent,
-            Uri uri, String number) {
-        // TODO: Remove this code.
-    }
-
-    /**
-     * This method is the single point of entry for the CALL intent, which is used (by built-in
-     * apps like Contacts / Dialer, as well as 3rd-party apps) to initiate an outgoing voice call.
-     *
-     *
-     */
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.outgoing_call_broadcaster);
-        mWaitingSpinner = (ProgressBar) findViewById(R.id.spinner);
-
-        Intent intent = getIntent();
-        if (DBG) {
-            final Configuration configuration = getResources().getConfiguration();
-            Log.v(TAG, "onCreate: this = " + this + ", icicle = " + icicle);
-            Log.v(TAG, " - getIntent() = " + intent);
-            Log.v(TAG, " - configuration = " + configuration);
-        }
-
-        if (icicle != null) {
-            // A non-null icicle means that this activity is being
-            // re-initialized after previously being shut down.
-            //
-            // In practice this happens very rarely (because the lifetime
-            // of this activity is so short!), but it *can* happen if the
-            // framework detects a configuration change at exactly the
-            // right moment; see bug 2202413.
-            //
-            // In this case, do nothing.  Our onCreate() method has already
-            // run once (with icicle==null the first time), which means
-            // that the NEW_OUTGOING_CALL broadcast for this new call has
-            // already been sent.
-            Log.i(TAG, "onCreate: non-null icicle!  "
-                  + "Bailing out, not sending NEW_OUTGOING_CALL broadcast...");
-
-            // No need to finish() here, since the OutgoingCallReceiver from
-            // our original instance will do that.  (It'll actually call
-            // finish() on our original instance, which apparently works fine
-            // even though the ActivityManager has already shut that instance
-            // down.  And note that if we *do* call finish() here, that just
-            // results in an "ActivityManager: Duplicate finish request"
-            // warning when the OutgoingCallReceiver runs.)
-
-            return;
-        }
-
-        processIntent(intent);
-
-        // isFinishing() return false when 1. broadcast is still ongoing, or 2. dialog is being
-        // shown. Otherwise finish() is called inside processIntent(), is isFinishing() here will
-        // return true.
-        if (DBG) Log.v(TAG, "At the end of onCreate(). isFinishing(): " + isFinishing());
-    }
-
-    /**
-     * Interprets a given Intent and starts something relevant to the Intent.
-     *
-     * This method will handle three kinds of actions:
-     *
-     * - CALL (action for usual outgoing voice calls)
-     * - CALL_PRIVILEGED (can come from built-in apps like contacts / voice dialer / bluetooth)
-     * - CALL_EMERGENCY (from the EmergencyDialer that's reachable from the lockscreen.)
-     *
-     * The exact behavior depends on the intent's data:
-     *
-     * - The most typical is a tel: URI, which we handle by starting the
-     *   NEW_OUTGOING_CALL broadcast.  That broadcast eventually triggers
-     *   the sequence OutgoingCallReceiver -> SipCallOptionHandler ->
-     *   InCallScreen.
-     *
-     * - Or, with a sip: URI we skip the NEW_OUTGOING_CALL broadcast and
-     *   go directly to SipCallOptionHandler, which then leads to the
-     *   InCallScreen.
-     *
-     * - voicemail: URIs take the same path as regular tel: URIs.
-     *
-     * Other special cases:
-     *
-     * - Outgoing calls are totally disallowed on non-voice-capable
-     *   devices (see handleNonVoiceCapable()).
-     *
-     * - A CALL intent with the EXTRA_SEND_EMPTY_FLASH extra (and
-     *   presumably no data at all) means "send an empty flash" (which
-     *   is only meaningful on CDMA devices while a call is already
-     *   active.)
-     *
-     */
-    private void processIntent(Intent intent) {
-        if (DBG) {
-            Log.v(TAG, "processIntent() = " + intent + ", thread: " + Thread.currentThread());
-        }
-        final Configuration configuration = getResources().getConfiguration();
-
-        // Outgoing phone calls are only allowed on "voice-capable" devices.
-        if (!PhoneGlobals.sVoiceCapable) {
-            Log.i(TAG, "This device is detected as non-voice-capable device.");
-            handleNonVoiceCapable(intent);
-            return;
-        }
-
-        String action = intent.getAction();
-        String number = PhoneNumberUtils.getNumberFromIntent(intent, this);
-        // Check the number, don't convert for sip uri
-        // TODO put uriNumber under PhoneNumberUtils
-        if (number != null) {
-            if (!PhoneNumberUtils.isUriNumber(number)) {
-                number = PhoneNumberUtils.convertKeypadLettersToDigits(number);
-                number = PhoneNumberUtils.stripSeparators(number);
-            }
-        } else {
-            Log.w(TAG, "The number obtained from Intent is null.");
-        }
-
-        AppOpsManager appOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE);
-        int launchedFromUid;
-        String launchedFromPackage;
-        try {
-            launchedFromUid = ActivityManager.getService().getLaunchedFromUid(
-                    getActivityToken());
-            launchedFromPackage = ActivityManager.getService().getLaunchedFromPackage(
-                    getActivityToken());
-        } catch (RemoteException e) {
-            launchedFromUid = -1;
-            launchedFromPackage = null;
-        }
-        if (appOps.noteOpNoThrow(AppOpsManager.OP_CALL_PHONE, launchedFromUid, launchedFromPackage)
-                != AppOpsManager.MODE_ALLOWED) {
-            Log.w(TAG, "Rejecting call from uid " + launchedFromUid + " package "
-                    + launchedFromPackage);
-            finish();
-            return;
-        }
-
-        // If true, this flag will indicate that the current call is a special kind
-        // of call (most likely an emergency number) that 3rd parties aren't allowed
-        // to intercept or affect in any way.  (In that case, we start the call
-        // immediately rather than going through the NEW_OUTGOING_CALL sequence.)
-        boolean callNow;
-
-        if (getClass().getName().equals(intent.getComponent().getClassName())) {
-            // If we were launched directly from the OutgoingCallBroadcaster,
-            // not one of its more privileged aliases, then make sure that
-            // only the non-privileged actions are allowed.
-            if (!Intent.ACTION_CALL.equals(intent.getAction())) {
-                Log.w(TAG, "Attempt to deliver non-CALL action; forcing to CALL");
-                intent.setAction(Intent.ACTION_CALL);
-            }
-        }
-
-        // Check whether or not this is an emergency number, in order to
-        // enforce the restriction that only the CALL_PRIVILEGED and
-        // CALL_EMERGENCY intents are allowed to make emergency calls.
-        //
-        // (Note that the ACTION_CALL check below depends on the result of
-        // isPotentialLocalEmergencyNumber() rather than just plain
-        // isLocalEmergencyNumber(), to be 100% certain that we *don't*
-        // allow 3rd party apps to make emergency calls by passing in an
-        // "invalid" number like "9111234" that isn't technically an
-        // emergency number but might still result in an emergency call
-        // with some networks.)
-        final boolean isExactEmergencyNumber =
-                (number != null) && PhoneNumberUtils.isLocalEmergencyNumber(this, number);
-        final boolean isPotentialEmergencyNumber =
-                (number != null) && PhoneNumberUtils.isPotentialLocalEmergencyNumber(this, number);
-        if (VDBG) {
-            Log.v(TAG, " - Checking restrictions for number '" + number + "':");
-            Log.v(TAG, "     isExactEmergencyNumber     = " + isExactEmergencyNumber);
-            Log.v(TAG, "     isPotentialEmergencyNumber = " + isPotentialEmergencyNumber);
-        }
-
-        /* Change CALL_PRIVILEGED into CALL or CALL_EMERGENCY as needed. */
-        // TODO: This code is redundant with some code in InCallScreen: refactor.
-        if (Intent.ACTION_CALL_PRIVILEGED.equals(action)) {
-            // We're handling a CALL_PRIVILEGED intent, so we know this request came
-            // from a trusted source (like the built-in dialer.)  So even a number
-            // that's *potentially* an emergency number can safely be promoted to
-            // CALL_EMERGENCY (since we *should* allow you to dial "91112345" from
-            // the dialer if you really want to.)
-            if (isPotentialEmergencyNumber) {
-                Log.i(TAG, "ACTION_CALL_PRIVILEGED is used while the number is a potential"
-                        + " emergency number. Use ACTION_CALL_EMERGENCY as an action instead.");
-                action = Intent.ACTION_CALL_EMERGENCY;
-            } else {
-                action = Intent.ACTION_CALL;
-            }
-            if (DBG) Log.v(TAG, " - updating action from CALL_PRIVILEGED to " + action);
-            intent.setAction(action);
-        }
-
-        if (Intent.ACTION_CALL.equals(action)) {
-            if (isPotentialEmergencyNumber) {
-                Log.w(TAG, "Cannot call potential emergency number '" + number
-                        + "' with CALL Intent " + intent + ".");
-                Log.i(TAG, "Launching default dialer instead...");
-
-                Intent invokeFrameworkDialer = new Intent();
-
-                // TwelveKeyDialer is in a tab so we really want
-                // DialtactsActivity.  Build the intent 'manually' to
-                // use the java resolver to find the dialer class (as
-                // opposed to a Context which look up known android
-                // packages only)
-                final Resources resources = getResources();
-                invokeFrameworkDialer.setClassName(
-                        resources.getString(R.string.ui_default_package),
-                        resources.getString(R.string.dialer_default_class));
-                invokeFrameworkDialer.setAction(Intent.ACTION_DIAL);
-                invokeFrameworkDialer.setData(intent.getData());
-                if (DBG) Log.v(TAG, "onCreate(): calling startActivity for Dialer: "
-                               + invokeFrameworkDialer);
-                startActivity(invokeFrameworkDialer);
-                finish();
-                return;
-            }
-            callNow = false;
-        } else if (Intent.ACTION_CALL_EMERGENCY.equals(action)) {
-            // ACTION_CALL_EMERGENCY case: this is either a CALL_PRIVILEGED
-            // intent that we just turned into a CALL_EMERGENCY intent (see
-            // above), or else it really is an CALL_EMERGENCY intent that
-            // came directly from some other app (e.g. the EmergencyDialer
-            // activity built in to the Phone app.)
-            // Make sure it's at least *possible* that this is really an
-            // emergency number.
-            if (!isPotentialEmergencyNumber) {
-                Log.w(TAG, "Cannot call non-potential-emergency number " + number
-                        + " with EMERGENCY_CALL Intent " + intent + "."
-                        + " Finish the Activity immediately.");
-                finish();
-                return;
-            }
-            callNow = true;
-        } else {
-            Log.e(TAG, "Unhandled Intent " + intent + ". Finish the Activity immediately.");
-            finish();
-            return;
-        }
-
-        // Make sure the screen is turned on.  This is probably the right
-        // thing to do, and more importantly it works around an issue in the
-        // activity manager where we will not launch activities consistently
-        // when the screen is off (since it is trying to keep them paused
-        // and has...  issues).
-        //
-        // Also, this ensures the device stays awake while doing the following
-        // broadcast; technically we should be holding a wake lock here
-        // as well.
-        PhoneGlobals.getInstance().wakeUpScreen();
-
-        // If number is null, we're probably trying to call a non-existent voicemail number,
-        // send an empty flash or something else is fishy.  Whatever the problem, there's no
-        // number, so there's no point in allowing apps to modify the number.
-        if (TextUtils.isEmpty(number)) {
-            if (intent.getBooleanExtra(EXTRA_SEND_EMPTY_FLASH, false)) {
-                Log.i(TAG, "onCreate: SEND_EMPTY_FLASH...");
-                PhoneUtils.sendEmptyFlash(PhoneGlobals.getPhone());
-                finish();
-                return;
-            } else {
-                Log.i(TAG, "onCreate: null or empty number, setting callNow=true...");
-                callNow = true;
-            }
-        }
-
-        if (callNow) {
-            // This is a special kind of call (most likely an emergency number)
-            // that 3rd parties aren't allowed to intercept or affect in any way.
-            // So initiate the outgoing call immediately.
-
-            Log.i(TAG, "onCreate(): callNow case! Calling placeCall(): " + intent);
-
-            // Initiate the outgoing call, and simultaneously launch the
-            // InCallScreen to display the in-call UI:
-            PhoneGlobals.getInstance().callController.placeCall(intent);
-
-            // Note we do *not* "return" here, but instead continue and
-            // send the ACTION_NEW_OUTGOING_CALL broadcast like for any
-            // other outgoing call.  (But when the broadcast finally
-            // reaches the OutgoingCallReceiver, we'll know not to
-            // initiate the call again because of the presence of the
-            // EXTRA_ALREADY_CALLED extra.)
-        }
-
-        // For now, SIP calls will be processed directly without a
-        // NEW_OUTGOING_CALL broadcast.
-        //
-        // TODO: In the future, though, 3rd party apps *should* be allowed to
-        // intercept outgoing calls to SIP addresses as well.  To do this, we should
-        // (1) update the NEW_OUTGOING_CALL intent documentation to explain this
-        // case, and (2) pass the outgoing SIP address by *not* overloading the
-        // EXTRA_PHONE_NUMBER extra, but instead using a new separate extra to hold
-        // the outgoing SIP address.  (Be sure to document whether it's a URI or just
-        // a plain address, whether it could be a tel: URI, etc.)
-        Uri uri = intent.getData();
-        String scheme = uri.getScheme();
-        if (PhoneAccount.SCHEME_SIP.equals(scheme) || PhoneNumberUtils.isUriNumber(number)) {
-            Log.i(TAG, "The requested number was detected as SIP call.");
-            startSipCallOptionHandler(this, intent, uri, number);
-            finish();
-            return;
-
-            // TODO: if there's ever a way for SIP calls to trigger a
-            // "callNow=true" case (see above), we'll need to handle that
-            // case here too (most likely by just doing nothing at all.)
-        }
-
-        Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);
-        if (number != null) {
-            broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
-        }
-        CallGatewayManager.checkAndCopyPhoneProviderExtras(intent, broadcastIntent);
-        broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow);
-        broadcastIntent.putExtra(EXTRA_ORIGINAL_URI, uri.toString());
-        // Need to raise foreground in-call UI as soon as possible while allowing 3rd party app
-        // to intercept the outgoing call.
-        broadcastIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        if (DBG) Log.v(TAG, " - Broadcasting intent: " + broadcastIntent + ".");
-
-        // Set a timer so that we can prepare for unexpected delay introduced by the broadcast.
-        // If it takes too much time, the timer will show "waiting" spinner.
-        // This message will be removed when OutgoingCallReceiver#onReceive() is called before the
-        // timeout.
-        mHandler.sendEmptyMessageDelayed(EVENT_OUTGOING_CALL_TIMEOUT,
-                OUTGOING_CALL_TIMEOUT_THRESHOLD);
-        sendOrderedBroadcastAsUser(broadcastIntent, UserHandle.SYSTEM,
-                android.Manifest.permission.PROCESS_OUTGOING_CALLS,
-                AppOpsManager.OP_PROCESS_OUTGOING_CALLS,
-                new OutgoingCallReceiver(),
-                null,  // scheduler
-                Activity.RESULT_OK,  // initialCode
-                number,  // initialData: initial value for the result data
-                null);  // initialExtras
-    }
-
-    @Override
-    protected void onStop() {
-        // Clean up (and dismiss if necessary) any managed dialogs.
-        //
-        // We don't do this in onPause() since we can be paused/resumed
-        // due to orientation changes (in which case we don't want to
-        // disturb the dialog), but we *do* need it here in onStop() to be
-        // sure we clean up if the user hits HOME while the dialog is up.
-        //
-        // Note it's safe to call removeDialog() even if there's no dialog
-        // associated with that ID.
-        removeDialog(DIALOG_NOT_VOICE_CAPABLE);
-
-        super.onStop();
-    }
-
-    /**
-     * Handle the specified CALL or CALL_* intent on a non-voice-capable
-     * device.
-     *
-     * This method may launch a different intent (if there's some useful
-     * alternative action to take), or otherwise display an error dialog,
-     * and in either case will finish() the current activity when done.
-     */
-    private void handleNonVoiceCapable(Intent intent) {
-        if (DBG) Log.v(TAG, "handleNonVoiceCapable: handling " + intent
-                       + " on non-voice-capable device...");
-
-        // Just show a generic "voice calling not supported" dialog.
-        showDialog(DIALOG_NOT_VOICE_CAPABLE);
-        // ...and we'll eventually finish() when the user dismisses
-        // or cancels the dialog.
-    }
-
-    @Override
-    protected Dialog onCreateDialog(int id) {
-        Dialog dialog;
-        switch(id) {
-            case DIALOG_NOT_VOICE_CAPABLE:
-                dialog = new AlertDialog.Builder(this)
-                        .setTitle(R.string.not_voice_capable)
-                        .setIconAttribute(android.R.attr.alertDialogIcon)
-                        .setPositiveButton(android.R.string.ok, this)
-                        .setOnCancelListener(this)
-                        .create();
-                break;
-            default:
-                Log.w(TAG, "onCreateDialog: unexpected ID " + id);
-                dialog = null;
-                break;
-        }
-        return dialog;
-    }
-
-    /** DialogInterface.OnClickListener implementation */
-    @Override
-    public void onClick(DialogInterface dialog, int id) {
-        // DIALOG_NOT_VOICE_CAPABLE is the only dialog we ever use (so far
-        // at least), and its only button is "OK".
-        finish();
-    }
-
-    /** DialogInterface.OnCancelListener implementation */
-    @Override
-    public void onCancel(DialogInterface dialog) {
-        // DIALOG_NOT_VOICE_CAPABLE is the only dialog we ever use (so far
-        // at least), and canceling it is just like hitting "OK".
-        finish();
-    }
-
-    /**
-     * Implement onConfigurationChanged() purely for debugging purposes,
-     * to make sure that the android:configChanges element in our manifest
-     * is working properly.
-     */
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        if (DBG) Log.v(TAG, "onConfigurationChanged: newConfig = " + newConfig);
-    }
-}
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 16c6bf7..da45900 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -135,9 +135,6 @@
 
     private static PhoneGlobals sMe;
 
-    // A few important fields we expose to the rest of the package
-    // directly (rather than thru set/get methods) for efficiency.
-    CallController callController;
     CallManager mCM;
     CallNotifier notifier;
     CallerInfoCache callerInfoCache;
@@ -329,11 +326,6 @@
 
             callGatewayManager = CallGatewayManager.getInstance();
 
-            // Create the CallController singleton, which is the interface
-            // to the telephony layer for user-initiated telephony functionality
-            // (like making outgoing calls.)
-            callController = CallController.init(this, callLogger, callGatewayManager);
-
             // Create the CallerInfoCache singleton, which remembers custom ring tone and
             // send-to-voicemail settings.
             //
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index c1af461..3fcd6ee 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -74,6 +74,7 @@
 import android.telephony.ims.aidl.IImsMmTelFeature;
 import android.telephony.ims.aidl.IImsRcsFeature;
 import android.telephony.ims.aidl.IImsRegistration;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.EventLog;
@@ -3297,22 +3298,13 @@
         }
     }
 
-    /*
-     * {@hide}
-     * Returns the IMS Registration Status
-     */
-    @Override
-    public boolean isImsRegistered() {
-        return mPhone.isImsRegistered();
-    }
-
     /**
      * {@hide}
      * Returns the IMS Registration Status on a particular subid
      *
      * @param subId
      */
-    public boolean isImsRegisteredForSubscriber(int subId) {
+    public boolean isImsRegistered(int subId) {
         Phone phone = getPhone(subId);
         if (phone != null) {
             return phone.isImsRegistered();
@@ -3326,27 +3318,53 @@
         return PhoneUtils.getSubIdForPhoneAccount(phoneAccount);
     }
 
-    /*
-     * {@hide}
-     * Returns the IMS Registration Status
+    /**
+     * @return the VoWiFi calling availability.
      */
-    public boolean isWifiCallingAvailable() {
-        return mPhone.isWifiCallingEnabled();
+    public boolean isWifiCallingAvailable(int subId) {
+        Phone phone = getPhone(subId);
+        if (phone != null) {
+            return phone.isWifiCallingEnabled();
+        } else {
+            return false;
+        }
     }
 
-    /*
-     * {@hide}
-     * Returns the IMS Registration Status
+    /**
+     * @return the VoLTE availability.
      */
-    public boolean isVolteAvailable() {
-        return mPhone.isVolteEnabled();
+    public boolean isVolteAvailable(int subId) {
+        Phone phone = getPhone(subId);
+        if (phone != null) {
+            return phone.isVolteEnabled();
+        } else {
+            return false;
+        }
     }
 
-    /*
-     * {@hide} Returns the IMS Registration Status
+    /**
+     * @return the VT calling availability.
      */
-    public boolean isVideoTelephonyAvailable() {
-        return mPhone.isVideoEnabled();
+    public boolean isVideoTelephonyAvailable(int subId) {
+        Phone phone = getPhone(subId);
+        if (phone != null) {
+            return phone.isVideoEnabled();
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * @return the IMS registration technology for the MMTEL feature. Valid return values are
+     * defined in {@link ImsRegistrationImplBase}.
+     */
+    public @ImsRegistrationImplBase.ImsRegistrationTech int getImsRegTechnologyForMmTel(int subId) {
+        Phone phone = getPhone(subId);
+        if (phone != null) {
+            return phone.getImsRegistrationTech();
+        } else {
+            return ImsRegistrationImplBase.REGISTRATION_TECH_NONE;
+        }
     }
 
     private boolean canReadPhoneState(String callingPackage, String message) {
diff --git a/src/com/android/phone/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java
index 14640e7..712b8cb 100644
--- a/src/com/android/phone/PhoneUtils.java
+++ b/src/com/android/phone/PhoneUtils.java
@@ -30,13 +30,10 @@
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Message;
-import android.os.PersistableBundle;
 import android.os.RemoteException;
-import android.os.SystemProperties;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.VideoProfile;
-import android.telephony.CarrierConfigManager;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.SubscriptionManager;
 import android.text.TextUtils;
@@ -61,7 +58,6 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.TelephonyCapabilities;
-import com.android.internal.telephony.TelephonyProperties;
 import com.android.internal.telephony.sip.SipPhone;
 import com.android.phone.CallGatewayManager.RawGatewayInfo;
 
@@ -122,9 +118,6 @@
     /** Define for not a special CNAP string */
     private static final int CNAP_SPECIAL_CASE_NO = -1;
 
-    /** Noise suppression status as selected by user */
-    private static boolean sIsNoiseSuppressionEnabled = true;
-
     /**
      * Theme to use for dialogs displayed by utility methods in this class. This is needed
      * because these dialogs are displayed using the application context, which does not resolve
@@ -1117,54 +1110,6 @@
     }
 
     /**
-     * Given an Intent (which is presumably the ACTION_CALL intent that
-     * initiated this outgoing call), figure out the actual phone number we
-     * should dial.
-     *
-     * Note that the returned "number" may actually be a SIP address,
-     * if the specified intent contains a sip: URI.
-     *
-     * This method is basically a wrapper around PhoneUtils.getNumberFromIntent(),
-     * except it's also aware of the EXTRA_ACTUAL_NUMBER_TO_DIAL extra.
-     * (That extra, if present, tells us the exact string to pass down to the
-     * telephony layer.  It's guaranteed to be safe to dial: it's either a PSTN
-     * phone number with separators and keypad letters stripped out, or a raw
-     * unencoded SIP address.)
-     *
-     * @return the phone number corresponding to the specified Intent, or null
-     *   if the Intent has no action or if the intent's data is malformed or
-     *   missing.
-     *
-     * @throws VoiceMailNumberMissingException if the intent
-     *   contains a "voicemail" URI, but there's no voicemail
-     *   number configured on the device.
-     */
-    public static String getInitialNumber(Intent intent)
-            throws PhoneUtils.VoiceMailNumberMissingException {
-        if (DBG) log("getInitialNumber(): " + intent);
-
-        String action = intent.getAction();
-        if (TextUtils.isEmpty(action)) {
-            return null;
-        }
-
-        // If the EXTRA_ACTUAL_NUMBER_TO_DIAL extra is present, get the phone
-        // number from there.  (That extra takes precedence over the actual data
-        // included in the intent.)
-        if (intent.hasExtra(OutgoingCallBroadcaster.EXTRA_ACTUAL_NUMBER_TO_DIAL)) {
-            String actualNumberToDial =
-                    intent.getStringExtra(OutgoingCallBroadcaster.EXTRA_ACTUAL_NUMBER_TO_DIAL);
-            if (DBG) {
-                log("==> got EXTRA_ACTUAL_NUMBER_TO_DIAL; returning '"
-                        + toLogSafePhoneNumber(actualNumberToDial) + "'");
-            }
-            return actualNumberToDial;
-        }
-
-        return getNumberFromIntent(PhoneGlobals.getInstance(), intent);
-    }
-
-    /**
      * Gets the phone number to be called from an intent.  Requires a Context
      * to access the contacts database, and a Phone to access the voicemail
      * number.
@@ -1796,62 +1741,6 @@
         return audioManager.isSpeakerphoneOn();
     }
 
-
-    static void turnOnNoiseSuppression(Context context, boolean flag, boolean store) {
-        if (DBG) log("turnOnNoiseSuppression: " + flag);
-        AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-
-        PersistableBundle b = PhoneGlobals.getInstance().getCarrierConfig();
-        if (!b.getBoolean(CarrierConfigManager.KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL)) {
-            return;
-        }
-
-        if (flag) {
-            audioManager.setParameters("noise_suppression=auto");
-        } else {
-            audioManager.setParameters("noise_suppression=off");
-        }
-
-        // record the speaker-enable value
-        if (store) {
-            sIsNoiseSuppressionEnabled = flag;
-        }
-
-        // TODO: implement and manage ICON
-
-    }
-
-    static void restoreNoiseSuppression(Context context) {
-        if (DBG) log("restoreNoiseSuppression, restoring to: " + sIsNoiseSuppressionEnabled);
-
-        PersistableBundle b = PhoneGlobals.getInstance().getCarrierConfig();
-        if (!b.getBoolean(CarrierConfigManager.KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL)) {
-            return;
-        }
-
-        // change the mode if needed.
-        if (isNoiseSuppressionOn(context) != sIsNoiseSuppressionEnabled) {
-            turnOnNoiseSuppression(context, sIsNoiseSuppressionEnabled, false);
-        }
-    }
-
-    static boolean isNoiseSuppressionOn(Context context) {
-
-        PersistableBundle b = PhoneGlobals.getInstance().getCarrierConfig();
-        if (!b.getBoolean(CarrierConfigManager.KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL)) {
-            return false;
-        }
-
-        AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-        String noiseSuppression = audioManager.getParameters("noise_suppression");
-        if (DBG) log("isNoiseSuppressionOn: " + noiseSuppression);
-        if (noiseSuppression.contains("off")) {
-            return false;
-        } else {
-            return true;
-        }
-    }
-
     static boolean isInEmergencyCall(CallManager cm) {
         Call fgCall = cm.getActiveFgCall();
         // isIdle includes checks for the DISCONNECTING/DISCONNECTED state.
diff --git a/src/com/android/phone/ProcessOutgoingCallTest.java b/src/com/android/phone/ProcessOutgoingCallTest.java
deleted file mode 100644
index c76fb43..0000000
--- a/src/com/android/phone/ProcessOutgoingCallTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 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;
-
-import android.app.SearchManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.util.Log;
-
-/**
- * ProcessOutgoingCallTest tests {@link OutgoingCallBroadcaster} by performing
- * a couple of simple modifications to outgoing calls, and by printing log
- * messages for each call.
- */
-public class ProcessOutgoingCallTest extends BroadcastReceiver {
-    private static final String TAG = "ProcessOutgoingCallTest";
-    private static final String AREACODE = "617";
-
-    private static final boolean LOGV = false;
-
-    private static final boolean REDIRECT_411_TO_GOOG411 = true;
-    private static final boolean SEVEN_DIGIT_DIALING = true;
-    private static final boolean POUND_POUND_SEARCH = true;
-    private static final boolean BLOCK_555 = true;
-
-    public void onReceive(Context context, Intent intent) {
-        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
-            String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
-            if (LOGV) Log.v(TAG, "Received intent " + intent + " (number = " + number + ".");
-            /* Example of how to redirect calls from one number to another. */
-            if (REDIRECT_411_TO_GOOG411 && number.equals("411")) {
-                setResultData("18004664411");
-            }
-
-            /* Example of how to modify the phone number in flight. */
-            if (SEVEN_DIGIT_DIALING && number.length() == 7) {
-                setResultData(AREACODE + number);
-            }
-
-            /* Example of how to route a call to another Application. */
-            if (POUND_POUND_SEARCH && number.startsWith("##")) {
-                Intent newIntent = new Intent(Intent.ACTION_SEARCH);
-                newIntent.putExtra(SearchManager.QUERY, number.substring(2));
-                newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                context.startActivity(newIntent);
-                setResultData(null);
-            }
-
-            /* Example of how to deny calls to a particular number.
-             * Note that no UI is displayed to the user -- the call simply 
-             * does not happen.  It is the application's responaibility to
-             * explain this to the user. */
-            int length = number.length();
-            if (BLOCK_555 && length >= 7) {
-                String exchange = number.substring(length - 7, length - 4);
-                Log.v(TAG, "exchange = " + exchange);
-                if (exchange.equals("555")) {
-                    setResultData(null);
-                }
-            }
-        }
-    }
-}
diff --git a/src/com/android/phone/TimeConsumingPreferenceActivity.java b/src/com/android/phone/TimeConsumingPreferenceActivity.java
index e626a53..354c4bb 100644
--- a/src/com/android/phone/TimeConsumingPreferenceActivity.java
+++ b/src/com/android/phone/TimeConsumingPreferenceActivity.java
@@ -23,7 +23,7 @@
 public class TimeConsumingPreferenceActivity extends PreferenceActivity
                         implements TimeConsumingPreferenceListener,
                         DialogInterface.OnCancelListener {
-    private static final String LOG_TAG = "TimeConsumingPreferenceActivity";
+    private static final String LOG_TAG = "TimeConsumingPrefActivity";
     private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
 
     private class DismissOnClickListener implements DialogInterface.OnClickListener {
@@ -155,8 +155,7 @@
     @Override
     public void onStarted(Preference preference, boolean reading) {
         if (DBG) dumpState();
-        if (DBG) Log.d(LOG_TAG, "onStarted, preference=" + preference.getKey()
-                + ", reading=" + reading);
+        Log.i(LOG_TAG, "onStarted, preference=" + preference.getKey() + ", reading=" + reading);
         mBusyList.add(preference.getKey());
 
         if (mIsForeground) {
@@ -172,8 +171,7 @@
     @Override
     public void onFinished(Preference preference, boolean reading) {
         if (DBG) dumpState();
-        if (DBG) Log.d(LOG_TAG, "onFinished, preference=" + preference.getKey()
-                + ", reading=" + reading);
+        Log.i(LOG_TAG, "onFinished, preference=" + preference.getKey() + ", reading=" + reading);
         mBusyList.remove(preference.getKey());
 
         if (mBusyList.isEmpty()) {
@@ -189,7 +187,7 @@
     @Override
     public void onError(Preference preference, int error) {
         if (DBG) dumpState();
-        if (DBG) Log.d(LOG_TAG, "onError, preference=" + preference.getKey() + ", error=" + error);
+        Log.i(LOG_TAG, "onError, preference=" + preference.getKey() + ", error=" + error);
 
         if (mIsForeground) {
             showDialog(error);
diff --git a/src/com/android/phone/settings/AccessibilitySettingsFragment.java b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
index 7ede23a..8ec747c 100644
--- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java
+++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
@@ -106,9 +106,7 @@
             // TODO: this is going to be a on/off switch for now. Ask UX about how to integrate
             // this settings with TTY
             boolean rttOn = Settings.System.getInt(
-                    mContext.getContentResolver(), Settings.System.RTT_CALLING_MODE,
-                    TelecomManager.TTY_MODE_OFF)
-                    != TelecomManager.TTY_MODE_OFF;
+                    mContext.getContentResolver(), Settings.System.RTT_CALLING_MODE, 0) != 0;
             mButtonRtt.setChecked(rttOn);
         } else {
             getPreferenceScreen().removePreference(mButtonRtt);
@@ -149,8 +147,7 @@
             return true;
         } else if (preference == mButtonRtt) {
             Log.i(LOG_TAG, "RTT setting changed -- now " + mButtonRtt.isChecked());
-            int rttMode = mButtonRtt.isChecked()
-                    ? TelecomManager.TTY_MODE_FULL : TelecomManager.TTY_MODE_OFF;
+            int rttMode = mButtonRtt.isChecked() ? 1 : 0;
             Settings.System.putInt(mContext.getContentResolver(), Settings.System.RTT_CALLING_MODE,
                     rttMode);
             // Update RTT config with IMS Manager
diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java
index 72184c4..c62a7f1 100644
--- a/src/com/android/services/telephony/ImsConference.java
+++ b/src/com/android/services/telephony/ImsConference.java
@@ -273,10 +273,10 @@
         long connectTime = conferenceHost.getOriginalConnection().getConnectTime();
         long connectElapsedTime = conferenceHost.getOriginalConnection().getConnectTimeReal();
         setConnectionTime(connectTime);
-        setConnectionElapsedTime(connectElapsedTime);
+        setConnectionStartElapsedRealTime(connectElapsedTime);
         // Set the connectTime in the connection as well.
         conferenceHost.setConnectTimeMillis(connectTime);
-        conferenceHost.setConnectElapsedTimeMillis(connectElapsedTime);
+        conferenceHost.setConnectionStartElapsedRealTime(connectElapsedTime);
 
         mTelephonyConnectionService = telephonyConnectionService;
         setConferenceHost(conferenceHost);
diff --git a/src/com/android/services/telephony/PstnIncomingCallNotifier.java b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
index e007bb4..4dfaf44 100644
--- a/src/com/android/services/telephony/PstnIncomingCallNotifier.java
+++ b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
@@ -36,6 +36,7 @@
 import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
 import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
 import com.android.internal.telephony.imsphone.ImsExternalConnection;
+import com.android.internal.telephony.imsphone.ImsPhoneConnection;
 import com.android.phone.PhoneUtils;
 
 import com.google.common.base.Preconditions;
@@ -243,6 +244,11 @@
         extras.putLong(TelecomManager.EXTRA_CALL_CREATED_TIME_MILLIS,
                 SystemClock.elapsedRealtime());
 
+        if (connection.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) {
+            if (((ImsPhoneConnection) connection).isRttEnabledForCall()) {
+                extras.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_RTT, true);
+            }
+        }
         PhoneAccountHandle handle = findCorrectPhoneAccountHandle();
         if (handle == null) {
             try {
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 9ed7689..a7bd2f2 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -22,6 +22,7 @@
 import android.os.AsyncResult;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.os.PersistableBundle;
 import android.telecom.CallAudioState;
@@ -96,7 +97,7 @@
     private static final int MSG_CDMA_VOICE_PRIVACY_OFF = 16;
     private static final int MSG_HANGUP = 17;
 
-    private final Handler mHandler = new Handler() {
+    private final Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
@@ -170,10 +171,7 @@
                                         new ArrayList(Arrays.asList(mSsNotification.history)));
                                 putExtras(lastForwardedNumber);
                             }
-                            if (mSsNotification.code
-                                    == SuppServiceNotification.MO_CODE_CALL_FORWARDED) {
-                                sendConnectionEvent(TelephonyManager.EVENT_CALL_FORWARDED, null);
-                            }
+                            handleSuppServiceNotification(mSsNotification);
                         }
                     }
                     break;
@@ -256,6 +254,115 @@
     };
 
     /**
+     * Handles {@link SuppServiceNotification}s pertinent to Telephony.
+     * @param ssn the notification.
+     */
+    private void handleSuppServiceNotification(SuppServiceNotification ssn) {
+        Log.i(this, "handleSuppServiceNotification: type=%d, code=%d", ssn.notificationType,
+                ssn.code);
+        if (ssn.notificationType == SuppServiceNotification.NOTIFICATION_TYPE_CODE_1
+                && ssn.code == SuppServiceNotification.CODE_1_CALL_FORWARDED) {
+            sendConnectionEvent(TelephonyManager.EVENT_CALL_FORWARDED, null);
+        }
+        sendSuppServiceNotificationEvent(ssn.notificationType, ssn.code);
+    }
+
+    /**
+     * Sends a supplementary service notification connection event.
+     * This connection event includes the type and code, as well as a human readable message which
+     * is suitable for display to the user if the UI chooses to do so.
+     * @param type the {@link SuppServiceNotification#type}.
+     * @param code the {@link SuppServiceNotification#code}.
+     */
+    private void sendSuppServiceNotificationEvent(int type, int code) {
+        Bundle extras = new Bundle();
+        extras.putInt(TelephonyManager.EXTRA_NOTIFICATION_TYPE, type);
+        extras.putInt(TelephonyManager.EXTRA_NOTIFICATION_CODE, code);
+        extras.putCharSequence(TelephonyManager.EXTRA_NOTIFICATION_MESSAGE,
+                getSuppServiceMessage(type, code));
+        sendConnectionEvent(TelephonyManager.EVENT_SUPPLEMENTARY_SERVICE_NOTIFICATION, extras);
+    }
+
+    /**
+     * Retrieves a human-readable message for a supplementary service notification.
+     * This message is suitable for display to the user.
+     * @param type the code group.
+     * @param code the code.
+     * @return A {@link CharSequence} containing the message, or {@code null} if none defined.
+     */
+    private CharSequence getSuppServiceMessage(int type, int code) {
+        int messageId = -1;
+        if (type == SuppServiceNotification.NOTIFICATION_TYPE_CODE_1) {
+            switch (code) {
+                case SuppServiceNotification.CODE_1_CALL_DEFLECTED:
+                    messageId = R.string.supp_service_notification_call_deflected;
+                    break;
+                case SuppServiceNotification.CODE_1_CALL_FORWARDED:
+                    messageId = R.string.supp_service_notification_call_forwarded;
+                    break;
+                case SuppServiceNotification.CODE_1_CALL_IS_WAITING:
+                    messageId = R.string.supp_service_notification_call_waiting;
+                    break;
+                case SuppServiceNotification.CODE_1_CLIR_SUPPRESSION_REJECTED:
+                    messageId = R.string.supp_service_clir_suppression_rejected;
+                    break;
+                case SuppServiceNotification.CODE_1_CUG_CALL:
+                    messageId = R.string.supp_service_closed_user_group_call;
+                    break;
+                case SuppServiceNotification.CODE_1_INCOMING_CALLS_BARRED:
+                    messageId = R.string.supp_service_incoming_calls_barred;
+                    break;
+                case SuppServiceNotification.CODE_1_OUTGOING_CALLS_BARRED:
+                    messageId = R.string.supp_service_outgoing_calls_barred;
+                    break;
+                case SuppServiceNotification.CODE_1_SOME_CF_ACTIVE:
+                    // Intentional fall through.
+                case SuppServiceNotification.CODE_1_UNCONDITIONAL_CF_ACTIVE:
+                    messageId = R.string.supp_service_call_forwarding_active;
+                    break;
+            }
+        } else if (type == SuppServiceNotification.NOTIFICATION_TYPE_CODE_2) {
+            switch (code) {
+                case SuppServiceNotification.CODE_2_ADDITIONAL_CALL_FORWARDED:
+                    messageId = R.string.supp_service_additional_call_forwarded;
+                    break;
+                case SuppServiceNotification.CODE_2_CALL_CONNECTED_ECT:
+                    messageId = R.string.supp_service_additional_ect_connected;
+                    break;
+                case SuppServiceNotification.CODE_2_CALL_CONNECTING_ECT:
+                    messageId = R.string.supp_service_additional_ect_connecting;
+                    break;
+                case SuppServiceNotification.CODE_2_CALL_ON_HOLD:
+                    messageId = R.string.supp_service_call_on_hold;
+                    break;
+                case SuppServiceNotification.CODE_2_CALL_RETRIEVED:
+                    messageId = R.string.supp_service_call_resumed;
+                    break;
+                case SuppServiceNotification.CODE_2_CUG_CALL:
+                    messageId = R.string.supp_service_closed_user_group_call;
+                    break;
+                case SuppServiceNotification.CODE_2_DEFLECTED_CALL:
+                    messageId = R.string.supp_service_deflected_call;
+                    break;
+                case SuppServiceNotification.CODE_2_FORWARDED_CALL:
+                    messageId = R.string.supp_service_forwarded_call;
+                    break;
+                case SuppServiceNotification.CODE_2_MULTI_PARTY_CALL:
+                    messageId = R.string.supp_service_conference_call;
+                    break;
+                case SuppServiceNotification.CODE_2_ON_HOLD_CALL_RELEASED:
+                    messageId = R.string.supp_service_held_call_released;
+                    break;
+            }
+        }
+        if (messageId != -1 && getPhone() != null && getPhone().getContext() != null) {
+            return getPhone().getContext().getText(messageId);
+        } else {
+            return null;
+        }
+    }
+
+    /**
      * @return {@code true} if carrier video conferencing is supported, {@code false} otherwise.
      */
     public boolean isCarrierVideoConferencingSupported() {
@@ -439,6 +546,7 @@
 
         @Override
         public void onRttModifyResponseReceived(int status) {
+            updateConnectionProperties();
             if (status == RttModifyStatus.SESSION_MODIFY_REQUEST_SUCCESS) {
                 sendRttInitiationSuccess();
             } else {
@@ -448,17 +556,20 @@
 
         @Override
         public void onDisconnect(int cause) {
-            Log.i(this, "onDisconnect: cause=%s", DisconnectCause.toString(cause));
-            mHandler.obtainMessage(MSG_DISCONNECT);
+            Log.i(this, "onDisconnect: callId=%s, cause=%s", getTelecomCallId(),
+                    DisconnectCause.toString(cause));
+            mHandler.obtainMessage(MSG_DISCONNECT).sendToTarget();
         }
 
         @Override
         public void onRttInitiated() {
+            updateConnectionProperties();
             sendRttInitiationSuccess();
         }
 
         @Override
         public void onRttTerminated() {
+            updateConnectionProperties();
             sendRttSessionRemotelyTerminated();
         }
     };
@@ -744,7 +855,7 @@
 
     @Override
     public void onStopRtt() {
-        // This is not supported by carriers/vendor yet. No-op for now.
+        Log.i(this, "Stopping RTT currently not supported. Doing nothing.");
     }
 
     @Override
@@ -905,8 +1016,7 @@
                 mIsCdmaVoicePrivacyEnabled);
         newProperties = changeBitmask(newProperties, PROPERTY_ASSISTED_DIALING_USED,
                 mIsUsingAssistedDialing);
-        newProperties = changeBitmask(newProperties, PROPERTY_IS_RTT,
-                (getConnectionProperties() & PROPERTY_IS_RTT) != 0);
+        newProperties = changeBitmask(newProperties, PROPERTY_IS_RTT, isRtt());
 
         if (getConnectionProperties() != newProperties) {
             setConnectionProperties(newProperties);
@@ -1591,6 +1701,15 @@
     }
 
     /**
+     * Determines if the current connection has RTT enabled.
+     */
+    private boolean isRtt() {
+        return mOriginalConnection != null
+                && mOriginalConnection.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS
+                && ((ImsPhoneConnection) mOriginalConnection).isRttEnabledForCall();
+    }
+
+    /**
      * Determines if the current connection is pullable.
      *
      * A connection is deemed to be pullable if the original connection capabilities state that it
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index e2f596f..aa2c345 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -53,6 +53,7 @@
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
 import com.android.internal.telephony.imsphone.ImsPhone;
+import com.android.internal.telephony.imsphone.ImsPhoneConnection;
 import com.android.phone.MMIDialogActivity;
 import com.android.phone.PhoneUtils;
 import com.android.phone.R;
@@ -765,10 +766,11 @@
         int videoState = originalConnection != null ? originalConnection.getVideoState() :
                 VideoProfile.STATE_AUDIO_ONLY;
 
-        Connection connection =
+        TelephonyConnection connection =
                 createConnectionFor(phone, originalConnection, false /* isOutgoing */,
                         request.getAccountHandle(), request.getTelecomCallId(),
                         request.getAddress(), videoState);
+        handleIncomingRtt(request, originalConnection);
         if (connection == null) {
             return Connection.createCanceledConnection();
         } else {
@@ -776,6 +778,36 @@
         }
     }
 
+    private void handleIncomingRtt(ConnectionRequest request,
+            com.android.internal.telephony.Connection originalConnection) {
+        if (originalConnection == null
+                || originalConnection.getPhoneType() != PhoneConstants.PHONE_TYPE_IMS) {
+            if (request.isRequestingRtt()) {
+                Log.w(this, "Requesting RTT on non-IMS call, ignoring");
+            }
+            return;
+        }
+
+        ImsPhoneConnection imsOriginalConnection = (ImsPhoneConnection) originalConnection;
+        if (!request.isRequestingRtt()) {
+            if (imsOriginalConnection.isRttEnabledForCall()) {
+                Log.i(this, "Incoming call requested RTT but was declined");
+            }
+            return;
+        }
+
+        if (!imsOriginalConnection.isRttEnabledForCall()) {
+            if (request.isRequestingRtt()) {
+                Log.w(this, "Incoming call processed as RTT but did not come in as one. Ignoring");
+            }
+            return;
+        }
+
+        Log.i(this, "Setting RTT stream on ImsPhoneConnection");
+        imsOriginalConnection.setCurrentRttTextStream(request.getRttTextStream());
+        imsOriginalConnection.getImsCall().setAnswerWithRtt();
+    }
+
     /**
      * Called by the {@link ConnectionService} when a newly created {@link Connection} has been
      * added to the {@link ConnectionService} and sent to Telecom.  Here it is safe to send
diff --git a/tests/robotests/src/com/android/phone/TelephonyRobolectricTestRunner.java b/tests/robotests/src/com/android/phone/TelephonyRobolectricTestRunner.java
new file mode 100644
index 0000000..a66c79f
--- /dev/null
+++ b/tests/robotests/src/com/android/phone/TelephonyRobolectricTestRunner.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2018 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;
+
+import android.annotation.NonNull;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.junit.runners.model.InitializationError;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.manifest.AndroidManifest;
+import org.robolectric.res.Fs;
+import org.robolectric.res.ResourcePath;
+
+import java.util.List;
+
+public class TelephonyRobolectricTestRunner extends RobolectricTestRunner {
+
+  public TelephonyRobolectricTestRunner(Class<?> testClass) throws InitializationError {
+    super(testClass);
+  }
+
+  /**
+   * We are going to create our own custom manifest so we can add multiple resource paths to it.
+   */
+  @Override
+  protected AndroidManifest getAppManifest(Config config) {
+    try {
+      // Using the manifest file's relative path, we can figure out the application directory.
+      final URL appRoot = new URL("file:packages/services/Telephony/");
+      final URL manifestPath = new URL(appRoot, "AndroidManifest.xml");
+      final URL resDir = new URL(appRoot, "res");
+      final URL assetsDir = new URL(appRoot, "assets");
+
+      // By adding any resources from libraries we need to the AndroidManifest, we can access
+      // them from within the parallel universe's resource loader.
+      return new AndroidManifest(Fs.fromURL(manifestPath), Fs.fromURL(resDir),
+          Fs.fromURL(assetsDir), "com.android.phone") {
+        @Override
+        public List<ResourcePath> getIncludedResourcePaths() {
+          final List<ResourcePath> paths = super.getIncludedResourcePaths();
+          paths.add(resourcePath(appRoot, "src/com/android/phone/assisteddialing/res"));
+          paths.add(resourcePath(appRoot, "src/com/android/phone/settings/assisteddialing/res"));
+          return paths;
+        }
+      };
+    } catch (MalformedURLException e) {
+      throw new RuntimeException("TelephonyRobolectricTestRunner failure", e);
+    }
+  }
+
+  private static ResourcePath resourcePath(@NonNull URL appRoot, @NonNull String spec) {
+    try {
+      return new ResourcePath(null, Fs.fromURL(new URL(appRoot, spec)), null);
+    } catch (MalformedURLException e) {
+      throw new RuntimeException("TelephonyRobolectricTestRunner failure", e);
+    }
+  }
+}
diff --git a/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingMediatorImplTest.java b/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingMediatorImplTest.java
new file mode 100644
index 0000000..3d4d0e8
--- /dev/null
+++ b/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingMediatorImplTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2018 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 static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.telephony.TelephonyManager;
+
+import com.android.phone.TelephonyRobolectricTestRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowTelephonyManager;
+
+import java.util.Optional;
+
+/**
+ * Unit Tests for AssistedDialingMediator.
+ */
+@RunWith(TelephonyRobolectricTestRunner.class)
+public class AssistedDialingMediatorImplTest {
+
+  private final Context mContext = RuntimeEnvironment.application;
+  private final TelephonyManager mTelephonyManager =
+      (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+  private final ShadowTelephonyManager mShadowTelephonyManager =
+      Shadows.shadowOf(mTelephonyManager);
+  private final LocationDetector mLocationDetector = new LocationDetector(
+      mTelephonyManager, null);
+  private final CountryCodeProvider mCountryCodeProvider = new CountryCodeProvider();
+  private final Constraints mConstraints = new Constraints(mContext, mCountryCodeProvider);
+  private final NumberTransformer mNumberTransformer = new NumberTransformer(mConstraints);
+  private final AssistedDialingMediator mAssistedDialingMediator =
+      new AssistedDialingMediatorImpl(mLocationDetector, mNumberTransformer);
+
+  @Test(expected = NullPointerException.class)
+  public void testConstructorThrows_allParametersNull() {
+    new AssistedDialingMediatorImpl(null, null);
+  }
+
+  @Test(expected = NullPointerException.class)
+  public void testConstructorThrows_locationDetectorNull() {
+    new AssistedDialingMediatorImpl(null, mNumberTransformer);
+  }
+
+  @Test(expected = NullPointerException.class)
+  public void testConstructorThrows_numberTransformerNull() {
+    new AssistedDialingMediatorImpl(mLocationDetector, null);
+  }
+
+  @Test
+  public void testAttemptAssistedDial() {
+    // User home country
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+    // User roaming country
+    mShadowTelephonyManager.setNetworkCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+
+    assertThat(
+        mAssistedDialingMediator
+            .attemptAssistedDial(AssistedDialingTestHelper.TEST_NUMBER_UNITED_STATES)
+            .get()
+            .getTransformedNumber())
+        .isEqualTo(AssistedDialingTestHelper.EXPECTED_FROM_UK_TO_US_DIALABLE_NUMBER);
+  }
+
+  @Test
+  public void attemptAssistedDial_nullNumber() {
+    // User home country
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+    // User roaming country
+    mShadowTelephonyManager.setNetworkCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+    assertThat(mAssistedDialingMediator.attemptAssistedDial(null)).isEqualTo(Optional.empty());
+  }
+
+  @Test
+  public void attemptAssistedDial_missingOneCountryCode() {
+    // User home country
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+    // User roaming country
+    mShadowTelephonyManager.setNetworkCountryIso(null);
+    assertThat(
+        mAssistedDialingMediator.attemptAssistedDial(
+            AssistedDialingTestHelper.TEST_NUMBER_UNITED_STATES))
+        .isEqualTo(Optional.empty());
+  }
+
+  @Test
+  public void testIsPlatformEligible() {
+    assertThat(mAssistedDialingMediator.isPlatformEligible()).isTrue();
+  }
+
+  @Test
+  public void testUserHomeCountryCode() {
+    // User home country
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+    assertThat(mAssistedDialingMediator.userHomeCountryCode().get())
+        .isEqualTo(AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+  }
+}
diff --git a/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingMediatorStubTest.java b/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingMediatorStubTest.java
index 225776f..cc3ee79 100755
--- a/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingMediatorStubTest.java
+++ b/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingMediatorStubTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -21,11 +21,12 @@
 import android.content.Context;
 import android.telephony.TelephonyManager;
 
+import com.android.phone.TelephonyRobolectricTestRunner;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadow.api.Shadow;
+import org.robolectric.Shadows;
 import org.robolectric.shadows.ShadowTelephonyManager;
 
 import java.util.Optional;
@@ -33,39 +34,38 @@
 /**
  * Unit Tests for AssistedDialingMediator.
  */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(TelephonyRobolectricTestRunner.class)
 public class AssistedDialingMediatorStubTest {
 
-    private final TelephonyManager mTelephonyManager =
-            (TelephonyManager) RuntimeEnvironment.application.getSystemService(
-                    Context.TELEPHONY_SERVICE);
-    private final ShadowTelephonyManager mShadowTelephonyManager =
-            (ShadowTelephonyManager) Shadow.extract(mTelephonyManager);
-    private final AssistedDialingMediatorStub mAssistedDialingMediatorStub =
-            new AssistedDialingMediatorStub();
+  private final TelephonyManager mTelephonyManager =
+      (TelephonyManager) RuntimeEnvironment.application.getSystemService(Context.TELEPHONY_SERVICE);
+  private final ShadowTelephonyManager mShadowTelephonyManager =
+      Shadows.shadowOf(mTelephonyManager);
+  private final AssistedDialingMediatorStub mAssistedDialingMediatorStub =
+      new AssistedDialingMediatorStub();
 
-    @Test
-    public void testAttemptAssistedDial_conditionsEligibleButStubInert() {
-        // User home country
-        mShadowTelephonyManager.setSimCountryIso(
-                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
-        // User roaming country
-        mShadowTelephonyManager.setNetworkCountryIso(
-                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
-        assertThat(
-                mAssistedDialingMediatorStub.attemptAssistedDial(
-                        AssistedDialingTestHelper.TEST_NUMBER_UNITED_STATES))
-                .isEqualTo(Optional.empty());
-    }
+  @Test
+  public void testAttemptAssistedDial_conditionsEligibleButStubInert() {
+    // User home country
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+    // User roaming country
+    mShadowTelephonyManager.setNetworkCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+    assertThat(
+        mAssistedDialingMediatorStub.attemptAssistedDial(
+            AssistedDialingTestHelper.TEST_NUMBER_UNITED_STATES))
+        .isEqualTo(Optional.empty());
+  }
 
-    @Test
-    public void testIsPlatformEligible() {
-        assertThat(mAssistedDialingMediatorStub.isPlatformEligible()).isFalse();
-    }
+  @Test
+  public void testIsPlatformEligible() {
+    assertThat(mAssistedDialingMediatorStub.isPlatformEligible()).isFalse();
+  }
 
-    @Test
-    public void testUserHomeCountryCode() {
-        assertThat(mAssistedDialingMediatorStub.userHomeCountryCode())
-                .isInstanceOf(Optional.empty().getClass());
-    }
+  @Test
+  public void testUserHomeCountryCode() {
+    assertThat(mAssistedDialingMediatorStub.userHomeCountryCode())
+        .isInstanceOf(Optional.empty().getClass());
+  }
 }
diff --git a/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingSettingFragmentTest.java b/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingSettingFragmentTest.java
new file mode 100644
index 0000000..112cbe7
--- /dev/null
+++ b/tests/robotests/src/com/android/phone/assisteddialing/AssistedDialingSettingFragmentTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2018 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 static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.preference.ListPreference;
+import android.preference.SwitchPreference;
+import android.telephony.TelephonyManager;
+
+import com.android.phone.TelephonyRobolectricTestRunner;
+import com.android.phone.settings.assisteddialing.AssistedDialingSettingFragment;
+import com.android.phone.settings.assisteddialing.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.android.controller.FragmentController;
+import org.robolectric.shadows.ShadowTelephonyManager;
+
+/**
+ * Unit Tests for AssistedDialingSettingFragmentTest.
+ */
+@RunWith(TelephonyRobolectricTestRunner.class)
+public class AssistedDialingSettingFragmentTest {
+
+  private final Context mContext = RuntimeEnvironment.application;
+  private final TelephonyManager mTelephonyManager =
+      (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+  private final ShadowTelephonyManager mShadowTelephonyManager =
+      Shadows.shadowOf(mTelephonyManager);
+  private FragmentController<AssistedDialingSettingFragment> mFragment;
+
+  @Before
+  public void setupTest() {
+    mFragment =
+        Robolectric.buildFragment(AssistedDialingSettingFragment.class)
+            .create()
+            .start()
+            .resume()
+            .visible();
+  }
+
+  @Test
+  public void testPrefOnByDefault() {
+    final String key = mContext.getString(R.string.assisted_dialing_setting_toggle_key);
+    final SwitchPreference pref = (SwitchPreference) mFragment.get().findPreference(key);
+    assertThat(pref.isChecked()).isTrue();
+  }
+
+  @Test
+  public void testPrefOff_ConcreteCreatorYieldsStub() {
+    final String key = mContext.getString(R.string.assisted_dialing_setting_toggle_key);
+    final SwitchPreference pref = (SwitchPreference) mFragment.get().findPreference(key);
+    pref.setChecked(false);
+    assertThat(pref.isChecked()).isFalse();
+    assertThat(ConcreteCreator.createNewAssistedDialingMediator(mTelephonyManager, mContext))
+        .isInstanceOf(AssistedDialingMediatorStub.class);
+  }
+
+  @Test
+  public void testPrefOn_ConcreteCreatorYieldsImpl() {
+    final String key = mContext.getString(R.string.assisted_dialing_setting_toggle_key);
+    final SwitchPreference pref = (SwitchPreference) mFragment.get().findPreference(key);
+    pref.setChecked(true);
+    assertThat(pref.isChecked()).isTrue();
+    assertThat(ConcreteCreator.createNewAssistedDialingMediator(mTelephonyManager, mContext))
+        .isInstanceOf(AssistedDialingMediatorImpl.class);
+  }
+
+  @Test
+  public void testCountryCodePrefKeyAndValueAlwaysOneToOne() {
+    final String key = mContext.getString(R.string.assisted_dialing_setting_cc_key);
+    final ListPreference pref = (ListPreference) mFragment.get().findPreference(key);
+    assertThat(pref.getEntries().length).isEqualTo(pref.getEntryValues().length);
+  }
+
+  @Test
+  public void testCountryCodePrefDefaultValueIsFirstValue() {
+    final String key = mContext.getString(R.string.assisted_dialing_setting_cc_key);
+    final ListPreference pref = (ListPreference) mFragment.get().findPreference(key);
+    final String fallback =
+        mContext.getString(R.string.assisted_dialing_setting_cc_default_summary_fallback);
+    assertThat(pref.getEntries()[0]).isEqualTo(fallback);
+    assertThat(pref.getEntryValues()[0]).isEqualTo("");
+  }
+
+  @Test
+  public void testAutomaticallyDetectedHomeCountryIsDisplayed() {
+    // User home country
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+    mFragment =
+        Robolectric.buildFragment(AssistedDialingSettingFragment.class)
+            .create()
+            .start()
+            .resume()
+            .visible();
+    final String key = mContext.getString(R.string.assisted_dialing_setting_cc_key);
+    final ListPreference pref = (ListPreference) mFragment.get().findPreference(key);
+    final String usDefault = mContext.getString(
+        R.string.assisted_dialing_setting_cc_default_summary,
+        "United States (+1)");
+    assertThat(pref.getSummary()).isEqualTo(usDefault);
+  }
+}
diff --git a/tests/robotests/src/com/android/phone/assisteddialing/ConcreteCreatorTest.java b/tests/robotests/src/com/android/phone/assisteddialing/ConcreteCreatorTest.java
new file mode 100644
index 0000000..288913b
--- /dev/null
+++ b/tests/robotests/src/com/android/phone/assisteddialing/ConcreteCreatorTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2018 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 static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.os.UserManager;
+import android.preference.PreferenceManager;
+import android.telecom.TransformationInfo;
+import android.telephony.TelephonyManager;
+
+import com.android.phone.TelephonyRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowTelephonyManager;
+import org.robolectric.shadows.ShadowUserManager;
+
+import java.util.Optional;
+
+/**
+ * Unit Tests for ConcreteCreator.
+ */
+@RunWith(TelephonyRobolectricTestRunner.class)
+public class ConcreteCreatorTest {
+
+  private final Context mContext = RuntimeEnvironment.application;
+  private final TelephonyManager mTelephonyManager =
+      (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+  private final ShadowTelephonyManager mShadowTelephonyManager =
+      Shadows.shadowOf(mTelephonyManager);
+  private final ShadowUserManager mShadowUserManager =
+      Shadows.shadowOf(mContext.getSystemService(UserManager.class));
+
+  @Before
+  public void setupTest() {
+    mShadowUserManager.setUserUnlocked(true);
+  }
+
+  @Test
+  public void testCreateNewAssistedDialingMediator() {
+    assertThat(ConcreteCreator.createNewAssistedDialingMediator(mTelephonyManager, mContext))
+        .isInstanceOf(AssistedDialingMediator.class);
+  }
+
+  @Test
+  public void testCreateNewAssistedDialingMediator_userDisabledFeature() {
+    PreferenceManager.getDefaultSharedPreferences(mContext)
+        .edit()
+        .putBoolean(mContext.getString(R.string.assisted_dialing_setting_toggle_key), false)
+        .apply();
+
+    assertThat(ConcreteCreator.createNewAssistedDialingMediator(mTelephonyManager, mContext))
+        .isInstanceOf(AssistedDialingMediatorStub.class);
+  }
+
+  @Test
+  public void testCreateNewAssistedDialingMediator_userSpecifiedCountryTakesPrecedence() {
+    // System thinks user is from the UK
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+    // Set the user to roam in the US
+    mShadowTelephonyManager.setNetworkCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+
+    // User sets preferred home country to Japan
+    PreferenceManager.getDefaultSharedPreferences(mContext)
+        .edit()
+        .putString(
+            mContext.getString(R.string.assisted_dialing_setting_cc_key),
+            AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_JAPAN)
+        .apply();
+
+    AssistedDialingMediator mediator =
+        ConcreteCreator.createNewAssistedDialingMediator(mTelephonyManager, mContext);
+    Optional<TransformationInfo> result =
+        mediator.attemptAssistedDial(AssistedDialingTestHelper.TEST_NUMBER_JAPAN);
+    assertThat(result.get().getUserHomeCountryCode())
+        .isEqualTo(AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_JAPAN);
+    assertThat(result.get().getTransformedNumber())
+        .isEqualTo(AssistedDialingTestHelper.EXPECTED_FROM_US_TO_JP_DIALABLE_NUMBER);
+  }
+
+  @Test
+  public void testCreateNewAssistedDialingMediator_defaultCountryCodeAutoDetected() {
+    // System thinks user is from the UK
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+    // Set the user to roam in the US
+    mShadowTelephonyManager.setNetworkCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+
+    AssistedDialingMediator mediator =
+        ConcreteCreator.createNewAssistedDialingMediator(mTelephonyManager, mContext);
+    Optional<TransformationInfo> result =
+        mediator.attemptAssistedDial(AssistedDialingTestHelper.TEST_NUMBER_UNITED_KINGDOM);
+    assertThat(result.get().getUserHomeCountryCode())
+        .isEqualTo(AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+    assertThat(result.get().getTransformedNumber())
+        .isEqualTo(AssistedDialingTestHelper.EXPECTED_FROM_US_TO_UK_DIALABLE_NUMBER);
+  }
+
+  @Test
+  public void testCreateNewAssistedDialingMediatorWithNullTelephonyManager_returnsStub() {
+    assertThat(ConcreteCreator.createNewAssistedDialingMediator(null, mContext))
+        .isInstanceOf(AssistedDialingMediatorStub.class);
+  }
+
+  @Test
+  public void testCreateNewAssistedDialingMediatorWithNullContext_returnsStub() {
+    assertThat(ConcreteCreator.createNewAssistedDialingMediator(null, mContext))
+        .isInstanceOf(AssistedDialingMediatorStub.class);
+  }
+
+  @Test
+  public void testCreateNewAssistedDialingMediator_deviceLockedDisablesFeature() {
+    mShadowUserManager.setUserUnlocked(false);
+    assertThat(ConcreteCreator.createNewAssistedDialingMediator(mTelephonyManager, mContext))
+        .isInstanceOf(AssistedDialingMediatorStub.class);
+  }
+
+  @Test
+  public void testGetCountryCodeProvider() {
+    assertThat(ConcreteCreator.getCountryCodeProvider()).isNotNull();
+  }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/phone/assisteddialing/ConstraintsTest.java b/tests/robotests/src/com/android/phone/assisteddialing/ConstraintsTest.java
index f67e06f..9459232 100644
--- a/tests/robotests/src/com/android/phone/assisteddialing/ConstraintsTest.java
+++ b/tests/robotests/src/com/android/phone/assisteddialing/ConstraintsTest.java
@@ -20,20 +20,21 @@
 
 import android.content.Context;
 
+import com.android.phone.TelephonyRobolectricTestRunner;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 /**
  * Unit Tests for Constraints.
  */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(TelephonyRobolectricTestRunner.class)
 public class ConstraintsTest {
 
-  public final Context mContext = RuntimeEnvironment.application.getBaseContext();
+  private final Context mContext = RuntimeEnvironment.application;
   private final CountryCodeProvider mCountryCodeProvider = new CountryCodeProvider();
-  private Constraints mConstraints = new Constraints(mContext, mCountryCodeProvider);
+  private final Constraints mConstraints = new Constraints(mContext, mCountryCodeProvider);
 
   @Test
   public void testnumberMeetsPreconditionsForAssistedDialing_countryCodesEquivalent() {
diff --git a/tests/robotests/src/com/android/phone/assisteddialing/CountryCodeProviderTest.java b/tests/robotests/src/com/android/phone/assisteddialing/CountryCodeProviderTest.java
index 028b0f2..27b8e57 100755
--- a/tests/robotests/src/com/android/phone/assisteddialing/CountryCodeProviderTest.java
+++ b/tests/robotests/src/com/android/phone/assisteddialing/CountryCodeProviderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -18,20 +18,21 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.android.phone.TelephonyRobolectricTestRunner;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 
 /**
  * Unit Tests for CountryCodeProvider.
  */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(TelephonyRobolectricTestRunner.class)
 public class CountryCodeProviderTest {
 
     private final CountryCodeProvider mCountryCodeProvider = new CountryCodeProvider();
 
     @Test
-    public void testnumberMeetsPreconditionsForAssistedDiailng_defaults() {
+    public void testnumberMeetsPreconditionsForAssistedDialing_defaults() {
         for (String country : CountryCodeProvider.DEFAULT_COUNTRY_CODES) {
             assertThat(mCountryCodeProvider.isSupportedCountryCode(country)).isTrue();
         }
diff --git a/tests/robotests/src/com/android/phone/assisteddialing/LocationDetectorTest.java b/tests/robotests/src/com/android/phone/assisteddialing/LocationDetectorTest.java
index 70dc5b0..82abfa9 100755
--- a/tests/robotests/src/com/android/phone/assisteddialing/LocationDetectorTest.java
+++ b/tests/robotests/src/com/android/phone/assisteddialing/LocationDetectorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -21,11 +21,12 @@
 import android.content.Context;
 import android.telephony.TelephonyManager;
 
+import com.android.phone.TelephonyRobolectricTestRunner;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadow.api.Shadow;
+import org.robolectric.Shadows;
 import org.robolectric.shadows.ShadowTelephonyManager;
 
 import java.util.Locale;
@@ -34,82 +35,78 @@
 /**
  * Unit Tests for LocationDetector.
  */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(TelephonyRobolectricTestRunner.class)
 public class LocationDetectorTest {
 
-    private final TelephonyManager mTelephonyManager =
-            (TelephonyManager) RuntimeEnvironment.application.getSystemService(
-                    Context.TELEPHONY_SERVICE);
-    private final ShadowTelephonyManager mShadowTelephonyManager =
-            (ShadowTelephonyManager) Shadow.extract(mTelephonyManager);
-    private final LocationDetector mLocationDetector = new LocationDetector(
-            mTelephonyManager, null);
+  private final TelephonyManager mTelephonyManager =
+      (TelephonyManager) RuntimeEnvironment.application.getSystemService(Context.TELEPHONY_SERVICE);
+  private final ShadowTelephonyManager mShadowTelephonyManager =
+      Shadows.shadowOf(mTelephonyManager);
+  private final LocationDetector mLocationDetector = new LocationDetector(mTelephonyManager, null);
 
-    @Test
-    public void testGetUserHomeCountry() {
-        // User home country
-        mShadowTelephonyManager.setSimCountryIso(
-                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
-        assertThat(mLocationDetector.getUpperCaseUserHomeCountry().get())
-                .isEqualTo(AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
-    }
+  @Test
+  public void testGetUserHomeCountry() {
+    // User home country
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+    assertThat(mLocationDetector.getUpperCaseUserHomeCountry().get())
+        .isEqualTo(AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+  }
 
-    @Test
-    public void testGetUserHomeCountry_userProvidedHomeCountry() {
-        // User home country
-        mShadowTelephonyManager.setSimCountryIso(
-                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+  @Test
+  public void testGetUserHomeCountry_userProvidedHomeCountry() {
+    // User home country
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
 
-        LocationDetector localLocationDetector = new LocationDetector(mTelephonyManager, "ZZ");
-        assertThat(localLocationDetector.getUpperCaseUserHomeCountry().get()).isEqualTo("ZZ");
-    }
+    LocationDetector localLocationDetector = new LocationDetector(mTelephonyManager, "ZZ");
+    assertThat(localLocationDetector.getUpperCaseUserHomeCountry().get()).isEqualTo("ZZ");
+  }
 
-    @Test
-    public void testGetUserRoamingCountry() {
-        // User roaming country
-        mShadowTelephonyManager.setNetworkCountryIso(
-                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
-        assertThat(mLocationDetector.getUpperCaseUserRoamingCountry().get())
-                .isEqualTo(AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
-    }
+  @Test
+  public void testGetUserRoamingCountry() {
+    // User roaming country
+    mShadowTelephonyManager.setNetworkCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+    assertThat(mLocationDetector.getUpperCaseUserRoamingCountry().get())
+        .isEqualTo(AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+  }
 
-    @Test
-    public void testGetLocationValues_returnValuesAreAlwaysUpperCase() {
-        mShadowTelephonyManager.setNetworkCountryIso(
-                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toLowerCase());
-        mShadowTelephonyManager.setSimCountryIso(
-                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toLowerCase());
+  @Test
+  public void testGetLocationValues_returnValuesAreAlwaysUpperCase() {
+    mShadowTelephonyManager.setNetworkCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toLowerCase());
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toLowerCase());
 
-        assertThat(mLocationDetector.getUpperCaseUserHomeCountry().get())
-                .isEqualTo(
-                        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toUpperCase(
-                                Locale.US));
-        assertThat(mLocationDetector.getUpperCaseUserRoamingCountry().get())
-                .isEqualTo(
-                        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toUpperCase(
-                                Locale.US));
-    }
+    assertThat(mLocationDetector.getUpperCaseUserHomeCountry().get())
+        .isEqualTo(
+            AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toUpperCase(
+                Locale.US));
+    assertThat(mLocationDetector.getUpperCaseUserRoamingCountry().get())
+        .isEqualTo(
+            AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toUpperCase(
+                Locale.US));
+  }
 
-    @Test
-    public void testGetLocationValues_returnValuesMayBeEmpty() {
-        mShadowTelephonyManager.setNetworkCountryIso(null);
-        mShadowTelephonyManager.setSimCountryIso(null);
+  @Test
+  public void testGetLocationValues_returnValuesMayBeEmpty() {
+    mShadowTelephonyManager.setNetworkCountryIso(null);
+    mShadowTelephonyManager.setSimCountryIso(null);
 
-        assertThat(mLocationDetector.getUpperCaseUserHomeCountry()).isEqualTo(Optional.empty());
-        assertThat(mLocationDetector.getUpperCaseUserRoamingCountry()).isEqualTo(Optional.empty());
-    }
+    assertThat(mLocationDetector.getUpperCaseUserHomeCountry()).isEqualTo(Optional.empty());
+    assertThat(mLocationDetector.getUpperCaseUserRoamingCountry()).isEqualTo(Optional.empty());
+  }
 
-    @Test
-    public void testConstructorWithNullYieldsEmptyOptional() {
-        mShadowTelephonyManager.setNetworkCountryIso(
-                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toLowerCase());
-        mShadowTelephonyManager.setSimCountryIso(
-                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toLowerCase());
+  @Test
+  public void testConstructorWithNullYieldsEmptyOptional() {
+    mShadowTelephonyManager.setNetworkCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toLowerCase());
+    mShadowTelephonyManager.setSimCountryIso(
+        AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM.toLowerCase());
 
-        LocationDetector locationDetector = new LocationDetector(null, null);
-        assertThat(locationDetector.getUpperCaseUserHomeCountry().isPresent())
-                .isFalse();
-        assertThat(locationDetector.getUpperCaseUserRoamingCountry().isPresent())
-                .isFalse();
-    }
+    final LocationDetector locationDetector = new LocationDetector(null, null);
+    assertThat(locationDetector.getUpperCaseUserHomeCountry().isPresent()).isFalse();
+    assertThat(locationDetector.getUpperCaseUserRoamingCountry().isPresent()).isFalse();
+  }
 }
diff --git a/tests/robotests/src/com/android/phone/assisteddialing/NumberTransformerTest.java b/tests/robotests/src/com/android/phone/assisteddialing/NumberTransformerTest.java
new file mode 100644
index 0000000..65b3128
--- /dev/null
+++ b/tests/robotests/src/com/android/phone/assisteddialing/NumberTransformerTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2018 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 static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.telecom.TransformationInfo;
+
+import com.android.phone.TelephonyRobolectricTestRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.Optional;
+
+/**
+ * Unit Tests for NumberTransformer.
+ */
+@RunWith(TelephonyRobolectricTestRunner.class)
+public class NumberTransformerTest {
+
+  private final Context mContext = RuntimeEnvironment.application;
+  private final CountryCodeProvider mCountryCodeProvider = new CountryCodeProvider();
+  private final Constraints mConstraints = new Constraints(mContext, mCountryCodeProvider);
+  private final NumberTransformer mNumberTransformer = new NumberTransformer(mConstraints);
+
+  @Test
+  public void testDoAssistedDialingTransformation_nothingToDo() {
+    assertThat(
+        mNumberTransformer.doAssistedDialingTransformation(
+            AssistedDialingTestHelper.TEST_NUMBER_UNITED_STATES,
+            AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES,
+            AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES))
+        .isEqualTo(Optional.empty());
+
+    assertThat(
+        mNumberTransformer.doAssistedDialingTransformation(
+            AssistedDialingTestHelper.TEST_NUMBER_UNITED_STATES,
+            AssistedDialingTestHelper.UNSUPPORTED_COUNTRY_CODE_NORTH_KOREA,
+            AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES))
+        .isEqualTo(Optional.empty());
+
+    assertThat(
+        mNumberTransformer.doAssistedDialingTransformation(
+            AssistedDialingTestHelper.INTERNATIONAL_TEST_NUMBER_UNITED_STATES,
+            AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES,
+            AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM))
+        .isEqualTo(Optional.empty());
+  }
+
+  @Test
+  public void testDoAssistedDialingTransformation_conditionsAreCorrect_fromUKtoUS() {
+    assertThat(
+        mNumberTransformer
+            .doAssistedDialingTransformation(
+                AssistedDialingTestHelper.TEST_NUMBER_UNITED_STATES,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM)
+            .get()
+            .getTransformedNumber())
+        .isEqualTo(AssistedDialingTestHelper.EXPECTED_FROM_UK_TO_US_DIALABLE_NUMBER);
+  }
+
+  @Test
+  public void testDoAssistedDialingTransformation_conditionsAreCorrect_fromUStoUK() {
+    assertThat(
+        mNumberTransformer
+            .doAssistedDialingTransformation(
+                AssistedDialingTestHelper.TEST_NUMBER_UNITED_KINGDOM,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES)
+            .get()
+            .getTransformedNumber())
+        .isEqualTo(AssistedDialingTestHelper.EXPECTED_FROM_US_TO_UK_DIALABLE_NUMBER);
+  }
+
+  @Test
+  public void testDoAssistedDialingTransformation_conditionsAreCorrect_fromJPtoMX() {
+    assertThat(
+        mNumberTransformer
+            .doAssistedDialingTransformation(
+                AssistedDialingTestHelper.TEST_NUMBER_MEXICO,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_MEXICO,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_JAPAN)
+            .get()
+            .getTransformedNumber())
+        .isEqualTo(AssistedDialingTestHelper.EXPECTED_FROM_JP_TO_MX_DIALABLE_NUMBER);
+  }
+
+  @Test
+  public void testDoAssistedDialingTransformation_conditionsAreCorrect_fromCAtoJP() {
+    assertThat(
+        mNumberTransformer
+            .doAssistedDialingTransformation(
+                AssistedDialingTestHelper.TEST_NUMBER_JAPAN,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_JAPAN,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_CANADA)
+            .get()
+            .getTransformedNumber())
+        .isEqualTo(AssistedDialingTestHelper.EXPECTED_FROM_CA_TO_JP_DIALABLE_NUMBER);
+  }
+
+  @Test
+  public void testDoADTransformation_conditionsCorrect_fromUKtoUS_allMembersReturned() {
+    TransformationInfo transformationInfo =
+        mNumberTransformer
+            .doAssistedDialingTransformation(
+                AssistedDialingTestHelper.TEST_NUMBER_UNITED_STATES,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES,
+                AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM)
+            .get();
+    assertThat(transformationInfo.getOriginalNumber())
+        .isEqualTo(AssistedDialingTestHelper.TEST_NUMBER_UNITED_STATES);
+    assertThat(transformationInfo.getTransformedNumber())
+        .isEqualTo(AssistedDialingTestHelper.EXPECTED_FROM_UK_TO_US_DIALABLE_NUMBER);
+    assertThat(transformationInfo.getUserHomeCountryCode())
+        .isEqualTo(AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_STATES);
+    assertThat(transformationInfo.getUserRoamingCountryCode())
+        .isEqualTo(AssistedDialingTestHelper.SUPPORTED_COUNTRY_CODE_UNITED_KINGDOM);
+    assertThat(transformationInfo.getTransformedNumberCountryCallingCode())
+        .isEqualTo(AssistedDialingTestHelper.UNITED_STATES_COUNTRY_CALLING_CODE);
+  }
+}
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index 700b626..3bd2716 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -16,13 +16,29 @@
 
 package com.android.services.telephony;
 
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import android.net.Uri;
+import android.os.AsyncResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.test.filters.FlakyTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.telecom.DisconnectCause;
 import android.telecom.TelecomManager;
 import android.telephony.RadioAccessFamily;
 import android.telephony.ServiceState;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
 import android.telephony.TelephonyManager;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -30,29 +46,18 @@
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection;
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.gsm.SuppServiceNotification;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 /**
  * Unit tests for TelephonyConnectionService.
  */
@@ -60,6 +65,7 @@
 @RunWith(AndroidJUnit4.class)
 public class TelephonyConnectionServiceTest extends TelephonyTestBase {
 
+    private static final long TIMEOUT_MS = 100;
     private static final int SLOT_0_PHONE_ID = 0;
     private static final int SLOT_1_PHONE_ID = 1;
 
@@ -752,6 +758,58 @@
         }
     }
 
+    @Test
+    @SmallTest
+    public void testSuppServiceNotification() {
+        TestTelephonyConnection c = new TestTelephonyConnection();
+
+        // We need to set the original connection to cause the supp service notification
+        // registration to occur.
+        Phone phone = c.getPhone();
+        c.setOriginalConnection(c.getOriginalConnection());
+
+        // When the registration occurs, we'll capture the handler and message so we can post our
+        // own messages to it.
+        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
+        ArgumentCaptor<Integer> messageCaptor = ArgumentCaptor.forClass(Integer.class);
+        verify(phone).registerForSuppServiceNotification(handlerCaptor.capture(),
+                messageCaptor.capture(), any());
+        Handler handler = handlerCaptor.getValue();
+        int message = messageCaptor.getValue();
+
+        // With the handler and message now known, we'll post a supp service notification.
+        AsyncResult result = getSuppServiceNotification(
+                SuppServiceNotification.NOTIFICATION_TYPE_CODE_1,
+                SuppServiceNotification.CODE_1_CALL_FORWARDED);
+        handler.obtainMessage(message, result).sendToTarget();
+        waitForHandlerAction(handler, TIMEOUT_MS);
+
+        assertTrue(c.getLastConnectionEvents().contains(TelephonyManager.EVENT_CALL_FORWARDED));
+
+        // With the handler and message now known, we'll post a supp service notification.
+        result = getSuppServiceNotification(
+                SuppServiceNotification.NOTIFICATION_TYPE_CODE_1,
+                SuppServiceNotification.CODE_1_CALL_IS_WAITING);
+        handler.obtainMessage(message, result).sendToTarget();
+        waitForHandlerAction(handler, TIMEOUT_MS);
+
+        // We we want the 3rd event since the forwarding one above sends 2.
+        assertEquals(c.getLastConnectionEvents().get(2),
+                TelephonyManager.EVENT_SUPPLEMENTARY_SERVICE_NOTIFICATION);
+        Bundle extras = c.getLastConnectionEventExtras().get(2);
+        assertEquals(SuppServiceNotification.NOTIFICATION_TYPE_CODE_1,
+                extras.getInt(TelephonyManager.EXTRA_NOTIFICATION_TYPE));
+        assertEquals(SuppServiceNotification.CODE_1_CALL_IS_WAITING,
+                extras.getInt(TelephonyManager.EXTRA_NOTIFICATION_CODE));
+    }
+
+    private AsyncResult getSuppServiceNotification(int notificationType, int code) {
+        SuppServiceNotification notification = new SuppServiceNotification();
+        notification.notificationType = notificationType;
+        notification.code = code;
+        return new AsyncResult(null, notification, null);
+    }
+
     private Phone makeTestPhone(int phoneId, int serviceState, boolean isEmergencyOnly) {
         Phone phone = mock(Phone.class);
         ServiceState testServiceState = new ServiceState();
diff --git a/tests/src/com/android/services/telephony/TestTelephonyConnection.java b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
index ea0f965..9040257 100644
--- a/tests/src/com/android/services/telephony/TestTelephonyConnection.java
+++ b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
@@ -16,17 +16,25 @@
 
 package com.android.services.telephony;
 
+import android.content.Context;
+import android.os.Bundle;
 import android.telecom.PhoneAccountHandle;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import com.android.internal.telephony.Call;
+import com.android.internal.telephony.Connection;
 import com.android.internal.telephony.Phone;
 
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Mock Telephony Connection used in TelephonyConferenceController.java for testing purpose
  */
@@ -39,8 +47,13 @@
     @Mock
     Call mMockCall;
 
+    @Mock
+    Context mMockContext;
+
     private Phone mMockPhone;
     private int mNotifyPhoneAccountChangedCount = 0;
+    private List<String> mLastConnectionEvents = new ArrayList<>();
+    private List<Bundle> mLastConnectionEventExtras = new ArrayList<>();
 
     @Override
     public com.android.internal.telephony.Connection getOriginalConnection() {
@@ -52,11 +65,17 @@
         MockitoAnnotations.initMocks(this);
 
         mMockPhone = mock(Phone.class);
+        mMockContext = mock(Context.class);
         // Set up mMockRadioConnection and mMockPhone to contain an active call
         when(mMockRadioConnection.getState()).thenReturn(Call.State.ACTIVE);
         when(mMockRadioConnection.getCall()).thenReturn(mMockCall);
+        doNothing().when(mMockRadioConnection).addListener(any(Connection.Listener.class));
+        doNothing().when(mMockRadioConnection).addPostDialListener(
+                any(Connection.PostDialListener.class));
         when(mMockPhone.getRingingCall()).thenReturn(mMockCall);
+        when(mMockPhone.getContext()).thenReturn(null);
         when(mMockCall.getState()).thenReturn(Call.State.ACTIVE);
+        when(mMockCall.getPhone()).thenReturn(mMockPhone);
     }
 
     @Override
@@ -82,7 +101,21 @@
         mNotifyPhoneAccountChangedCount++;
     }
 
+    @Override
+    public void sendConnectionEvent(String event, Bundle extras) {
+        mLastConnectionEvents.add(event);
+        mLastConnectionEventExtras.add(extras);
+    }
+
     public int getNotifyPhoneAccountChangedCount() {
         return mNotifyPhoneAccountChangedCount;
     }
+
+    public List<String> getLastConnectionEvents() {
+        return mLastConnectionEvents;
+    }
+
+    public List<Bundle> getLastConnectionEventExtras() {
+        return mLastConnectionEventExtras;
+    }
 }
