diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index dffb646..9e4ff1f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -436,14 +436,6 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".settings.PhoneAccountSelectionPreferenceActivity"
-                  android:label="@string/phone_accounts"
-                  android:theme="@style/DialerSettingsLight">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-            </intent-filter>
-        </activity>
-
         <!-- bluetooth phone service -->
         <service android:name="BluetoothPhoneService">
             <intent-filter>
@@ -499,8 +491,6 @@
                 <action android:name="com.android.phone.SIP_INCOMING_CALL" />
                 <action android:name="com.android.phone.SIP_REMOVE_PHONE" />
                 <action android:name="com.android.phone.SIP_CALL_OPTION_CHANGED" />
-                <action android:name="android.telecom.action.PHONE_ACCOUNT_ENABLED" />
-                <action android:name="android.telecom.action.PHONE_ACCOUNT_DISABLED" />
             </intent-filter>
         </receiver>
 
diff --git a/res/xml/phone_account_selection_activity.xml b/res/xml/phone_account_selection_activity.xml
deleted file mode 100644
index 6ae933c..0000000
--- a/res/xml/phone_account_selection_activity.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-  ~ Copyright (C) 2014 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
-  -->
-
-<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
-    <header
-        android:fragment="com.android.phone.settings.PhoneAccountSelectionPreferenceActivity$PhoneAccountSelectionPreferenceFragment"
-        android:title="@string/phone_accounts_selection_header" />
-</preference-headers>
\ No newline at end of file
diff --git a/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java b/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java
index 9c52324..c808133 100644
--- a/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java
+++ b/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java
@@ -177,38 +177,6 @@
     }
 
     /**
-     * Handles a {@link PhoneAccount} becoming enabled by starting the SIP service for the
-     * {@link SipProfile} associated with that {@linke PhoneAccount}.
-     *
-     * @param context The context.
-     * @param phoneAccountHandle The handle for the {@link PhoneAccount} which is enabled.
-     */
-    void setPhoneAccountEnabled(Context context, PhoneAccountHandle phoneAccountHandle) {
-        String sipUri = SipUtil.getSipUriFromPhoneAccount(phoneAccountHandle);
-        if (sipUri == null) {
-            return;
-        }
-
-        startSipService(context, sipUri);
-    }
-
-    /**
-     * Handles a {@link PhoneAccount} becoming disabled by stopping the SIP service for the
-     * {@link SipProfile} associated with that {@linke PhoneAccount}.
-     *
-     * @param context The context.
-     * @param phoneAccountHandle The handle for the {@link PhoneAccount} which is disabled.
-     */
-    void setPhoneAccountDisabled(Context context, PhoneAccountHandle phoneAccountHandle) {
-        String sipUri = SipUtil.getSipUriFromPhoneAccount(phoneAccountHandle);
-        if (sipUri == null) {
-            return;
-        }
-
-        stopSipService(context, sipUri);
-    }
-
-    /**
      * Performs an asynchronous call to
      * {@link SipAccountRegistry#startSipProfiles(android.content.Context, String)}, starting the
      * specified SIP profile and registering its {@link android.telecom.PhoneAccount}.
@@ -232,11 +200,6 @@
      * each with the telecom framework. If a specific sipUri is specified, this will only register
      * the associated SIP account.
      *
-     * Also handles migration from using the primary account shared preference to indicate the
-     * {@link SipProfile} to be used for outgoing Sip connections to using the enabled flag on
-     * {@link android.telecom.PhoneAccount}s to indicate which profiles can be used for outgoing
-     * or ingoing calls.
-     *
      * @param context The context.
      * @param sipUri A specific SIP uri to start, or {@code null} to start all.
      */
@@ -255,21 +218,10 @@
             if (sipUri == null || Objects.equals(sipUri, profile.getUriString())) {
                 PhoneAccount phoneAccount = SipUtil.createPhoneAccount(context, profile);
                 telecomManager.registerPhoneAccount(phoneAccount);
-
-                // If this profile was the primary profile in the past, mark it as enabled.
-                boolean isPrimaryProfile = primaryProfile != null &&
-                        profile.getUriString().equals(primaryProfile);
-                if (isPrimaryProfile) {
-                    telecomManager.setPhoneAccountEnabled(
-                            phoneAccount.getAccountHandle(), true);
-                }
             }
 
-            // Start the SIP service for the profile.
-            if (SipUtil.isPhoneAccountEnabled(context, profile)) {
-                if (sipUri == null || Objects.equals(sipUri, profile.getUriString())) {
-                    startSipServiceForProfile(profile, sipManager, context, isReceivingCalls);
-                }
+            if (sipUri == null || Objects.equals(sipUri, profile.getUriString())) {
+                startSipServiceForProfile(profile, sipManager, context, isReceivingCalls);
             }
         }
 
