diff --git a/res/values/config.xml b/res/values/config.xml
index 6b6bf04..adabe6c 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -257,4 +257,11 @@
     <!-- The country list that shortcut view can be enabled. -->
     <string-array name="config_countries_to_enable_shortcut_view" translatable="false">
     </string-array>
+
+    <!-- When an emergency call is placed and the carrier supports network initiated SUPL requests
+         for location, this configuration dictates whether or not the modem supports SUPL requests
+         being handled on the logical slot that is not currently configured as the default data
+         slot. If true, telephony will always try to place the emergency call on the subscription
+         associated with default data first, instead of using the default voice configuration.-->
+    <bool name="config_gnss_supl_requires_default_data_for_emergency">false</bool>
 </resources>
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 21685a3..177d669 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -56,6 +56,7 @@
 import com.android.ims.ImsManager;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.SubscriptionController;
 import com.android.phone.PhoneGlobals;
 import com.android.phone.PhoneUtils;
 import com.android.phone.R;
@@ -84,6 +85,7 @@
         private final PstnPhoneCapabilitiesNotifier mPhoneCapabilitiesNotifier;
         private boolean mIsEmergency;
         private boolean mIsRttCapable;
+        private boolean mIsEmergencyPreferred;
         private MmTelFeature.MmTelCapabilities mMmTelCapabilities;
         private ImsMmTelManager.CapabilityCallback mMmtelCapabilityCallback;
         private ImsMmTelManager mMmTelManager;
@@ -271,6 +273,11 @@
                 capabilities |= PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS;
             }
 
+            mIsEmergencyPreferred = isEmergencyPreferredAccount(subId);
+            if (mIsEmergencyPreferred) {
+                capabilities |= PhoneAccount.CAPABILITY_EMERGENCY_PREFERRED;
+            }
+
             if (isRttCurrentlySupported()) {
                 capabilities |= PhoneAccount.CAPABILITY_RTT;
                 mIsRttCapable = true;
@@ -410,6 +417,36 @@
         }
 
         /**
+         * In some cases, we need to try sending the emergency call over this PhoneAccount due to
+         * restrictions and limitations in MSIM configured devices. This includes the following:
+         * 1) The device does not support GNSS SUPL requests on the non-DDS subscription due to
+         *   modem limitations. If the device does not support SUPL on non-DDS, we need to try the
+         *   emergency call on the DDS subscription first to allow for SUPL to be completed.
+         *
+         * @return true if Telecom should prefer this PhoneAccount, false if there is no preference
+         * needed.
+         */
+        private boolean isEmergencyPreferredAccount(int subId) {
+            final boolean gnssSuplRequiresDefaultData = mContext.getResources().getBoolean(
+                    R.bool.config_gnss_supl_requires_default_data_for_emergency);
+            if (!gnssSuplRequiresDefaultData) {
+                // No preference is necessary.
+                return false;
+            }
+
+            // Only set a preference on MSIM devices
+            if (mTelephonyManager.getPhoneCount() <= 1) {
+                return false;
+            }
+            // Check to see if this PhoneAccount is associated with the default Data subscription.
+            if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+                return false;
+            }
+            SubscriptionController controller = SubscriptionController.getInstance();
+            return controller != null && (controller.getDefaultDataSubId() == subId);
+        }
+
+        /**
          * Determines from carrier configuration whether pausing of IMS video calls is supported.
          *
          * @return {@code true} if pausing IMS video calls is supported.
@@ -596,6 +633,14 @@
             }
         }
 
+        public void updateDefaultDataSubId() {
+            boolean isEmergencyPreferred = isEmergencyPreferredAccount(mPhone.getSubId());
+            if (isEmergencyPreferred != mIsEmergencyPreferred) {
+                Log.i(this, "updateDefaultDataSubId - changed, new value: " + isEmergencyPreferred);
+                mAccount = registerPstnPhoneAccount(mIsEmergency, mIsDummy);
+            }
+        }
+
         /**
          * Determines whether RTT is supported given the current state of the
          * device.
@@ -743,6 +788,15 @@
             }
             mServiceState = newState;
         }
+
+        @Override
+        public void onActiveDataSubscriptionIdChanged(int subId) {
+            synchronized (mAccountsLock) {
+                for (AccountEntry account : mAccounts) {
+                    account.updateDefaultDataSubId();
+                }
+            }
+        }
     };
 
     private static TelecomAccountRegistry sInstance;
@@ -951,7 +1005,8 @@
 
         // We also need to listen for changes to the service state (e.g. emergency -> in service)
         // because this could signal a removal or addition of a SIM in a single SIM phone.
-        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE);
+        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE
+                | PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE);
 
         // Listen for user switches.  When the user switches, we need to ensure that if the current
         // use is not the primary user we disable video calling.
