Merge "Print out S2 cell token in the lookup tool" into main
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 09258a4..b6171fc 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -642,7 +642,7 @@
             android:name=".settings.RadioInfo"
             android:label="@string/phone_info_label"
             android:exported="true"
-            android:theme="@style/Theme.AppCompat.DayNight">
+            android:theme="@style/RadioInfoTheme">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
diff --git a/ecc/input/eccdata.txt b/ecc/input/eccdata.txt
index 95b70d5..5852d76 100644
--- a/ecc/input/eccdata.txt
+++ b/ecc/input/eccdata.txt
@@ -547,7 +547,8 @@
   }
   eccs {
     phone_number: "1414"
-    types: TYPE_UNSPECIFIED
+    types: MOUNTAIN_RESCUE
+    routing: NORMAL
   }
   eccs {
     phone_number: "0800117117"
diff --git a/ecc/output/eccdata b/ecc/output/eccdata
index 513d6b9..d16b06f 100644
--- a/ecc/output/eccdata
+++ b/ecc/output/eccdata
Binary files differ
diff --git a/res/layout/radio_info.xml b/res/layout/radio_info.xml
index f18eda0..24590bc 100644
--- a/res/layout/radio_info.xml
+++ b/res/layout/radio_info.xml
@@ -20,7 +20,6 @@
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:paddingTop="40dp"
     android:layoutDirection="locale"
     android:textDirection="locale">
 
@@ -249,6 +248,14 @@
                 android:layout_height="wrap_content"
                 android:text="@string/simulate_out_of_service_string"/>
 
+        <!-- Enforce camping on satellite channel -->
+        <Switch android:id="@+id/enforce_satellite_channel"
+            android:textSize="14sp"
+            android:layout_marginTop="8dip"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/enforce_satellite_channel_string"/>
+
         <!-- Simulate this SIM to be satellite -->
         <Switch android:id="@+id/mock_carrier_roaming_satellite"
                 android:textSize="14sp"
@@ -267,6 +274,15 @@
                 android:text="@string/esos_satellite_string"
         />
 
+        <!-- Satellite enable non-emergency mode-->
+        <Button android:id="@+id/satellite_enable_non_emergency_mode"
+            android:textSize="14sp"
+            android:layout_marginTop="8dip"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAllCaps="false"
+            android:text="@string/satellite_enable_non_emergency_mode_string" />
+
         <!-- VoLTE provisioned -->
         <Switch android:id="@+id/volte_provisioned_switch"
                 android:textSize="14sp"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 2827cf9..0533de5 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Stel Verwyderbare-e-SIM as Verstek"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobieleradiokrag"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simuleer is nie beskikbaar nie (Slegs ontfoutingbou)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Satellietmodus van skyndiensverskaffer (net ontfoutingsbou)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Toets regte satelliet-eSOS-modus (net ontfoutingsbou)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Bekyk SIM-adresboek"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 96ef7ac..c439c59 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"የሚወገድን ኢሲም ነባሪ በሚል አቀናብር"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"የሞባይል ሬዲዮ ኃይል"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"ከአገልግሎት ውጭን አስመስል (የስህተት ማረሚያ ግንብ ብቻ)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier Satellite Mode (የስህተት ማረሚያ ግንባታ ብቻ)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"የእውነተኛ ሳተላይት eSOS ሁነታን ይሞክሩ (የስህተት ማረሚያ ግንብ ብቻ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"የሲም አድራሻ ደብተር አሳይ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 97020a6..570cbfb 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"‏ضبط شريحة eSIM القابلة للإزالة كشريحة تلقائية"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"طاقة اللاسلكي للجوّال"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"محاكاة الخطأ \"خارج الخدمة\" (الإصدار المخصص لتصحيح الأخطاء فقط)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"وضع القمر الصناعي التجريبي لمشغّل شبكة الجوّال (إصدار مخصّص لتصحيح الأخطاء فقط)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"‏اختبار وضع القمر الصناعي الحقيقي لنظام eSOS (إصدار مخصّص لتصحيح الأخطاء فقط)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"‏عرض دفتر عناوين SIM"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 987d5dd..46b2e35 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"আঁতৰাব পৰা ই-ছিম ডিফ’ল্ট হিচাপে ছেট কৰক"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ম’বাইলৰ ৰেডিঅ’ পাৱাৰ"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"সেৱাত নাই ছিমুলে’ট কৰক (কেৱল ডিবাগ বিল্ড)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Force Camp উপগ্ৰহ LTE চেনেল (কেৱল ডিবাগ বিল্ড)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"নকল বাহক উপগ্ৰহ ম’ড (কেৱল ডিবাগ বিল্ড)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"বাস্তৱিক উপগ্ৰহৰ eSOS ম’ড পৰীক্ষা কৰক (কেৱল ডিবাগ বিল্ড)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ছিম ঠিকনা সূচী চাওক"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 5e925a5..ce86e41 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Çıxarıla bilən eSIM\'i Defolt olaraq təyin edin"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobil Radio Enerjisi"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\"Xidmətdənkənar\" Simulyasiyası (yalnız Debaq Versiyası)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Sınaq Daşıyıcı Peyk Rejimi (yalnız sazlama versiyası)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Real peyk eSOS rejimini sınaqdan keçirin (yalnız sazlama versiyası)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM Ünvan Kitabçasına Baxın"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index bd20dfa..3032149 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Podesi prenosivi eSIM kao podrazumevani"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Napajanje za radio na mobilnim uređajima"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulacija ne funkcioniše (samo verzija sa otklonjenim greškama)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Lažni režim mobilnog operatera za slanje preko satelita (samo verzija za otklanjanje grešaka)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testirajte stvarni satelitski eSOS režim (samo verzija sa otklonjenim greškama)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Prikaži adresar SIM-a"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index bc42892..bbc8201 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -586,7 +586,7 @@
     <string name="onscreenShowDialpadText" msgid="658465753816164079">"Кнопкі набору"</string>
     <string name="onscreenMuteText" msgid="5470306116733843621">"Выключыць гук"</string>
     <string name="onscreenAddCallText" msgid="9075675082903611677">"Дадаць выклік"</string>
-    <string name="onscreenMergeCallsText" msgid="3692389519611225407">"Аб\'яднаць выклікі"</string>
+    <string name="onscreenMergeCallsText" msgid="3692389519611225407">"Аб’яднаць выклікі"</string>
     <string name="onscreenSwapCallsText" msgid="2682542150803377991">"Пераключыць"</string>
     <string name="onscreenManageCallsText" msgid="1162047856081836469">"Кіраваць выклікамі"</string>
     <string name="onscreenManageConferenceText" msgid="4700574060601755137">"Кірав. канферэнцыяй"</string>
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Зрабіць здымную eSIM-карту стандартнай"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Магутнасць радыёсігналу"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Мадэляванне знаходжання па-за сеткай (толькі ў зборцы для адладкі)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Імітацыя рэжыму спадарожніка з SIM-картай ад аператара (толькі ў зборцы для адладкі)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Тэсціраванне рэальнага рэжыму спадарожнікавага падключэння eSOS (толькі ў зборцы для адладкі)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Праглядзець адрасную кнігу на SIM-карце"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index fb7264e..d82df02 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Задаване на електронната SIM карта с изваждащ се чип като основна"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Мощност на мобилното радио"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Симулиране на липса на услуга (само в компилацията за отстраняване на грешки)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Симулиран сателитен режим от оператора (само в компилацията за отстраняване на грешки)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Тестване на режим на истински сателитен eSOS (само в компилацията за отстраняване на грешки)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Преглед на указателя на SIM картата"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 8f47094..20d746e 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"সরিয়ে দেওয়া যায় এমন eSIM ডিফল্ট হিসেবে সেট করুন"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"মোবাইল রেডিওর গুণমান"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"আউট-অফ-সার্ভিস সিমুলেট করা (শুধুমাত্র ডিবাগ বিল্ডের জন্য)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"নকল পরিষেবা প্রদানকারী উপগ্রহ মোড (শুধুমাত্র ডিবাগ বিল্ড)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"রিয়েল স্যাটেলাইট eSOS মোড পরীক্ষা করুন (শুধুমাত্র ডিবাগ বিল্ড)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"সিম অ্যাড্রেস বুক দেখুন"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 2fd44d8..5884efb 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Postavljanje uklonjive eSim kartice kao zadane"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Snaga mobilnog radija"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulacija ne radi (samo verzija za otklanjanje grešaka)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Lažni način rada operatera za slanje putem satelita (samo verzija za otklanjanje grešaka)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testiraj stvarni način rada satelitskog eSOS-a (samo verzija za otklanjanje grešaka)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Prikaži SIM adresar"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index e351f02..9e9b50f 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Defineix l\'eSIM extraïble com a opció predeterminada"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potència del senyal mòbil"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simula que està fora de servei (només per a la compilació de depuració)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Força el canal LTE del satèl·lit de camp (només per a la compilació de depuració)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mode de satèl·lit d\'un operador de telefonia mòbil simulat (només per a la compilació de depuració)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Provar el mode eSOS de satèl·lit real (només per a la compilació de depuració)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Mostra la llibreta d\'adreces de la SIM"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 5b76b8f..88a0ba8 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Nastavit vyjímatelnou eSIM jako výchozí"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Výkon mobilního přijímače"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulovat provoz mimo službu (pouze ladicí sestavení)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulace satelitního režimu operátora (pouze ladicí sestavení)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Otestovat reálný režim nouzových zpráv přes satelit (pouze ladicí sestavení)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Zobrazit adresář SIM karty"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index d73bc19..347ce35 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Konfigurer eSIM, der kan fjernes, som standard"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobilsendestyrke"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulering af enhed, der er ude af drift (kun i fejlretningsbuild)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Gennemtving Camp Satellite LTE-kanal (kun fejlretningsbuild)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Test af satellittilstand via mobilselskab (kun fejlretningsbuild)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Test af virkelig eSOS-satellittilstand (kun fejlretningsbuild)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Vis adressebog på SIM-kortet"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 9c50dd7..cea616c 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Wechsel-eSIM als Standard festlegen"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobilfunkstärke"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"„Außer Betrieb“ simulieren (nur Debug-Build)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Vom Mobilfunkanbieter simulierter Satellitenmodus (nur Debug-Build)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"eSOS-Modus mit echtem Satelliten testen (nur Debug-Build)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM-Adressbuch anzeigen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index cf33306..03f93dc 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Ορισμός αφαιρούμενης eSIM ως προεπιλεγμένης"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Ισχύς πομπού κινητής τηλεφωνίας"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Η προσομοίωση δεν λειτουργεί (μόνο έκδοση εντοπισμού σφαλμάτων)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Εικονική λειτουργία δορυφόρου εταιρείας κινητής τηλεφωνίας (μόνο έκδοση εντοπισμού σφαλμάτων)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Δοκιμή πραγματικής δορυφορικής λειτουργίας eSOS (μόνο έκδοση εντοπισμού σφαλμάτων)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Προβολή βιβλίου διευθύνσεων κάρτας SIM"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 13cd54b..81b02e0 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Set removable eSIM as default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile radio power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate out of service (debug build only)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock operator satellite mode (debug build only)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (debug build only)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM address book"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 9741778..81ceabf 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Set Removable eSIM as Default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile Radio Power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate Out of Service (Debug Build only)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Force Camp Satellite LTE Channel (Debug Build only)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier Satellite Mode (Debug Build only)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (Debug Build only)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM Address Book"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 13cd54b..81b02e0 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Set removable eSIM as default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile radio power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate out of service (debug build only)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock operator satellite mode (debug build only)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (debug build only)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM address book"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 13cd54b..81b02e0 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Set removable eSIM as default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile radio power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate out of service (debug build only)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock operator satellite mode (debug build only)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (debug build only)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM address book"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index f805a1e..7a228f5 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎Set Removable eSIM as Default‎‏‎‎‏‎"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‏‎Mobile Radio Power‎‏‎‎‏‎"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎Simulate Out of Service (Debug Build only)‎‏‎‎‏‎"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‏‎‎‏‎‎‏‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‎‎Force Camp Satellite LTE Channel (Debug Build only)‎‏‎‎‏‎"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎Mock Carrier Satellite Mode (Debug Build only)‎‏‎‎‏‎"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎Test real satellite eSOS mode (Debug Build only)‎‏‎‎‏‎"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‎View SIM Address Book‎‏‎‎‏‎"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 27a4190..2bdfe17 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Establecer eSIM extraíble como predeterminada"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potencia de la señal móvil"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simular fuera de servicio (solo para la compilación de depuración)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Modo Satélite del operador de prueba (solo en la compilación de depuración)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Prueba el modo eSOS de satélite real (solo en la compilación de depuración)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver libreta de direcciones de SIM"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index b1f0611..ec55cc2 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Establecer eSIM extraíble como predeterminada"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potencia de la señal móvil"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simular fuera del servicio (solo versión de depuración)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulación del modo Satélite de operador (solo versión de depuración)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Probar el modo eSOS por satélite real (solo versión de depuración)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver libreta de direcciones de tarjeta SIM"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 1fc277f..1406418 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Eemaldatava eSIM-i määramine vaikevalikuks"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobiiliraadio toide"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simuleerimine ei tööta (ainult silumisjärgus)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simuleeritud operaatori satelliidirežiim (ainult silumisjärgus)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Režiimi eSOS katsetamine reaalse satelliitsidesüsteemi puhul (ainult silumisjärk)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Kuva SIM-i aadressiraamat"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 0f889d1..10a6553 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Ezarri eSIM aldagarria lehenetsi gisa"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Sare mugikor bidezko irratiaren indarra"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulatu gailua ez dabilela (arazketa-konpilazioa soilik)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulatu operadorearen satelite modua (arazketa-konpilazioa soilik)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Probatu satelite bidezko SOS larrialdien modua (arazketa-konpilazioa soilik)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ikusi SIMeko kontaktuak"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 60abd7f..7994c71 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"تنظیم سیم‌کارت داخلی جداشدنی به‌عنوان پیش‌فرض"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"توان رادیوی تلفن همراه"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"شبیه‌سازی از کار افتادن (فقط ساخت اشکال‌زدایی)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"حالت ماهواره‌ای شرکت مخابراتی ساختگی (فقط ساخت اشکال‌زدایی)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"آزمایش کردن حالت واقعی درخواست کمک اضطراری ماهواره‌ای (فقط ساخت اشکال‌زدایی)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"مشاهده دفترچه نشانی سیم‌کارت"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index d347488..c821edc 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Aseta poistettava eSIM oletukseksi"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobiiliradion voimakkuus"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Epäkunnossa-simulaatio (vain virheenkorjauksen koontiversio)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Operaattorin satelliittitilaesimerkki (vain virheenkorjauksen koontiversio)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testaa oikeaa Satellite eSOS ‑tilaa (vain virheenkorjauksen koontiversio)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Näytä SIM-kortin osoitekirja"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 03c0e56..cb23c11 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Définir la carte eSIM amovible comme carte SIM par défaut"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Alimentation de radio cellulaire"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulation de l\'appareil hors service (version de débogage uniquement)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mode Satellite de l\'opérateur simulé (version de débogage uniquement)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Tester le mode eSOS par satellite réel (version de débogage uniquement)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Afficher le carnet d\'adresses de la carte SIM"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 8fac282..988776a 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Définir l\'eSIM amovible comme SIM par défaut"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Alimentation radio mobile"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simuler une panne (version de débogage uniquement)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simuler le mode Satellite de l\'opérateur (version de débogage uniquement)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Tester le SOS par satellite en mode réel (version de débogage uniquement)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Afficher le carnet d\'adresses de la carte SIM"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 7d680f7..6accf37 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Establecer eSIM extraíble como predeterminada"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Alimentación da radio móbil"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simular Fóra de servizo (só compilación de depuración)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Forzar o canal LTE do satélite do campamento (só compilación de depuración)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simular o modo Satélite do operador (só compilación de depuración)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Probar o modo real eSOS por satélite (só compilación de depuración)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver axenda de enderezos da SIM"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 19d127d..c4d0bff 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"કાઢી નાખી શકાય એવા ઇ-સિમ કાર્ડને ડિફૉલ્ટ તરીકે સેટ કરો"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"મોબાઇલ રેડિયો પાવર"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'સેવા ઉપલબ્ધ નથી\' મોડ સિમ્યુલેટ કરો (માત્ર ડિબગ બિલ્ડ માટે)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"મૉક કૅરિઅર સૅટલાઇટ મોડ (માત્ર ડિબગ બિલ્ડ માટે)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"રિઅલ સૅટલાઇટ eSOS મોડનું પરિક્ષણ કરો (માત્ર ડિબગ બિલ્ડ માટે)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"સિમમાં સરનામા પુસ્તિકા જુઓ"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 5e172b1..77b4283 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"हटाए जा सकने वाले ई-सिम को डिफ़ॉल्ट के तौर पर सेट करें"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"मोबाइल रेडियो पावर"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"सिम्युलेट किया गया डिवाइस काम नहीं कर रहा है (सिर्फ़ डीबग के लिए बिल्ड)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी के सैटलाइट मोड की मॉक टेस्टिंग करें (सिर्फ़ डीबग के लिए बिल्ड)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"रीयल सैटलाइट इमरजेंसी एसओएस मोड को आज़माएं (सिर्फ़ डीबग के लिए बिल्ड)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"सिम में संपर्कों के पते की सूची देखें"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index e33b502..d8aab6b 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Postavljanje uklonjivog eSIM-a kao zadanog"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Snaga mobilnog radija"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulacija stanja \"izvan upotrebe\" (samo međuverzija programa za otklanjanje pogrešaka)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Lažni način mobilnog operatera za slanje putem satelita (samo međuverzija programa za otklanjanje pogrešaka)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testiranje eSOS načina pravog satelita (samo međuverzija programa za otklanjanje pogrešaka)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Prikaži imenik SIM-a"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 62c413a..f6b614a 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Cserélhető eSIM beállítása alapértelmezettként"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobil rádióadó teljesítménye"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Szolgáltatáskiesés szimulációja (csak hibaelhárító build)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Szimulált szolgáltató – Műholdas mód (csak hibaelhárító build)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"A valódi műholdas eSOS mód tesztelése (csak hibaelhárító build)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM-kártya telefonkönyvének megtekintése"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 731c6fb..bb149c6 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Սահմանել հեռացվելի eSIM քարտը որպես կանխադրված"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Բջջային ռադիոազդանշանի հզորությունը"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Սպասարկման գոտուց դուրս գտնվելու սիմուլյացիա (միայն վրիպազերծման կառուցում)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Force Camp արբանյակային LTE ալիք (միայն վրիպազերծման կառուցման մեջ)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Օպերատորի արբանյակի ռեժիմի սիմուլյացիա (միայն վրիպազերծման կառուցում)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Փորձարկել իրական արբանյակային eSOS ռեժիմը (միայն վրիպազերծման կառուցման մեջ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Դիտել SIM քարտի հասցեագիրքը"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 1e9ca9a..37efa38 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Tetapkan eSIM yang Dapat Dilepas sebagai Default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Daya Radio Seluler"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulasi Tidak dapat Digunakan (Khusus Build Debug)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mode Satelit Operator Tiruan (khusus Build Debug)."</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Uji mode eSOS satelit asli (khusus Build Debug)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Lihat Buku Alamat SIM"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index a201c1e..f028400 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Stilla laust eSIM sem sjálfgefið"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Loftnetsstyrkur farsíma"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Líkja eftir „Utan þjónustusvæðis“ (aðeins villuleitarsmíði)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Eftirlíking af gervihnattarstillingu símafyrirtækis (aðeins villuleitarsmíði)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Prófa eSOS-stillingu raunverulegs gervihnattar (eingöngu villuleitarsmíð)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Skoða símaskrá SIM-korts"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index cadede4..2718b94 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Imposta la eSIM rimovibile come predefinita"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potenza del segnale radio mobile"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulazione non disponibile (solo build di debug)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Modalità satellite operatore fittizio (solo build di debug)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testa la modalità eSOS con satellite reale (solo build di debug)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Visualizza rubrica SIM"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index f93dc1d..b3941a6 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -846,6 +846,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"‏הגדרת eSIM נשלף כברירת המחדל"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"הפעלה של רדיו סלולרי"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"‏סימולציה של המצב \'לא בשירות\' (גרסת build לניפוי באגים בלבד)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"‏מצב שמדמה תקשורת לוויינית דרך ספק הסלולר (גרסת build לניפוי באגים בלבד)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"‏מצב בדיקה שמדמה תקשורת לוויינית eSOS (גרסת build לניפוי באגים בלבד)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"‏הצגת פנקס כתובות של SIM"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9642efc..be68201 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"リムーバブル eSIM をデフォルトに設定"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"モバイル無線電力"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"圏外状態のシミュレート(デバッグビルドのみ)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"携帯通信会社の疑似航空写真モード(デバッグビルドのみ)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"実際に衛星経由の緊急 SOS モードをテストする(デバッグビルドのみ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM のアドレス帳を表示"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 0d673a6..0f3e3b5 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"მოსახსნელი eSIM-ის ნაგულისხმევად დაყენება"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"მობილური რადიოკავშირის ელკვება"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"სიმულაცია სერვისის გარეშე (მხოლოდ გამართვის აგება)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"სიმულაციური ოპერატორის სატელიტის რეჟიმი (მხოლოდ გამართვის აგება)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"სატელიტური eSOS-ის რეალური რეჟიმის ტესტირება (მხოლოდ გამართვის მიზნით)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM-ის მისამართების წიგნის ნახვა"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 25ab94d..31be80c 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Алынбалы eSIM әдепкі етіп орнату"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Радиосигнал күші"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\"Істен шыққан\" қызметін симуляциялау (түзету құрамасы ғана)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier жер серігі режимі (тек түзету құрамасы)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Шынайы жерсеріктегі құтқару қызметін шақыру режимін сынау (тек түзету құрамасы)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM мекенжай кітапшасын көру"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index e8084f9..b523c2a 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"កំណត់ eSIM ដែល​អាចដកបាន​ជាលំនាំដើម"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ថាមពល​វិទ្យុ​ទូរសព្ទ​ចល័ត"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"ត្រាប់តាម​ពេលគ្មានសេវា (កំណែបង្កើតសម្រាប់ជួសជុលតែប៉ុណ្ណោះ)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Force Camp Satellite LTE Channel (តែកំណែបង្កើតសម្រាប់ជួសជុលប៉ុណ្ណោះ)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"មុខងារ​ផ្កាយរណប​ក្រុមហ៊ុន​សេវាទូរសព្ទ​សាកល្បង (កំណែបង្កើត​សម្រាប់​ជួសជុល​តែប៉ុណ្ណោះ)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"មុខងារ​ធ្វើតេស្ត eSOS ផ្កាយរណប​ជាក់ស្ដែង (កំណែបង្កើត​សម្រាប់​ជួសជុល​តែប៉ុណ្ណោះ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"មើលសៀវភៅអាសយដ្ឋានក្នុងស៊ីមកាត"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 9feb53a..f18c5ff 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ತೆಗೆದುಹಾಕಬಹುದಾದ eSIM ಅನ್ನು ಡೀಫಾಲ್ಟ್ ಆಗಿ ಸೆಟ್ ಮಾಡಿ"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ಮೊಬೈಲ್ ರೇಡಿಯೋ ಪವರ್"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"ಸೇವೆಯಲ್ಲಿಲ್ಲದಿರುವುದನ್ನು ಸಿಮ್ಯುಲೇಟ್‌ ಮಾಡುವುದು (ಡೀಬಗ್ ಬಿಲ್ಡ್ ಮಾತ್ರ)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier ಉಪಗ್ರಹ ಮೋಡ್ (ಡೀಬಗ್ ಬಿಲ್ಡ್ ಮಾತ್ರ)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"ನೈಜ ಸ್ಯಾಟಲೈಟ್ eSOS ಮೋಡ್ ಅನ್ನು ಪರೀಕ್ಷಿಸಿ (ಡೀಬಗ್ ಬಿಲ್ಡ್ ಮಾತ್ರ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ಸಿಮ್ ವಿಳಾಸ ಪುಸ್ತಕವನ್ನು ವೀಕ್ಷಿಸಿ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index c3b4425..61badde 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"삭제 가능한 eSIM을 기본으로 설정"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"모바일 무선 전력"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'서비스 지역 벗어남\' 시뮬레이션(디버그 빌드만 해당)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"모의 이동통신사 위성 모드(디버그 빌드만 해당)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"실제 위성 eSOS 모드 테스트(디버그 빌드만 해당)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM 주소록 보기"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 3b086e9..2fc1d1d 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Чыгарылуучу eSIM-картаны демейки катары коюу"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Мобилдик радионун кубаты"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Тейлөө аймагынын сыртында режимин иштетүү (Мүчүлүштүктөрдү оңдоо үчүн гана)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Симуляцияланган байланыш операторунун спутниги (Мүчүлүштүктөрдү оңдоо үчүн гана)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Чыныгы спутник eSOS режимин сыноо (Мүчүлүштүктөрдү оңдоо үчүн гана)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM картадагы дарек китепчесин көрүү"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index d771fe3..1ad86f4 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ຕັ້ງຄ່າ eSIM ແບບຖອດໄດ້ໃຫ້ເປັນຄ່າເລີ່ມຕົ້ນ"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ພະລັງງານວິທະຍຸມືຖື"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"ຈໍາລອງເຫດການບໍ່ພ້ອມໃຫ້ບໍລິການ (ສໍາລັບ Build ດີບັກເທົ່ານັ້ນ)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"ຈຳລອງໂໝດດາວທຽມຂອງຜູ້ໃຫ້ບໍລິການ (ສຳລັບ Build ດີບັກເທົ່ານັ້ນ)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"ທົດສອບໂໝດ eSOS ດາວທຽມແທ້ (ສຳລັບ Build ດີບັກເທົ່ານັ້ນ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ເບິ່ງສະໝຸດທີ່ຢູ່ໃນຊິມ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 3034573..3ad4cf8 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Nustatyti pašalinimą „eSIM“ kaip numatytąją"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobiliojo ryšio radijo signalas"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Modeliavimas neteikiamas (tik derinimo versija)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Netikras operatoriaus satelito režimas (tik derinimo versija)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Išbandykite tikrą Pagalbos iškvietimo kritiniu atveju naudojant palydovinį ryšį režimą (tik derinimo versija)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Žiūrėti SIM kortelės adresų knygą"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 10a7a49..b8f28df 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Iestatīt noņemamu eSIM kā noklusējumu"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobilā tālruņa radio signāla stiprums"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulācijas ierīce nedarbojas (tikai atkļūdošanas būvējums)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mobilo sakaru operatora satelīta režīma imitēšana (tikai atkļūdošanas būvējums)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Izmēģināt īsta satelīta eSOS režīmu (tikai atkļūdošanas būvējumā)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Skatīt SIM adrešu grāmatu"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 450fce0..5e3ab1f 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Поставување eSIM што може да се отстрани како стандардна"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Радио-напојување на мобилен"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Симулирање „Надвор од употреба“ (само за верзиите за отстранување грешки)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Симулација на режим на сателит за оператор (само за верзиите за отстранување грешки)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Тестирајте го реалниот режим на eSOS (само во верзијата за отстранување грешки)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Прикажи именик на SIM-картичката"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 3f8935c..a2b1392 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"നീക്കം ചെയ്യാവുന്ന ഇ-സിം ഡിഫോൾട്ടായി സജ്ജീകരിക്കുക"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"മൊബൈൽ റേഡിയോ പവർ"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"സേവനം ലഭ്യമല്ലെന്ന് അനുകരിക്കുക (ഡീബഗ് ബിൽഡ് മാത്രം)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock സേവനദാതാവ് ഉപഗ്രഹ മോഡ് (ഡീബഗ് ബിൽഡ് മാത്രം)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"യഥാർത്ഥ സാറ്റലൈറ്റ് eSOS മോഡ് പരീക്ഷിക്കുക (ഡീബഗ് ബിൽഡ് മാത്രം)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"സിം വിലാസ പുസ്‌തകം കാണുക"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index ea2421c..d2556ab 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Салгах боломжтой eSIM-г өгөгдмөлөөр тохируулах"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Мобайл радио цахилгаан"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Үйлчилгээний хүрээнээс гарсан нөхцөл байдлыг загварчлах (зөвхөн дебагийн хийц)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Оператор компанийн хуурамч хиймэл дагуулын горим (зөвхөн дебаг хийсэн хийц)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Жинхэнэ хиймэл дагуул eSOS горимыг турших (зөвхөн дебаг хийсэн хийц)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM хаягийн лавлахыг харах"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 2975abd..7dc628a 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"काढून टाकण्यायोग्य eSIM डीफॉल्ट म्हणून सेट करा"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"मोबाइल रेडिओ पॉवर"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"सेवा बंद आहे सिम्युलेट करा (फक्त डीबगचा बिल्‍ड)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"नमुना वाहकाचा उपग्रह मोड (फक्त डीबग बिल्ड)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"प्रत्यक्ष सॅटेलाइट eSOS मोडची चाचणी करा (फक्त डीबग बिल्ड)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"सिम ॲड्रेस बुक पहा"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index b7e25ca..f7f090c 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Tetapkan eSIM Boleh Tanggal sebagai Lalai"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Kuasa Radio Mudah Alih"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulasi Rosak (Binaan Penyahpepijatan sahaja)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Contoh Mod Satelit Pembawa (Binaan Penyahpepijatan sahaja)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Uji mod sSOS satelit sebenar (Binaan Penyahpepijatan sahaja)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Lihat Buku Alamat SIM"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 59182a3..cca7d8e 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ဖယ်ရှားနိုင်သော eSIM ကို မူရင်းအဖြစ် သတ်မှတ်ရန်"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"မိုဘိုင်း ရေဒီယိုစွမ်းအား"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"အသွင်တူပြုလုပ်သောစက် အလုပ်မလုပ်ပါ (အမှားရှာပြင်ခြင်းသာလျှင်)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Force Camp Satellite LTE ချန်နယ် (အမှားရှာပြင်ခြင်းအတွက်သာ)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier Satellite Mode (အမှားရှာပြင်ခြင်း အတွက်သာ)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"ဂြိုဟ်တုအစစ် eSOS မုဒ်ကို စမ်းသပ်ခြင်း (အမှားရှာပြင်ခြင်းအတွက်သာ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM ထဲရှိ လိပ်စာ စာအုပ်ကိုကြည့်ပါ"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index b62d14e..db2b0e0 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Angi flyttbart eSIM-kort som standard"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Strømforsyning for mobilradio"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Ute av drift-simulering (bare for feilsøkingsversjoner)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Satelittmodus for fiktiv operatør (feilsøkingsversjon)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Test ekte satellitt med eSOS-modus (kun for feilsøkingsversjoner)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Se adressebok for SIM-kort"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index f63b198..8e8d2e1 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"हटाउन मिल्ने eSIM डिफल्ट रूपमा सेट गर्नुहोस्"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"मोबाइल रेडियोको पावर"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\"सेवा उपलब्ध छैन\" सिमुलेट गर्नुहोस् (डिबग बिल्डमा मात्र सिमुलेट गर्न मिल्छ)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"सेवा प्रदायकको स्याटेलाइट मोडको परीक्षण गर्नुहोस् (डिबग बिल्ड मात्र)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"वास्तविक स्याटेलाइट eSOS मोड परीक्षण गर्नुहोस् (डिबग बिल्ड मात्र)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM को ठेगाना पुस्तिका हेर्नुहोस्"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 7d92840..a764bf2 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Verwisselbare e-simkaart instellen als standaard"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobiel radiovermogen"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'Niet in gebruik\' simuleren (alleen in foutopsporingsbuild)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Satellietmodus voor testprovider (alleen in foutopsporingsbuild)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Echte e-SOS via satellietmodus testen (alleen in foutopsporingsbuild)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Adresboek op simkaart bekijken"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 8a0b029..f8b54d2 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"କାଢ଼ି ହେଉଥିବା eSIMକୁ ଡିଫଲ୍ଟ ଭାବେ ସେଟ କରନ୍ତୁ"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ମୋବାଇଲ୍ ରେଡିଓ ପାୱାର୍"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\"କାମ କରୁନାହିଁ\"ରେ ସିମୁଲେଟ କରନ୍ତୁ (କେବଳ ଡିବଗ ବିଲ୍ଡ)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"ମକ କେରିଅର ସେଟେଲାଇଟ ମୋଡ (କେବଳ ଡିବଗ ବିଲ୍ଡ)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"ପ୍ରକୃତ ସେଟେଲାଇଟର eSOS ମୋଡ ପରୀକ୍ଷା କରନ୍ତୁ (କେବଳ ଡିବଗ ବିଲ୍ଡ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ସିମ୍‌ରେ ଥିବା ଠିକଣା ପୁସ୍ତକ ଦେଖନ୍ତୁ"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 585a53e..3b6d668 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ਹਟਾਉਣਯੋਗ ਈ-ਸਿਮ ਨੂੰ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਜੋਂ ਸੈੱਟ ਕਰੋ"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ਮੋਬਾਈਲ ਰੇਡੀਓ ਪਾਵਰ"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'ਸੇਵਾ ਵਿੱਚ ਨਹੀਂ\' ਨੂੰ ਸਿਮੂਲੇਟ ਕਰੋ (ਸਿਰਫ਼ ਡੀਬੱਗ ਬਿਲਡ)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"ਮੌਕ ਕੈਰੀਅਰ ਉਪਗ੍ਰਹਿ ਮੋਡ (ਸਿਰਫ਼ ਡੀਬੱਗ ਬਿਲਡ)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"ਰੀਅਲ ਸੈਟੇਲਾਈਟ eSOS ਮੋਡ ਅਜ਼ਮਾਓ (ਸਿਰਫ਼ ਡੀਬੱਗ ਬਿਲਡ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ਸਿਮ ਦੀ ਪਤਾ ਬੁੱਕ ਦੇਖੋ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 7793f49..73de97f 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Ustaw wymienną kartę eSIM jako domyślną"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Moc sygnału komórkowego"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Symulowana przerwa w działaniu usługi (tylko w kompilacji do debugowania)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Symulowany tryb satelitarny operatora (tylko kompilacja do debugowania)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testowanie rzeczywistego trybu satelitarnego eSOS (tylko kompilacja do debugowania)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Wyświetl książkę adresową z karty SIM"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 62c51e8..e5b0b1b 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Predefinir eSIM removível"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potência do rádio móvel"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simule o modo fora de serviço (apenas na versão de depuração)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Modo satélite da operadora fictícia (apenas na versão de depuração)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testar modo eSOS de satélite real (apenas na versão de depuração)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver livro de endereços do SIM"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 6bd6988..c5b1e8f 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Definir eSIM removível como padrão"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potência do rádio celular"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simular o modo fora de serviço (somente build de depuração)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulação de modo satélite da operadora (somente build de depuração)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testar o modo eSOS por satélite (somente build de depuração)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver o catálogo de endereços do chip"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index dd8a134..5b4495e 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Setează cartela eSIM portabilă drept prestabilită"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Alimentare radio celular"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulează modul în afara ariei de acoperire (numai în versiunea pentru remedierea erorilor)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mod Satelit al operatorului de testare (numai versiune pentru remedierea erorilor)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testează modul eSOS prin satelit real (numai versiunea pentru remedierea erorilor)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Afișează agenda de pe SIM"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index c640ce3..b6ac300 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Установить съемную eSIM-карту в качестве используемой по умолчанию"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Мощность радиосигнала"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Моделирование нахождения вне зоны обслуживания (только отладочная сборка)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Принудительно использовать спутниковый канал LTE (только для отладочной сборки)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Режим спутниковой связи симуляции оператора (только отладочная сборка)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Проверка спутникового режима eSOS (только отладочная сборка)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Посмотреть адресную книгу на SIM-карте"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index c29bef1..567601c 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ඉවත් කළ හැකි eSIM පෙරනිමිය ලෙස සකසන්න"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ජංගම රේඩියෝ බලය"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"සේවයෙන් බැහැරව අනුකරණය කරන්න (නිදොස් තැනුම පමණි)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"ආදර්ශ වාහක චන්ද්‍රිකා ප්‍රකාරය (නිදොස් තැනීමට පමණි)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"සැබෑ චන්ද්‍රිකා eSOS ප්‍රකාරය පරීක්ෂා කරන්න (නිදොස් තැනීමට පමණි)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM ලිපින පොත බලන්න"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index d540299..2f074b2 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Nastaviť odoberateľnú eSIM kartu ako predvolenú"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Sila signálu GSM"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulácia nefungujúceho zariadenia (možné iba v ladiacej zostave)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulácia satelitného režimu operátora (iba ladiaca zostava)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testovať režim pomoci v tiesni cez skutočné satelity (iba ladiaca zostava)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Zobraziť adresár SIM karty"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 214fcc4..00d2ded 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Nastavi izmenljivo kartico e-SIM kot privzeto"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Moč radia mobilne naprave"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulacija nedelovanja (samo za gradnjo za odpravljanje napak)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Lažni satelitski način operaterja (samo gradnja za odpravljanje napak)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Preizkus pravega satelitskega načina eSOS (samo gradnja za odpravljanje napak)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Prikaži imenik na kartici SIM"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index a9aad0d..d989784 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Caktoje kartën e lëvizshme eSIM si të parazgjedhur"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Fuqia e radios së rrjetit celular"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulo gjendjen jashtë shërbimit (vetëm versioni i korrigjimit)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulo modalitetin e satelitit të operatorit celular (vetëm versioni i korrigjimit)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testo modalitetin real të \"eSOS satelitor\" (vetëm versioni i korrigjimit)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Shiko librin e adresave të kartës SIM"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 3c61e72..20fb05f 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Подеси преносиви eSIM као подразумевани"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Напајање за радио на мобилним уређајима"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Симулација не функционише (само верзија са отклоњеним грешкама)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Лажни режим мобилног оператера за слање преко сателита (само верзија за отклањање грешака)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Тестирајте стварни сателитски eSOS режим (само верзија са отклоњеним грешкама)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Прикажи адресар SIM-а"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 65921b3..a07a589 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Ställ in Flyttbart eSIM som standard"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Strömförsörjning för mobilradio"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulera ur funktion (endast felsökningsversion)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulering av operatörssatellitläge (version endast för felsökning)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Testa verkligt eSOS-satellitläge (endast felsökningsversion)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Visa SIM-adressbok"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 61ff509..6fd5e6d 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Weka eSIM Inayoweza Kuondolewa kama Chaguomsingi"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Nishati ya Redio ya Vifaa vya Mkononi"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Kifaa cha Kuiga Hakifanyi Kazi (Muundo wa Utatuzi pekee)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Hali ya Setilaiti ya Jaribio la Mtoa Huduma (Muundo wa Utatuzi pekee)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Kujaribu hali ya msaada halisi wa mtandaoni kupitia setilaiti (Muundo wa Utatuzi pekee)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Angalia Kitabu cha Anwani katika SIM"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 24a1a8c..c166506 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"அகற்றக்கூடிய eSIMமை இயல்பாக அமை"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"மொபைல் ரேடியோ பவர்"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"சாதனம் \'வேலை செய்யவில்லை\' என்பதை சிமுலேட் செய்தல் (பிழைதிருத்தப் பதிப்பில் மட்டும்)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock மொபைல் நிறுவன சாட்டிலைட் பயன்முறை (பிழைதிருத்த பதிப்பு மட்டும்)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"அசல் சாட்டிலைட் eSOS பயன்முறை (பிழைதிருத்தப் பதிப்பு மட்டும்)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"சிம் முகவரிப் புத்தகத்தைக் காட்டு"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index ba6a581..bcbc0ac 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"తీసివేయగలిగే eSIMని ఆటోమేటిక్ సెట్టింగ్‌గా సెట్ చేయండి"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"మొబైల్ రేడియో పవర్"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"పరికరాన్ని సిమ్యులేట్ చేయడం అందుబాటులో లేదు (డీబగ్ బిల్డ్ మోడ్‌లో మాత్రమే)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"ఫోర్స్ క్యాంప్ శాటిలైట్ LTE ఛానెల్ (డీబగ్ బిల్డ్ మోడ్‌లో మాత్రమే)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"మాక్ క్యారియర్ శాటిలైట్ మోడ్ (డీబగ్ బిల్డ్ మోడ్‌లో మాత్రమే)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"రియల్ శాటిలైట్ eSOS మోడ్‌ను టెస్ట్ చేయండి (డీబగ్ బిల్డ్ మోడ్‌లో మాత్రమే)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM అడ్రస్‌ పుస్తకాన్ని చూడండి"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 1994bdf..fb0e606 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"กำหนดให้ eSIM แบบนำออกได้เป็นค่าเริ่มต้น"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"กำลังส่งของวิทยุเครือข่ายมือถือ"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"จําลองความไม่พร้อมให้บริการ (บิลด์การแก้ไขข้อบกพร่องเท่านั้น)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"โหมดดาวเทียมของผู้ให้บริการจำลอง (บิลด์การแก้ไขข้อบกพร่องเท่านั้น)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"ทดสอบโหมด eSOS ของดาวเทียมจริง (บิลด์การแก้ไขข้อบกพร่องเท่านั้น)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ดูสมุดที่อยู่ของซิม"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 7dd659f..9ec7341 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Itakda na Default ang Naaalis na eSIM"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile Radio Power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Mag-simulate ng Hindi Gumagana (Build sa Pag-debug lang)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Satellite Mode ng Mock Carrier (Debug Build lang)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (Build sa Pag-debug lang)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Tingnan ang Address Book ng SIM"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 3bb1dc5..78b0918 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Çıkarılabilir eSIM\'i Varsayılan Yap"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobil Radyo Gücü"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Hizmet Dışı Simülasyonu (Yalnızca Hata Ayıklama Derlemesi)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Örnek operatör uydu modu (yalnızca hata ayıklama derlemesi)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Gerçek uydu eSOS modunu test et (yalnızca hata ayıklama derlemesi)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM Adres Defterini Görüntüle"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 0a994dc..30eef04 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Установити знімну eSIM-карту як карту за умовчанням"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Потужність мобільного радіо"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Імітація знаходження поза зоною обслуговування (лише складання для налагодження)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Примусово застосувати супутниковий зв’язок із каналом LTE (лише для налагодження)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Режим супутника оператора Mock (лише складання для налагодження)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Тестувати реальний режим супутникового сигналу SOS (лише складання для налагодження)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Переглянути адресну книгу SIM-карти"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 840cc56..ffb43f8 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"‏ہٹانے لائق eSIM کو بطور ڈیفالٹ سیٹ کریں"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"موبائل ریڈیو پاور"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'سروس دستیاب نہیں ہے\' موڈ کو سمیولیٹ کریں (صرف ڈیبگ بلڈ کیلئے)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"موک کیریئر سیٹلائٹ موڈ (صرف ڈیبگ بلڈ)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"‏اصل سیٹلائٹ eSOS وضع کی جانچ کریں (صرف ڈیبگ بلڈ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"‏SIM ایڈریس بک دیکھیں"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 10b7667..a9e257d 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Olinadigan eSIM kartani birlamchi qilib belgilash"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Radio signal quvvati"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Xizmatdan tashqari simulyatsiya (faqat nosozliklarni aniqlash dasturi uchun)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Soxta operator sputnik rejimi (faqat debag nashrida)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Haqiqiy sputnik eSOS rejimini sinash (faqat debag nashrida)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM kartadagi abonentlar ro‘yxatini ochish"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 5935a58..4aa9c56 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Đặt eSIM có thể tháo rời là Mặc định"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Cường độ của sóng di động"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Mô phỏng thiết bị không hoạt động (chỉ dành cho bản gỡ lỗi)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mô phỏng chế độ vệ tinh của nhà mạng (chỉ dành cho Bản gỡ lỗi)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Thử nghiệm chế độ eSOS thực tế qua vệ tinh (chỉ bản gỡ lỗi)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Xem sổ địa chỉ trên SIM"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index a53e592..ae6124f 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"将可卸载的 eSIM 卡设为默认 eSIM 卡"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"移动无线装置电源"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"模拟服务终止(仅限调试 build)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"模拟运营商卫星模式(仅限调试 build)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"测试真实的卫星 eSOS 模式(仅限调试 build)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"查看 SIM 卡通讯录"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index a338e3b..204ddd6 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"將可移除的 eSIM 卡設為預設值"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"流動無線電的電源"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"模擬沒有服務 (僅限偵錯版本)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"模擬流動網絡供應商衛星模式 (僅限偵錯版本)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"測試「緊急衛星連接」真實模式 (僅限偵錯版本)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"查看 SIM 卡通訊錄"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 99e2912..6391da3 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -845,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"將可移除的 eSIM 卡設為預設 eSIM 卡"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"行動無線電電源"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"模擬無法使用服務的情況 (僅限偵錯版本)"</string>
+    <!-- no translation found for enforce_satellite_channel_string (295306734591329892) -->
+    <skip />
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"模擬電信業者衛星模式 (僅限偵錯版本)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"實際測試衛星緊急求救模式 (僅限偵錯版本)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"查看 SIM 通訊錄"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 12ac0bc..8b54f4f 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -845,6 +845,7 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Setha i-eSim Esusekayo Njengezenzakalelayo"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Amandla erediyo yeselula"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Lingisa okuthi Ayikho Isevisi (Umakhiwo Wokususa Iphutha kuphela)"</string>
+    <string name="enforce_satellite_channel_string" msgid="295306734591329892">"Isiteshi se-Force Camp Satellite LTE (Ukwakhiwa Kokususa Iphutha kuphela)"</string>
     <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Imodi Yesethelayithi Yenkampani Yenethiwekhi ye-Mock (Susa Iphutha Esakhiweni kuphela)"</string>
     <string name="esos_satellite_string" msgid="7274794226125968657">"Hlola imodi yesathelayithi yangempela ye-eSOS (Ukwakhiwa Kokususa Iphutha kuphela)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Buka incwadi yekheli le-SIM"</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index cdef37e..61e01b0 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -347,6 +347,8 @@
         <!-- b/317945295 -->
         <item>in</item>
         <item>sg</item>
+        <!-- b/341611911 -->
+        <item>my</item>
     </string-array>
 
     <!-- Array of countries that a CS preferred scan is preferred after CSFB failure
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 87e7095..305f7cb 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2028,10 +2028,15 @@
     <!-- Title for simulating device out of service. -->
     <string name="simulate_out_of_service_string">Simulate Out of Service (Debug Build only)</string>
 
+    <!-- Title for enforcing satellite channels. -->
+    <string name="enforce_satellite_channel_string">Force Camp Satellite LTE Channel (Debug Build only)</string>
+
     <!-- Title for simulating SIM capable of satellite. -->
     <string name="mock_carrier_roaming_satellite_string">Mock Carrier Satellite Mode (Debug Build only)</string>
     <!-- Title for trigger real satellite eSOS. -->
     <string name="esos_satellite_string">Test real satellite eSOS mode (Debug Build only)</string>
+    <!-- Title for enable real satellite non-emergency mode. -->
+    <string name="satellite_enable_non_emergency_mode_string">Test real satellite non-eSOS mode (Debug Build only)</string>
 
     <!-- Phone Info screen. Menu item label.  Used for diagnostic info screens, precise translation isn't needed -->
     <string name="radioInfo_menu_viewADN">View SIM Address Book</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 435e3a6..088a5a7 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -369,4 +369,9 @@
         <item name="android:textColor">@android:color/white</item>
         <item name="android:textSize">@dimen/emergency_shortcut_tap_hint_text_size</item>
     </style>
+
+    <!--    <style name="RadioInfoTheme" parent="@android:style/Theme.DeviceDefault.DayNight">-->
+    <style name="RadioInfoTheme" parent="Theme.AppCompat.DayNight">
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+    </style>
 </resources>
diff --git a/src/com/android/phone/ImsProvisioningController.java b/src/com/android/phone/ImsProvisioningController.java
index e4bda19..ea60633 100644
--- a/src/com/android/phone/ImsProvisioningController.java
+++ b/src/com/android/phone/ImsProvisioningController.java
@@ -49,9 +49,11 @@
 import android.os.PersistableBundle;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
+import android.telephony.AnomalyReporter;
 import android.telephony.CarrierConfigManager;
 import android.telephony.CarrierConfigManager.Ims;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
 import android.telephony.TelephonyRegistryManager;
 import android.telephony.ims.ProvisioningManager;
 import android.telephony.ims.aidl.IFeatureProvisioningCallback;
@@ -76,6 +78,7 @@
 
 import java.util.Arrays;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.Executor;
 
 /**
@@ -154,6 +157,10 @@
             CAPABILITY_TYPE_PRESENCE_UCE, Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY
     );
 
+    private static final UUID VOLTE_PROVISIONING_ANOMALY =
+            UUID.fromString("f5f90e4d-3d73-4f63-a0f9-cbe1941ca57c");
+    private static final String VOLTE_PROVISIONING_ANOMALY_DESC = "VoLTE is Not Provisioned";
+
     /**
      * Create a FeatureConnector for this class to use to connect to an ImsManager.
      */
@@ -249,7 +256,7 @@
                                         (FeatureProvisioningData) msg.obj);
                     } catch (NullPointerException e) {
                         logw(LOG_PREFIX, msg.arg1,
-                                "can not find callback manager message" + msg.what);
+                                "can not find callback manager, message" + msg.what);
                     }
                     break;
                 case EVENT_MULTI_SIM_CONFIGURATION_CHANGE:
