diff --git a/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java b/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java
index b9ee69d..0a08c61 100644
--- a/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java
+++ b/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java
@@ -113,7 +113,7 @@
     }
 
     void setup(Context context) {
-        startSipProfilesAsync(context, (String) null);
+        startSipProfilesAsync(context, (String) null, false);
 
         // TODO: remove orphaned SIP Accounts
     }
@@ -124,9 +124,10 @@
      *
      * @param context The context.
      * @param sipProfileName The name of the {@link SipProfile} to start, or {@code null} for all.
+     * @param enableProfile Sip account should be enabled
      */
-    void startSipService(Context context, String sipProfileName) {
-        startSipProfilesAsync(context, sipProfileName);
+    void startSipService(Context context, String sipProfileName, boolean enableProfile) {
+        startSipProfilesAsync(context, sipProfileName, enableProfile);
     }
 
     /**
@@ -175,7 +176,7 @@
      * @param context The context.
      */
     public void restartSipService(Context context) {
-        startSipProfiles(context, null);
+        startSipProfiles(context, null, false);
     }
 
     /**
@@ -185,14 +186,16 @@
      *
      * @param context The context.
      * @param sipProfileName Name of the SIP profile.
+     * @param enableProfile Sip account should be enabled.
      */
-    private void startSipProfilesAsync(final Context context, final String sipProfileName) {
+    private void startSipProfilesAsync(
+            final Context context, final String sipProfileName, final boolean enableProfile) {
         if (VERBOSE) log("startSipProfiles, start auto registration");
 
         new Thread(new Runnable() {
             @Override
             public void run() {
-                startSipProfiles(context, sipProfileName);
+                startSipProfiles(context, sipProfileName, enableProfile);
             }}
         ).start();
     }
@@ -204,8 +207,9 @@
      *
      * @param context The context.
      * @param sipProfileName A specific SIP profile Name to start, or {@code null} to start all.
+     * @param enableProfile Sip account should be enabled.
      */
-    private void startSipProfiles(Context context, String sipProfileName) {
+    private void startSipProfiles(Context context, String sipProfileName, boolean enableProfile) {
         final SipSharedPreferences sipSharedPreferences = new SipSharedPreferences(context);
         boolean isReceivingCalls = sipSharedPreferences.isReceivingCallsEnabled();
         String primaryProfile = sipSharedPreferences.getPrimaryAccount();
@@ -220,6 +224,9 @@
             if (sipProfileName == null || sipProfileName.equals(profile.getProfileName())) {
                 PhoneAccount phoneAccount = SipUtil.createPhoneAccount(context, profile);
                 telecomManager.registerPhoneAccount(phoneAccount);
+                if (enableProfile) {
+                    telecomManager.enablePhoneAccount(phoneAccount.getAccountHandle(), true);
+                }
                 startSipServiceForProfile(profile, sipManager, context, isReceivingCalls);
             }
         }
diff --git a/sip/src/com/android/services/telephony/sip/SipEditor.java b/sip/src/com/android/services/telephony/sip/SipEditor.java
index d6f862a..6304220 100644
--- a/sip/src/com/android/services/telephony/sip/SipEditor.java
+++ b/sip/src/com/android/services/telephony/sip/SipEditor.java
@@ -244,12 +244,13 @@
      * {@link android.telecom.PhoneAccount}.
      *
      * @param p The {@link SipProfile} to register.
+     * @param enableProfile {@code true} if profile should be enabled, too.
      * @throws IOException Exception resulting from profile save.
      */
-    private void saveAndRegisterProfile(SipProfile p) throws IOException {
+    private void saveAndRegisterProfile(SipProfile p, boolean enableProfile) throws IOException {
         if (p == null) return;
         mProfileDb.saveProfile(p);
-        mSipAccountRegistry.startSipService(this, p.getProfileName());
+        mSipAccountRegistry.startSipService(this, p.getProfileName(), enableProfile);
     }
 
     /**
@@ -372,7 +373,8 @@
             public void run() {
                 try {
                     deleteAndUnregisterProfile(oldProfile);
-                    saveAndRegisterProfile(newProfile);
+                    boolean autoEnableNewProfile = oldProfile == null;
+                    saveAndRegisterProfile(newProfile, autoEnableNewProfile);
                     finish();
                 } catch (Exception e) {
                     log("replaceProfile, can not save/register new SipProfile, exception: " + e);
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index d918f7d..0c34c5f 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -40,9 +40,9 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
-import android.service.carrier.CarrierConfigService;
 import android.service.carrier.CarrierIdentifier;
-import android.service.carrier.ICarrierConfigService;
+import android.service.carrier.CarrierService;
+import android.service.carrier.ICarrierService;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -89,7 +89,7 @@
     // Carrier configs from privileged carrier config app, indexed by phoneID.
     private PersistableBundle[] mConfigFromCarrierApp;
     // Service connection for binding to config app.
-    private ConfigServiceConnection[] mServiceConnection;
+    private CarrierServiceConnection[] mServiceConnection;
 
     // Broadcast receiver for SIM and pkg intents, register intent filter in constructor.
     private final BroadcastReceiver mReceiver = new ConfigLoaderBroadcastReceiver();
@@ -133,7 +133,7 @@
             int phoneId = msg.arg1;
             log("mHandler: " + msg.what + " phoneId: " + phoneId);
             CarrierIdentifier carrierId;
-            ConfigServiceConnection conn;
+            CarrierServiceConnection conn;
             PersistableBundle config;
             switch (msg.what) {
                 case EVENT_CLEAR_CONFIG:
@@ -158,16 +158,16 @@
 
                 case EVENT_CONNECTED_TO_DEFAULT:
                     carrierId = getCarrierIdForPhoneId(phoneId);
-                    conn = (ConfigServiceConnection) msg.obj;
+                    conn = (CarrierServiceConnection) msg.obj;
                     // If new service connection has been created, unbind.
                     if (mServiceConnection[phoneId] != conn || conn.service == null) {
                         mContext.unbindService(conn);
                         break;
                     }
                     try {
-                        ICarrierConfigService configService = ICarrierConfigService.Stub
+                        ICarrierService carrierService = ICarrierService.Stub
                                 .asInterface(conn.service);
-                        config = configService.getCarrierConfig(carrierId);
+                        config = carrierService.getCarrierConfig(carrierId);
                         mConfigFromDefaultApp[phoneId] = config;
                         sendMessage(obtainMessage(EVENT_LOADED_FROM_DEFAULT, phoneId, -1));
                     } catch (RemoteException ex) {
@@ -183,7 +183,7 @@
                     }
                     List<String> carrierPackageNames = TelephonyManager.from(mContext)
                             .getCarrierPackageNamesForIntentAndPhone(
-                                    new Intent(CarrierConfigService.SERVICE_INTERFACE), phoneId);
+                                    new Intent(CarrierService.CONFIG_SERVICE_INTERFACE), phoneId);
                     log("Found carrier config app: " + carrierPackageNames);
                     if (carrierPackageNames != null && carrierPackageNames.size() > 0) {
                         if (!bindToConfigPackage(carrierPackageNames.get(0),
@@ -197,7 +197,7 @@
 
                 case EVENT_CONNECTED_TO_CARRIER:
                     carrierId = getCarrierIdForPhoneId(phoneId);
-                    conn = (ConfigServiceConnection) msg.obj;
+                    conn = (CarrierServiceConnection) msg.obj;
                     // If new service connection has been created, unbind.
                     if (mServiceConnection[phoneId] != conn ||
                             conn.service == null) {
@@ -205,9 +205,9 @@
                         break;
                     }
                     try {
-                        ICarrierConfigService configService = ICarrierConfigService.Stub
+                        ICarrierService carrierService = ICarrierService.Stub
                                 .asInterface(conn.service);
-                        config = configService.getCarrierConfig(carrierId);
+                        config = carrierService.getCarrierConfig(carrierId);
                         mConfigFromCarrierApp[phoneId] = config;
                         sendMessage(obtainMessage(EVENT_LOADED_FROM_CARRIER, phoneId, -1));
                     } catch (RemoteException ex) {
@@ -244,7 +244,7 @@
         int numPhones = TelephonyManager.from(context).getPhoneCount();
         mConfigFromDefaultApp = new PersistableBundle[numPhones];
         mConfigFromCarrierApp = new PersistableBundle[numPhones];
-        mServiceConnection = new ConfigServiceConnection[numPhones];
+        mServiceConnection = new CarrierServiceConnection[numPhones];
         // Make this service available through ServiceManager.
         ServiceManager.addService(Context.CARRIER_CONFIG_SERVICE, this);
         log("CarrierConfigLoader has started");
@@ -278,11 +278,11 @@
     /** Binds to the default or carrier config app. */
     private boolean bindToConfigPackage(String pkgName, int phoneId, int eventId) {
         log("Binding to " + pkgName + " for phone " + phoneId);
-        Intent carrierConfigService = new Intent(CarrierConfigService.SERVICE_INTERFACE);
-        carrierConfigService.setPackage(pkgName);
-        mServiceConnection[phoneId] = new ConfigServiceConnection(phoneId, eventId);
+        Intent carrierService = new Intent(CarrierService.CONFIG_SERVICE_INTERFACE);
+        carrierService.setPackage(pkgName);
+        mServiceConnection[phoneId] = new CarrierServiceConnection(phoneId, eventId);
         try {
-            return mContext.bindService(carrierConfigService, mServiceConnection[phoneId],
+            return mContext.bindService(carrierService, mServiceConnection[phoneId],
                     Context.BIND_AUTO_CREATE);
         } catch (SecurityException ex) {
             return false;
@@ -490,12 +490,12 @@
         }
     }
 
-    private class ConfigServiceConnection implements ServiceConnection {
+    private class CarrierServiceConnection implements ServiceConnection {
         int phoneId;
         int eventId;
         IBinder service;
 
-        public ConfigServiceConnection(int phoneId, int eventId) {
+        public CarrierServiceConnection(int phoneId, int eventId) {
             this.phoneId = phoneId;
             this.eventId = eventId;
         }