diff --git a/sip/src/com/android/services/telephony/sip/SipBroadcastReceiver.java b/sip/src/com/android/services/telephony/sip/SipBroadcastReceiver.java
index d3d274d..0b701ce 100644
--- a/sip/src/com/android/services/telephony/sip/SipBroadcastReceiver.java
+++ b/sip/src/com/android/services/telephony/sip/SipBroadcastReceiver.java
@@ -51,20 +51,6 @@
             if (VERBOSE) log("SIP_REMOVE_PHONE " +
                             intent.getStringExtra(SipManager.EXTRA_LOCAL_URI));
             sipAccountRegistry.removeSipProfile(intent.getStringExtra(SipManager.EXTRA_LOCAL_URI));
-        } else if (action.equals(TelecomManager.ACTION_PHONE_ACCOUNT_ENABLED)) {
-            PhoneAccountHandle phoneAccountHandle = intent.getParcelableExtra(
-                    TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
-            if (phoneAccountHandle == null) {
-                return;
-            }
-            sipAccountRegistry.setPhoneAccountEnabled(context, phoneAccountHandle);
-        } else if (action.equals(TelecomManager.ACTION_PHONE_ACCOUNT_DISABLED)) {
-            PhoneAccountHandle phoneAccountHandle = intent.getParcelableExtra(
-                    TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
-            if (phoneAccountHandle == null) {
-                return;
-            }
-            sipAccountRegistry.setPhoneAccountDisabled(context, phoneAccountHandle);
         } else {
             if (VERBOSE) log("onReceive, action not processed: " + action);
         }
diff --git a/sip/src/com/android/services/telephony/sip/SipSettings.java b/sip/src/com/android/services/telephony/sip/SipSettings.java
index 875b312..525fd0f 100644
--- a/sip/src/com/android/services/telephony/sip/SipSettings.java
+++ b/sip/src/com/android/services/telephony/sip/SipSettings.java
@@ -99,8 +99,7 @@
         void setProfile(SipProfile p) {
             mProfile = p;
             setTitle(getProfileName(p));
-            boolean isEnabled = SipUtil.isPhoneAccountEnabled(getContext(), p);
-            updateSummary(isEnabled && mSipSharedPreferences.isReceivingCallsEnabled()
+            updateSummary(mSipSharedPreferences.isReceivingCallsEnabled()
                     ? getString(R.string.registration_status_checking_status)
                     : getString(R.string.registration_status_not_receiving));
         }
@@ -300,8 +299,7 @@
 
         if (!mSipSharedPreferences.isReceivingCallsEnabled()) return;
         for (SipProfile p : mSipProfileList) {
-            if (mUid == p.getCallingUid() &&
-                    SipUtil.isPhoneAccountEnabled(getApplicationContext(), p)) {
+            if (mUid == p.getCallingUid()) {
                 try {
                     mSipManager.setRegistrationListener(
                             p.getUriString(), createRegistrationListener());
diff --git a/sip/src/com/android/services/telephony/sip/SipUtil.java b/sip/src/com/android/services/telephony/sip/SipUtil.java
index 458aaeb..e4d5d4c 100644
--- a/sip/src/com/android/services/telephony/sip/SipUtil.java
+++ b/sip/src/com/android/services/telephony/sip/SipUtil.java
@@ -95,20 +95,6 @@
     }
 
     /**
-     * Determines if the {@link android.tlecom.PhoneAccount} associated with a {@link SipProfile}
-     * is enabled.
-     *
-     * @param context The {@link Context}.
-     * @param profile The {@link SipProfile}.
-     * @return {@code True} if the {@code PhoneAccount} is enabled.
-     */
-    static boolean isPhoneAccountEnabled(Context context, SipProfile profile) {
-        PhoneAccount phoneAccount = TelecomManager.from(context)
-                .getPhoneAccount(SipUtil.createAccountHandle(context, profile.getUriString()));
-        return phoneAccount != null && phoneAccount.isEnabled();
-    }
-
-    /**
      * Creates a PhoneAccount for a SipProfile.
      *
      * @param context The context
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 6947727..245e97f 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -610,8 +610,7 @@
 
     /**
      * Called just prior to showing an AccountSelection dialog to re-populate the model of the
-     * AccountSelection dialog.  Important to ensure changes to the enabled state of
-     * {@code PhoneAccount}s are reflected in the dialog.
+     * AccountSelection dialog.
      *
      * @param pref The account selection preference dialog being shown.
      */
@@ -1574,9 +1573,8 @@
         TelecomManager telecomManager = TelecomManager.from(this);
 
         int allPhoneAccountsCount = telecomManager.getAllPhoneAccountsCount();
-        // Show the phone accounts preference if there are is more than one phone account (this
-        // includes disabled phone accounts).  The default selection, however, only includes those
-        // PhoneAccounts which are enabled.
+        allPhoneAccountsCount = 2;
+        // Show the phone accounts preference if there are is more than one phone account
         if (allPhoneAccountsCount > 1) {
             populateDefaultOutgoingAccountsModel();
 
@@ -2149,10 +2147,11 @@
         }
 
         TelecomManager telecomManager = TelecomManager.from(this);
-        List<PhoneAccountHandle> enabledPhoneAccounts = telecomManager.getEnabledPhoneAccounts();
+        List<PhoneAccountHandle> callCapablePhoneAccounts =
+                telecomManager.getCallCapablePhoneAccounts();
         mDefaultOutgoingAccount.setModel(
                 telecomManager,
-                enabledPhoneAccounts,
+                callCapablePhoneAccounts,
                 telecomManager.getUserSelectedOutgoingPhoneAccount(),
                 getString(R.string.phone_accounts_ask_every_time));
     }
diff --git a/src/com/android/phone/settings/AccountSelectionPreference.java b/src/com/android/phone/settings/AccountSelectionPreference.java
index 88a12e7..2995cf4 100644
--- a/src/com/android/phone/settings/AccountSelectionPreference.java
+++ b/src/com/android/phone/settings/AccountSelectionPreference.java
@@ -116,26 +116,6 @@
         // list of enabled accounts can be updated prior to showing the dialog.
         mListener.onAccountSelectionDialogShow(this);
 
-        final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int whichButton) {
-                showSelectPhoneAccounts();
-            }
-        };
-        builder.setNegativeButton(R.string.phone_accounts_choose_accounts, listener);
         super.onPrepareDialogBuilder(builder);
     }
-
-    /**
-     * Displays the {@link PhoneAccountSelectionPreferenceActivity} where the user is able to
-     * enable and disable phone accounts.
-     */
-    private void showSelectPhoneAccounts() {
-        Intent intent = new Intent(mContext, PhoneAccountSelectionPreferenceActivity.class);
-        intent.setAction(Intent.ACTION_MAIN);
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
-                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
-                | Intent.FLAG_ACTIVITY_CLEAR_TOP);
-        mContext.startActivityAsUser(intent, null, UserHandle.CURRENT);
-    }
 }