@@ -257,9 +264,11 @@
                     onMultiSimConfigChanged(activeModemCount);
                     break;
                 case EVENT_PROVISIONING_VALUE_CHANGED:
-                    log("subId " + msg.arg1 + " changed provisioning value item : " + msg.arg2
+                    logAttr("ImsConfig", "EVENT_PROVISIONING_VALUE_CHANGED", msg.arg1,
+                            "changed provisioning value, item : " + msg.arg2
                             + " value : " + (int) msg.obj);
-                    updateCapabilityTechFromKey(msg.arg1, msg.arg2, (int) msg.obj);
+                    updateCapabilityTechFromKey("ImsConfig[" + msg.arg1 + "]",
+                            msg.arg1, msg.arg2, (int) msg.obj);
                     break;
                 case EVENT_NOTIFY_INIT_PROVISIONED_VALUE:
                     int slotId = msg.arg1;
@@ -1136,11 +1145,12 @@
      * return the provisioning status for MmTel capability in specific radio tech
      */
     @VisibleForTesting
-    public boolean getImsProvisioningStatusForCapability(int subId, int capability, int tech) {
+    public boolean getImsProvisioningStatusForCapability(String attributionPackage, int subId,
+            int capability, int tech) {
         boolean mmTelProvisioned = isImsProvisioningRequiredForCapability(subId, capability, tech);
         if (!mmTelProvisioned) { // provisioning not required
-            log("getImsProvisioningStatusForCapability : not required "
-                    + " capability " + capability + " tech " + tech);
+            logAttr(attributionPackage, "getImsProvisioningStatusForCapability", subId,
+                    " not required, capability " + capability + " tech " + tech);
             return true;
         }
 
@@ -1153,14 +1163,15 @@
             result = getValueFromImsService(subId, capability, tech);
             mmTelProvisioned = getBoolValue(result);
             if (result != ProvisioningManager.PROVISIONING_RESULT_UNKNOWN) {
-                setAndNotifyMmTelProvisioningValue(subId, capability, tech, mmTelProvisioned);
+                setAndNotifyMmTelProvisioningValue(attributionPackage, subId, capability, tech,
+                        mmTelProvisioned);
             }
         } else {
             mmTelProvisioned = getBoolValue(result);
         }
 
-        log("getImsProvisioningStatusForCapability : "
-                + " capability " + capability
+        logAttr(attributionPackage, "getImsProvisioningStatusForCapability", subId,
+                " capability " + capability
                 + " tech " + tech
                 + " result " + mmTelProvisioned);
         return mmTelProvisioned;
@@ -1170,20 +1181,21 @@
      * set MmTel provisioning status in specific tech
      */
     @VisibleForTesting
-    public void setImsProvisioningStatusForCapability(int subId, int capability, int tech,
-            boolean isProvisioned) {
+    public void setImsProvisioningStatusForCapability(String attributionPackage, int subId,
+            int capability, int tech, boolean isProvisioned) {
         boolean mmTelProvisioned = isImsProvisioningRequiredForCapability(subId, capability, tech);
         if (!mmTelProvisioned) { // provisioning not required
-            log("setImsProvisioningStatusForCapability : not required "
-                    + " capability " + capability + " tech " + tech);
+            logAttr(attributionPackage, "setImsProvisioningStatusForCapability", subId,
+                    "not required, capability " + capability + " tech " + tech);
             return;
         }
 
         // write value to ImsProvisioningLoader
-        boolean isChanged = setAndNotifyMmTelProvisioningValue(subId, capability, tech,
-                isProvisioned);
+        boolean isChanged = setAndNotifyMmTelProvisioningValue(attributionPackage, subId,
+                capability, tech, isProvisioned);
         if (!isChanged) {
-            log("status not changed mmtel capability " + capability + " tech " + tech);
+            logAttr(attributionPackage, "setImsProvisioningStatusForCapability", subId,
+                    "status not changed, capability " + capability + " tech " + tech);
             return;
         }
 
@@ -1192,7 +1204,8 @@
         int value = getIntValue(isProvisioned);
         int key = getKeyFromCapability(capability, tech);
         if (key != INVALID_VALUE) {
-            log("setImsProvisioningStatusForCapability : matched key " + key);
+            logAttr(attributionPackage, "setImsProvisioningStatusForCapability", subId,
+                    "matched key " + key);
             try {
                 // set key and value to vendor ImsService for MmTel
                 mMmTelFeatureListenersSlotMap.get(slotId).setProvisioningValue(key, value);
@@ -1291,20 +1304,22 @@
      * {@link ImsConfigImplBase#CONFIG_RESULT_SUCCESS} or
      */
     @VisibleForTesting
-    public int setProvisioningValue(int subId, int key, int value) {
-        log("setProvisioningValue");
+    public int setProvisioningValue(String attributionPackage, int subId, int key, int value) {
+        logAttr(attributionPackage, "setProvisioningValue", subId, key + ": " + value);
 
         int retVal = ImsConfigImplBase.CONFIG_RESULT_FAILED;
         // check key value
         if (!Arrays.stream(LOCAL_IMS_CONFIG_KEYS).anyMatch(keyValue -> keyValue == key)) {
-            log("not matched key " + key);
+            logAttr(attributionPackage, "setProvisioningValue", subId,
+                    "not matched key " + key);
             return ImsConfigImplBase.CONFIG_RESULT_UNKNOWN;
         }
 
         // check subId
         int slotId = getSlotId(subId);
         if (slotId <= SubscriptionManager.INVALID_SIM_SLOT_INDEX || slotId >= mNumSlot) {
-            loge("Fail to retrieve slotId from subId");
+            logAttrE(attributionPackage, "setProvisioningValue", subId,
+                    "Fail to retrieve slotId from subId");
             return ImsConfigImplBase.CONFIG_RESULT_FAILED;
         }
 
@@ -1326,12 +1341,13 @@
                 retVal = mRcsFeatureListenersSlotMap.get(slotId).setProvisioningValue(key, value);
             }
         } catch (NullPointerException e) {
-            loge("can not access FeatureListener to set provisioning value");
+            logAttrE(attributionPackage, "setProvisioningValue", subId,
+                    "can not access FeatureListener to set provisioning value");
             return ImsConfigImplBase.CONFIG_RESULT_FAILED;
         }
 
         // update and notify provisioning status changed capability and tech from key
-        updateCapabilityTechFromKey(subId, key, value);
+        updateCapabilityTechFromKey(attributionPackage, subId, key, value);
 
         return retVal;
     }
@@ -1349,17 +1365,19 @@
      * {@link ImsConfigImplBase#CONFIG_RESULT_UNKNOWN}
      */
     @VisibleForTesting
-    public int getProvisioningValue(int subId, int key) {
+    public int getProvisioningValue(String attributionPackage, int subId, int key) {
         // check key value
         if (!Arrays.stream(LOCAL_IMS_CONFIG_KEYS).anyMatch(keyValue -> keyValue == key)) {
-            log("not matched key " + key);
+            logAttr(attributionPackage, "getProvisioningValue", subId,
+                    "not matched key " + key);
             return ImsConfigImplBase.CONFIG_RESULT_UNKNOWN;
         }
 
         // check subId
         int slotId = getSlotId(subId);
         if (slotId <= SubscriptionManager.INVALID_SIM_SLOT_INDEX || slotId >= mNumSlot) {
-            loge("Fail to retrieve slotId from subId");
+            logAttrE(attributionPackage, "getProvisioningValue", subId,
+                    "Fail to retrieve slotId from subId");
             return ImsConfigImplBase.CONFIG_RESULT_UNKNOWN;
         }
 
@@ -1376,7 +1394,8 @@
                         capability, tech);
             }
             if (result != ImsProvisioningLoader.STATUS_NOT_SET) {
-                log("getProvisioningValue from loader : key " + key + " result " + result);
+                logAttr(attributionPackage, "getProvisioningValue", subId,
+                        "cache hit : key=" + key + ": value=" + result);
                 return result;
             }
         }
@@ -1385,24 +1404,27 @@
         if (key == KEY_EAB_PROVISIONING_STATUS) {
             result = getRcsValueFromImsService(subId, capability);
             if (result == ImsConfigImplBase.CONFIG_RESULT_UNKNOWN) {
-                logw("getProvisioningValue : fail to get data from ImsService capability"
-                        + capability);
+                logAttrW(attributionPackage, "getProvisioningValue", subId,
+                        "fail to get data from ImsService, capability=" + capability);
                 return result;
             }
-            log("getProvisioningValue from vendor : key " + key + " result " + result);
+            logAttr(attributionPackage, "getProvisioningValue", subId,
+                    "cache miss, get from RCS - key=" + key + ": value=" + result);
 
             setAndNotifyRcsProvisioningValueForAllTech(subId, capability, getBoolValue(result));
             return result;
         } else {
             result = getValueFromImsService(subId, capability, tech);
             if (result == ImsConfigImplBase.CONFIG_RESULT_UNKNOWN) {
-                logw("getProvisioningValue : fail to get data from ImsService capability"
-                        + capability);
+                logAttrW(attributionPackage, "getProvisioningValue", subId,
+                        "fail to get data from ImsService, capability=" + capability);
                 return result;
             }
-            log("getProvisioningValue from vendor : key " + key + " result " + result);
+            logAttr(attributionPackage, "getProvisioningValue", subId,
+                    "cache miss, get from MMTEL - key=" + key + ": value=" + result);
 
-            setAndNotifyMmTelProvisioningValue(subId, capability, tech, getBoolValue(result));
+            setAndNotifyMmTelProvisioningValue(attributionPackage, subId, capability, tech,
+                    getBoolValue(result));
             return result;
         }
     }
@@ -1531,20 +1553,23 @@
         }
     }
 
-    private void  updateCapabilityTechFromKey(int subId, int key, int value) {
+    private void  updateCapabilityTechFromKey(String attributionPackage, int subId, int key,
+            int value) {
         boolean isProvisioned = getBoolValue(value);
         int capability = getCapabilityFromKey(key);
         int tech = getTechFromKey(key);
 
         if (capability == INVALID_VALUE || tech == INVALID_VALUE) {
-            logw("updateCapabilityTechFromKey : unknown key " + key);
+            logAttrW(attributionPackage, "updateCapabilityTechFromKey", subId,
+                    "unknown key " + key);
             return;
         }
 
         if (key == KEY_VOLTE_PROVISIONING_STATUS
                 || key == KEY_VT_PROVISIONING_STATUS
                 || key == KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE) {
-            setAndNotifyMmTelProvisioningValue(subId, capability, tech, isProvisioned);
+            setAndNotifyMmTelProvisioningValue(attributionPackage, subId, capability, tech,
+                    isProvisioned);
         }
         if (key == KEY_EAB_PROVISIONING_STATUS) {
             setAndNotifyRcsProvisioningValueForAllTech(subId, capability, isProvisioned);
@@ -1631,12 +1656,33 @@
         return value == ProvisioningManager.PROVISIONING_VALUE_ENABLED ? true : false;
     }
 
-    private boolean setAndNotifyMmTelProvisioningValue(int subId, int capability, int tech,
+    // If VoLTE is not provisioned, generate an anomaly report as this is not expected.
+    private void checkProvisioningValueForAnomaly(String attributionPackage, int subId,
+            int capability, int tech, boolean isProvisioned) {
+        if (isProvisioned) return;
+        boolean isVolte = capability == CAPABILITY_TYPE_VOICE && tech == REGISTRATION_TECH_LTE;
+        if (!isVolte) return;
+        // We have hit the condition where VoLTE has been de-provisioned
+        int carrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
+        TelephonyManager manager = mApp.getSystemService(TelephonyManager.class);
+        if (manager != null) {
+            carrierId = manager.createForSubscriptionId(subId).getSimCarrierId();
+        }
+        logAttrW(attributionPackage, "checkProvisioningValueForAnomaly", subId,
+                "VoLTE provisioning disabled");
+        AnomalyReporter.reportAnomaly(VOLTE_PROVISIONING_ANOMALY,
+                VOLTE_PROVISIONING_ANOMALY_DESC, carrierId);
+    }
+
+    private boolean setAndNotifyMmTelProvisioningValue(String attributionPackage, int subId,
+            int capability, int tech,
             boolean isProvisioned) {
         boolean changed = mImsProvisioningLoader.setProvisioningStatus(subId, FEATURE_MMTEL,
                 capability, tech, isProvisioned);
         // notify MmTel capability changed
         if (changed) {
+            checkProvisioningValueForAnomaly(attributionPackage, subId, capability, tech,
+                    isProvisioned);
             mHandler.sendMessage(mHandler.obtainMessage(EVENT_PROVISIONING_CAPABILITY_CHANGED,
                     getSlotId(subId), 0, (Object) new FeatureProvisioningData(
                             capability, tech, isProvisioned, /*isMmTel*/true)));
@@ -1766,6 +1812,18 @@
         }
     }
 
+    private void logAttr(String attr, String prefix, int subId, String log) {
+        Rlog.d(TAG, prefix + "[" + subId + "]: " + log + ", attr = [" + attr + "]");
+    }
+
+    private void logAttrW(String attr, String prefix, int subId, String log) {
+        Rlog.w(TAG, prefix + "[" + subId + "]: " + log + ", attr = [" + attr + "]");
+    }
+
+    private void logAttrE(String attr, String prefix, int subId, String log) {
+        Rlog.e(TAG, prefix + "[" + subId + "]: " + log + ", attr = [" + attr + "]");
+    }
+
     private void log(String s) {
         Rlog.d(TAG, s);
     }
diff --git a/src/com/android/phone/ImsProvisioningLoader.java b/src/com/android/phone/ImsProvisioningLoader.java
index 1238b9a..8d63463 100644
--- a/src/com/android/phone/ImsProvisioningLoader.java
+++ b/src/com/android/phone/ImsProvisioningLoader.java
@@ -113,7 +113,7 @@
                     logd("check UT provisioning status " + UtProvisioningStatus);
 
                     if (STATUS_PROVISIONED == UtProvisioningStatus) {
-                        setProvisioningStatusToSubIdBundle(ImsFeature.FEATURE_MMTEL, tech,
+                        setProvisioningStatusToSubIdBundle(subId, ImsFeature.FEATURE_MMTEL, tech,
                                 MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT, subIdBundle,
                                 UtProvisioningStatus);
                     }
@@ -130,7 +130,7 @@
             subIdBundle = mSubIdBundleArray.get(subId, null);
         }
 
-        return getProvisioningStatusFromSubIdBundle(imsFeature, tech,
+        return getProvisioningStatusFromSubIdBundle(subId, imsFeature, tech,
                 capability, subIdBundle);
     }
 
@@ -146,42 +146,44 @@
             }
 
             PersistableBundle subIdBundle = mSubIdBundleArray.get(subId, null);
-            setProvisioningStatusToSubIdBundle(imsFeature, tech, capability, subIdBundle,
+            setProvisioningStatusToSubIdBundle(subId, imsFeature, tech, capability, subIdBundle,
                     newValue);
             saveSubIdBundleToXml(subId, subIdBundle);
         }
         return true;
     }
 
-    private int getProvisioningStatusFromSubIdBundle(int imsFeature, int tech,
+    private int getProvisioningStatusFromSubIdBundle(int subId, int imsFeature, int tech,
             int capability, PersistableBundle subIdBundle) {
         // If it doesn't exist in xml, return STATUS_NOT_SET
         if (subIdBundle == null || subIdBundle.isEmpty()) {
-            logd("xml is empty");
+            logd("getProvisioningStatusFromSubIdBundle", subId, "xml is empty");
             return STATUS_NOT_SET;
         }
 
         PersistableBundle regTechBundle = subIdBundle.getPersistableBundle(
                 String.valueOf(imsFeature));
         if (regTechBundle == null) {
-            logd("ImsFeature " + imsFeature + " is not exist in xml");
+            logd("getProvisioningStatusFromSubIdBundle", subId,
+                    "ImsFeature " + imsFeature + " does not exist in xml");
             return STATUS_NOT_SET;
         }
 
         PersistableBundle capabilityBundle = regTechBundle.getPersistableBundle(
                 String.valueOf(tech));
         if (capabilityBundle == null) {
-            logd("RegistrationTech " + tech + " is not exist in xml");
+            logd("getProvisioningStatusFromSubIdBundle", subId,
+                    "RegistrationTech " + tech + " does not exist in xml");
             return STATUS_NOT_SET;
         }
 
-        return getIntValueFromBundle(String.valueOf(capability), capabilityBundle);
+        return getIntValueFromBundle(subId, tech, String.valueOf(capability), capabilityBundle);
     }
 
-    private void setProvisioningStatusToSubIdBundle(int imsFeature, int tech,
+    private void setProvisioningStatusToSubIdBundle(int subId, int imsFeature, int tech,
             int capability, PersistableBundle subIdBundle, int newStatus) {
-        logd("set provisioning status " + newStatus + " ImsFeature "
-                + imsFeature + " tech " + tech + " capa " + capability);
+        logd("setProvisioningStatusToSubIdBundle", subId, "set provisioning status " + newStatus
+                + " ImsFeature " + imsFeature + " tech " + tech + " capa " + capability);
 
         PersistableBundle regTechBundle = subIdBundle.getPersistableBundle(
                 String.valueOf(imsFeature));
@@ -201,9 +203,10 @@
     }
 
     // Default value is STATUS_NOT_SET
-    private int getIntValueFromBundle(String key, PersistableBundle bundle) {
+    private int getIntValueFromBundle(int subId, int tech, String key, PersistableBundle bundle) {
         int value = bundle.getInt(key, STATUS_NOT_SET);
-        logd("get value " + value);
+        logd("getIntValueFromBundle", subId,
+                "Cache hit, tech=" + tech + " capability=" + key + ": returning " + value);
         return value;
     }
 
@@ -293,7 +296,7 @@
             String[] infoArray) {
         for (String info : infoArray) {
             String[] paramArray = info.split(",");
-            setProvisioningStatusToSubIdBundle(Integer.valueOf(paramArray[0]),
+            setProvisioningStatusToSubIdBundle(subId, Integer.valueOf(paramArray[0]),
                     Integer.valueOf(paramArray[1]), Integer.valueOf(paramArray[2]),
                     subIdBundle, Integer.valueOf(paramArray[3]));
         }
@@ -304,6 +307,10 @@
         Log.e(LOG_TAG, contents);
     }
 
+    private void logd(String prefix, int subId, String contents) {
+        Log.d(LOG_TAG, prefix + "[" + subId + "]: " + contents);
+    }
+
     private void logd(String contents) {
         Log.d(LOG_TAG, contents);
     }
diff --git a/src/com/android/phone/ImsStateCallbackController.java b/src/com/android/phone/ImsStateCallbackController.java
index 019c1ca..2dca102 100644
--- a/src/com/android/phone/ImsStateCallbackController.java
+++ b/src/com/android/phone/ImsStateCallbackController.java
@@ -59,6 +59,7 @@
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConfigurationManager;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.flags.FeatureFlags;
 import com.android.internal.telephony.ims.ImsResolver;
 import com.android.internal.telephony.util.HandlerExecutor;
 import com.android.internal.util.IndentingPrintWriter;
@@ -159,6 +160,8 @@
 
     private int mNumSlots;
 
+    private final FeatureFlags mFeatureFlags;
+
     private BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -287,11 +290,13 @@
             if (mSubId == subId) return;
             logd(mLogPrefix + "setSubId changed subId=" + subId);
 
-            // subId changed from valid to invalid
-            if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-                if (VDBG) logv(mLogPrefix + "setSubId remove ImsManager " + mSubId);
-                // remove ImsManager reference associated with subId
-                mSubIdToImsManagerCache.remove(mSubId);
+            if (!mFeatureFlags.avoidDeletingImsObjectFromCache()) {
+                // subId changed from valid to invalid
+                if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+                    if (VDBG) logv(mLogPrefix + "setSubId remove ImsManager " + mSubId);
+                    // remove ImsManager reference associated with subId
+                    mSubIdToImsManagerCache.remove(mSubId);
+                }
             }
 
             mSubId = subId;
@@ -709,7 +714,8 @@
     /**
      * create an instance
      */
-    public static ImsStateCallbackController make(PhoneGlobals app, int numSlots) {
+    public static ImsStateCallbackController make(PhoneGlobals app, int numSlots,
+            FeatureFlags featureFlags) {
         synchronized (ImsStateCallbackController.class) {
             if (sInstance == null) {
                 logd("ImsStateCallbackController created");
@@ -718,7 +724,7 @@
                 handlerThread.start();
                 sInstance = new ImsStateCallbackController(app, handlerThread.getLooper(), numSlots,
                         ImsManager::getConnector, RcsFeatureManager::getConnector,
-                        ImsResolver.getInstance());
+                        ImsResolver.getInstance(), featureFlags);
             }
         }
         return sInstance;
@@ -727,7 +733,7 @@
     @VisibleForTesting
     public ImsStateCallbackController(PhoneGlobals app, Looper looper, int numSlots,
             MmTelFeatureConnectorFactory mmTelFactory, RcsFeatureConnectorFactory rcsFactory,
-            ImsResolver imsResolver) {
+            ImsResolver imsResolver, FeatureFlags featureFlags) {
         mApp = app;
         mHandler = new MyHandler(looper);
         mImsResolver = imsResolver;
@@ -735,6 +741,7 @@
         mTelephonyRegistryManager = mApp.getSystemService(TelephonyRegistryManager.class);
         mMmTelFeatureFactory = mmTelFactory;
         mRcsFeatureFactory = rcsFactory;
+        mFeatureFlags = featureFlags;
 
         updateFeatureControllerSize(numSlots);
 
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index d0d92c6..8d6dc07 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -638,7 +638,8 @@
 
             if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS)) {
                 mImsStateCallbackController =
-                        ImsStateCallbackController.make(this, PhoneFactory.getPhones().length);
+                        ImsStateCallbackController.make(this, PhoneFactory.getPhones().length,
+                                mFeatureFlags);
                 mTelephonyRcsService = new TelephonyRcsService(this,
                         PhoneFactory.getPhones().length, mFeatureFlags);
                 mTelephonyRcsService.initialize();
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 308ef40..65dcb94 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -25,7 +25,6 @@
 import static android.telephony.TelephonyManager.HAL_SERVICE_RADIO;
 import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED;
 import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_ACCESS_BARRED;
-import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
 import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
 
 import static com.android.internal.telephony.PhoneConstants.PHONE_TYPE_CDMA;
@@ -165,12 +164,12 @@
 import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
 import android.telephony.satellite.NtnSignalStrength;
 import android.telephony.satellite.NtnSignalStrengthCallback;
-import android.telephony.satellite.ProvisionSubscriberId;
 import android.telephony.satellite.SatelliteCapabilities;
 import android.telephony.satellite.SatelliteDatagram;
 import android.telephony.satellite.SatelliteDatagramCallback;
 import android.telephony.satellite.SatelliteManager;
 import android.telephony.satellite.SatelliteProvisionStateCallback;
+import android.telephony.satellite.SatelliteSubscriberInfo;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.EventLog;
@@ -480,6 +479,8 @@
 
     private static final int MODEM_ACTIVITY_TIME_OFFSET_CORRECTION_MS = 50;
 
+    private static final int LINE1_NUMBER_MAX_LEN = 50;
+
     /**
      * With support for MEP(multiple enabled profile) in Android T, a SIM card can have more than
      * one ICCID active at the same time.
@@ -5467,6 +5468,7 @@
         enforceTelephonyFeatureWithException(getCurrentPackageName(),
                 FEATURE_TELEPHONY_IMS, "setImsProvisioningStatusForCapability");
 
+        String displayPackageName = getCurrentPackageNameOrPhone();
         final long identity = Binder.clearCallingIdentity();
         try {
             ImsProvisioningController controller = ImsProvisioningController.getInstance();
@@ -5474,7 +5476,7 @@
                 loge("setImsProvisioningStatusForCapability: Device does not support IMS");
                 return;
             }
-            controller.setImsProvisioningStatusForCapability(
+            controller.setImsProvisioningStatusForCapability(displayPackageName,
                     subId, capability, tech, isProvisioned);
         } finally {
             Binder.restoreCallingIdentity(identity);
@@ -5489,6 +5491,7 @@
         enforceTelephonyFeatureWithException(getCurrentPackageName(),
                 FEATURE_TELEPHONY_IMS, "getImsProvisioningStatusForCapability");
 
+        String displayPackageName = getCurrentPackageNameOrPhone();
         final long identity = Binder.clearCallingIdentity();
         try {
             ImsProvisioningController controller = ImsProvisioningController.getInstance();
@@ -5498,7 +5501,8 @@
                 // device does not support IMS, this method will return true always.
                 return true;
             }
-            return controller.getImsProvisioningStatusForCapability(subId, capability, tech);
+            return controller.getImsProvisioningStatusForCapability(displayPackageName,
+                    subId, capability, tech);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -5561,6 +5565,7 @@
         enforceTelephonyFeatureWithException(getCurrentPackageName(),
                 FEATURE_TELEPHONY_IMS, "getImsProvisioningInt");
 
+        String displayPackageName = getCurrentPackageNameOrPhone();
         final long identity = Binder.clearCallingIdentity();
         try {
             // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
@@ -5578,7 +5583,8 @@
                 // device does not support IMS, this method will return CONFIG_RESULT_UNKNOWN.
                 return ImsConfigImplBase.CONFIG_RESULT_UNKNOWN;
             }
-            int retVal = controller.getProvisioningValue(subId, key);
+            int retVal = controller.getProvisioningValue(displayPackageName, subId,
+                    key);
             if (retVal != ImsConfigImplBase.CONFIG_RESULT_UNKNOWN) {
                 return retVal;
             }
@@ -5634,6 +5640,7 @@
         enforceTelephonyFeatureWithException(getCurrentPackageName(),
                 FEATURE_TELEPHONY_IMS, "setImsProvisioningInt");
 
+        String displayPackageName = getCurrentPackageNameOrPhone();
         final long identity = Binder.clearCallingIdentity();
         try {
             // TODO: Refactor to remove ImsManager dependence and query through ImsPhone directly.
@@ -5651,7 +5658,8 @@
                 // device does not support IMS, this method will return CONFIG_RESULT_FAILED.
                 return ImsConfigImplBase.CONFIG_RESULT_FAILED;
             }
-            int retVal = controller.setProvisioningValue(subId, key, value);
+            int retVal = controller.setProvisioningValue(displayPackageName, subId, key,
+                    value);
             if (retVal != ImsConfigImplBase.CONFIG_RESULT_UNKNOWN) {
                 return retVal;
             }
@@ -7575,8 +7583,11 @@
             }
         }
 
-        enforceTelephonyFeatureWithException(getCurrentPackageName(),
-                PackageManager.FEATURE_TELEPHONY_DATA, "isDataEnabledForReason");
+        if (!mApp.getResources().getBoolean(
+                    com.android.internal.R.bool.config_force_phone_globals_creation)) {
+            enforceTelephonyFeatureWithException(getCurrentPackageName(),
+                    PackageManager.FEATURE_TELEPHONY_DATA, "isDataEnabledForReason");
+        }
 
         final long identity = Binder.clearCallingIdentity();
         try {
@@ -7663,9 +7674,12 @@
     public int checkCarrierPrivilegesForPackageAnyPhone(String pkgName) {
         enforceReadPrivilegedPermission("checkCarrierPrivilegesForPackageAnyPhone");
 
-        enforceTelephonyFeatureWithException(getCurrentPackageName(),
-                PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION,
-                "checkCarrierPrivilegesForPackageAnyPhone");
+        if (!mApp.getResources().getBoolean(
+                    com.android.internal.R.bool.config_force_phone_globals_creation)) {
+            enforceTelephonyFeatureWithException(getCurrentPackageName(),
+                    PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION,
+                    "checkCarrierPrivilegesForPackageAnyPhone");
+        }
 
         return checkCarrierPrivilegesForPackageAnyPhoneWithPermission(pkgName);
     }
@@ -7846,6 +7860,10 @@
             if (phone == null) {
                 return false;
             }
+            if (!TextUtils.isEmpty(number) && number.length() > LINE1_NUMBER_MAX_LEN) {
+                Rlog.e(LOG_TAG, "Number is too long");
+                return false;
+            }
             final String subscriberId = phone.getSubscriberId();
 
             if (DBG_MERGE) {
@@ -8140,20 +8158,31 @@
     @Override
     public void uploadCallComposerPicture(int subscriptionId, String callingPackage,
             String contentType, ParcelFileDescriptor fd, ResultReceiver callback) {
-        try {
-            if (!Objects.equals(mApp.getPackageManager().getPackageUid(callingPackage, 0),
-                    Binder.getCallingUid())) {
+        if (com.android.internal.telephony.flags.Flags.supportPhoneUidCheckForMultiuser()) {
+            enforceCallingPackage(callingPackage, Binder.getCallingUid(),
+                    "Invalid package:" + callingPackage);
+        } else {
+            try {
+                if (!Objects.equals(mApp.getPackageManager().getPackageUid(callingPackage, 0),
+                        Binder.getCallingUid())) {
+                    throw new SecurityException("Invalid package:" + callingPackage);
+                }
+            } catch (PackageManager.NameNotFoundException e) {
                 throw new SecurityException("Invalid package:" + callingPackage);
             }
-        } catch (PackageManager.NameNotFoundException e) {
-            throw new SecurityException("Invalid package:" + callingPackage);
         }
 
         enforceTelephonyFeatureWithException(callingPackage,
                 PackageManager.FEATURE_TELEPHONY_CALLING, "uploadCallComposerPicture");
 
         RoleManager rm = mApp.getSystemService(RoleManager.class);
-        List<String> dialerRoleHolders = rm.getRoleHolders(RoleManager.ROLE_DIALER);
+        List<String> dialerRoleHolders;
+        if (com.android.internal.telephony.flags.Flags.supportPhoneUidCheckForMultiuser()) {
+            dialerRoleHolders = rm.getRoleHoldersAsUser(RoleManager.ROLE_DIALER,
+                    UserHandle.of(ActivityManager.getCurrentUser()));
+        } else {
+            dialerRoleHolders = rm.getRoleHolders(RoleManager.ROLE_DIALER);
+        }
         if (!dialerRoleHolders.contains(callingPackage)) {
             throw new SecurityException("App must be the dialer role holder to"
                     + " upload a call composer pic");
@@ -8576,7 +8605,7 @@
             cleanUpSmsRawTable(getDefaultPhone().getContext());
             // Clean up IMS settings as well here.
             int slotId = getSlotIndex(subId);
-            if (slotId > SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
+            if (isImsAvailableOnDevice() && slotId > SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
                 ImsManager.getInstance(mApp, slotId).factoryReset();
             }
 
@@ -10843,6 +10872,19 @@
     }
 
     /**
+     * @return The calling package name or "phone" if the caller is the phone process. This is done
+     * because multiple Phone has multiple packages in it and the first element in the array is not
+     * actually always the caller.
+     * Note: This is for logging purposes only and should not be used for security checks.
+     */
+    private String getCurrentPackageNameOrPhone() {
+        PackageManager pm = mApp.getPackageManager();
+        String uidName = pm == null ? null : pm.getNameForUid(Binder.getCallingUid());
+        if (uidName != null && !uidName.isEmpty()) return uidName;
+        return getCurrentPackageName();
+    }
+
+    /**
      * Return whether data is enabled for certain APN type. This will tell if framework will accept
      * corresponding network requests on a subId.
      *
@@ -13184,7 +13226,7 @@
     @Override
     public void requestIsEmergencyModeEnabled(int subId, @NonNull ResultReceiver result) {
         enforceSatelliteCommunicationPermission("requestIsEmergencyModeEnabled");
-        result.send(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, null);
+        mSatelliteController.requestIsEmergencyModeEnabled(subId, result);
     }
 
     /**
@@ -13728,17 +13770,22 @@
      * This API can be used by only CTS to update satellite vendor service package name.
      *
      * @param servicePackageName The package name of the satellite vendor service.
+     * @param provisioned Whether satellite should be provisioned or not.
+     *
      * @return {@code true} if the satellite vendor service is set successfully,
      * {@code false} otherwise.
      */
-    public boolean setSatelliteServicePackageName(String servicePackageName) {
-        Log.d(LOG_TAG, "setSatelliteServicePackageName - " + servicePackageName);
+    public boolean setSatelliteServicePackageName(String servicePackageName,
+            String provisioned) {
+        Log.d(LOG_TAG, "setSatelliteServicePackageName - " + servicePackageName
+                + ", provisioned=" + provisioned);
         TelephonyPermissions.enforceShellOnly(
                 Binder.getCallingUid(), "setSatelliteServicePackageName");
         TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(mApp,
                 SubscriptionManager.INVALID_SUBSCRIPTION_ID,
                 "setSatelliteServicePackageName");
-        return mSatelliteController.setSatelliteServicePackageName(servicePackageName);
+        return mSatelliteController.setSatelliteServicePackageName(servicePackageName,
+                provisioned);
     }
 
     /**
@@ -14326,7 +14373,8 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    public void requestIsProvisioned(String satelliteSubscriberId, @NonNull ResultReceiver result) {
+    public void requestIsProvisioned(@NonNull String satelliteSubscriberId,
+            @NonNull ResultReceiver result) {
         enforceSatelliteCommunicationPermission("requestIsProvisioned");
         mSatelliteController.requestIsProvisioned(satelliteSubscriberId, result);
     }
@@ -14340,7 +14388,7 @@
      * @throws SecurityException if the caller doesn't have the required permission.
      */
     @Override
-    public void provisionSatellite(List<ProvisionSubscriberId> list,
+    public void provisionSatellite(@NonNull List<SatelliteSubscriberInfo> list,
             @NonNull ResultReceiver result) {
         enforceSatelliteCommunicationPermission("provisionSatellite");
         mSatelliteController.provisionSatellite(list, result);
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index 6969275..7a424cb 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -3203,6 +3203,7 @@
     private int handleSetSatelliteServicePackageNameCommand() {
         PrintWriter errPw = getErrPrintWriter();
         String serviceName = null;
+        String provisioned = null;
 
         String opt;
         while ((opt = getNextOption()) != null) {
@@ -3211,24 +3212,31 @@
                     serviceName = getNextArgRequired();
                     break;
                 }
+
+                case "-p": {
+                    provisioned = getNextArgRequired();
+                    break;
+                }
             }
         }
         Log.d(LOG_TAG, "handleSetSatelliteServicePackageNameCommand: serviceName="
-                + serviceName);
+                + serviceName + ", provisioned=" + provisioned);
 
         try {
-            boolean result = mInterface.setSatelliteServicePackageName(serviceName);
+            boolean result = mInterface.setSatelliteServicePackageName(serviceName, provisioned);
             if (VDBG) {
-                Log.v(LOG_TAG, "SetSatelliteServicePackageName " + serviceName
-                        + ", result = " + result);
+                Log.v(LOG_TAG,
+                        "SetSatelliteServicePackageName " + serviceName + ", provisioned="
+                                + provisioned + ", result = " + result);
             }
             getOutPrintWriter().println(result);
         } catch (RemoteException e) {
-            Log.w(LOG_TAG, "SetSatelliteServicePackageName: " + serviceName
-                    + ", error = " + e.getMessage());
+            Log.w(LOG_TAG, "SetSatelliteServicePackageName: " + serviceName + ", provisioned="
+                    + provisioned + ", error = " + e.getMessage());
             errPw.println("Exception: " + e.getMessage());
             return -1;
         }
+
         return 0;
     }
 
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index be7179e..75e39f9 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -1541,6 +1541,25 @@
         }
 
         mSatelliteCommunicationAllowedStateChangedListeners.put(callback.asBinder(), callback);
+
+        if (!mFeatureFlags.geofenceEnhancementForBetterUx()) {
+            plogd("The feature flag geofenceEnhancementForBetterUx is not enabled");
+            return SATELLITE_RESULT_SUCCESS;
+        }
+
+        this.post(() -> {
+            try {
+                synchronized (mSatelliteCommunicationAllowStateLock) {
+                    callback.onSatelliteCommunicationAllowedStateChanged(
+                            mCurrentSatelliteAllowedState);
+                    logd("registerForCommunicationAllowedStateChanged: "
+                            + "mCurrentSatelliteAllowedState " + mCurrentSatelliteAllowedState);
+                }
+            } catch (RemoteException ex) {
+                ploge("registerForCommunicationAllowedStateChanged: RemoteException ex=" + ex);
+            }
+        });
+
         return SATELLITE_RESULT_SUCCESS;
     }
 
diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java
index c59f92a..9d8f070 100644
--- a/src/com/android/phone/settings/RadioInfo.java
+++ b/src/com/android/phone/settings/RadioInfo.java
@@ -68,6 +68,7 @@
 import android.telephony.NetworkRegistrationInfo;
 import android.telephony.PhysicalChannelConfig;
 import android.telephony.RadioAccessFamily;
+import android.telephony.RadioAccessSpecifier;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 import android.telephony.SubscriptionManager;
@@ -83,6 +84,8 @@
 import android.telephony.ims.ProvisioningManager;
 import android.telephony.ims.feature.MmTelFeature;
 import android.telephony.ims.stub.ImsRegistrationImplBase;
+import android.telephony.satellite.EnableRequestAttributes;
+import android.telephony.satellite.SatelliteManager;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Menu;
@@ -303,6 +306,7 @@
     private EditText mSmsc;
     private Switch mRadioPowerOnSwitch;
     private Switch mSimulateOutOfServiceSwitch;
+    private Switch mEnforceSatelliteChannel;
     private Switch mMockSatellite;
     private Button mDnsCheckToggleButton;
     private Button mPingTestButton;
@@ -312,6 +316,7 @@
     private Button mCarrierProvisioningButton;
     private Button mTriggerCarrierProvisioningButton;
     private Button mEsosButton;
+    private Button mSatelliteEnableNonEmergencyModeButton;
     private Switch mImsVolteProvisionedSwitch;
     private Switch mImsVtProvisionedSwitch;
     private Switch mImsWfcProvisionedSwitch;
@@ -344,6 +349,8 @@
     private boolean mCfiValue = false;
 
     private final PersistableBundle[] mCarrierSatelliteOriginalBundle = new PersistableBundle[2];
+    private final ForceSatelliteChannelBundle[] mOriginalSystemChannels =
+            new ForceSatelliteChannelBundle[2];
     private List<CellInfo> mCellInfoResult = null;
     private final boolean[] mSimulateOos = new boolean[2];
     private int[] mSelectedSignalStrengthIndex = new int[2];
@@ -710,8 +717,10 @@
         }
 
         mMockSatellite = (Switch) findViewById(R.id.mock_carrier_roaming_satellite);
+        mEnforceSatelliteChannel = (Switch) findViewById(R.id.enforce_satellite_channel);
         if (!TelephonyUtils.IS_DEBUGGABLE) {
             mMockSatellite.setVisibility(View.GONE);
+            mEnforceSatelliteChannel.setVisibility(View.GONE);
         }
 
         mDownlinkKbps = (TextView) findViewById(R.id.dl_kbps);
@@ -743,14 +752,25 @@
         }
 
         mEsosButton = (Button) findViewById(R.id.esos_questionnaire);
+        mSatelliteEnableNonEmergencyModeButton = (Button) findViewById(
+                R.id.satellite_enable_non_emergency_mode);
+        CarrierConfigManager cm = mPhone.getContext().getSystemService(CarrierConfigManager.class);
+        if (!cm.getConfigForSubId(mPhone.getSubId(),
+                        CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL)
+                .getBoolean(CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL)) {
+            mSatelliteEnableNonEmergencyModeButton.setVisibility(View.GONE);
+        }
         if (!TelephonyUtils.IS_DEBUGGABLE) {
             mEsosButton.setVisibility(View.GONE);
+            mSatelliteEnableNonEmergencyModeButton.setVisibility(View.GONE);
         } else {
             mEsosButton.setOnClickListener(v ->
                     mPhone.getContext().startActivity(
                         new Intent(ACTION_ESOS_TEST)
                         .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK))
             );
+            mSatelliteEnableNonEmergencyModeButton.setOnClickListener(v ->
+                    enableSatelliteNonEmergencyMode());
         }
 
         mOemInfoButton = (Button) findViewById(R.id.oem_info);
@@ -848,6 +868,8 @@
         mSimulateOutOfServiceSwitch.setOnCheckedChangeListener(mSimulateOosOnChangeListener);
         mMockSatellite.setChecked(mCarrierSatelliteOriginalBundle[mPhone.getPhoneId()] != null);
         mMockSatellite.setOnCheckedChangeListener(mMockSatelliteListener);
+        mEnforceSatelliteChannel.setChecked(mOriginalSystemChannels[mPhone.getPhoneId()] != null);
+        mEnforceSatelliteChannel.setOnCheckedChangeListener(mForceSatelliteChannelOnChangeListener);
         mImsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
         mImsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
         mImsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
@@ -972,6 +994,10 @@
             if (mSimulateOos[mPhone.getPhoneId()])  {
                 mSimulateOosOnChangeListener.onCheckedChanged(mSimulateOutOfServiceSwitch, false);
             }
+            if (mOriginalSystemChannels[mPhone.getPhoneId()] != null) {
+                mForceSatelliteChannelOnChangeListener
+                        .onCheckedChanged(mEnforceSatelliteChannel, false);
+            }
             if (mCarrierSatelliteOriginalBundle[mPhone.getPhoneId()] != null) {
                 mMockSatelliteListener.onCheckedChanged(mMockSatellite, false);
             }
@@ -1850,8 +1876,7 @@
         }
     };
 
-    private final OnCheckedChangeListener mSimulateOosOnChangeListener =
-            (buttonView, isChecked) -> {
+    private final OnCheckedChangeListener mSimulateOosOnChangeListener = (bv, isChecked) -> {
         Intent intent = new Intent("com.android.internal.telephony.TestServiceState");
         if (isChecked) {
             log("Send OOS override broadcast intent.");
@@ -1862,8 +1887,92 @@
             intent.putExtra("action", "reset");
             mSimulateOos[mPhone.getPhoneId()] = false;
         }
+    };
 
-        mPhone.getTelephonyTester().setServiceStateTestIntent(intent);
+    private record ForceSatelliteChannelBundle(PersistableBundle bundle,
+                                               List<RadioAccessSpecifier> specifiers) {}
+
+    private final OnCheckedChangeListener mForceSatelliteChannelOnChangeListener =
+            (buttonView, isChecked) -> {
+                if (mPhone == null || mPhone.getSubId() < 1) return;
+                CarrierConfigManager cm = mPhone.getContext()
+                        .getSystemService(CarrierConfigManager.class);
+                if (cm == null) return;
+                TelephonyManager tm = mTelephonyManager.createForSubscriptionId(mPhone.getSubId());
+                // To be used in thread in case mPhone changes.
+                int subId = mPhone.getSubId();
+                int phoneId = mPhone.getPhoneId();
+                if (isChecked) {
+                    (new Thread(() -> {
+                        // Override carrier config
+                        PersistableBundle originalBundle = cm.getConfigForSubId(subId,
+                                CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL,
+                                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL,
+                                CarrierConfigManager.KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL
+                        );
+                        PersistableBundle overrideBundle = new PersistableBundle();
+                        overrideBundle.putBoolean(
+                                CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true);
+                        overrideBundle.putBoolean(CarrierConfigManager
+                                .KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true);
+                        overrideBundle.putBoolean(CarrierConfigManager
+                                .KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL, true);
+
+                        // Force channel selection
+                        List<RadioAccessSpecifier> originalChannels;
+                        try {
+                            originalChannels = tm.getSystemSelectionChannels();
+                        } catch (Exception e) {
+                            loge("Force satellite channel failed to get channels " + e);
+                            return;
+                        }
+                        List<RadioAccessSpecifier> mock = List.of(
+                                new RadioAccessSpecifier(
+                                        AccessNetworkConstants.AccessNetworkType.EUTRAN,
+                                        new int[]{AccessNetworkConstants.EutranBand.BAND_25},
+                                        new int[]{8665}),
+                                new RadioAccessSpecifier(
+                                        AccessNetworkConstants.AccessNetworkType.NGRAN,
+                                        new int[0],  new int[0]),
+                                new RadioAccessSpecifier(
+                                        AccessNetworkConstants.AccessNetworkType.UTRAN,
+                                        new int[0],  new int[0]),
+                                new RadioAccessSpecifier(
+                                        AccessNetworkConstants.AccessNetworkType.GERAN,
+                                        new int[0],  new int[0]));
+                        try {
+                            log("Force satellite channel new channels " + mock);
+                            tm.setSystemSelectionChannels(mock);
+                        } catch (Exception e) {
+                            loge("Force satellite channel failed to set channels " + e);
+                            return;
+                        }
+                        log("Force satellite channel new config " + overrideBundle);
+                        cm.overrideConfig(subId, overrideBundle, false);
+                        ForceSatelliteChannelBundle original =
+                                new ForceSatelliteChannelBundle(originalBundle, originalChannels);
+                        mOriginalSystemChannels[phoneId] = original;
+                        log("Force satellite channel old " + original);
+                    })).start();
+                } else {
+                    ForceSatelliteChannelBundle original;
+                    original = mOriginalSystemChannels[phoneId];
+                    if (original == null) return;
+                    log("Force satellite channel restoring to " + original);
+                    (new Thread(() -> {
+                        try {
+                            tm.setSystemSelectionChannels(original.specifiers);
+                            log("Force satellite channel successfully restored channels to "
+                                    + original.specifiers);
+                            cm.overrideConfig(subId, original.bundle, false);
+                            log("Force satellite channel successfully restored config to "
+                                    + original.bundle);
+                            mOriginalSystemChannels[phoneId] = null;
+                        } catch (Exception e) {
+                            loge("Force satellite channel: Can't clear mock " + e);
+                        }
+                    })).start();
+                }
     };
 
     private final OnCheckedChangeListener mMockSatelliteListener =
@@ -1929,6 +2038,29 @@
                 }
             };
 
