diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 7cbf80d..3760f24 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -69,7 +69,6 @@
 import android.telephony.NeighboringCellInfo;
 import android.telephony.NetworkScanRequest;
 import android.telephony.PhoneNumberRange;
-import android.telephony.PhoneNumberUtils;
 import android.telephony.RadioAccessFamily;
 import android.telephony.Rlog;
 import android.telephony.ServiceState;
@@ -153,11 +152,9 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Implementation of the ITelephony interface.
@@ -5973,12 +5970,16 @@
         }
         final long identity = Binder.clearCallingIdentity();
         try {
-            Map<Integer, List<EmergencyNumber>> results = getEmergencyNumberListInternal();
-            // Use ecclist to construct Emergency number list for backward compatibality
-            if (results.isEmpty()) {
-                results = getEmergencyNumberListFromEccList();
+            Map<Integer, List<EmergencyNumber>> emergencyNumberListInternal = new HashMap<>();
+            for (Phone phone: PhoneFactory.getPhones()) {
+                if (phone.getEmergencyNumberTracker() != null
+                        && phone.getEmergencyNumberTracker().getEmergencyNumberList() != null) {
+                    emergencyNumberListInternal.put(
+                            phone.getSubId(),
+                            phone.getEmergencyNumberTracker().getEmergencyNumberList());
+                }
             }
-            return results;
+            return emergencyNumberListInternal;
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -5994,40 +5995,14 @@
         }
         final long identity = Binder.clearCallingIdentity();
         try {
-            Map<Integer, List<EmergencyNumber>> emergencyNumberLists =
-                    getEmergencyNumberListInternal();
-
-            String defaultCountryIso = getNetworkCountryIsoForPhone(defaultPhone.getPhoneId());
-
-            if (!emergencyNumberLists.isEmpty()) {
-                for (List<EmergencyNumber> emergencyNumberList : emergencyNumberLists.values()) {
-                    if (emergencyNumberList != null) {
-                        for (EmergencyNumber num : emergencyNumberList) {
-                            // According to com.android.i18n.phonenumbers.ShortNumberInfo, in
-                            // these countries, if extra digits are added to an emergency number,
-                            // it no longer connects to the emergency service.
-                            Set<String> countriesRequiredForExactMatch = new HashSet<>();
-                            countriesRequiredForExactMatch.add("br");
-                            countriesRequiredForExactMatch.add("cl");
-                            countriesRequiredForExactMatch.add("ni");
-                            if (exactMatch || countriesRequiredForExactMatch.contains(
-                                    defaultCountryIso)) {
-                                if (num.getNumber().equals(number)) {
-                                    return true;
-                                }
-                            } else {
-                                if (number.startsWith(num.getNumber())) {
-                                    return true;
-                                }
-                            }
-
-                        }
+            for (Phone phone: PhoneFactory.getPhones()) {
+                if (phone.getEmergencyNumberTracker() != null
+                        && phone.getEmergencyNumberTracker() != null) {
+                    if (phone.getEmergencyNumberTracker().isEmergencyNumber(
+                            number, exactMatch)) {
+                        return true;
                     }
                 }
-            } else {
-                // For backward compatibility for devices launched before Q
-                return PhoneNumberUtils.isEmergencyNumberInternal(number, exactMatch,
-                        defaultCountryIso);
             }
             return false;
         } finally {
