diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 1d054a6..322976e 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -55,6 +55,7 @@
 import com.android.phone.common.util.SettingsUtil;
 import com.android.phone.settings.AccountSelectionPreference;
 import com.android.phone.settings.CallForwardInfoUtil;
+import com.android.phone.settings.TtyModeListPreference;
 import com.android.phone.settings.VoicemailDialogUtil;
 import com.android.phone.settings.VoicemailNotificationSettingsUtil;
 import com.android.phone.settings.VoicemailProviderListPreference;
@@ -191,8 +192,7 @@
     private CheckBoxPreference mButtonAutoRetry;
     private CheckBoxPreference mButtonHAC;
     private ListPreference mButtonDTMF;
-    private ListPreference mButtonTTY;
-    private Preference mPhoneAccountSettingsPreference;
+    private TtyModeListPreference mButtonTTY;
     private VoicemailProviderListPreference mVoicemailProviders;
     private PreferenceScreen mVoicemailSettingsScreen;
     private PreferenceScreen mVoicemailSettings;
@@ -376,8 +376,6 @@
             int index = mButtonDTMF.findIndexOfValue((String) objValue);
             Settings.System.putInt(mPhone.getContext().getContentResolver(),
                     Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, index);
-        } else if (preference == mButtonTTY) {
-            handleTTYChange(preference, objValue);
         } else if (preference == mVoicemailProviders) {
             final String newProviderKey = (String) objValue;
 
@@ -1128,19 +1126,6 @@
         mSubscriptionInfoHelper.setActionBarTitle(
                 getActionBar(), getResources(), R.string.call_settings_with_label);
         mPhone = mSubscriptionInfoHelper.getPhone();
-   }
-
-    private void initPhoneAccountPreferences() {
-        mPhoneAccountSettingsPreference = findPreference(PHONE_ACCOUNT_SETTINGS_KEY);
-
-        TelecomManager telecomManager = TelecomManager.from(this);
-        TelephonyManager telephonyManager =
-                (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
-
-        if ((telecomManager.getSimCallManagers().isEmpty() && !SipUtil.isVoipSupported(this))
-                || telephonyManager.getPhoneCount() > 1) {
-            getPreferenceScreen().removePreference(mPhoneAccountSettingsPreference);
-        }
     }
 
     @Override
@@ -1155,7 +1140,15 @@
 
         addPreferencesFromResource(R.xml.call_feature_setting);
 
-        initPhoneAccountPreferences();
+        TelecomManager telecomManager = TelecomManager.from(this);
+        TelephonyManager telephonyManager =
+                (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+
+        Preference phoneAccountSettingsPreference = findPreference(PHONE_ACCOUNT_SETTINGS_KEY);
+        if (telephonyManager.isMultiSimEnabled() || (telecomManager.getSimCallManagers().isEmpty()
+                    && !SipUtil.isVoipSupported(mPhone.getContext()))) {
+            getPreferenceScreen().removePreference(phoneAccountSettingsPreference);
+        }
 
         PreferenceScreen prefSet = getPreferenceScreen();
         mSubMenuVoicemailSettings = (EditPhoneNumberPreference) findPreference(BUTTON_VOICEMAIL_KEY);
@@ -1166,7 +1159,8 @@
         mButtonDTMF = (ListPreference) findPreference(BUTTON_DTMF_KEY);
         mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
         mButtonHAC = (CheckBoxPreference) findPreference(BUTTON_HAC_KEY);
-        mButtonTTY = (ListPreference) findPreference(BUTTON_TTY_KEY);
+        mButtonTTY = (TtyModeListPreference) findPreference(
+                getResources().getString(R.string.tty_mode_key));
 
         mVoicemailProviders = (VoicemailProviderListPreference) findPreference(
                 BUTTON_VOICEMAIL_PROVIDER_KEY);
@@ -1219,14 +1213,8 @@
             mButtonHAC = null;
         }
 
-        TelecomManager telecomManager = TelecomManager.from(this);
-        if (telecomManager != null && telecomManager.isTtySupported()) {
-            mButtonTTY.setOnPreferenceChangeListener(this);
-            int settingsTtyMode = Settings.Secure.getInt(getContentResolver(),
-                    Settings.Secure.PREFERRED_TTY_MODE,
-                    TelecomManager.TTY_MODE_OFF);
-            mButtonTTY.setValue(Integer.toString(settingsTtyMode));
-            updatePreferredTtyModeSummary(settingsTtyMode);
+        if (!telephonyManager.isMultiSimEnabled() && telecomManager.isTtySupported()) {
+            mButtonTTY.init();
         } else {
             prefSet.removePreference(mButtonTTY);
             mButtonTTY = null;
@@ -1314,53 +1302,6 @@
         }
     }
 
-    private void handleTTYChange(Preference preference, Object objValue) {
-        int buttonTtyMode;
-        buttonTtyMode = Integer.valueOf((String) objValue).intValue();
-        int settingsTtyMode = android.provider.Settings.Secure.getInt(
-                getContentResolver(),
-                android.provider.Settings.Secure.PREFERRED_TTY_MODE,
-                TelecomManager.TTY_MODE_OFF);
-        if (DBG) log("handleTTYChange: requesting set TTY mode enable (TTY) to" +
-                Integer.toString(buttonTtyMode));
-
-        if (buttonTtyMode != settingsTtyMode) {
-            switch(buttonTtyMode) {
-            case TelecomManager.TTY_MODE_OFF:
-            case TelecomManager.TTY_MODE_FULL:
-            case TelecomManager.TTY_MODE_HCO:
-            case TelecomManager.TTY_MODE_VCO:
-                android.provider.Settings.Secure.putInt(getContentResolver(),
-                        android.provider.Settings.Secure.PREFERRED_TTY_MODE, buttonTtyMode);
-                break;
-            default:
-                buttonTtyMode = TelecomManager.TTY_MODE_OFF;
-            }
-
-            mButtonTTY.setValue(Integer.toString(buttonTtyMode));
-            updatePreferredTtyModeSummary(buttonTtyMode);
-            Intent ttyModeChanged = new Intent(TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED);
-            ttyModeChanged.putExtra(TelecomManager.EXTRA_TTY_PREFERRED_MODE, buttonTtyMode);
-            sendBroadcastAsUser(ttyModeChanged, UserHandle.ALL);
-        }
-    }
-
-    private void updatePreferredTtyModeSummary(int TtyMode) {
-        String [] txts = getResources().getStringArray(R.array.tty_mode_entries);
-        switch(TtyMode) {
-            case TelecomManager.TTY_MODE_OFF:
-            case TelecomManager.TTY_MODE_HCO:
-            case TelecomManager.TTY_MODE_VCO:
-            case TelecomManager.TTY_MODE_FULL:
-                mButtonTTY.setSummary(txts[TtyMode]);
-                break;
-            default:
-                mButtonTTY.setEnabled(false);
-                mButtonTTY.setSummary(txts[TelecomManager.TTY_MODE_OFF]);
-                break;
-        }
-    }
-
     private static void log(String msg) {
         Log.d(LOG_TAG, msg);
     }
diff --git a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
index 83fa5da..56cd0cb 100644
--- a/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
+++ b/src/com/android/phone/settings/PhoneAccountSettingsFragment.java
@@ -85,15 +85,20 @@
                 (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
         mAccountList = (PreferenceCategory) getPreferenceScreen().findPreference(
                 ACCOUNTS_LIST_CATEGORY_KEY);
-        if (telephonyManager.getPhoneCount() > 1) {
+        TtyModeListPreference ttyModeListPreference =
+                (TtyModeListPreference) getPreferenceScreen().findPreference(
+                        getResources().getString(R.string.tty_mode_key));
+        if (telephonyManager.isMultiSimEnabled()) {
             initAccountList();
+            ttyModeListPreference.init();
         } else {
             getPreferenceScreen().removePreference(mAccountList);
+            getPreferenceScreen().removePreference(ttyModeListPreference);
         }
 
         mDefaultOutgoingAccount = (AccountSelectionPreference)
                 getPreferenceScreen().findPreference(DEFAULT_OUTGOING_ACCOUNT_KEY);
-        if (mTelecomManager.getCallCapablePhoneAccounts().size() > 1) {
+        if (mTelecomManager.hasMultipleCallCapableAccounts()) {
             mDefaultOutgoingAccount.setListener(this);
             updateDefaultOutgoingAccountsModel();
         } else {
diff --git a/src/com/android/phone/settings/TtyModeListPreference.java b/src/com/android/phone/settings/TtyModeListPreference.java
new file mode 100644
index 0000000..e8ef099
--- /dev/null
+++ b/src/com/android/phone/settings/TtyModeListPreference.java
@@ -0,0 +1,108 @@
+/*
+ * 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.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.provider.Settings;
+import android.telecom.TelecomManager;
+import android.util.AttributeSet;
+import android.util.Log;
+
+import com.android.phone.PhoneGlobals;
+import com.android.phone.R;
+
+public class TtyModeListPreference extends ListPreference
+        implements Preference.OnPreferenceChangeListener {
+    private static final String LOG_TAG = TtyModeListPreference.class.getSimpleName();
+    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
+
+    public TtyModeListPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public void init() {
+        setOnPreferenceChangeListener(this);
+
+        int settingsTtyMode = Settings.Secure.getInt(getContext().getContentResolver(),
+                Settings.Secure.PREFERRED_TTY_MODE,
+                TelecomManager.TTY_MODE_OFF);
+        setValue(Integer.toString(settingsTtyMode));
+        updatePreferredTtyModeSummary(settingsTtyMode);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object objValue) {
+        if (preference == this) {
+            int buttonTtyMode;
+            buttonTtyMode = Integer.valueOf((String) objValue).intValue();
+            int settingsTtyMode = android.provider.Settings.Secure.getInt(
+                    getContext().getContentResolver(),
+                    Settings.Secure.PREFERRED_TTY_MODE,
+                    TelecomManager.TTY_MODE_OFF);
+            if (DBG) log("handleTTYChange: requesting set TTY mode enable (TTY) to" +
+                    Integer.toString(buttonTtyMode));
+
+            if (buttonTtyMode != settingsTtyMode) {
+                switch(buttonTtyMode) {
+                    case TelecomManager.TTY_MODE_OFF:
+                    case TelecomManager.TTY_MODE_FULL:
+                    case TelecomManager.TTY_MODE_HCO:
+                    case TelecomManager.TTY_MODE_VCO:
+                        Settings.Secure.putInt(
+                                getContext().getContentResolver(),
+                                Settings.Secure.PREFERRED_TTY_MODE,
+                                buttonTtyMode);
+                        break;
+                    default:
+                        buttonTtyMode = TelecomManager.TTY_MODE_OFF;
+                }
+
+                setValue(Integer.toString(buttonTtyMode));
+                updatePreferredTtyModeSummary(buttonTtyMode);
+                Intent ttyModeChanged =
+                        new Intent(TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED);
+                ttyModeChanged.putExtra(TelecomManager.EXTRA_TTY_PREFERRED_MODE, buttonTtyMode);
+                getContext().sendBroadcastAsUser(ttyModeChanged, UserHandle.ALL);
+            }
+        }
+        return true;
+    }
+
+    private void updatePreferredTtyModeSummary(int TtyMode) {
+        String [] txts = getContext().getResources().getStringArray(R.array.tty_mode_entries);
+        switch(TtyMode) {
+            case TelecomManager.TTY_MODE_OFF:
+            case TelecomManager.TTY_MODE_HCO:
+            case TelecomManager.TTY_MODE_VCO:
+            case TelecomManager.TTY_MODE_FULL:
+                setSummary(txts[TtyMode]);
+                break;
+            default:
+                setEnabled(false);
+                setSummary(txts[TelecomManager.TTY_MODE_OFF]);
+                break;
+        }
+    }
+
+    private static void log(String msg) {
+        Log.d(LOG_TAG, msg);
+    }
+}
