diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e3a6dcd..dd6593b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -533,12 +533,6 @@
                 android:uiOptions="splitActionBarWhenNarrow">
         </activity>
 
-        <activity android:name="ImsEditor"
-                android:theme="@style/DialerSettingsLight"
-                android:configChanges="orientation|screenSize|keyboardHidden"
-                android:uiOptions="splitActionBarWhenNarrow">
-        </activity>
-
         <!-- End SIP -->
 
         <activity android:name="ErrorDialogActivity"
diff --git a/res/values-mcc310-mnc410/config.xml b/res/values-mcc310-mnc410/config.xml
new file mode 100644
index 0000000..bf89c34
--- /dev/null
+++ b/res/values-mcc310-mnc410/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+
+<resources>
+    <bool name="support_pause_ims_video_calls" translatable="false">false</bool>
+</resources>
\ No newline at end of file
diff --git a/res/values-mcc311-mnc480/config.xml b/res/values-mcc311-mnc480/config.xml
index 5cae0bc..b7d0d6e 100755
--- a/res/values-mcc311-mnc480/config.xml
+++ b/res/values-mcc311-mnc480/config.xml
@@ -23,4 +23,5 @@
     <!-- Determine whether the voicemail notification is persistent in the notification bar.
          If true, the voicemail notifications cannot be dismissed from the notification bar. -->
     <bool name="voicemail_notification_persistent">true</bool>
+    <bool name="support_pause_ims_video_calls" translatable="false">true</bool>
 </resources>
diff --git a/res/values/array.xml b/res/values/array.xml
deleted file mode 100644
index 79b6034..0000000
--- a/res/values/array.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-
-<!-- Array resources for the Phone app. -->
-<resources>
-    <!-- Array resource for IMS VT call quality entries-->
-    <string-array translatable="true" name="ims_vt_call_quality_entries">
-        <item>@string/ims_vt_call_quality_low</item>
-        <item>@string/ims_vt_call_quality_high</item>
-    </string-array>
-
-    <!-- Array resource for IMS VT call quality values-->
-    <string-array translatable="false" name="ims_vt_call_quality_values">
-        <item>0</item>
-        <item>1</item>
-    </string-array>
-</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index b7e3208..1f32b2d 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -156,4 +156,7 @@
     <!-- Determine whether the voicemail notification is persistent in the notification bar.
          If true, the voicemail notifications cannot be dismissed from the notification bar. -->
     <bool name="voicemail_notification_persistent">false</bool>
+
+    <!-- For IMS video over LTE calls, determines whether video pause signalling is supported. -->
+    <bool name="support_pause_ims_video_calls" translatable="false">true</bool>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 408d570..3a101bf 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -184,7 +184,7 @@
     <!-- GSM Call settings screen, setting option name -->
     <string name="additional_gsm_call_settings">Additional settings</string>
     <!-- GSM Call settings screen, setting option name, with label identifying the SIM the settings are for. -->
