diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6b35ada..c47db4f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1279,5 +1279,8 @@
 
     <!-- DO NOT TRANSLATE. Internal key for a voicemail notification preference. -->
     <string name="voicemail_notification_ringtone_key">voicemail_notification_ringtone_key</string>
+    <!-- DO NOT TRANSLATE. Internal key for a voicemail notification preference. -->
     <string name="voicemail_notification_vibrate_key">voicemail_notification_vibrate_key</string>
+    <!-- DO NOT TRANSLATE. Internal key for tty mode preference. -->
+    <string name="tty_mode_key">button_tty_mode_key</string>
 </resources>
diff --git a/res/xml/call_feature_setting.xml b/res/xml/call_feature_setting.xml
index cef723d..4ae0bf6 100644
--- a/res/xml/call_feature_setting.xml
+++ b/res/xml/call_feature_setting.xml
@@ -94,8 +94,8 @@
         android:persistent="false"
         android:summary="@string/auto_retry_mode_summary"/>
 
-    <ListPreference
-        android:key="button_tty_mode_key"
+    <com.android.phone.settings.TtyModeListPreference
+        android:key="@string/tty_mode_key"
         android:title="@string/tty_mode_option_title"
         android:summary="@string/tty_mode_option_summary"
         android:persistent="false"
diff --git a/res/xml/phone_account_settings.xml b/res/xml/phone_account_settings.xml
index f818baa..ff01d34 100644
--- a/res/xml/phone_account_settings.xml
+++ b/res/xml/phone_account_settings.xml
@@ -28,6 +28,14 @@
         android:defaultValue=""
         android:persistent="false" />
 
+    <com.android.phone.settings.TtyModeListPreference
+        android:key="@string/tty_mode_key"
+        android:title="@string/tty_mode_option_title"
+        android:summary="@string/tty_mode_option_summary"
+        android:persistent="false"
+        android:entries="@array/tty_mode_entries"
+        android:entryValues="@array/tty_mode_values"/>
+
     <PreferenceCategory
         android:key="phone_accounts_call_assistant_settings_category_key"
         android:title="@string/wifi_calling_call_assistant"
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);
+    }
+}