+    /**
+     * Enable modem satellite for non-emergency mode.
+     */
+    private void enableSatelliteNonEmergencyMode() {
+        SatelliteManager sm = mPhone.getContext().getSystemService(SatelliteManager.class);
+        CarrierConfigManager cm = mPhone.getContext().getSystemService(CarrierConfigManager.class);
+        if (sm == null || cm == null) {
+            loge("enableSatelliteNonEmergencyMode: sm or cm is null");
+            return;
+        }
+        if (!cm.getConfigForSubId(mPhone.getSubId(),
+                CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL)
+                .getBoolean(CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL)) {
+            loge("enableSatelliteNonEmergencyMode: KEY_SATELLITE_ATTACH_SUPPORTED_BOOL is false");
+            return;
+        }
+        log("enableSatelliteNonEmergencyMode: requestEnabled");
+        sm.requestEnabled(new EnableRequestAttributes.Builder(true)
+                        .setDemoMode(false).setEmergencyMode(false).build(),
+                Runnable::run, res -> log("enableSatelliteNonEmergencyMode: " + res)
+        );
+    }
+
     private boolean isImsVolteProvisioned() {
         return getImsConfigProvisionedState(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
                 ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
diff --git a/src/com/android/phone/vvm/VvmDumpHandler.java b/src/com/android/phone/vvm/VvmDumpHandler.java
index 82c5bb5..bf09f30 100644
--- a/src/com/android/phone/vvm/VvmDumpHandler.java
+++ b/src/com/android/phone/vvm/VvmDumpHandler.java
@@ -19,15 +19,20 @@
         indentedWriter.println("******* OmtpVvm *******");
         indentedWriter.println("======= Configs =======");
         indentedWriter.increaseIndent();
-        for (PhoneAccountHandle handle : context.getSystemService(TelecomManager.class)
-                .getCallCapablePhoneAccounts()) {
-            int subId = PhoneAccountHandleConverter.toSubId(handle);
-            indentedWriter.println(
-                    "VisualVoicemailPackageName:" + telephonyManager.createForSubscriptionId(subId)
-                            .getVisualVoicemailPackageName());
-            indentedWriter.println(
-                    "VisualVoicemailSmsFilterSettings(" + subId + "):" + telephonyManager
-                            .getActiveVisualVoicemailSmsFilterSettings(subId));
+        try {
+            for (PhoneAccountHandle handle : context.getSystemService(TelecomManager.class)
+                    .getCallCapablePhoneAccounts()) {
+                int subId = PhoneAccountHandleConverter.toSubId(handle);
+                indentedWriter.println(
+                        "VisualVoicemailPackageName:" + telephonyManager.createForSubscriptionId(
+                                        subId)
+                                .getVisualVoicemailPackageName());
+                indentedWriter.println(
+                        "VisualVoicemailSmsFilterSettings(" + subId + "):" + telephonyManager
+                                .getActiveVisualVoicemailSmsFilterSettings(subId));
+            }
+        } catch (SecurityException se) {
+            indentedWriter.println("Could not get vvm config " + se);
         }
         indentedWriter.decreaseIndent();
         indentedWriter.println("======== Logs =========");
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 77bc32a..da9cfdf 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -32,12 +32,14 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerExecutor;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.PersistableBundle;
+import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.provider.Telephony;
@@ -1324,8 +1326,12 @@
      */
     public static synchronized TelecomAccountRegistry getInstance(Context context) {
         if (sInstance == null && context != null) {
-            if (Flags.enforceTelephonyFeatureMappingForPublicApis()) {
-                PackageManager pm = context.getPackageManager();
+            int vendorApiLevel = SystemProperties.getInt("ro.vendor.api_level",
+                    Build.VERSION.DEVICE_INITIAL_SDK_INT);
+            PackageManager pm = context.getPackageManager();
+
+            if (Flags.enforceTelephonyFeatureMappingForPublicApis()
+                    && vendorApiLevel >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
                 if (pm != null && pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                         && pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) {
                     sInstance = new TelecomAccountRegistry(context);
@@ -1334,7 +1340,14 @@
                             + "missing telephony/calling feature(s)");
                 }
             } else {
-                sInstance = new TelecomAccountRegistry(context);
+                // One of features is defined, create instance
+                if (pm != null && (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
+                        || pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING))) {
+                    sInstance = new TelecomAccountRegistry(context);
+                } else {
+                    Log.d(LOG_TAG, "Not initializing TelecomAccountRegistry: "
+                            + "missing telephony or calling feature(s)");
+                }
             }
         }
         return sInstance;
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 4421f0c..163fc26 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -90,6 +90,8 @@
 import com.android.internal.telephony.emergency.EmergencyStateTracker;
 import com.android.internal.telephony.emergency.RadioOnHelper;
 import com.android.internal.telephony.emergency.RadioOnStateListener;
+import com.android.internal.telephony.flags.FeatureFlags;
+import com.android.internal.telephony.flags.FeatureFlagsImpl;
 import com.android.internal.telephony.flags.Flags;
 import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
 import com.android.internal.telephony.imsphone.ImsPhone;
@@ -214,6 +216,9 @@
             new TelephonyConferenceController(mTelephonyConnectionServiceProxy);
     private final CdmaConferenceController mCdmaConferenceController =
             new CdmaConferenceController(this);
+
+    private FeatureFlags mFeatureFlags = new FeatureFlagsImpl();
+
     private ImsConferenceController mImsConferenceController;
 
     private ComponentName mExpectedComponentName = null;
@@ -765,6 +770,15 @@
                 if (cause == android.telephony.DisconnectCause.EMERGENCY_TEMP_FAILURE
                         || cause == android.telephony.DisconnectCause.EMERGENCY_PERM_FAILURE) {
                     if (mEmergencyConnection != null) {
+                        if (Flags.hangupEmergencyCallForCrossSimRedialing()) {
+                            if (mEmergencyConnection.getOriginalConnection() != null) {
+                                if (mEmergencyConnection.getOriginalConnection()
+                                        .getState().isAlive()) {
+                                    mEmergencyConnection.hangup(cause);
+                                }
+                                return;
+                            }
+                        }
                         boolean isPermanentFailure =
                                 cause == android.telephony.DisconnectCause.EMERGENCY_PERM_FAILURE;
                         Log.i(this, "onSelectionTerminated permanent=" + isPermanentFailure);
@@ -1156,19 +1170,21 @@
 
         final boolean isAirplaneModeOn = mDeviceState.isAirplaneModeOn(this);
 
-        boolean needToTurnOffSatellite = isSatelliteBlockingCall(isEmergencyNumber);
-
         // Get the right phone object from the account data passed in.
         final Phone phone = getPhoneForAccount(request.getAccountHandle(), isEmergencyNumber,
                 /* Note: when not an emergency, handle can be null for unknown callers */
                 handle == null ? null : handle.getSchemeSpecificPart());
         ImsPhone imsPhone = phone != null ? (ImsPhone) phone.getImsPhone() : null;
 
+        boolean needToTurnOffSatellite = shouldExitSatelliteModeForEmergencyCall(
+                isEmergencyNumber, phone);
+
         boolean isPhoneWifiCallingEnabled = phone != null && phone.isWifiCallingEnabled();
         boolean needToTurnOnRadio = (isEmergencyNumber && (!isRadioOn() || isAirplaneModeOn))
                 || (isRadioPowerDownOnBluetooth() && !isPhoneWifiCallingEnabled);
 
-        if (mSatelliteController.isSatelliteEnabled()) {
+        if (mSatelliteController.isSatelliteEnabled()
+                || mSatelliteController.isSatelliteBeingEnabled()) {
             Log.d(this, "onCreateOutgoingConnection, "
                     + " needToTurnOnRadio=" + needToTurnOnRadio
                     + " needToTurnOffSatellite=" + needToTurnOffSatellite
@@ -1266,7 +1282,8 @@
                         // reporting the OUT_OF_SERVICE state.
                         return phone.getState() == PhoneConstants.State.OFFHOOK
                                 || (phone.getServiceStateTracker().isRadioOn()
-                                && !mSatelliteController.isSatelliteEnabled());
+                                && (!mSatelliteController.isSatelliteEnabled()
+                                    && !mSatelliteController.isSatelliteBeingEnabled()));
                     } else {
                         SubscriptionInfoInternal subInfo = SubscriptionManagerService
                                 .getInstance().getSubscriptionInfoInternal(phone.getSubId());
@@ -1279,7 +1296,7 @@
                                 // Do not wait for voice in service on opportunistic SIMs.
                                 || subInfo != null && subInfo.isOpportunistic()
                                 || (serviceState == ServiceState.STATE_IN_SERVICE
-                                && !isSatelliteBlockingCall(isEmergencyNumber));
+                                && !needToTurnOffSatellite);
                     }
                 }
             }, isEmergencyNumber && !isTestEmergencyNumber, phone, isTestEmergencyNumber,
@@ -1478,7 +1495,7 @@
                 });
             }
         } else {
-            if (isSatelliteBlockingCall(isEmergencyNumber)) {
+            if (shouldExitSatelliteModeForEmergencyCall(isEmergencyNumber, phone)) {
                 Log.w(LOG_TAG, "handleOnComplete, failed to turn off satellite modem");
                 closeOrDestroyConnection(originalConnection,
                         mDisconnectCauseFactory.toTelecomDisconnectCause(
@@ -2129,8 +2146,10 @@
         return result;
     }
 
-    private boolean isSatelliteBlockingCall(boolean isEmergencyNumber) {
-        if (!mSatelliteController.isSatelliteEnabled()) {
+    private boolean shouldExitSatelliteModeForEmergencyCall(boolean isEmergencyNumber,
+            Phone phone) {
+        if (!mSatelliteController.isSatelliteEnabled()
+                && !mSatelliteController.isSatelliteBeingEnabled()) {
             return false;
         }
 
@@ -2138,6 +2157,12 @@
             if (mSatelliteController.isDemoModeEnabled()) {
                 // If user makes emergency call in demo mode, end the satellite session
                 return true;
+            } else if (mFeatureFlags.carrierRoamingNbIotNtn()
+                    && mSatelliteController.isInSatelliteModeForCarrierRoaming(phone)
+                    && !mSatelliteController.getRequestIsEmergency()) {
+                // If CarrierRoaming mode enabled and OEM Satellite request is not for emergency
+                // end to satellite session
+                return true;
             } else {
                 return getTurnOffOemEnabledSatelliteDuringEmergencyCall();
             }
@@ -2866,9 +2891,19 @@
                 + "csCause=" +  callFailCause + ", psCause=" + reasonInfo
                 + ", showPreciseCause=" + showPreciseCause + ", overrideCause=" + overrideCause);
 
-        if (c.getOriginalConnection() != null
+        boolean isLocalHangup = c.getOriginalConnection() != null
                 && c.getOriginalConnection().getDisconnectCause()
-                        != android.telephony.DisconnectCause.LOCAL
+                        == android.telephony.DisconnectCause.LOCAL;
+
+        // Do not treat it as local hangup if it is a cross-sim redial.
+        if (Flags.hangupEmergencyCallForCrossSimRedialing()) {
+            isLocalHangup = isLocalHangup
+                    && overrideCause != android.telephony.DisconnectCause.EMERGENCY_TEMP_FAILURE
+                    && overrideCause != android.telephony.DisconnectCause.EMERGENCY_PERM_FAILURE;
+        }
+
+        // If it is neither a local hangup nor a power off hangup, then reselect domain.
+        if (c.getOriginalConnection() != null && (!isLocalHangup)
                 && c.getOriginalConnection().getDisconnectCause()
                         != android.telephony.DisconnectCause.POWER_OFF) {
 
@@ -4797,4 +4832,10 @@
         }
         return turnOffSatellite;
     }
+
+    /* Only for testing */
+    @VisibleForTesting
+    public void setFeatureFlags(FeatureFlags featureFlags) {
+        mFeatureFlags = featureFlags;
+    }
 }
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 9f2e0a9..3946d1a 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -101,6 +101,7 @@
 import android.util.LocalLog;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.flags.Flags;
 import com.android.phone.R;
 
 import java.util.ArrayList;
@@ -270,6 +271,7 @@
     private final CrossSimRedialingController mCrossSimRedialingController;
     private final DataConnectionStateHelper mEpdnHelper;
     private final List<Network> mWiFiNetworksAvailable = new ArrayList<>();
+    private final ImsEmergencyRegistrationStateHelper mImsEmergencyRegistrationHelper;
 
     /** Constructor. */
     public EmergencyCallDomainSelector(Context context, int slotId, int subId,
@@ -288,6 +290,8 @@
         mCrossSimRedialingController = csrController;
         mEpdnHelper = epdnHelper;
         epdnHelper.setEmergencyCallDomainSelector(this);
+        mImsEmergencyRegistrationHelper = new ImsEmergencyRegistrationStateHelper(
+                mContext, getSlotId(), getSubId(), getLooper());
         acquireWakeLock();
     }
 
@@ -623,6 +627,9 @@
         mDomainSelectionRequested = true;
         startCrossStackTimer();
         if (SubscriptionManager.isValidSubscriptionId(getSubId())) {
+            if (mCallSetupTimerOnCurrentRat > 0) {
+                mImsEmergencyRegistrationHelper.start();
+            }
             sendEmptyMessageDelayed(MSG_WAIT_FOR_IMS_STATE_TIMEOUT,
                     DEFAULT_WAIT_FOR_IMS_STATE_TIMEOUT_MS);
             selectDomain();
@@ -1480,6 +1487,16 @@
         for (int i = 0; i < rats.length; i++) {
             ratList.add(rats[i]);
         }
+
+        // Prefer LTE if UE is located in non-NR coverage.
+        if (ratList.contains(NGRAN) && mLastRegResult != null
+                && mLastRegResult.getAccessNetwork() != UNKNOWN
+                && mLastRegResult.getAccessNetwork() != NGRAN
+                && !TextUtils.isEmpty(mLastRegResult.getCountryIso())) {
+            ratList.remove(Integer.valueOf(NGRAN));
+            ratList.add(NGRAN);
+        }
+
         return ratList;
     }
 
@@ -1818,13 +1835,20 @@
         logi("notifyCrossStackTimerExpired");
 
         mCrossStackTimerExpired = true;
-        if (mDomainSelected) {
+        boolean isHangupOngoingDialing = hangupOngoingDialing();
+        if (mDomainSelected && !isHangupOngoingDialing) {
             // When reselecting domain, terminateSelection will be called.
             return;
         }
         mIsWaitingForDataDisconnection = false;
         removeMessages(MSG_WAIT_DISCONNECTION_TIMEOUT);
-        terminateSelectionForCrossSimRedialing(false);
+        terminateSelectionForCrossSimRedialing(isHangupOngoingDialing);
+    }
+
+    private boolean hangupOngoingDialing() {
+        return Flags.hangupEmergencyCallForCrossSimRedialing()
+                && (mCallSetupTimerOnCurrentRat > 0)
+                && (!mImsEmergencyRegistrationHelper.isImsEmergencyRegistered());
     }
 
     /** Notifies the ePDN connection state changes. */
@@ -1921,6 +1945,7 @@
         if (DBG) logd("destroy");
 
         mEpdnHelper.setEmergencyCallDomainSelector(null);
+        mImsEmergencyRegistrationHelper.destroy();
         mCrossSimRedialingController.stopTimer();
         releaseWakeLock();
 
diff --git a/src/com/android/services/telephony/domainselection/ImsEmergencyRegistrationStateHelper.java b/src/com/android/services/telephony/domainselection/ImsEmergencyRegistrationStateHelper.java
new file mode 100644
index 0000000..a6ac9c4
--- /dev/null
+++ b/src/com/android/services/telephony/domainselection/ImsEmergencyRegistrationStateHelper.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2024 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.services.telephony.domainselection;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.telephony.SubscriptionManager;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsManager;
+import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.ImsReasonInfo;
+import android.telephony.ims.ImsRegistrationAttributes;
+import android.telephony.ims.ImsStateCallback;
+import android.telephony.ims.RegistrationManager;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * A class to listen to the IMS emergency registration state.
+ */
+public class ImsEmergencyRegistrationStateHelper {
+    private static final String TAG = ImsEmergencyRegistrationStateHelper.class.getSimpleName();
+
+    protected static final long MMTEL_FEATURE_AVAILABLE_WAIT_TIME_MILLIS = 2 * 1000; // 2 seconds
+
+    private final Context mContext;
+    private final int mSlotId;
+    private final int mSubId;
+    private final Handler mHandler;
+
+    private ImsMmTelManager mMmTelManager;
+    private ImsStateCallback mImsStateCallback;
+    private RegistrationManager.RegistrationCallback mRegistrationCallback;
+    private boolean mImsEmergencyRegistered;
+
+    public ImsEmergencyRegistrationStateHelper(@NonNull Context context,
+            int slotId, int subId, @NonNull Looper looper) {
+        mContext = context;
+        mSlotId = slotId;
+        mSubId = subId;
+        mHandler = new Handler(looper);
+    }
+
+    /**
+     * Destroys this instance.
+     */
+    public void destroy() {
+        stopListeningForImsEmergencyRegistrationState();
+        mHandler.removeCallbacksAndMessages(null);
+    }
+
+    /**
+     * Returns the Handler instance.
+     */
+    @VisibleForTesting
+    public @NonNull Handler getHandler() {
+        return mHandler;
+    }
+
+    /**
+     * Returns {@code true} if IMS is registered, {@code false} otherwise.
+     */
+    public boolean isImsEmergencyRegistered() {
+        return mImsEmergencyRegistered;
+    }
+
+    /**
+     * Starts listening for IMS emergency registration state.
+     */
+    public void start() {
+        startListeningForImsEmergencyRegistrationState();
+    }
+
+    /**
+     * Starts listening to monitor the IMS states -
+     * connection state, IMS emergency registration state.
+     */
+    private void startListeningForImsEmergencyRegistrationState() {
+        if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
+            return;
+        }
+
+        ImsManager imsMngr = mContext.getSystemService(ImsManager.class);
+        mMmTelManager = imsMngr.getImsMmTelManager(mSubId);
+        mImsEmergencyRegistered = false;
+        registerImsStateCallback();
+    }
+
+    /**
+     * Stops listening to monitor the IMS states -
+     * connection state, IMS emergency registration state.
+     */
+    private void stopListeningForImsEmergencyRegistrationState() {
+        if (mMmTelManager != null) {
+            unregisterImsEmergencyRegistrationCallback();
+            unregisterImsStateCallback();
+            mMmTelManager = null;
+        }
+    }
+
+    private void registerImsStateCallback() {
+        if (mImsStateCallback != null) {
+            loge("ImsStateCallback is already registered for sub-" + mSubId);
+            return;
+        }
+
+        // Listens to the IMS connection state change.
+        mImsStateCallback = new ImsStateCallback() {
+            @Override
+            public void onUnavailable(@DisconnectedReason int reason) {
+                unregisterImsEmergencyRegistrationCallback();
+            }
+
+            @Override
+            public void onAvailable() {
+                registerImsEmergencyRegistrationCallback();
+            }
+
+            @Override
+            public void onError() {
+                mImsStateCallback = null;
+                mHandler.postDelayed(
+                        ImsEmergencyRegistrationStateHelper.this::registerImsStateCallback,
+                        MMTEL_FEATURE_AVAILABLE_WAIT_TIME_MILLIS);
+            }
+        };
+
+        try {
+            mMmTelManager.registerImsStateCallback(mHandler::post, mImsStateCallback);
+        } catch (ImsException e) {
+            loge("Exception when registering ImsStateCallback: " + e);
+            mImsStateCallback = null;
+        }
+    }
+
+    private void unregisterImsStateCallback() {
+        if (mImsStateCallback != null) {
+            try {
+                mMmTelManager.unregisterImsStateCallback(mImsStateCallback);
+            }  catch (Exception ignored) {
+                // Ignore the runtime exception while unregistering callback.
+                logd("Exception when unregistering ImsStateCallback: " + ignored);
+            }
+            mImsStateCallback = null;
+        }
+    }
+
+    private void registerImsEmergencyRegistrationCallback() {
+        if (mRegistrationCallback != null) {
+            logd("RegistrationCallback is already registered for sub-" + mSubId);
+            return;
+        }
+
+        // Listens to the IMS emergency registration state change.
+        mRegistrationCallback = new RegistrationManager.RegistrationCallback() {
+            @Override
+            public void onRegistered(@NonNull ImsRegistrationAttributes attributes) {
+                mImsEmergencyRegistered = true;
+            }
+
+            @Override
+            public void onUnregistered(@NonNull ImsReasonInfo info) {
+                mImsEmergencyRegistered = false;
+            }
+        };
+
+        try {
+            mMmTelManager.registerImsEmergencyRegistrationCallback(mHandler::post,
+                    mRegistrationCallback);
+        } catch (ImsException e) {
+            loge("Exception when registering RegistrationCallback: " + e);
+            mRegistrationCallback = null;
+        }
+    }
+
+    private void unregisterImsEmergencyRegistrationCallback() {
+        if (mRegistrationCallback != null) {
+            try {
+                mMmTelManager.unregisterImsEmergencyRegistrationCallback(mRegistrationCallback);
+            }  catch (Exception ignored) {
+                // Ignore the runtime exception while unregistering callback.
+                logd("Exception when unregistering RegistrationCallback: " + ignored);
+            }
+            mRegistrationCallback = null;
+        }
+    }
+
+    private void logd(String s) {
+        Log.d(TAG, "[" + mSlotId + "|" + mSubId + "] " + s);
+    }
+
+    private void loge(String s) {
+        Log.e(TAG, "[" + mSlotId + "|" + mSubId + "] " + s);
+    }
+}
diff --git a/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java b/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
index aedd06e..906aa28 100644
--- a/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
@@ -21,6 +21,7 @@
 import android.annotation.NonNull;
 import android.content.Context;
 import android.os.Looper;
+import android.os.Message;
 import android.os.PersistableBundle;
 import android.telecom.TelecomManager;
 import android.telephony.Annotation.DisconnectCauses;
@@ -45,6 +46,13 @@
 
     private static final String LOG_TAG = "NCDS";
 
+    // Wait-time for IMS state change callback.
+    @VisibleForTesting
+    protected static final int WAIT_FOR_IMS_STATE_TIMEOUT_MS = 3000; // 3 seconds
+
+    @VisibleForTesting
+    protected static final int MSG_WAIT_FOR_IMS_STATE_TIMEOUT = 11;
+
     @VisibleForTesting
     protected enum SelectorState {
         ACTIVE,
@@ -67,12 +75,40 @@
             logd("Subscribing to state callbacks. Subid:" + subId);
             mImsStateTracker.addServiceStateListener(this);
             mImsStateTracker.addImsStateListener(this);
+
         } else {
             loge("Invalid Subscription. Subid:" + subId);
         }
     }
 
     @Override
+    public void handleMessage(Message message) {
+        switch (message.what) {
+
+            case MSG_WAIT_FOR_IMS_STATE_TIMEOUT: {
+                loge("ImsStateTimeout. ImsState callback not received");
+                if (mSelectorState != SelectorState.ACTIVE) {
+                    return;
+                }
+
+                if (!mImsRegStateReceived) {
+                    onImsRegistrationStateChanged();
+                }
+
+                if (!mMmTelCapabilitiesReceived) {
+                    onImsMmTelCapabilitiesChanged();
+                }
+            }
+            break;
+
+            default: {
+                super.handleMessage(message);
+            }
+            break;
+        }
+    }
+
+    @Override
     public void selectDomain(SelectionAttributes attributes, TransportSelectorCallback callback) {
         mSelectionAttributes = attributes;
         mTransportSelectorCallback = callback;
@@ -104,6 +140,7 @@
 
         if (subId == getSubId()) {
             logd("NormalCallDomainSelection triggered. Sub-id:" + subId);
+            sendEmptyMessageDelayed(MSG_WAIT_FOR_IMS_STATE_TIMEOUT, WAIT_FOR_IMS_STATE_TIMEOUT_MS);
             post(() -> selectDomain());
         } else {
             mSelectorState = SelectorState.INACTIVE;
@@ -290,6 +327,49 @@
         }
     }
 
+    private void handleReselectDomain(ImsReasonInfo imsReasonInfo) {
+        mReselectDomain = false;
+
+        // Out of service
+        if (isOutOfService()) {
+            loge("Cannot place call in current ServiceState: " + mServiceState.getState());
+            notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
+            return;
+        }
+
+        // IMS -> CS
+        if (imsReasonInfo != null) {
+            logd("PsDisconnectCause:" + imsReasonInfo.getCode());
+            if (imsReasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED) {
+                logd("Redialing over CS");
+                notifyCsSelected();
+            } else {
+                // Not a valid redial
+                logd("Redialing cancelled.");
+                notifySelectionTerminated(DisconnectCause.NOT_VALID);
+            }
+            return;
+        }
+
+        // CS -> IMS
+        int csDisconnectCause = mSelectionAttributes.getCsDisconnectCause();
+        if (csDisconnectCause == CallFailCause.EMC_REDIAL_ON_IMS
+                || csDisconnectCause == CallFailCause.EMC_REDIAL_ON_VOWIFI) {
+            // Check IMS registration state.
+            if (mImsStateTracker.isImsRegistered()) {
+                logd("IMS is registered");
+                notifyPsSelected();
+                return;
+            }
+
+            logd("IMS is NOT registered");
+        }
+
+        // Not a valid redial
+        logd("Redialing cancelled.");
+        notifySelectionTerminated(DisconnectCause.NOT_VALID);
+    }
+
     private boolean isTtySupportedByIms() {
         CarrierConfigManager configManager = mContext.getSystemService(CarrierConfigManager.class);
 
@@ -326,50 +406,8 @@
         }
 
         // Check if this is a re-dial scenario
-        ImsReasonInfo imsReasonInfo = mSelectionAttributes.getPsDisconnectCause();
         if (mReselectDomain) {
-            mReselectDomain = false;
-
-            // Out of service
-            if (isOutOfService()) {
-                loge("Cannot place call in current ServiceState: " + mServiceState.getState());
-                notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
-
-                return;
-            }
-
-            // IMS -> CS
-            if (imsReasonInfo != null) {
-                logd("PsDisconnectCause:" + imsReasonInfo.getCode());
-                if (imsReasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED) {
-                    logd("Redialing over CS");
-                    notifyCsSelected();
-                } else {
-                    // Not a valid redial
-                    logd("Redialing cancelled.");
-                    notifySelectionTerminated(DisconnectCause.NOT_VALID);
-                }
-                return;
-            }
-
-            // CS -> IMS
-            int csDisconnectCause = mSelectionAttributes.getCsDisconnectCause();
-            switch (csDisconnectCause) {
-                case CallFailCause.EMC_REDIAL_ON_IMS:
-                case CallFailCause.EMC_REDIAL_ON_VOWIFI:
-                    // Check IMS registration state.
-                    if (mImsStateTracker.isImsRegistered()) {
-                        logd("IMS is registered");
-                        notifyPsSelected();
-                        return;
-                    } else {
-                        logd("IMS is NOT registered");
-                    }
-            }
-
-            // Not a valid redial
-            logd("Redialing cancelled.");
-            notifySelectionTerminated(DisconnectCause.NOT_VALID);
+            handleReselectDomain(mSelectionAttributes.getPsDisconnectCause());
             return;
         }
 
@@ -389,6 +427,10 @@
             return;
         }
 
+        if (hasMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT)) {
+            removeMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT);
+        }
+
         // Check IMS registration state.
         if (!mImsStateTracker.isImsRegistered()) {
             logd("IMS is NOT registered");
diff --git a/src/com/android/services/telephony/domainselection/OWNERS b/src/com/android/services/telephony/domainselection/OWNERS
index 2a76770..5874c98 100644
--- a/src/com/android/services/telephony/domainselection/OWNERS
+++ b/src/com/android/services/telephony/domainselection/OWNERS
@@ -1,7 +1,7 @@
 # automatically inherit owners from fw/opt/telephony
 
 hwangoo@google.com
-forestchoi@google.com
+jaesikkong@google.com
 avinashmp@google.com
 mkoon@google.com
 seheele@google.com
diff --git a/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml b/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml
index 6aec1da..b1b2ccf 100644
--- a/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml
+++ b/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml
@@ -125,6 +125,24 @@
             android:layout_height="wrap_content"
             android:paddingRight="4dp"
             android:text="@string/getIsEmergency"/>
+        <Button
+            android:id="@+id/requestProvisionSubscriberIds"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/requestProvisionSubscriberIds"/>
+        <Button
+            android:id="@+id/requestIsProvisioned"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/requestIsProvisioned"/>
+        <Button
+            android:id="@+id/provisionSatellite"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/provisionSatellite"/>
          <Button
             android:id="@+id/Back"
             android:onClick="Back"
diff --git a/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml b/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
index 43bb1c5..39a4bd6 100644
--- a/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
+++ b/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
@@ -25,7 +25,8 @@
         android:layout_height="wrap_content"
         android:orientation="vertical"
         android:gravity="center"
-        android:paddingStart="4dp">
+        android:paddingStart="4dp"
+        android:paddingTop="68dp">
 
         <TextView
             android:layout_width="wrap_content"
@@ -142,6 +143,30 @@
             android:layout_height="wrap_content"
             android:paddingRight="4dp"
             android:text="@string/unregisterForCarrierRoamingNtnModeChanged"/>
+        <Button
+            android:id="@+id/registerForCommunicationAllowedStateChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/registerForCommunicationAllowedStateChanged"/>
+        <Button
+            android:id="@+id/unregisterForCommunicationAllowedStateChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/unregisterForCommunicationAllowedStateChanged"/>
+        <Button
+            android:id="@+id/registerForModemStateChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/registerForModemStateChanged"/>
+        <Button
+            android:id="@+id/unregisterForModemStateChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/unregisterForModemStateChanged"/>
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
index e7fbb97..c51d574 100644
--- a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
+++ b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
@@ -44,6 +44,8 @@
     <string name="stopSatelliteTransmissionUpdates">stopSatelliteTransmissionUpdates</string>
     <string name="showDatagramSendStateTransition">showDatagramSendStateTransition</string>
     <string name="showDatagramReceiveStateTransition">showDatagramReceiveStateTransition</string>
+    <string name="registerForCommunicationAllowedStateChanged">registerForCommunicationAllowedStateChanged</string>
+    <string name="unregisterForCommunicationAllowedStateChanged">unregisterForCommunicationAllowedStateChanged</string>
 
     <string name="provisionSatelliteService">provisionSatelliteService</string>
     <string name="deprovisionSatelliteService">deprovisionSatelliteService</string>
@@ -91,9 +93,16 @@
     <string name="reportSatelliteNotSupportedFromModem">reportSatelliteNotSupportedFromModem</string>
     <string name="showCurrentSatelliteSupportedStated">showCurrentSatelliteSupportedStated</string>
 
+    <string name="requestProvisionSubscriberIds">requestProvisionSubscriberIds</string>
+    <string name="requestIsProvisioned">requestIsProvisioned</string>
+    <string name="provisionSatellite">provisionSatellite</string>
+
     <string name="Back">Back</string>
     <string name="ClearLog">Clear Log</string>
 
     <string name="registerForCarrierRoamingNtnModeChanged">registerForCarrierRoamingNtnModeChanged</string>
     <string name="unregisterForCarrierRoamingNtnModeChanged">unregisterForCarrierRoamingNtnModeChanged</string>
+
+    <string name="registerForModemStateChanged">registerForModemStateChanged</string>
+    <string name="unregisterForModemStateChanged">unregisterForModemStateChanged</string>
 </resources>
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/Provisioning.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/Provisioning.java
index 20c5ef5..15c8fd8 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/Provisioning.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/Provisioning.java
@@ -39,7 +39,7 @@
  */
 public class Provisioning extends Activity {
 
-    private static final String TAG = "Provisioning";
+    private static final String TAG = "SatelliteProvisioning";
 
     private boolean mProvisioned = false;
 
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java
index a03f04e..4843c5f 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java
@@ -25,12 +25,14 @@
 import android.telephony.satellite.EnableRequestAttributes;
 import android.telephony.satellite.SatelliteCapabilities;
 import android.telephony.satellite.SatelliteManager;
+import android.telephony.satellite.SatelliteSubscriberInfo;
 import android.telephony.satellite.stub.SatelliteResult;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.TextView;
 
 import java.time.Duration;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
@@ -45,6 +47,7 @@
 
     private SatelliteManager mSatelliteManager;
     private SubscriptionManager mSubscriptionManager;
+    private List<SatelliteSubscriberInfo> mSatelliteSubscriberInfoList = new ArrayList<>();
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -83,6 +86,12 @@
                 .setOnClickListener(this::isRequestIsSatelliteEnabledForCarrierApp);
         findViewById(R.id.getIsEmergency)
                 .setOnClickListener(this::getIsEmergencyApp);
+        findViewById(R.id.requestProvisionSubscriberIds)
+                .setOnClickListener(this::requestProvisionSubscriberIdsApp);
+        findViewById(R.id.requestIsProvisioned)
+                .setOnClickListener(this::requestIsProvisionedApp);
+        findViewById(R.id.provisionSatellite)
+                .setOnClickListener(this::provisionSatelliteApp);
         findViewById(R.id.Back).setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -383,4 +392,95 @@
                 + SatelliteTestApp.getTestSatelliteService()
                 .getIsEmergency());
     }