-    <string name="additional_gsm_call_settings_with_label">Additional settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
+    <string name="additional_gsm_call_settings_with_label">Additional settings (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
     <!-- GSM-only Call settings screen, setting option name-->
     <string name="sum_gsm_call_settings">Additional GSM only call settings</string>
     <!-- CDMA Call settings screen, setting option name -->
@@ -212,7 +212,7 @@
     <!-- Call forwarding settings screen, section heading -->
     <string name="call_forwarding_settings">Call forwarding settings</string>
     <!-- Call forwarding settings screen, section heading, with a label identifying the SIM the settings are for. -->
-    <string name="call_forwarding_settings_with_label">Call forwarding settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
+    <string name="call_forwarding_settings_with_label">Call forwarding settings (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
     <!-- Call settings screen, setting option name -->
     <string name="labelCF">Call forwarding</string>
 
@@ -257,9 +257,8 @@
     <string name="messageCFNRc">Number when unreachable</string>
     <!-- Call forwarding settings screen, setting summary text when forwarding to a specific number when unreachable-->
     <string name="sum_cfnrc_enabled">Forwarding to <xliff:g id="phonenumber" example="555-1212">{0}</xliff:g></string>
-    <!-- Call forwarding settings screen, setting summary text when "Forward when unreachable" is
-         disabled. [CHAR LIMIT=40] -->
-    <string name="sum_cfnrc_disabled">Off</string>
+    <!-- Call forwarding settings screen, setting summary text when Forward when unreachable is disabled -->
+    <string name="sum_cfnrc_disabled">Disabled</string>
     <!-- Error message displayed after failing to disable forwarding calls when the phone is unreachable -->
     <string name="disable_cfnrc_forbidden">Your carrier doesn\'t support disabling call forwarding when your phone is unreachable.</string>
 
@@ -268,7 +267,7 @@
     <!-- Toast in Call settings when asked to launch settings for a secondary user -->
     <string name="call_settings_primary_user_only">Call settings can only be changed by the primary user.</string>
     <!-- Title of the "Call settings" settings screen, with a text label identifying which SIM the settings are for. -->
-    <string name="call_settings_with_label">Call settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
+    <string name="call_settings_with_label">Call settings (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
     <!-- Title of the alert dialog displayed if an error occurs while updating Call settings -->
     <string name="error_updating_title">Call settings error</string>
     <!-- Toast in Call settings dialog while settings are being read -->
@@ -722,13 +721,13 @@
     <string name="fdn">Fixed Dialing Numbers</string>
     <!-- Title for "Fixed Dialing Number" settings, with a label to identify the SIM the settings
         apply to. -->
-    <string name="fdn_with_label">Fixed Dialing Numbers (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
+    <string name="fdn_with_label">Fixed Dialing Numbers (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
 
     <!-- Call settings screen, button label that takes you to the Fixed Dialing Number management screen -->
     <string name="manage_fdn_list">FDN list</string>
     <!-- Title for settings screen to manage Fixed Dialing Number contacts, with a label to identify
          the SIM the settings apply to. -->
-    <string name="fdn_list_with_label">FDN list (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
+    <string name="fdn_list_with_label">FDN list (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
     <!-- Call settings screen, preference item label -->
     <string name="fdn_activation">FDN activation</string>
     <!-- Call settings setting option name when FDN is enabled -->
@@ -1077,6 +1076,22 @@
         <item>3</item>
     </string-array>
 
+    <!-- Dtmf tones settings -->
+    <!-- Title for the DTMF Tones options displayed in Call Settings -->
+    <string name="dtmf_tones_title">DTMF tones</string>
+    <!-- Summary for the DTMF Tones options displayed in Call Settings -->
+    <string name="dtmf_tones_summary">Set the length of DTMF tones</string>
+    <!-- Options displayed as part of DTMF Tones in Call Settings -->
+    <string-array name="dtmf_tone_entries">
+      <item>Normal</item>
+      <item>Long</item>
+    </string-array>
+    <!-- Do not translate. -->
+    <string-array name="dtmf_tone_values" translatable="false">
+       <item>0</item>
+       <item>1</item>
+    </string-array>
+
     <!-- Title for the dialog used to display CDMA DisplayInfo -->
     <string name="network_info_message">Network message</string>
     <!-- Title for the dialog used to display a network error message to the user -->
diff --git a/res/xml/call_feature_setting.xml b/res/xml/call_feature_setting.xml
index 52a8815..f6b8eca 100644
--- a/res/xml/call_feature_setting.xml
+++ b/res/xml/call_feature_setting.xml
@@ -81,15 +81,4 @@
             android:targetClass="com.android.phone.CdmaCallOptions"/>
 
     </PreferenceScreen>
-
-    <PreferenceScreen
-        android:key="ims_account_settings_key"
-        android:title="@string/ims_accounts_title"
-        android:persistent="false">
-
-        <intent android:action="android.intent.action.MAIN"
-            android:targetPackage="com.android.phone"
-            android:targetClass="com.android.phone.ImsEditor" />
-    </PreferenceScreen>
-
 </PreferenceScreen>
diff --git a/res/xml/ims_edit.xml b/res/xml/ims_edit.xml
deleted file mode 100644
index f16e2f5..0000000
--- a/res/xml/ims_edit.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        android:title="@string/ims_edit_title"
-        android:persistent="false">
-
-    <ListPreference
-        android:key="@string/ims_vt_call_quality"
-        android:title="@string/ims_vt_call_quality_title"
-        android:entries="@array/ims_vt_call_quality_entries"
-        android:entryValues="@array/ims_vt_call_quality_values"
-        android:summary="@string/ims_vt_call_quality_unknown"
-        android:persistent="false"
-        android:enabled="true"
-        android:dialogTitle="@string/ims_vt_call_quality_title"/>
-
-</PreferenceScreen>
diff --git a/src/com/android/phone/ims/ImsEditor.java b/src/com/android/phone/ims/ImsEditor.java
deleted file mode 100644
index bbd4526..0000000
--- a/src/com/android/phone/ims/ImsEditor.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Copyright (C) 2015 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;
-
-import android.os.Bundle;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.telephony.SubscriptionManager;
-import android.util.Log;
-import android.widget.Toast;
-
-import com.android.ims.ImsConfig;
-import com.android.ims.ImsConfigListener;
-import com.android.ims.ImsException;
-import com.android.ims.ImsManager;
-import com.android.phone.R;
-
-/**
- * The activity class for editing a new or existing IMS profile.
- */
-public class ImsEditor extends PreferenceActivity
-        implements Preference.OnPreferenceChangeListener {
-
-    private static final String TAG = ImsEditor.class.getSimpleName();
-
-    private ListPreference mVideoCallQuality;
-    private ImsConfig mImsConfig;
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        Log.d(TAG, "onResume");
-        getVideoQuality();
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        Log.v(TAG, "start profile editor");
-        super.onCreate(savedInstanceState);
-
-        addPreferencesFromResource(R.xml.ims_edit);
-        PreferenceScreen screen = getPreferenceScreen();
-
-        mVideoCallQuality = (ListPreference) screen
-                .findPreference(getString(R.string.ims_vt_call_quality));
-        mVideoCallQuality.setOnPreferenceChangeListener(this);
-
-        try {
-            ImsManager imsManager = ImsManager.getInstance(getBaseContext(),
-                    SubscriptionManager.getDefaultVoiceSubId());
-            mImsConfig = imsManager.getConfigInterface();
-        } catch (ImsException e) {
-            mImsConfig = null;
-            Log.e(TAG, "ImsService is not running");
-        }
-    }
-
-    private ImsConfigListener imsConfigListener = new ImsConfigListener.Stub() {
-        public void onGetVideoQuality(int status, int quality) {
-            if (hasRequestFailed(status)) {
-                quality = ImsConfig.OperationValuesConstants.VIDEO_QUALITY_UNKNOWN;
-                Log.e(TAG, "onGetVideoQuality: failed. errorCode = " + status);
-            }
-            Log.d(TAG, "onGetVideoQuality: value = " + quality);
-            loadVideoCallQualityPrefs(quality);
-        }
-
-        public void onSetVideoQuality(int status) {
-            if (hasRequestFailed(status)) {
-                Log.e(TAG, "onSetVideoQuality: set failed. errorCode = " + status);
-                Toast.makeText(getApplicationContext(), R.string.ims_vt_call_quality_set_failed,
-                        Toast.LENGTH_SHORT).show();
-                getVideoQuality(); // Set request failed, get current value.
-            } else {
-                Log.d(TAG, "onSetVideoQuality: set succeeded.");
-            }
-        }
-
-        public void onGetFeatureResponse(int feature, int network, int value, int status) {
-            //TODO not required as of now
-        }
-
-        public void onSetFeatureResponse(int feature, int network, int value, int status) {
-            //TODO not required as of now
-        }
-    };
-
-    @Override
-    public boolean onPreferenceChange(Preference pref, Object newValue) {
-        if (pref.equals(mVideoCallQuality)) {
-            if (newValue == null) {
-                Log.e(TAG, "onPreferenceChange invalid value received");
-            } else {
-                final int quality = Integer.parseInt(newValue.toString());
-                boolean result = setVideoQuality(quality);
-                if (result) {
-                    loadVideoCallQualityPrefs(quality);
-                }
-                return result;
-            }
-        }
-        return true;
-    }
-
-    private void loadVideoCallQualityPrefs(int vqValue) {
-        Log.d(TAG, "loadVideoCallQualityPrefs, vqValue = " + vqValue);
-        final String videoQuality = videoQualityToString(vqValue);
-        mVideoCallQuality.setValue(String.valueOf(vqValue));
-        mVideoCallQuality.setSummary(videoQuality);
-    }
-
-    private void getVideoQuality() {
-        try {
-            if (mImsConfig != null) {
-                mImsConfig.getVideoQuality(imsConfigListener);
-            } else {
-                loadVideoCallQualityPrefs(ImsConfig.OperationValuesConstants.VIDEO_QUALITY_UNKNOWN);
-                Log.e(TAG, "getVideoQuality failed. mImsConfig is null");
-            }
-        } catch (ImsException e) {
-            Log.e(TAG, "getVideoQuality failed. Exception = " + e);
-        }
-    }
-
-    private boolean setVideoQuality(int quality) {
-        try {
-            if (mImsConfig != null) {
-                mImsConfig.setVideoQuality(quality, imsConfigListener);
-            } else {
-                Log.e(TAG, "setVideoQuality failed. mImsConfig is null");
-                return false;
-            }
-        } catch (ImsException e) {
-            Log.e(TAG, "setVideoQuality failed. Exception = " + e);
-            return false;
-        }
-        return true;
-    }
-
-    private boolean hasRequestFailed(int result) {
-        return (result != ImsConfig.OperationStatusConstants.SUCCESS);
-    }
-
-    private String videoQualityToString(int quality) {
-        switch (quality) {
-            case ImsConfig.OperationValuesConstants.VIDEO_QUALITY_HIGH:
-                return getString(R.string.ims_vt_call_quality_high);
-            case ImsConfig.OperationValuesConstants.VIDEO_QUALITY_LOW:
-                return getString(R.string.ims_vt_call_quality_low);
-            case ImsConfig.OperationValuesConstants.VIDEO_QUALITY_UNKNOWN:
-            default:
-                return getString(R.string.ims_vt_call_quality_unknown);
-        }
-    }
-}
diff --git a/src/com/android/services/telephony/PstnPhoneCapabilitiesNotifier.java b/src/com/android/services/telephony/PstnPhoneCapabilitiesNotifier.java
index 48568d3..7a2adf1 100644
--- a/src/com/android/services/telephony/PstnPhoneCapabilitiesNotifier.java
+++ b/src/com/android/services/telephony/PstnPhoneCapabilitiesNotifier.java
@@ -20,7 +20,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.net.Uri;
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.Message;
@@ -42,7 +41,15 @@
 final class PstnPhoneCapabilitiesNotifier {
     private static final int EVENT_VIDEO_CAPABILITIES_CHANGED = 1;
 
+    /**
+     * Listener called when video capabilities have changed.
+     */
+    public interface Listener {
+        public void onVideoCapabilitiesChanged(boolean isVideoCapable);
+    }
+
     private final PhoneProxy mPhoneProxy;
+    private final Listener mListener;
     private Phone mPhoneBase;
 
     private final Handler mHandler = new Handler() {
@@ -72,10 +79,11 @@
     };
 
     /*package*/
-    PstnPhoneCapabilitiesNotifier(PhoneProxy phoneProxy) {
+    PstnPhoneCapabilitiesNotifier(PhoneProxy phoneProxy, Listener listener) {
         Preconditions.checkNotNull(phoneProxy);
 
         mPhoneProxy = phoneProxy;
+        mListener = listener;
 
         registerForNotifications();
 
@@ -117,14 +125,17 @@
             Log.d(this, "handleVideoCapabilitesChanged. Video capability - " + isVideoCapable);
             PhoneAccountHandle accountHandle =
                     PhoneUtils.makePstnPhoneAccountHandle(mPhoneProxy);
+
             TelecomManager telecomMgr = TelecomManager.from(mPhoneProxy.getContext());
             PhoneAccount oldPhoneAccount = telecomMgr.getPhoneAccount(accountHandle);
             PhoneAccount.Builder builder = new PhoneAccount.Builder(oldPhoneAccount);
 
             int capabilites = newCapabilities(oldPhoneAccount.getCapabilities(),
                     PhoneAccount.CAPABILITY_VIDEO_CALLING, isVideoCapable);
+
             builder.setCapabilities(capabilites);
             telecomMgr.registerPhoneAccount(builder.build());
+            mListener.onVideoCapabilitiesChanged(isVideoCapable);
         } catch (Exception e) {
             Log.d(this, "handleVideoCapabilitesChanged. Exception=" + e);
         }
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 866118c..0a78180 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -18,6 +18,7 @@
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
@@ -53,11 +54,13 @@
     // is not supported, i.e. SubscriptionManager.INVALID_SLOT_ID or the 5th SIM in a phone.
     private final static int defaultPhoneAccountIcon =  R.drawable.ic_multi_sim;
 
-    private final class AccountEntry {
+    final class AccountEntry implements PstnPhoneCapabilitiesNotifier.Listener {
         private final Phone mPhone;
         private final PhoneAccount mAccount;
         private final PstnIncomingCallNotifier mIncomingCallNotifier;
         private final PstnPhoneCapabilitiesNotifier mPhoneCapabilitiesNotifier;
+        private boolean mIsVideoCapable;
+        private boolean mIsVideoPauseSupported;
 
         AccountEntry(Phone phone, boolean isEmergency, boolean isDummy) {
             mPhone = phone;
@@ -65,7 +68,8 @@
             Log.d(this, "Registered phoneAccount: %s with handle: %s",
                     mAccount, mAccount.getAccountHandle());
             mIncomingCallNotifier = new PstnIncomingCallNotifier((PhoneProxy) mPhone);
-            mPhoneCapabilitiesNotifier = new PstnPhoneCapabilitiesNotifier((PhoneProxy) mPhone);
+            mPhoneCapabilitiesNotifier = new PstnPhoneCapabilitiesNotifier((PhoneProxy) mPhone,
+                    this);
         }
 
         void teardown() {
@@ -101,6 +105,11 @@
             String description;
             Bitmap iconBitmap = null;
 
+            // We can only get the real slotId from the SubInfoRecord, we can't calculate the
+            // slotId from the subId or the phoneId in all instances.
+            SubscriptionInfo record =
+                    mSubscriptionManager.getActiveSubscriptionInfo(subId);
+
             if (isEmergency) {
                 label = mContext.getResources().getString(R.string.sim_label_emergency_calls);
                 description =
@@ -111,10 +120,7 @@
                 description = label = mTelephonyManager.getNetworkOperatorName();
             } else {
                 CharSequence subDisplayName = null;
-                // We can only get the real slotId from the SubInfoRecord, we can't calculate the
-                // slotId from the subId or the phoneId in all instances.
-                SubscriptionInfo record =
-                        mSubscriptionManager.getActiveSubscriptionInfo(subId);
+
                 if (record != null) {
                     subDisplayName = record.getDisplayName();
                     slotId = record.getSimSlotIndex();
@@ -149,9 +155,13 @@
                     PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS |
                     PhoneAccount.CAPABILITY_MULTI_USER;
 
-            if (mPhone.isVideoEnabled()) {
+            mIsVideoCapable = mPhone.isVideoEnabled();
+            if (mIsVideoCapable) {
                 capabilities |= PhoneAccount.CAPABILITY_VIDEO_CALLING;
             }
+            if (record != null) {
+                updateVideoPauseSupport(record);
+            }
 
             if (iconBitmap == null) {
                 iconBitmap = BitmapFactory.decodeResource(
@@ -179,6 +189,56 @@
         public PhoneAccountHandle getPhoneAccountHandle() {
             return mAccount != null ? mAccount.getAccountHandle() : null;
         }
+
+        /**
+         * Updates indicator for this {@link AccountEntry} to determine if the carrier supports
+         * pause/resume signalling for IMS video calls.  The carrier setting is stored in MNC/MCC
+         * configuration files.
+         *
+         * @param subscriptionInfo The subscription info.
+         */
+        private void updateVideoPauseSupport(SubscriptionInfo subscriptionInfo) {
+            // Get the configuration for the MNC/MCC specified in the current subscription info.
+            Configuration configuration = new Configuration();
+            if (subscriptionInfo.getMcc() == 0 && subscriptionInfo.getMnc() == 0) {
+                Configuration config = mContext.getResources().getConfiguration();
+                configuration.mcc = config.mcc;
+                configuration.mnc = config.mnc;
+                Log.i(this, "updateVideoPauseSupport -- no mcc/mnc for sub: " + subscriptionInfo +
+                        " using mcc/mnc from main context: " + configuration.mcc + "/" +
+                        configuration.mnc);
+            } else {
+                Log.i(this, "updateVideoPauseSupport -- mcc/mnc for sub: " + subscriptionInfo);
+
+                configuration.mcc = subscriptionInfo.getMcc();
+                configuration.mnc = subscriptionInfo.getMnc();
+            }
+
+            // Load the MNC/MCC specific configuration.
+            Context subContext = mContext.createConfigurationContext(configuration);
+            mIsVideoPauseSupported = subContext.getResources().getBoolean(
+                    R.bool.support_pause_ims_video_calls);
+        }
+
+        /**
+         * Receives callback from {@link PstnPhoneCapabilitiesNotifier} when the video capabilities
+         * have changed.
+         *
+         * @param isVideoCapable {@code true} if video is capable.
+         */
+        @Override
+        public void onVideoCapabilitiesChanged(boolean isVideoCapable) {
+            mIsVideoCapable = isVideoCapable;
+        }
+
+        /**
+         * Indicates whether this account supports pausing video calls.
+         * @return {@code true} if the account supports pausing video calls, {@code false}
+         * otherwise.
+         */
+        public boolean isVideoPauseSupported() {
+            return mIsVideoCapable && mIsVideoPauseSupported;
+        }
     }
 
     private OnSubscriptionsChangedListener mOnSubscriptionsChangedListener =
@@ -238,6 +298,22 @@
     }
 
     /**
+     * Determines if the {@link AccountEntry} associated with a {@link PhoneAccountHandle} supports
+     * pausing video calls.
+     *
+     * @param handle The {@link PhoneAccountHandle}.
+     * @return {@code True} if video pausing is supported.
+     */
+    boolean isVideoPauseSupported(PhoneAccountHandle handle) {
+        for (AccountEntry entry : mAccounts) {
+            if (entry.getPhoneAccountHandle().equals(handle)) {
+                return entry.isVideoPauseSupported();
+            }
+        }
+        return false;
+    }
+
+    /**
      * Sets up all the phone accounts for SIMs on first boot.
      */
     void setupOnBoot() {
@@ -255,6 +331,7 @@
         // because this could signal a removal or addition of a SIM in a single SIM phone.
         mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE);
     }
+
     /**
      * Determines if the list of {@link AccountEntry}(s) contains an {@link AccountEntry} with a
      * specified {@link PhoneAccountHandle}.
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 1df63e7..10c5e4a 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -249,6 +249,12 @@
     private boolean mHasHighDefAudio;
 
     /**
+     * For video calls, indicates whether the outgoing video for the call can be paused using
+     * the {@link android.telecom.VideoProfile.VideoState#PAUSED} VideoState.
+     */
+    private boolean mIsVideoPauseSupported;
+
+    /**
      * Listeners to our TelephonyConnection specific callbacks
      */
     private final Set<TelephonyConnectionListener> mTelephonyListeners = Collections.newSetFromMap(
@@ -481,6 +487,8 @@
         newCapabilities = changeCapability(newCapabilities,
                 CAPABILITY_HIGH_DEF_AUDIO, mHasHighDefAudio);
         newCapabilities = changeCapability(newCapabilities, CAPABILITY_WIFI, mIsWifi);
+        newCapabilities = changeCapability(newCapabilities, CAPABILITY_CAN_PAUSE_VIDEO,
+                mIsVideoPauseSupported && mRemoteVideoCapable && mLocalVideoCapable);
 
         newCapabilities = applyConferenceTerminationCapabilities(newCapabilities);
 
@@ -848,6 +856,16 @@
     }
 
     /**
+     * For video calls, sets whether this connection supports pausing the outgoing video for the
+     * call using the {@link android.telecom.VideoProfile.VideoState#PAUSED} VideoState.
+     *
+     * @param isVideoPauseSupported {@code true} if pause state supported, {@code false} otherwise.
+     */
+    public void setVideoPauseSupported(boolean isVideoPauseSupported) {
+        mIsVideoPauseSupported = isVideoPauseSupported;
+    }
+
+    /**
      * Whether the original connection is an IMS connection.
      * @return {@code True} if the original connection is an IMS connection, {@code false}
      *     otherwise.
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 39dbfc1..eba3461 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -184,7 +184,7 @@
         }
 
         final TelephonyConnection connection =
-                createConnectionFor(phone, null, true /* isOutgoing */);
+                createConnectionFor(phone, null, true /* isOutgoing */, request.getAccountHandle());
         if (connection == null) {
             return Connection.createFailedConnection(
                     DisconnectCauseUtil.toTelecomDisconnectCause(
@@ -257,9 +257,9 @@
         }
 
         Connection connection =
-                createConnectionFor(phone, originalConnection, false /* isOutgoing */);
+                createConnectionFor(phone, originalConnection, false /* isOutgoing */,
+                        request.getAccountHandle());
         if (connection == null) {
-            connection = Connection.createCanceledConnection();
             return Connection.createCanceledConnection();
         } else {
             return connection;
@@ -307,7 +307,8 @@
 
         TelephonyConnection connection =
                 createConnectionFor(phone, unknownConnection,
-                        !unknownConnection.isIncoming() /* isOutgoing */);
+                        !unknownConnection.isIncoming() /* isOutgoing */,
+                        request.getAccountHandle());
 
         if (connection == null) {
             return Connection.createCanceledConnection();
@@ -367,7 +368,8 @@
     private TelephonyConnection createConnectionFor(
             Phone phone,
             com.android.internal.telephony.Connection originalConnection,
-            boolean isOutgoing) {
+            boolean isOutgoing,
+            PhoneAccountHandle phoneAccountHandle) {
         TelephonyConnection returnConnection = null;
         int phoneType = phone.getPhoneType();
         if (phoneType == TelephonyManager.PHONE_TYPE_GSM) {
@@ -380,6 +382,9 @@
         if (returnConnection != null) {
             // Listen to Telephony specific callbacks from the connection
             returnConnection.addTelephonyConnectionListener(mTelephonyConnectionListener);
+            returnConnection.setVideoPauseSupported(
+                    TelecomAccountRegistry.getInstance(this).isVideoPauseSupported(
+                            phoneAccountHandle));
         }
         return returnConnection;
     }
