diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index fbaddbd..a97f5d0 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -41,6 +41,7 @@
 import android.provider.Settings;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
+import android.telephony.PhoneStateListener;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
@@ -278,6 +279,13 @@
     public void onPause() {
         super.onPause();
         mForeground = false;
+
+        if (ImsManager.isVolteEnabledByPlatform(this) &&
+                !mPhone.getContext().getResources().getBoolean(
+                        com.android.internal.R.bool.config_carrier_volte_tty_supported)) {
+            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+            tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+        }
     }
 
     /**
@@ -298,6 +306,23 @@
      */
     private boolean mSetupVoicemail = false;
 
+    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+        /**
+         * Enable/disable the TTY setting when in/out of a call (and if carrier doesn't
+         * support VoLTE with TTY).
+         * @see android.telephony.PhoneStateListener#onCallStateChanged(int,
+         * java.lang.String)
+         */
+        @Override
+        public void onCallStateChanged(int state, String incomingNumber) {
+            if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
+            Preference pref = getPreferenceScreen().findPreference(BUTTON_TTY_KEY);
+            if (pref != null) {
+                pref.setEnabled(state == TelephonyManager.CALL_STATE_IDLE);
+            }
+        }
+    };
+
     /*
      * Click Listeners, handle click based on objects attached to UI.
      */
@@ -1300,6 +1325,13 @@
         } else {
             prefSet.removePreference(mEnableVideoCalling);
         }
+
+        if (ImsManager.isVolteEnabledByPlatform(this) &&
+                !mPhone.getContext().getResources().getBoolean(
+                        com.android.internal.R.bool.config_carrier_volte_tty_supported)) {
+            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+            tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+        }
     }
 
     @Override
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index 58aa511..48865ff 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -50,6 +50,7 @@
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
 import android.preference.SwitchPreference;
+import android.telecom.TelecomManager;
 import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
@@ -136,7 +137,8 @@
 
     private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
         /*
-         * Enable/disable the 'Enhanced 4G LTE Mode' when in/out of a call.
+         * Enable/disable the 'Enhanced 4G LTE Mode' when in/out of a call
+         * and depending on TTY mode and TTY support over VoLTE.
          * @see android.telephony.PhoneStateListener#onCallStateChanged(int,
          * java.lang.String)
          */
@@ -145,7 +147,8 @@
             if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
             Preference pref = getPreferenceScreen().findPreference(BUTTON_4G_LTE_KEY);
             if (pref != null) {
-                pref.setEnabled(state == TelephonyManager.CALL_STATE_IDLE);
+                pref.setEnabled((state == TelephonyManager.CALL_STATE_IDLE) &&
+                        ImsManager.isNonTtyOrTtyOnVolteEnabled(getApplicationContext()));
             }
         }
     };
@@ -253,13 +256,6 @@
         }
     }
 
-    private void setIMS(boolean turnOn) {
-        int value = (turnOn) ? 1:0;
-        android.provider.Settings.Global.putInt(
-                  mPhone.getContext().getContentResolver(),
-                  android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED, value);
-    }
-
     private OnTabChangeListener mTabListener = new OnTabChangeListener() {
         @Override
         public void onTabChanged(String tabId) {
@@ -319,7 +315,6 @@
         mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY);
 
         mButton4glte.setOnPreferenceChangeListener(this);
-        mButton4glte.setChecked(ImsManager.isEnhanced4gLteModeSettingEnabledByUser(this));
 
         try {
             Context con = createPackageContext("com.android.systemui", 0);
@@ -398,6 +393,10 @@
             TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
             tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
         }
+
+        mButton4glte.setChecked(ImsManager.isEnhanced4gLteModeSettingEnabledByUser(this)
+                && ImsManager.isNonTtyOrTtyOnVolteEnabled(this));
+        // NOTE: The button will be enabled/disabled in mPhoneStateListener
     }
 
     private void updateBody() {
@@ -679,18 +678,7 @@
         } else if (preference == mButton4glte) {
             SwitchPreference ltePref = (SwitchPreference)preference;
             ltePref.setChecked(!ltePref.isChecked());
-            setIMS(ltePref.isChecked());
-
-            ImsManager imsMan = ImsManager.getInstance(getBaseContext(),
-                    SubscriptionManager.getDefaultVoicePhoneId());
-            if (imsMan != null) {
-
-                try {
-                    imsMan.setAdvanced4GMode(ltePref.isChecked());
-                } catch (ImsException ie) {
-                    // do nothing
-                }
-            }
+            ImsManager.setEnhanced4gLteModeSetting(this, ltePref.isChecked());
         } else if (preference == mButtonDataRoam) {
             if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
 