+
+    private void requestProvisionSubscriberIdsApp(View view) {
+        final AtomicReference<List<SatelliteSubscriberInfo>> list = new AtomicReference<>();
+        final AtomicReference<Integer> errorCode = new AtomicReference<>();
+        OutcomeReceiver<List<SatelliteSubscriberInfo>, SatelliteManager.SatelliteException>
+                receiver =
+                new OutcomeReceiver<>() {
+                    @Override
+                    public void onResult(List<SatelliteSubscriberInfo> result) {
+                        mSatelliteSubscriberInfoList = result;
+                        list.set(result);
+                        TextView textView = findViewById(R.id.text_id);
+                        String text = "";
+                        for (SatelliteSubscriberInfo psi : result) {
+                            text += "" + psi + " , ";
+                        }
+                        textView.setText("requestProvisionSubscriberIds: result=" + text);
+                    }
+
+                    @Override
+                    public void onError(SatelliteManager.SatelliteException exception) {
+                        errorCode.set(exception.getErrorCode());
+                        TextView textView = findViewById(R.id.text_id);
+                        textView.setText("Status for requestProvisionSubscriberIds error : "
+                                + SatelliteErrorUtils.mapError(errorCode.get()));
+                    }
+                };
+        mSatelliteManager.requestProvisionSubscriberIds(Runnable::run, receiver);
+    }
+
+    private void requestIsProvisionedApp(View view) {
+        final AtomicReference<Boolean> enabled = new AtomicReference<>();
+        final AtomicReference<Integer> errorCode = new AtomicReference<>();
+        OutcomeReceiver<Boolean, SatelliteManager.SatelliteException> receiver =
+                new OutcomeReceiver<>() {
+                    @Override
+                    public void onResult(Boolean result) {
+                        enabled.set(result);
+                        TextView textView = findViewById(R.id.text_id);
+                        if (enabled.get()) {
+                            textView.setText("requestIsProvisioned is true");
+                        } else {
+                            textView.setText("Status for requestIsProvisioned result : "
+                                    + enabled.get());
+                        }
+                    }
+
+                    @Override
+                    public void onError(SatelliteManager.SatelliteException exception) {
+                        errorCode.set(exception.getErrorCode());
+                        TextView textView = findViewById(R.id.text_id);
+                        textView.setText("Status for requestIsProvisioned error : "
+                                + SatelliteErrorUtils.mapError(errorCode.get()));
+                    }
+                };
+        if (mSatelliteSubscriberInfoList == null || mSatelliteSubscriberInfoList.get(0) == null) {
+            TextView textView = findViewById(R.id.text_id);
+            textView.setText("No ProvisionSubscriberIdList");
+            return;
+        }
+        mSatelliteManager.requestIsProvisioned(
+                mSatelliteSubscriberInfoList.get(0).getSubscriberId(), Runnable::run, receiver);
+    }
+
+    private void provisionSatelliteApp(View view) {
+        final AtomicReference<Boolean> enabled = new AtomicReference<>();
+        final AtomicReference<Integer> errorCode = new AtomicReference<>();
+        OutcomeReceiver<Boolean, SatelliteManager.SatelliteException> receiver =
+                new OutcomeReceiver<>() {
+                    @Override
+                    public void onResult(Boolean result) {
+                        enabled.set(result);
+                        TextView textView = findViewById(R.id.text_id);
+                        if (enabled.get()) {
+                            textView.setText("provisionSatellite is true");
+                        } else {
+                            textView.setText("Status for provisionSatellite result : "
+                                    + enabled.get());
+                        }
+                    }
+
+                    @Override
+                    public void onError(SatelliteManager.SatelliteException exception) {
+                        errorCode.set(exception.getErrorCode());
+                        TextView textView = findViewById(R.id.text_id);
+                        textView.setText("Status for provisionSatellite error : "
+                                + SatelliteErrorUtils.mapError(errorCode.get()));
+                    }
+                };
+        mSatelliteManager.provisionSatellite(mSatelliteSubscriberInfoList, Runnable::run, receiver);
+    }
 }
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
index b5b781c..54bb16d 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
@@ -93,7 +93,6 @@
 
     private boolean mIsCommunicationAllowedInLocation;
     private boolean mIsEnabled;
