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.