diff --git a/src/com/android/phone/settings/PhoneAccountSelectionPreferenceActivity.java b/src/com/android/phone/settings/PhoneAccountSelectionPreferenceActivity.java
deleted file mode 100644
index a5eadbb..0000000
--- a/src/com/android/phone/settings/PhoneAccountSelectionPreferenceActivity.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.phone.settings;
-
-import android.app.ActionBar;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceCategory;
-import android.preference.PreferenceFragment;
-import android.preference.SwitchPreference;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
-
-import com.android.internal.util.CharSequences;
-import com.android.phone.R;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Preference activity used to facilitate enabling and disabling phone accounts by the user.
- */
-public class PhoneAccountSelectionPreferenceActivity extends PreferenceActivity {
-
-    /**
-     * Preference fragment containing a list of all {@link PhoneAccount}s in the form of switches
-     * the user can use to enable or disable accounts.
-     */
-    public static class PhoneAccountSelectionPreferenceFragment extends PreferenceFragment
-            implements Preference.OnPreferenceChangeListener {
-        private static final String CATEGORY_PHONE_ACCOUNTS_KEY = "phone_accounts_list";
-
-        private TelecomManager mTelecomManager;
-        private PreferenceCategory mPhoneAccountsCategory;
-
-        /**
-         * Represents a single {@link PhoneAccount} for the purpose enabling and disabling.
-         */
-        static class PhoneAccountPreference extends SwitchPreference {
-            private PhoneAccountHandle mPhoneAccountHandle;
-            private boolean mPreviousState;
-
-            public PhoneAccountPreference(Context context, PhoneAccount phoneAccount) {
-                super(context);
-
-                setPhoneAccount(phoneAccount);
-            }
-
-            /**
-             * Configures the {@code PhoneAccountPreference} for the passed in {@link PhoneAccount}.
-             *
-             * @param phoneAccount The phone account.
-             */
-            private void setPhoneAccount(PhoneAccount phoneAccount) {
-                mPhoneAccountHandle = phoneAccount.getAccountHandle();
-                mPreviousState = phoneAccount.isEnabled();
-                this.setTitle(phoneAccount.getLabel());
-                this.setChecked(mPreviousState);
-            }
-
-            public boolean getPreviousState() {
-                return mPreviousState;
-            }
-
-            public PhoneAccountHandle getPhoneAccountHandle() {
-                return mPhoneAccountHandle;
-            }
-        }
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-
-            addPreferencesFromResource(R.xml.phone_account_selection);
-            mPhoneAccountsCategory = (PreferenceCategory) findPreference(
-                    CATEGORY_PHONE_ACCOUNTS_KEY);
-            mTelecomManager = TelecomManager.from(this.getActivity());
-
-            List<PhoneAccount> phoneAccounts = mTelecomManager.getAllPhoneAccounts();
-            Collections.sort(phoneAccounts, new Comparator<PhoneAccount>() {
-                @Override
-                public int compare(PhoneAccount o1, PhoneAccount o2) {
-                    return CharSequences.compareToIgnoreCase(o1.getLabel(), o2.getLabel());
-                }
-            });
-
-            for (PhoneAccount phoneAccount : phoneAccounts) {
-                // Do not add Sim PhoneAccounts.
-                if (phoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) {
-                    continue;
-                }
-
-                PhoneAccountPreference phoneAccountPreference = new PhoneAccountPreference(
-                        getActivity(), phoneAccount);
-                phoneAccountPreference.setOnPreferenceChangeListener(this);
-                phoneAccountPreference.setEnabled(!phoneAccount.hasCapabilities(
-                        PhoneAccount.CAPABILITY_ALWAYS_ENABLED));
-                mPhoneAccountsCategory.addPreference(phoneAccountPreference);
-            }
-        }
-
-        /**
-         * Handles changes to preferences
-         * @param preference The preference which changed.
-         * @param newValue The new value of the preference.
-         * @return
-         */
-        @Override
-        public boolean onPreferenceChange(Preference preference, Object newValue) {
-            if (preference instanceof PhoneAccountPreference) {
-                PhoneAccountPreference phoneAccountPreference = (PhoneAccountPreference) preference;
-                boolean newState = Boolean.valueOf(newValue.toString()).booleanValue();
-
-                if (newState != phoneAccountPreference.getPreviousState()) {
-                    mTelecomManager.setPhoneAccountEnabled(
-                            phoneAccountPreference.getPhoneAccountHandle(), newState);
-                }
-                return true;
-            }
-            return false;
-        }
-    }
-
-    @Override
-    public void onBuildHeaders(List<Header> target) {
-        loadHeadersFromResource(R.xml.phone_account_selection_activity, target);
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTitle(getResources().getString(R.string.call_settings));
-        ActionBar actionBar = getActionBar();
-        if (actionBar != null) {
-            actionBar.setDisplayShowHomeEnabled(false);
-            actionBar.setDisplayHomeAsUpEnabled(false);
-        }
-
-        // By default, show the main fragment.
-        Intent intent = getIntent();
-        if (intent.getStringArrayExtra(EXTRA_SHOW_FRAGMENT) == null) {
-            getIntent().putExtra(EXTRA_SHOW_FRAGMENT,
-                    PhoneAccountSelectionPreferenceFragment.class.getName());
-        }
-
-        super.onCreate(savedInstanceState);
-    }
-
-    @Override
-    public boolean isValidFragment(String fragmentName) {
-        return true;
-    }
-}
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 307c522..06badc3 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -139,12 +139,6 @@
                     PhoneAccount.CAPABILITY_CALL_PROVIDER |
                     PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS;
 
-            // Indicate the emergency calling PhoneAccount is ALWAYS enabled.  This capability is
-            // important to ensure the emergency-only PhoneAccount cannot be disabled.
-            if (isEmergency) {
-                capabilities |= PhoneAccount.CAPABILITY_ALWAYS_ENABLED;
-            }
-
             PhoneAccount account = PhoneAccount.builder(phoneAccountHandle, label)
                     .setAddress(Uri.fromParts(PhoneAccount.SCHEME_TEL, line1Number, null))
                     .setSubscriptionAddress(
@@ -154,7 +148,6 @@
                     .setShortDescription(description)
                     .setSupportedUriSchemes(Arrays.asList(
                             PhoneAccount.SCHEME_TEL, PhoneAccount.SCHEME_VOICEMAIL))
-                    .setEnabled(true)
                     .build();
 
             // Register with Telecom and put into the account entry.