-    private boolean mIsProvisioned;
     private boolean mIsSupported;
     private int mModemState;
     private boolean mIsCellularModemEnabledMode;
@@ -113,7 +112,6 @@
         super(executor);
         mIsCommunicationAllowedInLocation = true;
         mIsEnabled = false;
-        mIsProvisioned = false;
         mIsSupported = true;
         mModemState = SatelliteModemState.SATELLITE_MODEM_STATE_OFF;
         mIsCellularModemEnabledMode = false;
@@ -297,41 +295,6 @@
     }
 
     @Override
-    public void provisionSatelliteService(@NonNull String token, @NonNull byte[] provisionData,
-            @NonNull IIntegerConsumer errorCallback) {
-        logd("provisionSatelliteService: mErrorCode=" + mErrorCode);
-        if (mErrorCode != SatelliteResult.SATELLITE_RESULT_SUCCESS) {
-            runWithExecutor(() -> errorCallback.accept(mErrorCode));
-            return;
-        }
-        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
-        updateSatelliteProvisionState(true);
-    }
-
-    @Override
-    public void deprovisionSatelliteService(@NonNull String token,
-            @NonNull IIntegerConsumer errorCallback) {
-        logd("deprovisionSatelliteService: mErrorCode=" + mErrorCode);
-        if (mErrorCode != SatelliteResult.SATELLITE_RESULT_SUCCESS) {
-            runWithExecutor(() -> errorCallback.accept(mErrorCode));
-            return;
-        }
-        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
-        updateSatelliteProvisionState(false);
-    }
-
-    @Override
-    public void requestIsSatelliteProvisioned(@NonNull IIntegerConsumer errorCallback,
-            @NonNull IBooleanConsumer callback) {
-        logd("requestIsSatelliteProvisioned: mErrorCode=" + mErrorCode);
-        if (mErrorCode != SatelliteResult.SATELLITE_RESULT_SUCCESS) {
-            runWithExecutor(() -> errorCallback.accept(mErrorCode));
-            return;
-        }
-        runWithExecutor(() -> callback.accept(mIsProvisioned));
-    }
-
-    @Override
     public void pollPendingSatelliteDatagrams(@NonNull IIntegerConsumer errorCallback) {
         logd("pollPendingSatelliteDatagrams: mErrorCode=" + mErrorCode);
         if (mErrorCode != SatelliteResult.SATELLITE_RESULT_SUCCESS) {
@@ -512,11 +475,6 @@
                     SatelliteResult.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED));
             return false;
         }
-        if (!mIsProvisioned) {
-            runWithExecutor(() -> errorCallback.accept(
-                    SatelliteResult.SATELLITE_RESULT_SERVICE_NOT_PROVISIONED));
-            return false;
-        }
         if (!mIsEnabled) {
             runWithExecutor(() -> errorCallback.accept(
                     SatelliteResult.SATELLITE_RESULT_INVALID_MODEM_STATE));
@@ -545,24 +503,6 @@
     }
 
     /**
-     * Update the satellite provision state and notify listeners if it changed.
-     *
-     * @param isProvisioned {@code true} if the satellite is currently provisioned and
-     *                      {@code false} if it is not.
-     */
-    private void updateSatelliteProvisionState(boolean isProvisioned) {
-        logd("updateSatelliteProvisionState: isProvisioned=" + isProvisioned
-                + ", mIsProvisioned=" + mIsProvisioned);
-        if (isProvisioned == mIsProvisioned) {
-            return;
-        }
-        mIsProvisioned = isProvisioned;
-        logd("updateSatelliteProvisionState: mRemoteListeners.size=" + mRemoteListeners.size());
-        mRemoteListeners.values().forEach(listener -> runWithExecutor(() ->
-                listener.onSatelliteProvisionStateChanged(mIsProvisioned)));
-    }
-
-    /**
      * Execute the given runnable using the executor that this service was created with.
      *
      * @param r A runnable that can throw an exception.
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
index 93a8131..109ebbf 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
@@ -27,7 +27,9 @@
 import android.telephony.satellite.wrapper.NtnSignalStrengthCallbackWrapper;
 import android.telephony.satellite.wrapper.NtnSignalStrengthWrapper;
 import android.telephony.satellite.wrapper.SatelliteCapabilitiesCallbackWrapper;
+import android.telephony.satellite.wrapper.SatelliteCommunicationAllowedStateCallbackWrapper;
 import android.telephony.satellite.wrapper.SatelliteManagerWrapper;
+import android.telephony.satellite.wrapper.SatelliteModemStateCallbackWrapper;
 import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -54,7 +56,9 @@
     private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
     private SatelliteManagerWrapper mSatelliteManagerWrapper;
     private NtnSignalStrengthCallback mNtnSignalStrengthCallback = null;
+    private SatelliteModemStateCallback mModemStateCallback = null;
     private CarrierRoamingNtnModeListener mCarrierRoamingNtnModeListener = null;
+    private SatelliteCommunicationAllowedStateCallback mSatelliteCommunicationAllowedStateCallback;
     private SatelliteCapabilitiesCallbackWrapper mSatelliteCapabilitiesCallback;
     private SubscriptionManager mSubscriptionManager;
     private int mSubId;
@@ -105,6 +109,15 @@
                 .setOnClickListener(this::registerForCarrierRoamingNtnModeChanged);
         findViewById(R.id.unregisterForCarrierRoamingNtnModeChanged)
                 .setOnClickListener(this::unregisterForCarrierRoamingNtnModeChanged);
+        findViewById(R.id.registerForCommunicationAllowedStateChanged)
+                .setOnClickListener(this::registerForCommunicationAllowedStateChanged);
+        findViewById(R.id.unregisterForCommunicationAllowedStateChanged)
+                .setOnClickListener(this::unregisterForCommunicationAllowedStateChanged);
+        findViewById(R.id.registerForModemStateChanged)
+                .setOnClickListener(this::registerForModemStateChanged);
+        findViewById(R.id.unregisterForModemStateChanged)
+                .setOnClickListener(this::unregisterForModemStateChanged);
+
         findViewById(R.id.Back).setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -218,6 +231,38 @@
         }
     }
 
+    private void registerForCommunicationAllowedStateChanged(View view) {
+        addLogMessage("registerForCommunicationAllowedStateChanged");
+        logd("registerForCommunicationAllowedStateChanged()");
+        if (mSatelliteCommunicationAllowedStateCallback == null) {
+            logd("Creating new CarrierRoamingNtnModeListener instance.");
+            mSatelliteCommunicationAllowedStateCallback =
+                    new SatelliteCommunicationAllowedStateCallback();
+        }
+
+        try {
+            mSatelliteManagerWrapper.registerForCommunicationAllowedStateChanged(mExecutor,
+                    mSatelliteCommunicationAllowedStateCallback);
+        } catch (Exception ex) {
+            String errorMessage = "registerForCommunicationAllowedStateChanged: " + ex.getMessage();
+            logd(errorMessage);
+            addLogMessage(errorMessage);
+            mSatelliteCommunicationAllowedStateCallback = null;
+        }
+    }
+
+    private void unregisterForCommunicationAllowedStateChanged(View view) {
+        addLogMessage("unregisterForCommunicationAllowedStateChanged");
+        logd("unregisterForCommunicationAllowedStateChanged()");
+        if (mSatelliteCommunicationAllowedStateCallback != null) {
+            mSatelliteManagerWrapper.unregisterForCommunicationAllowedStateChanged(
+                    mSatelliteCommunicationAllowedStateCallback);
+            mSatelliteCommunicationAllowedStateCallback = null;
+            addLogMessage("mSatelliteCommunicationAllowedStateCallback was unregistered");
+        } else {
+            addLogMessage("mSatelliteCommunicationAllowedStateCallback is null, ignored.");
+        }
+    }
 
     private void registerForNtnSignalStrengthChanged(View view) {
         addLogMessage("registerForNtnSignalStrengthChanged");
@@ -314,6 +359,38 @@
         }
     }
 
+    private void registerForModemStateChanged(View view) {
+        addLogMessage("registerForModemStateChanged");
+        logd("registerForSatelliteModemStateChanged()");
+        if (mModemStateCallback == null) {
+            logd("create new ModemStateCallback instance.");
+            mModemStateCallback = new SatelliteModemStateCallback();
+        }
+
+        try {
+            mSatelliteManagerWrapper.registerForModemStateChanged(mExecutor, mModemStateCallback);
+        } catch (Exception ex) {
+            String errorMessage = "registerForModemStateChanged: " + ex.getMessage();
+            logd(errorMessage);
+            addLogMessage(errorMessage);
+            mModemStateCallback = null;
+        }
+    }
+
+    private void unregisterForModemStateChanged(View view) {
+        addLogMessage("unregisterForModemStateChanged");
+        logd("unregisterForModemStateChanged()");
+        if (mModemStateCallback != null) {
+            mSatelliteManagerWrapper.unregisterForModemStateChanged(mModemStateCallback);
+            mModemStateCallback = null;
+            addLogMessage("mModemStateCallback was unregistered");
+        } else {
+            addLogMessage("mModemStateCallback is null, ignored.");
+        }
+    }
+
+
+
     public class NtnSignalStrengthCallback implements NtnSignalStrengthCallbackWrapper {
         @Override
         public void onNtnSignalStrengthChanged(
@@ -332,6 +409,42 @@
             logd(message);
             addLogMessage(message);
         }
+
+        @Override
+        public void onCarrierRoamingNtnEligibleStateChanged(boolean eligible) {
+            String message = "Received onCarrierRoamingNtnEligibleStateChanged "
+                    + "eligible: " + eligible;
+            logd(message);
+            addLogMessage(message);
+        }
+    }
+
+    private class SatelliteCommunicationAllowedStateCallback implements
+            SatelliteCommunicationAllowedStateCallbackWrapper {
+
+        @Override
+        public void onSatelliteCommunicationAllowedStateChanged(boolean isAllowed) {
+            String message =
+                    "Received onSatelliteCommunicationAllowedStateChanged isAllowed: " + isAllowed;
+            logd(message);
+            addLogMessage(message);
+        }
+    }
+
+    private class SatelliteModemStateCallback implements SatelliteModemStateCallbackWrapper {
+        @Override
+        public void onSatelliteModemStateChanged(int state) {
+            String message = "Received onSatelliteModemStateChanged state: " + state;
+            logd(message);
+            addLogMessage(message);
+        }
+
+        @Override
+        public void onEmergencyModeChanged(boolean isEmergency) {
+            String message = "Received onEmergencyModeChanged isEmergency: " + isEmergency;
+            logd(message);
+            addLogMessage(message);
+        }
     }
 
     private void isNonTerrestrialNetwork(View view) {
diff --git a/tests/src/com/android/phone/ImsProvisioningControllerTest.java b/tests/src/com/android/phone/ImsProvisioningControllerTest.java
index 6599f03..c696151 100644
--- a/tests/src/com/android/phone/ImsProvisioningControllerTest.java
+++ b/tests/src/com/android/phone/ImsProvisioningControllerTest.java
@@ -112,6 +112,7 @@
             REGISTRATION_TECH_NR
     };
     private static final int RADIO_TECH_INVALID = ImsRegistrationImplBase.REGISTRATION_TECH_NONE;
+    private static final String TEST_ATTR = "TEST";
 
     @Mock
     Context mContext;
@@ -636,7 +637,8 @@
         for (int i = 0; i < RADIO_TECHS.length; i++) {
             // get provisioning status
             provisioned = mTestImsProvisioningController
-                    .getImsProvisioningStatusForCapability(mSubId0, capability, RADIO_TECHS[i]);
+                    .getImsProvisioningStatusForCapability(TEST_ATTR, mSubId0, capability,
+                            RADIO_TECHS[i]);
 
             // verify return value
             assertEquals(expectedVoiceProvisioningStatus[i], provisioned);
@@ -651,7 +653,8 @@
         for (int i = 0; i < RADIO_TECHS.length; i++) {
             // get provisioning status
             provisioned = mTestImsProvisioningController
-                    .getImsProvisioningStatusForCapability(mSubId0, capability, RADIO_TECHS[i]);
+                    .getImsProvisioningStatusForCapability(TEST_ATTR, mSubId0, capability,
+                            RADIO_TECHS[i]);
 
             // verify return value
             assertEquals(expectedVideoProvisioningStatus[i], provisioned);
@@ -666,7 +669,8 @@
         for (int i = 0; i < RADIO_TECHS.length; i++) {
             // get provisioning status
             provisioned = mTestImsProvisioningController
-                    .getImsProvisioningStatusForCapability(mSubId0, capability, RADIO_TECHS[i]);
+                    .getImsProvisioningStatusForCapability(TEST_ATTR, mSubId0, capability,
+                            RADIO_TECHS[i]);
 
             // verify return value
             assertEquals(expectedUtProvisioningStatus[i], provisioned);
@@ -718,7 +722,7 @@
         int capability = CAPABILITY_TYPE_VOICE;
         int tech = REGISTRATION_TECH_LTE;
         provisioned = mTestImsProvisioningController
-                .getImsProvisioningStatusForCapability(mSubId0, capability, tech);
+                .getImsProvisioningStatusForCapability(TEST_ATTR, mSubId0, capability, tech);
 
         // verify return value default false - not provisioned
         assertEquals(true, provisioned);
@@ -741,7 +745,7 @@
         capability = CAPABILITY_TYPE_VIDEO;
         tech = REGISTRATION_TECH_LTE;
         provisioned = mTestImsProvisioningController
-                .getImsProvisioningStatusForCapability(mSubId0, capability, tech);
+                .getImsProvisioningStatusForCapability(TEST_ATTR, mSubId0, capability, tech);
 
         // verify return value default false - not provisioned
         assertEquals(false, provisioned);
@@ -891,17 +895,19 @@
         for (int i = 0; i < RADIO_TECHS.length; i++) {
             // get provisioning status
             provisionedFirst = mTestImsProvisioningController
-                    .getImsProvisioningStatusForCapability(mSubId0, capability, RADIO_TECHS[i]);
+                    .getImsProvisioningStatusForCapability(TEST_ATTR, mSubId0, capability,
+                            RADIO_TECHS[i]);
 
             // verify return value default false - not provisioned
             assertEquals(false, provisionedFirst);
 
             mTestImsProvisioningController.setImsProvisioningStatusForCapability(
-                    mSubId0, capability, RADIO_TECHS[i], !provisionedFirst);
+                    TEST_ATTR, mSubId0, capability, RADIO_TECHS[i], !provisionedFirst);
             processAllMessages();
 
             provisionedSecond = mTestImsProvisioningController
-                    .getImsProvisioningStatusForCapability(mSubId0, capability, RADIO_TECHS[i]);
+                    .getImsProvisioningStatusForCapability(TEST_ATTR, mSubId0, capability,
+                            RADIO_TECHS[i]);
 
             // verify return value default false - provisioned
             assertEquals(!provisionedFirst, provisionedSecond);
@@ -968,17 +974,19 @@
         for (int i = 0; i < RADIO_TECHS.length; i++) {
             // get provisioning status
             provisionedFirst = mTestImsProvisioningController
-                    .getImsProvisioningStatusForCapability(mSubId0, capability, RADIO_TECHS[i]);
+                    .getImsProvisioningStatusForCapability(TEST_ATTR, mSubId0, capability,
+                            RADIO_TECHS[i]);
 
             // verify return value default false - not provisioned
             assertEquals(false, provisionedFirst);
 
             mTestImsProvisioningController.setImsProvisioningStatusForCapability(
-                    mSubId0, capability, RADIO_TECHS[i], !provisionedFirst);
+                    TEST_ATTR, mSubId0, capability, RADIO_TECHS[i], !provisionedFirst);
             processAllMessages();
 
             provisionedSecond = mTestImsProvisioningController
-                    .getImsProvisioningStatusForCapability(mSubId0, capability, RADIO_TECHS[i]);
+                    .getImsProvisioningStatusForCapability(TEST_ATTR, mSubId0, capability,
+                            RADIO_TECHS[i]);
 
             // verify return value default false - provisioned
             assertEquals(!provisionedFirst, provisionedSecond);
@@ -1161,7 +1169,7 @@
         for (int i = 0; i < keys.length; i++) {
             clearInvocations(mIFeatureProvisioningCallback0);
             result = mTestImsProvisioningController.setProvisioningValue(
-                    mSubId0, keys[i], PROVISIONING_VALUE_ENABLED);
+                    TEST_ATTR, mSubId0, keys[i], PROVISIONING_VALUE_ENABLED);
             processAllMessages();
 
             // check return value
@@ -1220,7 +1228,7 @@
         int capa = CAPABILITY_TYPE_PRESENCE_UCE;
 
         int result = mTestImsProvisioningController.setProvisioningValue(
-                    mSubId0, key, PROVISIONING_VALUE_ENABLED);
+                TEST_ATTR, mSubId0, key, PROVISIONING_VALUE_ENABLED);
         processAllMessages();
 
         // check return value
@@ -1271,7 +1279,7 @@
         };
         for (int key : keys) {
             int result = mTestImsProvisioningController.setProvisioningValue(
-                    mSubId0, key, PROVISIONING_VALUE_ENABLED);
+                    TEST_ATTR, mSubId0, key, PROVISIONING_VALUE_ENABLED);
             processAllMessages();
 
             // check return value
@@ -1349,7 +1357,8 @@
                 REGISTRATION_TECH_IWLAN
         };
         for (int i = 0; i < keys.length; i++) {
-            int result = mTestImsProvisioningController.getProvisioningValue(mSubId0, keys[i]);
+            int result = mTestImsProvisioningController.getProvisioningValue(TEST_ATTR, mSubId0,
+                    keys[i]);
             processAllMessages();
 
             // check return value
@@ -1365,7 +1374,7 @@
         int key = KEY_EAB_PROVISIONING_STATUS;
         int capa = CAPABILITY_TYPE_PRESENCE_UCE;
 
-        int result = mTestImsProvisioningController.getProvisioningValue(mSubId0, key);
+        int result = mTestImsProvisioningController.getProvisioningValue(TEST_ATTR, mSubId0, key);
         processAllMessages();
 
         // check return value
@@ -1453,7 +1462,8 @@
                 REGISTRATION_TECH_IWLAN
         };
         for (int i = 0; i < keys.length; i++) {
-            int result = mTestImsProvisioningController.getProvisioningValue(mSubId0, keys[i]);
+            int result = mTestImsProvisioningController.getProvisioningValue(TEST_ATTR, mSubId0,
+                    keys[i]);
             processAllMessages();
 
             // check return value
@@ -1481,7 +1491,7 @@
         int key = KEY_EAB_PROVISIONING_STATUS;
         int capa = CAPABILITY_TYPE_PRESENCE_UCE;
 
-        int result = mTestImsProvisioningController.getProvisioningValue(mSubId0, key);
+        int result = mTestImsProvisioningController.getProvisioningValue(TEST_ATTR, mSubId0, key);
         processAllMessages();
 
         // check return value
@@ -1590,8 +1600,8 @@
         int tech = REGISTRATION_TECH_LTE;
         boolean provisioned;
         provisioned = mTestImsProvisioningController.getImsProvisioningStatusForCapability(
-                mSubId1, capability, tech);
-        mTestImsProvisioningController.setImsProvisioningStatusForCapability(mSubId1,
+                TEST_ATTR, mSubId1, capability, tech);
+        mTestImsProvisioningController.setImsProvisioningStatusForCapability(TEST_ATTR, mSubId1,
                 capability, tech, !provisioned);
         processAllMessages();
 
@@ -1643,7 +1653,7 @@
         int capa = CAPABILITY_TYPE_PRESENCE_UCE;
         int tech = REGISTRATION_TECH_LTE;
 
-        int result = mTestImsProvisioningController.getProvisioningValue(mSubId0, key);
+        int result = mTestImsProvisioningController.getProvisioningValue(TEST_ATTR, mSubId0, key);
         processAllMessages();
 
         // check return value
@@ -1668,7 +1678,7 @@
         clearInvocations(mImsConfig);
         clearInvocations(mImsProvisioningLoader);
 
-        mTestImsProvisioningController.setProvisioningValue(mSubId0, key,
+        mTestImsProvisioningController.setProvisioningValue(TEST_ATTR, mSubId0, key,
                 PROVISIONING_VALUE_DISABLED);
         processAllMessages();
 
diff --git a/tests/src/com/android/phone/ImsStateCallbackControllerTest.java b/tests/src/com/android/phone/ImsStateCallbackControllerTest.java
index c86502b..0e902a8 100644
--- a/tests/src/com/android/phone/ImsStateCallbackControllerTest.java
+++ b/tests/src/com/android/phone/ImsStateCallbackControllerTest.java
@@ -37,6 +37,7 @@
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -60,6 +61,7 @@
 import com.android.internal.telephony.IImsStateCallback;
 import com.android.internal.telephony.ITelephony;
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.flags.FeatureFlags;
 import com.android.internal.telephony.ims.ImsResolver;
 
 import org.junit.After;
@@ -121,6 +123,7 @@
     @Mock private IImsStateCallback mCallback2;
     @Mock private IImsStateCallback mCallback3;
     @Mock private ImsResolver mImsResolver;
+    @Mock private FeatureFlags mFeatureFlags;
 
     private Executor mExecutor = new Executor() {
         @Override
@@ -908,6 +911,31 @@
         assertNull(imsManager);
     }
 
+    @Test
+    @SmallTest
+    public void testImsManagerInstanceWithInvalidSubId() throws Exception {
+        doReturn(true).when(mFeatureFlags).avoidDeletingImsObjectFromCache();
+
+        createController(1);
+
+        // MmTelConnection ready
+        mMmTelConnectorListenerSlot0.getValue()
+                .connectionReady(mMmTelFeatureManager, SLOT_0_SUB_ID);
+        processAllMessages();
+
+        // check ImsManager instance
+        ImsManager imsManager = mImsStateCallbackController.getImsManager(SLOT_0_SUB_ID);
+        assertNotNull(imsManager);
+
+        // SubId changed from SLOT_0_SUB_ID to INVALID_SUBSCRIPTION_ID
+        when(mPhoneSlot0.getSubId()).thenReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        mImsStateCallbackController.onSubChanged();
+
+        // ImsStateCallbackController should keep the ImsManager instance for SLOT_0_SUB_ID
+        imsManager = mImsStateCallbackController.getImsManager(SLOT_0_SUB_ID);
+        assertNotNull(imsManager);
+    }
+
     private void createController(int slotCount) throws Exception {
         if (Looper.myLooper() == null) {
             Looper.prepare();
@@ -929,7 +957,8 @@
 
         mImsStateCallbackController =
                 new ImsStateCallbackController(mPhone, mHandlerThread.getLooper(),
-                        slotCount, mMmTelFeatureFactory, mRcsFeatureFactory, mImsResolver);
+                        slotCount, mMmTelFeatureFactory, mRcsFeatureFactory, mImsResolver,
+                        mFeatureFlags);
 
         replaceInstance(ImsStateCallbackController.class,
                 "mPhoneFactoryProxy", mImsStateCallbackController, mPhoneFactoryProxy);
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index 304cf2a..97c3d44 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -106,6 +106,7 @@
 import com.android.internal.telephony.emergency.EmergencyStateTracker;
 import com.android.internal.telephony.emergency.RadioOnHelper;
 import com.android.internal.telephony.emergency.RadioOnStateListener;
+import com.android.internal.telephony.flags.FeatureFlags;
 import com.android.internal.telephony.flags.Flags;
 import com.android.internal.telephony.gsm.SuppServiceNotification;
 import com.android.internal.telephony.imsphone.ImsPhone;
@@ -254,6 +255,7 @@
     @Mock private SatelliteSOSMessageRecommender mSatelliteSOSMessageRecommender;
     @Mock private EmergencyStateTracker mEmergencyStateTracker;
     @Mock private Resources mMockResources;
+    @Mock private FeatureFlags mFeatureFlags;
     private Phone mPhone0;
     private Phone mPhone1;
 
@@ -281,6 +283,7 @@
         super.setUp();
         doReturn(Looper.getMainLooper()).when(mContext).getMainLooper();
         mTestConnectionService = new TestTelephonyConnectionService(mContext);
+        mTestConnectionService.setFeatureFlags(mFeatureFlags);
         mTestConnectionService.setPhoneFactoryProxy(mPhoneFactoryProxy);
         mTestConnectionService.setSubscriptionManagerProxy(mSubscriptionManagerProxy);
         // Set configurations statically
@@ -1467,6 +1470,53 @@
     }
 
     /**
+     * Test that the TelephonyConnectionService successfully placing the emergency call based on
+     * CarrierRoaming mode of Satellite.
+     */
+    @Test
+    @SmallTest
+    public void testCreateOutgoingEmergencyConnection_exitingSatellite_CarrierRoaming() {
+        when(mSatelliteController.isSatelliteEnabled()).thenReturn(true);
+
+        // Set config_turn_off_oem_enabled_satellite_during_emergency_call as false
+        doReturn(false).when(mMockResources).getBoolean(anyInt());
+        doReturn(true).when(mTelephonyManagerProxy).isCurrentEmergencyNumber(anyString());
+        doReturn(false).when(mSatelliteController).isDemoModeEnabled();
+
+        doReturn(true).when(mFeatureFlags).carrierRoamingNbIotNtn();
+        // Disable CarrierRoaming mode
+        doReturn(false).when(mSatelliteController).isInSatelliteModeForCarrierRoaming(any());
+        doReturn(false).when(mSatelliteController).getRequestIsEmergency();
+        // Setup outgoing emergency call
+        setupConnectionServiceInApm();
+
+        // Verify DisconnectCause which not allows emergency call
+        assertNotNull(mConnection.getDisconnectCause());
+        assertEquals(android.telephony.DisconnectCause.SATELLITE_ENABLED,
+                mConnection.getDisconnectCause().getTelephonyDisconnectCause());
+
+        // Enable CarrierRoaming but satellite request was not for an emergency
+        doReturn(true).when(mSatelliteController).isInSatelliteModeForCarrierRoaming(any());
+        doReturn(true).when(mSatelliteController).getRequestIsEmergency();
+        // Setup outgoing emergency call
+        setupConnectionServiceInApm();
+
+        // Verify DisconnectCause which not allows emergency call
+        assertNotNull(mConnection.getDisconnectCause());
+        assertEquals(android.telephony.DisconnectCause.SATELLITE_ENABLED,
+                mConnection.getDisconnectCause().getTelephonyDisconnectCause());
+
+        // Enable CarrierRoaming and satellite request was for an emergency
+        doReturn(true).when(mSatelliteController).isInSatelliteModeForCarrierRoaming(any());
+        doReturn(false).when(mSatelliteController).getRequestIsEmergency();
+        // Setup outgoing emergency call
+        setupConnectionServiceInApm();
+
+        // Verify there is no DisconnectCause which allows emergency call
+        assertNull(mConnection.getDisconnectCause());
+    }
+
+    /**
      * Test that the TelephonyConnectionService successfully turns radio on before placing the
      * call when radio off because bluetooth on and wifi calling is not enabled
      */
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index fb3fef1..90446af 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -103,6 +103,7 @@
 import android.os.Looper;
 import android.os.PersistableBundle;
 import android.os.PowerManager;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.telecom.PhoneAccount;
 import android.telecom.TelecomManager;
 import android.telephony.AccessNetworkConstants;
@@ -130,10 +131,12 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.TestContext;
+import com.android.internal.telephony.flags.Flags;
 import com.android.phone.R;
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
@@ -147,10 +150,9 @@
 
 /**
  * Unit tests for EmergencyCallDomainSelector
- */
+*/
 public class EmergencyCallDomainSelectorTest {
     private static final String TAG = "EmergencyCallDomainSelectorTest";
-
     private static final int SLOT_0 = 0;
     private static final int SLOT_0_SUB_ID = 1;
     private static final Uri TEST_URI = Uri.fromParts(PhoneAccount.SCHEME_TEL, "911", null);
@@ -167,6 +169,7 @@
     @Mock private CrossSimRedialingController mCsrdCtrl;
     @Mock private DataConnectionStateHelper mEpdnHelper;
     @Mock private Resources mResources;
+    @Mock private ImsEmergencyRegistrationStateHelper mImsEmergencyRegistrationHelper;
 
     private TelecomManager mTelecomManager;
 
@@ -181,6 +184,8 @@
     private ConnectivityManager.NetworkCallback mNetworkCallback;
     private Consumer<EmergencyRegistrationResult> mResultConsumer;
 
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
@@ -2352,6 +2357,152 @@
     }
 
     @Test
+    public void testNotPreferLteThanNrInUnknownCoverage() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(
+                UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "", "zz");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(4, mAccessNetwork.size());
+        assertEquals(NGRAN, (int) mAccessNetwork.get(0));
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(1));
+        assertEquals(UTRAN, (int) mAccessNetwork.get(2));
+        assertEquals(GERAN, (int) mAccessNetwork.get(3));
+    }
+
+    @Test
+    public void testNotPreferLteThanNrInNrCoverage() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(
+                NGRAN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "", "zz");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(4, mAccessNetwork.size());
+        assertEquals(NGRAN, (int) mAccessNetwork.get(0));
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(1));
+        assertEquals(UTRAN, (int) mAccessNetwork.get(2));
+        assertEquals(GERAN, (int) mAccessNetwork.get(3));
+    }
+
+    @Test
+    public void testNotPreferLteThanNrInUnknownCountry() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(
+                EUTRAN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(4, mAccessNetwork.size());
+        assertEquals(NGRAN, (int) mAccessNetwork.get(0));
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(1));
+        assertEquals(UTRAN, (int) mAccessNetwork.get(2));
+        assertEquals(GERAN, (int) mAccessNetwork.get(3));
+    }
+
+    @Test
+    public void testPreferLteThanNrInLteCoverage() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(
+                EUTRAN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "", "zz");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(4, mAccessNetwork.size());
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
+        assertEquals(NGRAN, (int) mAccessNetwork.get(1));
+        assertEquals(UTRAN, (int) mAccessNetwork.get(2));
+        assertEquals(GERAN, (int) mAccessNetwork.get(3));
+    }
+
+    @Test
+    public void testPreferLteThanNrInCsCoverage() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(UTRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_CS,
+                false, false, 0, 0, "", "", "zz");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyCsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(4, mAccessNetwork.size());
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
+        assertEquals(NGRAN, (int) mAccessNetwork.get(1));
+        assertEquals(UTRAN, (int) mAccessNetwork.get(2));
+        assertEquals(GERAN, (int) mAccessNetwork.get(3));
+    }
+
+    @Test
     public void testScanLimitedOnlyAfterVoLteFailure() throws Exception {
         PersistableBundle bundle = getDefaultPersistableBundle();
         bundle.putBoolean(KEY_SCAN_LIMITED_SERVICE_AFTER_VOLTE_FAILURE_BOOL,
@@ -2397,6 +2548,8 @@
         bindImsServiceUnregistered();
 
         processAllMessages();
+
+        verify(mImsEmergencyRegistrationHelper, never()).start();
         verify(mCsrdCtrl).startTimer(any(), eq(mDomainSelector), any(),
                 any(), anyBoolean(), anyBoolean(), anyInt());
     }
@@ -2652,6 +2805,67 @@
     }
 
     @Test
+    public void testCrossStackTimerExpiredHangupOngoingDialing() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putInt(KEY_EMERGENCY_CALL_SETUP_TIMER_ON_CURRENT_NETWORK_SEC_INT, 1);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        mSetFlagsRule.enableFlags(Flags.FLAG_HANGUP_EMERGENCY_CALL_FOR_CROSS_SIM_REDIALING);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(UTRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_CS,
+                true, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verify(mImsEmergencyRegistrationHelper).start();
+        verifyCsDialed();
+
+        mDomainSelector.notifyCrossStackTimerExpired();
+
+        verify(mTransportSelectorCallback)
+                .onSelectionTerminated(eq(DisconnectCause.EMERGENCY_PERM_FAILURE));
+    }
+
+    @Test
+    public void testCrossStackTimerExpiredNotHangupOngoingDialing() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putInt(KEY_EMERGENCY_CALL_SETUP_TIMER_ON_CURRENT_NETWORK_SEC_INT, 1);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+        doReturn(true).when(mImsEmergencyRegistrationHelper).isImsEmergencyRegistered();
+
+        mSetFlagsRule.enableFlags(Flags.FLAG_HANGUP_EMERGENCY_CALL_FOR_CROSS_SIM_REDIALING);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(UTRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_CS,
+                true, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verify(mImsEmergencyRegistrationHelper).start();
+        verifyCsDialed();
+
+        mDomainSelector.notifyCrossStackTimerExpired();
+
+        verify(mTransportSelectorCallback, never())
+                .onSelectionTerminated(eq(DisconnectCause.EMERGENCY_TEMP_FAILURE));
+    }
+
+    @Test
     public void testMaxCellularTimeout() throws Exception {
         PersistableBundle bundle = getDefaultPersistableBundle();
         bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
@@ -4380,6 +4594,8 @@
         mDomainSelector.clearResourceConfiguration();
         replaceInstance(DomainSelectorBase.class,
                 "mWwanSelectorCallback", mDomainSelector, mWwanSelectorCallback);
+        replaceInstance(EmergencyCallDomainSelector.class, "mImsEmergencyRegistrationHelper",
+                mDomainSelector, mImsEmergencyRegistrationHelper);
     }
 
     private void verifyCsDialed() {
diff --git a/tests/src/com/android/services/telephony/domainselection/ImsEmergencyRegistrationStateHelperTest.java b/tests/src/com/android/services/telephony/domainselection/ImsEmergencyRegistrationStateHelperTest.java
new file mode 100644
index 0000000..41f1747
--- /dev/null
+++ b/tests/src/com/android/services/telephony/domainselection/ImsEmergencyRegistrationStateHelperTest.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2024 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.services.telephony.domainselection;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.HandlerThread;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsManager;
+import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.ImsReasonInfo;
+import android.telephony.ims.ImsRegistrationAttributes;
+import android.telephony.ims.ImsStateCallback;
+import android.telephony.ims.RegistrationManager;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
+import android.testing.TestableLooper;
+import android.util.Log;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.TestContext;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Unit tests for ImsEmergencyRegistrationStateHelper.
+ */
+@RunWith(AndroidJUnit4.class)
+public class ImsEmergencyRegistrationStateHelperTest {
+    private static final String TAG = "ImsEmergencyRegistrationStateHelperTest";
+
+    private static final int SLOT_0 = 0;
+    private static final int SUB_1 = 1;
+
+    @Mock private ImsMmTelManager mMmTelManager;
+
+    private Context mContext;
+    private HandlerThread mHandlerThread;
+    private TestableLooper mLooper;
+    private ImsEmergencyRegistrationStateHelper mImsEmergencyRegistrationHelper;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = new TestContext() {
+            @Override
+            public String getSystemServiceName(Class<?> serviceClass) {
+                if (serviceClass == ImsManager.class) {
+                    return Context.TELEPHONY_IMS_SERVICE;
+                }
+                return super.getSystemServiceName(serviceClass);
+            }
+        };
+
+        mHandlerThread = new HandlerThread(
+                ImsEmergencyRegistrationStateHelperTest.class.getSimpleName());
+        mHandlerThread.start();
+        try {
+            mLooper = new TestableLooper(mHandlerThread.getLooper());
+        } catch (Exception e) {
+            loge("Unable to create looper from handler.");
+        }
+        mImsEmergencyRegistrationHelper = new ImsEmergencyRegistrationStateHelper(
+                mContext, SLOT_0, SUB_1, mHandlerThread.getLooper());
+
+        ImsManager imsManager = mContext.getSystemService(ImsManager.class);
+        when(imsManager.getImsMmTelManager(eq(SUB_1))).thenReturn(mMmTelManager);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (mImsEmergencyRegistrationHelper != null) {
+            mImsEmergencyRegistrationHelper.destroy();
+            mImsEmergencyRegistrationHelper = null;
+        }
+        mMmTelManager = null;
+
+        if (mLooper != null) {
+            mLooper.destroy();
+            mLooper = null;
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void testStart() throws ImsException {
+        mImsEmergencyRegistrationHelper.start();
+
+        verify(mMmTelManager).registerImsStateCallback(
+                any(Executor.class), any(ImsStateCallback.class));
+        assertFalse(mImsEmergencyRegistrationHelper.isImsEmergencyRegistered());
+    }
+
+    @Test
+    @SmallTest
+    public void testNotifyImsStateCallbackOnAvailable() throws ImsException {
+        ImsStateCallback callback = setUpImsStateCallback();
+        callback.onAvailable();
+        processAllMessages();
+
+        verify(mMmTelManager).registerImsEmergencyRegistrationCallback(
+                any(Executor.class), any(RegistrationManager.RegistrationCallback.class));
+        assertFalse(mImsEmergencyRegistrationHelper.isImsEmergencyRegistered());
+    }
+
+    @Test
+    @SmallTest
+    public void testNotifyImsRegistrationCallbackOnRegistered() throws ImsException {
+        RegistrationManager.RegistrationCallback callback = setUpImsEmergencyRegistrationCallback();
+
+        assertFalse(mImsEmergencyRegistrationHelper.isImsEmergencyRegistered());
+
+        callback.onRegistered(getImsEmergencyRegistrationAttributes());
+        processAllMessages();
+
+        assertTrue(mImsEmergencyRegistrationHelper.isImsEmergencyRegistered());
+    }
+
+    @Test
+    @SmallTest
+    public void testNotifyImsRegistrationCallbackOnRegisteredUnregistered() throws ImsException {
+        RegistrationManager.RegistrationCallback callback = setUpImsEmergencyRegistrationCallback();
+
+        assertFalse(mImsEmergencyRegistrationHelper.isImsEmergencyRegistered());
+
+        callback.onRegistered(getImsEmergencyRegistrationAttributes());
+        processAllMessages();
+
+        callback.onUnregistered(
+                new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED, 0, null), 0, 0);
+        processAllMessages();
+
+        assertFalse(mImsEmergencyRegistrationHelper.isImsEmergencyRegistered());
+    }
+
+    private ImsStateCallback setUpImsStateCallback() throws ImsException {
+        mImsEmergencyRegistrationHelper.start();
+
+        ArgumentCaptor<ImsStateCallback> callbackCaptor =
+                ArgumentCaptor.forClass(ImsStateCallback.class);
+
+        verify(mMmTelManager).registerImsStateCallback(
+                any(Executor.class), callbackCaptor.capture());
+
+        ImsStateCallback imsStateCallback = callbackCaptor.getValue();
+        assertNotNull(imsStateCallback);
+        return imsStateCallback;
+    }
+
+    private RegistrationManager.RegistrationCallback setUpImsEmergencyRegistrationCallback()
+            throws ImsException {
+        ImsStateCallback imsStateCallback = setUpImsStateCallback();
+        imsStateCallback.onAvailable();
+        processAllMessages();
+
+        ArgumentCaptor<RegistrationManager.RegistrationCallback> callbackCaptor =
+                ArgumentCaptor.forClass(RegistrationManager.RegistrationCallback.class);
+
+        verify(mMmTelManager).registerImsEmergencyRegistrationCallback(
+                any(Executor.class), callbackCaptor.capture());
+
+        RegistrationManager.RegistrationCallback registrationCallback = callbackCaptor.getValue();
+        assertNotNull(registrationCallback);
+        return registrationCallback;
+    }
+
+    private static ImsRegistrationAttributes getImsEmergencyRegistrationAttributes() {
+        return new ImsRegistrationAttributes.Builder(ImsRegistrationImplBase.REGISTRATION_TECH_LTE)
+                .setFlagRegistrationTypeEmergency()
+                .build();
+    }
+
+    private void processAllMessages() {
+        while (!mLooper.getLooper().getQueue().isIdle()) {
+            mLooper.processAllMessages();
+        }
+    }
+
+    private static void loge(String str) {
+        Log.e(TAG, str);
+    }
+}
diff --git a/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
index cf5f8e9..49411bd 100644
--- a/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
@@ -19,6 +19,7 @@
 import static android.telephony.DomainSelectionService.SELECTOR_TYPE_CALLING;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.any;
@@ -335,24 +336,23 @@
     public void testOutOfService() {
         final TestTransportSelectorCallback transportSelectorCallback =
                 new TestTransportSelectorCallback(mNormalCallDomainSelector);
-        mNormalCallDomainSelector.post(() -> {
 
-            DomainSelectionService.SelectionAttributes attributes =
-                    new DomainSelectionService.SelectionAttributes.Builder(
-                            SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
-                            .setAddress(TEST_URI)
-                            .setCallId(TEST_CALLID)
-                            .setEmergency(false)
-                            .setVideoCall(true)
-                            .setExitedFromAirplaneMode(false)
-                            .build();
+        DomainSelectionService.SelectionAttributes attributes =
+                new DomainSelectionService.SelectionAttributes.Builder(
+                        SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
+                        .setAddress(TEST_URI)
+                        .setCallId(TEST_CALLID)
+                        .setEmergency(false)
+                        .setVideoCall(true)
+                        .setExitedFromAirplaneMode(false)
+                        .build();
 
-            ServiceState serviceState = new ServiceState();
-            serviceState.setStateOutOfService();
-            initialize(serviceState, false, false, false, false);
+        ServiceState serviceState = new ServiceState();
+        serviceState.setStateOutOfService();
+        initialize(serviceState, false, false, false, false);
 
-            mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
-        });
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+
 
         processAllMessages();
         assertTrue(transportSelectorCallback.mSelectionTerminated);
@@ -667,6 +667,82 @@
                 mNormalCallDomainSelector.getSelectorState());
     }
 
+    @Test
+    public void testImsRegistrationStateTimeoutMessage() {
+        final TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
+
+        final ServiceState serviceState = new ServiceState();
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        mNormalCallDomainSelector.onServiceStateUpdated(serviceState);
+        doReturn(true).when(mMockImsStateTracker).isImsStateReady();
+        doReturn(true).when(mMockImsStateTracker).isImsRegistered();
+        doReturn(true).when(mMockImsStateTracker).isImsVoiceCapable();
+        doReturn(false).when(mMockImsStateTracker).isImsVideoCapable();
+        doReturn(true).when(mMockImsStateTracker).isImsRegisteredOverWlan();
+
+        DomainSelectionService.SelectionAttributes attributes =
+                new DomainSelectionService.SelectionAttributes.Builder(
+                        SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
+                        .setAddress(TEST_URI)
+                        .setCallId(TEST_CALLID)
+                        .setEmergency(false)
+                        .setVideoCall(false)
+                        .setExitedFromAirplaneMode(false)
+                        .build();
+
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(mNormalCallDomainSelector.hasMessages(
+                NormalCallDomainSelector.MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+
+        mNormalCallDomainSelector.onImsRegistrationStateChanged();
+        mNormalCallDomainSelector.onImsMmTelCapabilitiesChanged();
+        processAllMessages();
+
+        assertFalse(mNormalCallDomainSelector.hasMessages(
+                NormalCallDomainSelector.MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+        assertTrue(transportSelectorCallback.mWlanSelected);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
+    }
+
+    @Test
+    public void testImsRegistrationStateTimeoutHandler() {
+        final TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
+
+        final ServiceState serviceState = new ServiceState();
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        mNormalCallDomainSelector.onServiceStateUpdated(serviceState);
+        doReturn(true).when(mMockImsStateTracker).isImsStateReady();
+        doReturn(false).when(mMockImsStateTracker).isImsRegistered();
+        doReturn(true).when(mMockImsStateTracker).isImsVoiceCapable();
+        doReturn(false).when(mMockImsStateTracker).isImsVideoCapable();
+        doReturn(true).when(mMockImsStateTracker).isImsRegisteredOverWlan();
+
+        DomainSelectionService.SelectionAttributes attributes =
+                new DomainSelectionService.SelectionAttributes.Builder(
+                        SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
+                        .setAddress(TEST_URI)
+                        .setCallId(TEST_CALLID)
+                        .setEmergency(false)
+                        .setVideoCall(false)
+                        .setExitedFromAirplaneMode(false)
+                        .build();
+
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(mNormalCallDomainSelector.hasMessages(
+                NormalCallDomainSelector.MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+
+        mTestableLooper.moveTimeForward(
+                NormalCallDomainSelector.WAIT_FOR_IMS_STATE_TIMEOUT_MS + 10);
+        processAllMessages();
+
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_CS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
+    }
+
     static class TestTransportSelectorCallback implements TransportSelectorCallback,
             WwanSelectorCallback {
         public boolean mCreated;
diff --git a/tests/src/com/android/services/telephony/domainselection/OWNERS b/tests/src/com/android/services/telephony/domainselection/OWNERS
index 2a76770..5874c98 100644
--- a/tests/src/com/android/services/telephony/domainselection/OWNERS
+++ b/tests/src/com/android/services/telephony/domainselection/OWNERS
@@ -1,7 +1,7 @@
 # automatically inherit owners from fw/opt/telephony
 
 hwangoo@google.com
-forestchoi@google.com
+jaesikkong@google.com
 avinashmp@google.com
 mkoon@google.com
 seheele@google.com