Merge "Screen Add FDN: Disable Save button if fields Name or Number are empty"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 69620cd..4baec2d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -79,6 +79,10 @@
     <protected-broadcast android:name= "com.android.phone.vvm.ACTION_VISUAL_VOICEMAIL_SERVICE_EVENT" />
     <protected-broadcast android:name= "com.android.internal.telephony.CARRIER_VVM_PACKAGE_INSTALLED" />
     <protected-broadcast android:name= "com.android.cellbroadcastreceiver.GET_LATEST_CB_AREA_INFO" />
+    <protected-broadcast android:name= "android.intent.action.CURRENT_CARRIER_IDENTITY_CHANGED" />
+    <protected-broadcast android:name= "android.telephony.action.SIM_CARD_STATE_CHANGED" />
+    <protected-broadcast android:name= "android.telephony.action.SIM_APPLICATION_STATE_CHANGED" />
+    <protected-broadcast android:name= "android.telephony.action.SIM_SLOT_STATUS_CHANGED" />
 
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
     <uses-permission android:name="android.permission.CALL_PHONE" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 7ddd38d..e5c422c 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Die nuwe PIN bevat ongeldige karakters."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kan nie PIN verander nie"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Ongesteunde tipe boodskap, bel <xliff:g id="NUMBER">%s</xliff:g> om te luister."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobiele netwerkinstellings"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobiele netwerk"</string>
     <string name="label_available" msgid="1181658289009300430">"Beskikbare netwerke"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Soek tans…"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 384e1e4..9020be2 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"አዲሱ ፒን ልክ ያልሆኑ ቁምፊዎችን ይዟል።"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ፒን መቀየር አልተቻለም።"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"የማይደገፍ የመልዕክት አይነት፤ ለማዳመጥ ወደ <xliff:g id="NUMBER">%s</xliff:g> ይደውሉ።"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"የተንቀሳቃሽ ስልክ አውታረ መረብ ቅንብሮች"</string>
     <string name="network_settings_title" msgid="514120489499925574">"የተንቀሳቃሽ ስልክ አውታረ መረብ"</string>
     <string name="label_available" msgid="1181658289009300430">"የሚገኙ አውታረመረቦች"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"በመፈለግ ላይ…"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 3191ecf..f850115 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"رقم التعريف الشخصي الجديد يحتوي على أحرف غير صالحة."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"غير قادر على تغيير رقم التعريف الشخصي"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"نوع الرسالة غير معتمد، اتصل على <xliff:g id="NUMBER">%s</xliff:g> لسماعها."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"إعدادات شبكة الجوال"</string>
     <string name="network_settings_title" msgid="514120489499925574">"شبكة الجوّال"</string>
     <string name="label_available" msgid="1181658289009300430">"الشبكات المتاحة"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"جارِ البحث…"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 14b0b8a..5984aea 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Yeni PIN kod yanlış simvollardan ibarətdir."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN kodu dəyişmək mümkün olmadı"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Dəstəklənməyən mesaj növü, qulaq asmaq üçün <xliff:g id="NUMBER">%s</xliff:g> nömrəsinə zəng edin."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobil şəbəkə parametrləri"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobil şəbəkə"</string>
     <string name="label_available" msgid="1181658289009300430">"Əlçatımlı şəbəkələr"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Axtarılır..."</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 9c3c37a..c2a4088 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Novi PIN sadrži nevažeće znakove."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Promena PIN-a nije uspela"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodržani tip poruke. Pozovite <xliff:g id="NUMBER">%s</xliff:g> da biste je preslušali."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Podešavanja za mob. mrežu"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilna mreža"</string>
     <string name="label_available" msgid="1181658289009300430">"Dostupne mreže"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Pretražuje se…"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 3f8bf23..b1fddb2 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новы PIN-код змяшчае несапраўдныя сімвалы."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Немагчыма змяніць PIN-код"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Гэты тып паведамлення не падтрымліваецца; каб праслухаць, патэлефануйце на <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Налады мабільнай сеткі"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Мабільная сетка"</string>
     <string name="label_available" msgid="1181658289009300430">"Даступныя сеткі"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Пошук..."</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index d60b205..9ec3901 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новият ПИН съдържа невалидни знаци."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Промяната на ПИН не е възможна"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Типът на съобщението не се поддържа. Обадете се на <xliff:g id="NUMBER">%s</xliff:g>, за да го чуете."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Настройки на мобилн. мрежа"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Мобилна мрежа"</string>
     <string name="label_available" msgid="1181658289009300430">"Налични мрежи"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Търси се…"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 67b89c5..2823559 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"নতুন পিনে অবৈধ অক্ষর রয়েছে৷"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"পিন পরিবর্তন করা গেল না"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"এই ধরণের বার্তা সমর্থিত নয় , শুোনার জন্য <xliff:g id="NUMBER">%s</xliff:g> এ কল করুন৷"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"মোবাইল নেটওয়ার্ক সেটিংস"</string>
     <string name="network_settings_title" msgid="514120489499925574">"মোবাইল নেটওয়ার্ক"</string>
     <string name="label_available" msgid="1181658289009300430">"উপলব্ধ নেটওয়ার্কগুলি"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"অনুসন্ধান করছে..."</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 1245575..000469d 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Novi PIN sadrži nevažeće znakove."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nije moguće promijeniti PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodržana vrsta poruke. Pozovite <xliff:g id="NUMBER">%s</xliff:g> da je preslušate."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Postavke mobilne mreže"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilna mreža"</string>
     <string name="label_available" msgid="1181658289009300430">"Dostupne mreže"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Pretraživanje…"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 3e7c48c..fa56382 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"El PIN nou conté caràcters que no són vàlids."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"No es pot canviar el PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Aquest tipus de missatge no s\'admet. Truca al <xliff:g id="NUMBER">%s</xliff:g> per escoltar-lo."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Configuració de la xarxa mòbil"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Xarxa mòbil"</string>
     <string name="label_available" msgid="1181658289009300430">"Xarxes disponibles"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"S\'està cercant…"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 79f1364..8ce0361 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nový kód PIN obsahuje neplatné znaky."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kód PIN se nepodařilo změnit"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodporovaný typ zprávy, pokud si ji chcete poslechnout zavolejte na číslo <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Nastavení mobilní sítě"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilní síť"</string>
     <string name="label_available" msgid="1181658289009300430">"Dostupné sítě"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Vyhledávání..."</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 8d737bb..cff52ec 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Den nye pinkode har ugyldige tegn."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Pinkoden kan ikke ændres"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Ikke-understøttet beskedtype. Ring til <xliff:g id="NUMBER">%s</xliff:g> for at aflytte."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Indstillinger for mobilnetværk"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilnetværk"</string>
     <string name="label_available" msgid="1181658289009300430">"Tilgængelige netværk"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Søger..."</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 02bbfca..fc0d730 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Die neue PIN enthält ungültige Zeichen."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN kann nicht geändert werden"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nicht unterstützter Nachrichtentyp, zum Abhören <xliff:g id="NUMBER">%s</xliff:g> anrufen."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Einstellungen für Mobilfunknetze"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilfunknetz"</string>
     <string name="label_available" msgid="1181658289009300430">"Verfügbare Netzwerke"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Suche läuft..."</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 1a3476b..6a819dc 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Το νέο PIN περιέχει μη έγκυρους χαρακτήρες."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Δεν είναι δυνατή η αλλαγή του PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Μη υποστηριζόμενος τύπος μηνύματος: καλέστε στο <xliff:g id="NUMBER">%s</xliff:g> για να το ακούσετε."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Ρυθμίσεις δικτύου κινητής τηλεφωνίας"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Δίκτυο κινητής τηλεφωνίας"</string>
     <string name="label_available" msgid="1181658289009300430">"Διαθέσιμα δίκτυα"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Αναζήτηση..."</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 388a6a1..fb47ff8 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"The new PIN contains invalid characters."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Unable to change PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Unsupported message type. Call <xliff:g id="NUMBER">%s</xliff:g> to listen."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobile network settings"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobile network"</string>
     <string name="label_available" msgid="1181658289009300430">"Available networks"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Searching…"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 388a6a1..fb47ff8 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"The new PIN contains invalid characters."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Unable to change PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Unsupported message type. Call <xliff:g id="NUMBER">%s</xliff:g> to listen."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobile network settings"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobile network"</string>
     <string name="label_available" msgid="1181658289009300430">"Available networks"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Searching…"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 388a6a1..fb47ff8 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"The new PIN contains invalid characters."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Unable to change PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Unsupported message type. Call <xliff:g id="NUMBER">%s</xliff:g> to listen."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobile network settings"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobile network"</string>
     <string name="label_available" msgid="1181658289009300430">"Available networks"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Searching…"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index bf2608b..d493bce 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"El nuevo PIN contiene caracteres no válidos."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"No se puede cambiar el PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo de mensaje no compatible. Llama al <xliff:g id="NUMBER">%s</xliff:g> para escucharlo."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Configuración de red móvil"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Red móvil"</string>
     <string name="label_available" msgid="1181658289009300430">"Redes disponibles"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Buscando..."</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 95d345b..6f8359c 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"El PIN nuevo contiene caracteres no válidos."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"No se puede cambiar el PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Este tipo de mensaje no se admite. Llama al <xliff:g id="NUMBER">%s</xliff:g> para escucharlo."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Ajustes de la red móvil"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Red móvil"</string>
     <string name="label_available" msgid="1181658289009300430">"Redes disponibles"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Buscando..."</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 13a3c26..73e1fa5 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Uus PIN-kood sisaldab sobimatuid tähemärke."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-koodi ei õnnestu muuta"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Toetamata sõnumi tüüp, kuulamiseks helistage numbrile <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobiilsidevõrgu seaded"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobiilsidevõrk"</string>
     <string name="label_available" msgid="1181658289009300430">"Saadaolevad võrgud"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Otsimine ..."</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index e01d16b..9dce3d4 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Balio ez duten karaktereak ditu PIN kode berriak."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Ezin da aldatu PIN kodea"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Ez dira onartzen mota honetako mezuak. Entzuteko, deitu <xliff:g id="NUMBER">%s</xliff:g> zenbakira."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Sare mugikorren ezarpenak"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Sare mugikorra"</string>
     <string name="label_available" msgid="1181658289009300430">"Sare erabilgarriak"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Bilatzen…"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 27ad27f..45502d2 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"پین جدید نویسه‌های نامعتبری دارد."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"پین تغییر نکرد"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"نوع پیام پشتیبانی نمی‌شود، برای گوش کردن با <xliff:g id="NUMBER">%s</xliff:g> تماس بگیرید."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"تنظیمات شبکهٔ تلفن همراه"</string>
     <string name="network_settings_title" msgid="514120489499925574">"شبکه تلفن همراه"</string>
     <string name="label_available" msgid="1181658289009300430">"شبکه‌های موجود"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"در حال جستجو…"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 6909576..012e352 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Uusi PIN-koodi sisältää virheellisiä merkkejä."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-koodin vaihtaminen epäonnistui."</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Viestin tyyppiä ei tueta. Kuuntele soittamalla numeroon <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobiiliverkkoasetukset"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobiiliverkko"</string>
     <string name="label_available" msgid="1181658289009300430">"Käytettävissä olevat verkot"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Haetaan…"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 0e3c052..ba372d6 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Le nouveau NIP contient des caractères incorrects."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Impossible de modifier le NIP"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Type de message non pris en charge. Composez le <xliff:g id="NUMBER">%s</xliff:g> pour l\'écouter."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Paramètres du réseau mobile"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Réseau cellulaire"</string>
     <string name="label_available" msgid="1181658289009300430">"Réseaux disponibles"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Recherche en cours…"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a1b7f52..a95a939 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Le nouveau code contient des caractères incorrects."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Impossible de modifier le code"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Type de message incompatible, composez le <xliff:g id="NUMBER">%s</xliff:g> pour l\'écouter."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Paramètres du réseau mobile"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Réseau mobile"</string>
     <string name="label_available" msgid="1181658289009300430">"Réseaux disponibles"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Recherche..."</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 04be743..1e91d59 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"O novo PIN contén caracteres non válidos."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Non se puido cambiar o PIN."</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo de mensaxe non compatible. Chama ao <xliff:g id="NUMBER">%s</xliff:g> para escoitala."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Configuración de rede móbil"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Rede de telefonía móbil"</string>
     <string name="label_available" msgid="1181658289009300430">"Redes dispoñibles"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Buscando..."</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 1f06345..945d93b 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"નવો PIN અમાન્ય અક્ષરો ધરાવે છે."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN બદલવામાં અસમર્થ"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"અસમર્થિત સંદેશ પ્રકાર, સાંભળવા માટે <xliff:g id="NUMBER">%s</xliff:g> પર કૉલ કરો."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"મોબાઇલ નેટવર્ક સેટિંગ્સ"</string>
     <string name="network_settings_title" msgid="514120489499925574">"મોબાઇલ નેટવર્ક"</string>
     <string name="label_available" msgid="1181658289009300430">"ઉપલબ્ધ નેટવર્ક્સ"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"શોધી રહ્યું છે..."</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 2d7dd04..291616a 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"नए पिन में अमान्य वर्ण शामिल हैं."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"पिन बदलने में असमर्थ"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"असमर्थित संदेश प्रकार, सुनने के लिए <xliff:g id="NUMBER">%s</xliff:g> पर कॉल करें."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"मोबाइल नेटवर्क सेटिंग"</string>
     <string name="network_settings_title" msgid="514120489499925574">"मोबाइल नेटवर्क"</string>
     <string name="label_available" msgid="1181658289009300430">"उपलब्ध नेटवर्क"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"खोज रहा है..."</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 495a8f7..2849d4a 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Novi PIN sadrži nevažeće znakove."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN se ne može promijeniti"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Vrsta poruke nije podržana, nazovite <xliff:g id="NUMBER">%s</xliff:g> da biste je poslušali."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Postavke mobilne mreže"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilna mreža"</string>
     <string name="label_available" msgid="1181658289009300430">"Dostupne mreže"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Pretraživanje…"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index ceeb84e..ab240de 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Az új PIN-kód érvénytelen karaktereket tartalmaz."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nem sikerült módosítani a PIN-kódot"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nem támogatott üzenettípus. Hívja a következő telefonszámot az üzenet meghallgatásához: <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobilhálózati beállítások"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilhálózat"</string>
     <string name="label_available" msgid="1181658289009300430">"Elérhető hálózatok"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Keresés…"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 40de4e0..62b04d0 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Նոր PIN-ը պարունակում է անվավեր գրանշաններ:"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Չհաջողվեց փոխել PIN-ը"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Հաղորդագրության չաջակցվող տեսակ, զանգեք <xliff:g id="NUMBER">%s</xliff:g> համարին՝ լսելու համար:"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Բջջ. ցանցի կարգավորումներ"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Բջջային ցանց"</string>
     <string name="label_available" msgid="1181658289009300430">"Հասանելի ցանցեր"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Որոնում..."</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 1684ece..cdd93b7 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"PIN baru berisi karakter yang tidak valid."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Tidak dapat mengubah PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipe pesan tidak didukung, telepon <xliff:g id="NUMBER">%s</xliff:g> untuk mendengarkan."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Setelan jaringan seluler"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Jaringan seluler"</string>
     <string name="label_available" msgid="1181658289009300430">"Jaringan yang tersedia"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Menelusuri…"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index fdbded9..1f87beb 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nýja PIN-númerið inniheldur ógilda stafi."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Ekki var hægt að breyta PIN-númerinu"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Óstudd skilaboðagerð, hringdu í <xliff:g id="NUMBER">%s</xliff:g> til að hlusta."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Stillingar farsímakerfis"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Farsímakerfi"</string>
     <string name="label_available" msgid="1181658289009300430">"Símkerfi í boði"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Leitar…"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 751850d..b96864a 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Il nuovo PIN contiene caratteri non validi."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Impossibile cambiare il PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo di messaggio non supportato, chiama <xliff:g id="NUMBER">%s</xliff:g> per ascoltare."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Impostazioni reti mobili"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Rete mobile"</string>
     <string name="label_available" msgid="1181658289009300430">"Reti disponibili"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Ricerca..."</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index e5770e9..9e22e08 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"קוד הגישה החדש מכיל תווים לא חוקיים."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"לא ניתן לשנות את קוד הגישה"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"סוג ההודעה לא נתמך. התקשר למספר <xliff:g id="NUMBER">%s</xliff:g> כדי להאזין לה."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"הגדרות רשת סלולרית"</string>
     <string name="network_settings_title" msgid="514120489499925574">"רשת סלולרית"</string>
     <string name="label_available" msgid="1181658289009300430">"רשתות זמינות"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"מחפש..."</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index b70057e..1aeb37d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"新しい PIN に無効な文字が含まれています。"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN を変更できませんでした"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"サポートされていないメッセージ タイプです。<xliff:g id="NUMBER">%s</xliff:g> 宛に電話をかけてメッセージをお聞きください。"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"モバイルネットワーク設定"</string>
     <string name="network_settings_title" msgid="514120489499925574">"モバイル ネットワーク"</string>
     <string name="label_available" msgid="1181658289009300430">"利用可能なネットワーク"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"検索中..."</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index cb23c48..0798e33 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ახალი PIN-კოდი არასწორ სიმბოლოებს შეიცავს."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-კოდის შეცვლა შეუძლებელია"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"შეტყობინების ტიპი მხარდაუჭერელია. მოსასმენად დარეკეთ <xliff:g id="NUMBER">%s</xliff:g>-ზე."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"მობილური ქსელის პარამეტრები"</string>
     <string name="network_settings_title" msgid="514120489499925574">"მობილური ქსელი"</string>
     <string name="label_available" msgid="1181658289009300430">"ხელმისაწვდომი ქსელები"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"ძიება..."</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 4da2f38..8944ebb 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Жаңа PIN кодта жарамсыз таңбалар бар."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN кодты өзгерту мүмкін емес"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Қолдау көрсетілмейтін хабар түрі, тыңдау үшін <xliff:g id="NUMBER">%s</xliff:g> нөміріне қоңырау шалыңыз."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Ұялы желі параметрлері"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Мобильдік желі"</string>
     <string name="label_available" msgid="1181658289009300430">"Қол жетімді желілер"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Іздеуде…"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index aecf3b0..c61d7e9 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"លេខ​កូដ PIN ថ្មី​​មាន​តួអក្សរ​មិន​ត្រឹមត្រូវ។"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"មិន​អាច​ប្ដូរ​លេខ​កូដ PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"មិន​ស្គាល់​ប្រភេទ​សារ សូម​ហៅ​ទូរស័ព្ទ​ទៅ <xliff:g id="NUMBER">%s</xliff:g> ដើម្បី​ស្ដាប់។"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"ការ​កំណត់​បណ្ដាញ​ឧបករណ៍​ចល័ត"</string>
     <string name="network_settings_title" msgid="514120489499925574">"បណ្ដាញទូរសព្ទចល័ត"</string>
     <string name="label_available" msgid="1181658289009300430">"បណ្ដាញ​ដែល​មាន"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"កំពុង​ស្វែងរក..."</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 1212fc2..a829e8c 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ಹೊಸ ಪಿನ್ ಅಮಾನ್ಯವಾದ ಅಕ್ಷರಗಳನ್ನು ಒಳಗೊಂಡಿದೆ."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ಪಿನ್ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"ಬೆಂಬಲಿತವಲ್ಲದ ಸಂದೇಶ ಮಾದರಿ, ಆಲಿಸಲು <xliff:g id="NUMBER">%s</xliff:g> ಗೆ ಕರೆ ಮಾಡಿ."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"ಮೊಬೈಲ್‌ ನೆಟ್‌ವರ್ಕ್‌ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="network_settings_title" msgid="514120489499925574">"ಮೊಬೈಲ್‌ ನೆಟ್‌ವರ್ಕ್‌"</string>
     <string name="label_available" msgid="1181658289009300430">"ಲಭ್ಯವಿರುವ ನೆಟ್‌ವರ್ಕ್‌ಗಳು"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 6de4c77..60577d7 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"새 PIN에 잘못된 문자가 있습니다."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN을 변경할 수 없습니다."</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"지원되지 않는 메시지 유형입니다. 들으려면 <xliff:g id="NUMBER">%s</xliff:g>번으로 전화하세요."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"모바일 네트워크 설정"</string>
     <string name="network_settings_title" msgid="514120489499925574">"모바일 네트워크"</string>
     <string name="label_available" msgid="1181658289009300430">"사용 가능한 네트워크"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"검색 중..."</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 78a1300..db6c96c 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -159,7 +159,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Жаңы PIN коддо жараксыз белгилер бар."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN код өзгөртүлгөн жок"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Колдоого алынбаган билдирүү, угуу үчүн <xliff:g id="NUMBER">%s</xliff:g> чалыңыз."</string>
-    <!-- no translation found for mobile_networks (5540397602919106177) -->
     <skip />
     <string name="network_settings_title" msgid="514120489499925574">"Мобилдик тармак"</string>
     <string name="label_available" msgid="1181658289009300430">"Жеткиликтүү тармактар"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index fdce05f..1824c4c 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ລະຫັດ PIN ໃໝ່ມີຕົວອັກສອນທີ່ບໍ່ຖືກຕ້ອງ."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ບໍ່ສາມາດປ່ຽນລະຫັດ PIN ໄດ້"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"ປະເພດຂໍ້ຄວາມທີ່ບໍ່ຮອງຮັບ, ໂທ <xliff:g id="NUMBER">%s</xliff:g> ເພື່ອຟັງ."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"ການຕັ້ງຄ່າເຄືອຂ່າຍມືຖື"</string>
     <string name="network_settings_title" msgid="514120489499925574">"ເຄືອຂ່າຍມືຖື"</string>
     <string name="label_available" msgid="1181658289009300430">"ເຄືອຂ່າຍທີ່ມີ"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"ກຳລັງຊອກຫາ..."</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 948e0d5..633d54a 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Naujame PIN kode yra netinkamų simbolių."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nepavyko pakeisti PIN kodo"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepalaikomas pranešimo tipas, paskambinkite numeriu <xliff:g id="NUMBER">%s</xliff:g> ir išklausykite."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobiliojo ryšio tinklo tipas"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobiliojo ryšio tinklas"</string>
     <string name="label_available" msgid="1181658289009300430">"Galimi tinklai"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Ieškoma…"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index f9cd07f..4c700af 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Jaunajā PIN ir ietvertas nederīgas rakstzīmes."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Neizdevās mainīt PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Neatbalstīts ziņojuma veids. Lai noklausītos, zvaniet uz numuru <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobilā tīkla iestatījumi"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilais tīkls"</string>
     <string name="label_available" msgid="1181658289009300430">"Pieejamie tīkli"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Notiek meklēšana…"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 388db23..d6d4cad 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новиот PIN содржи погрешни знаци."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-кодот не може да се промени"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Неподдржан тип порака. Повикајте <xliff:g id="NUMBER">%s</xliff:g> за да слушате."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Поставки на мобилна мрежа"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Мобилна мрежа"</string>
     <string name="label_available" msgid="1181658289009300430">"Достапни мрежи"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Се пребарува..."</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index ce4daa6..75f0b50 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"പുതിയ പിന്നിൽ അസാധുവായ പ്രതീകങ്ങൾ അടങ്ങിയിരിക്കുന്നു."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"പിൻ മാറ്റാനായില്ല"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"സന്ദേശ തരം പിന്തുണയ്‌ക്കുന്നില്ല, കേൾക്കാൻ <xliff:g id="NUMBER">%s</xliff:g> നമ്പറിൽ വിളിക്കുക."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"മൊബൈൽ നെറ്റ്‌വർക്ക് ക്രമീകരണങ്ങൾ"</string>
     <string name="network_settings_title" msgid="514120489499925574">"മൊബൈൽ നെറ്റ്‌വർക്ക്"</string>
     <string name="label_available" msgid="1181658289009300430">"ലഭ്യമായ നെറ്റ്‌വർക്കുകൾ"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"തിരയുന്നു…"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index c0b723e..92cb9dc 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Шинэ PIN-д буруу тэмдэгт агуулагдаж байна."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-г өөрчлөх боломжгүй"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Дэмжигдээгүй зурвасын төрөл, сонсохын тулд <xliff:g id="NUMBER">%s</xliff:g> руу залгана уу."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Мобайль сүлжээний тохиргоо"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Мобайл сүлжээ"</string>
     <string name="label_available" msgid="1181658289009300430">"Боломжтой сүлжээнүүд"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Хайж байна..."</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index cf29a1e..4d84040 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"नवीन पिन मध्ये अवैध वर्ण आहेत."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"पिन बदलण्यात अक्षम"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"असमर्थित संदेश प्रकार, ऐकण्यासाठी <xliff:g id="NUMBER">%s</xliff:g> वर कॉल करा."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"मोबाईल नेटवर्क सेटिंग्ज"</string>
     <string name="network_settings_title" msgid="514120489499925574">"मोबाइल नेटवर्क"</string>
     <string name="label_available" msgid="1181658289009300430">"उपलब्ध नेटवर्क"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"शोधत आहे..."</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 0ba68c1..76352fe 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"PIN baharu mengandungi aksara yang tidak sah."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Tidak dapat menukar PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Jenis mesej tidak disokong, hubungi <xliff:g id="NUMBER">%s</xliff:g> untuk mendengar."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Tetapan rangkaian mudah alih"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Rangkaian mudah alih"</string>
     <string name="label_available" msgid="1181658289009300430">"Rangkaian sedia ada"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Mencari..."</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index e436235..fa0b96f 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ပင်နံပါတ်အသစ်တွင် အသုံးပြု၍မရသောစာလုံးများ ပါဝင်နေပါသည်။"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ပင်နံပါတ်ကို ပြောင်း၍မရပါ"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"ပံ့ပိုးမထားသော မက်ဆေ့ဂျ်အမျိုးအစားဖြစ်၍ နားထောင်ရန် <xliff:g id="NUMBER">%s</xliff:g> ကို ခေါ်ဆိုပါ။"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"မိုဘိုင်းကွန်ယက် ဆက်တင်များ"</string>
     <string name="network_settings_title" msgid="514120489499925574">"မိုဘိုင်းကွန်ရက်"</string>
     <string name="label_available" msgid="1181658289009300430">"ရရှိနိုင်သော ကွန်ယက်များ"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"ရှာဖွေနေသည်…"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 8f5c42b..c090e7e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Den nye PIN-koden inneholder ugyldige tegn."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kan ikke bytte PIN-kode"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Meldingstypen støttes ikke. Ring <xliff:g id="NUMBER">%s</xliff:g> for å høre."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Innstillinger for mobilnettverk"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilnettverk"</string>
     <string name="label_available" msgid="1181658289009300430">"Tilgjengelige nettverk"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Søker …"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index d614be2..d033349 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"नयाँ PIN मा अमान्य वर्णहरू छन्।"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN परिवर्तन गर्न सकिएन"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"सन्देशको असमर्थित प्रकार, सुन्नका लागि <xliff:g id="NUMBER">%s</xliff:g> मा कल गर्नुहोस्।"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"मोबाइल नेटवर्क सेटिहरू"</string>
     <string name="network_settings_title" msgid="514120489499925574">"मोबाइल नेटवर्क"</string>
     <string name="label_available" msgid="1181658289009300430">"उपलब्ध नेटवर्कहरू"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"खोजी गर्दै..."</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index d4b9c98..6115388 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"De nieuwe pincode bevat ongeldige tekens."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kan pincode niet wijzigen"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Niet-ondersteund berichttype, bel <xliff:g id="NUMBER">%s</xliff:g> om te luisteren."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Instellingen mobiel netwerk"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobiel netwerk"</string>
     <string name="label_available" msgid="1181658289009300430">"Beschikbare netwerken"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Zoeken..."</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 85dcd96..bd4c305 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ਨਵੇਂ PIN ਵਿੱਚ ਅਵੈਧ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਹਨ।"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN ਨੂੰ ਬਦਲਣ ਵਿੱਚ ਅਸਮਰੱਥ"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"ਅਸਮਰਥਿਤ ਸੁਨੇਹਾ ਕਿਸਮ, ਸੁਣਨ ਲਈ <xliff:g id="NUMBER">%s</xliff:g> \'ਤੇ ਕਾਲ ਕਰੋ।"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"ਮੋਬਾਈਲ ਨੈਟਵਰਕ ਸੈਟਿੰਗਾਂ"</string>
     <string name="network_settings_title" msgid="514120489499925574">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ"</string>
     <string name="label_available" msgid="1181658289009300430">"ਉਪਲਬਧ ਨੈਟਵਰਕ"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"ਖੋਜ ਰਿਹਾ ਹੈ..."</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 3a2a1c0..301943f 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nowy PIN zawiera nieprawidłowe znaki."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nie udało się zmienić kodu PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nieobsługiwany typ wiadomości – aby ją odsłuchać, zadzwoń pod numer <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Ustawienia sieci komórkowej"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Sieć komórkowa"</string>
     <string name="label_available" msgid="1181658289009300430">"Dostępne sieci"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Wyszukiwanie..."</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 43575a0..fd52131 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"O novo PIN contém carateres inválidos."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Não é possível alterar o PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo de mensagem não suportada, ligue para o número <xliff:g id="NUMBER">%s</xliff:g> para ouvir."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Definições da rede móvel"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Rede móvel"</string>
     <string name="label_available" msgid="1181658289009300430">"Redes disponíveis"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"A pesquisar..."</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 9d9dd4d..1793d2e 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"O novo PIN contém caracteres inválidos."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Não foi possível alterar o PIN."</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo de mensagem incompatível, para ouvi-la, ligue para <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Configurações de rede móvel"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Rede móvel"</string>
     <string name="label_available" msgid="1181658289009300430">"Redes disponíveis"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Pesquisando..."</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 368565c..cc91c8c 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Codul PIN nou conține caractere nevalide."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nu se poate schimba codul PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tip de mesaj neacceptat. Apelează numărul <xliff:g id="NUMBER">%s</xliff:g> pentru a-l asculta."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Setări pentru rețeaua mobilă"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Rețea mobilă"</string>
     <string name="label_available" msgid="1181658289009300430">"Rețele disponibile"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Se caută…"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 966fe2d..66838cf 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новый PIN-код содержит недопустимые символы"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Не удалось сменить PIN-код"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Неподдерживаемый тип сообщения. Чтобы его прослушать, позвоните по телефону <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Настройки мобильной сети"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Мобильная сеть"</string>
     <string name="label_available" msgid="1181658289009300430">"Доступные сети"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Поиск…"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index e49e5bc..dc5f92e 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"නව PIN අංකයෙහි අවලංගු අනුලකුණු අන්තර්ගත වේ."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN අංකය මාරු කිරීමට නොහැකිය"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"සහාය නොදක්වන පණිවිඩය වර්ගය, සවන් දීමට <xliff:g id="NUMBER">%s</xliff:g> අමතන්න."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"ජංගම ජාල සැකසුම්"</string>
     <string name="network_settings_title" msgid="514120489499925574">"ජංගම ජාලය"</string>
     <string name="label_available" msgid="1181658289009300430">"තිබෙන ජාල"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"සොයමින්..."</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 53deb51..0e93513 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nový PIN obsahuje neplatné znaky."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN nie je možné zmeniť"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodporovaný typ správy, zavolajte na číslo <xliff:g id="NUMBER">%s</xliff:g> a vypočujte si správu."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Nastavenia mobilnej siete"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilná sieť"</string>
     <string name="label_available" msgid="1181658289009300430">"Dostupné siete"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Hľadá sa…"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 0444f05..40573df 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nova koda PIN vsebuje neveljavne znake."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Ni mogoče spremeniti kode PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodprta vrsta sporočila, za poslušanje pokličite <xliff:g id="NUMBER">%s</xliff:g>."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Nastavitve mobi. omrežja"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilno omrežje"</string>
     <string name="label_available" msgid="1181658289009300430">"Razpoložljiva omrežja"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Iskanje ..."</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index f871c17..de7e6f3 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Kodi PIN i ri përmban karaktere të pavlefshme."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kodi PIN nuk u ndryshua."</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Lloj mesazhi i pambështetur, telefono <xliff:g id="NUMBER">%s</xliff:g> për ta dëgjuar."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Cilësimet e rrjetit celular"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Rrjeti celular"</string>
     <string name="label_available" msgid="1181658289009300430">"Rrjete të arritshme"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Po kërkon..."</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 7928eac..28cea4f 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Нови PIN садржи неважеће знакове."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Промена PIN-а није успела"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Неподржани тип поруке. Позовите <xliff:g id="NUMBER">%s</xliff:g> да бисте је преслушали."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Подешавања за моб. мрежу"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Мобилна мрежа"</string>
     <string name="label_available" msgid="1181658289009300430">"Доступне мреже"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Претражује се…"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index d1b111a..e535456 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Den nya pinkoden innehåller ogiltiga tecken."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Det gick inte att ändra pinkoden"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Meddelandetypen stöds inte, ring <xliff:g id="NUMBER">%s</xliff:g> om du vill lyssna."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobila nätverksinställningar"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobilnätverk"</string>
     <string name="label_available" msgid="1181658289009300430">"Tillgängliga nätverk"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Söker…"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 884a68a..0a16e94 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"PIN mpya ina herufi zisizostahiki."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Imeshindwa kubadilisha PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Huwezi kuona ujumbe wa aina hii; piga <xliff:g id="NUMBER">%s</xliff:g> ili uusikilize."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mipangilio ya mtandao wa simu"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mtandao wa simu"</string>
     <string name="label_available" msgid="1181658289009300430">"Mitandao inayopatikana"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Inatafuta…"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 368ac71..6aceb73 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"புதிய பின்னில் தவறான எழுத்துக்குறிகள் உள்ளன."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"பின்னை மாற்ற முடியவில்லை"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"ஆதரிக்கப்படாத செய்தி வகை, தகவலைக் கேட்க <xliff:g id="NUMBER">%s</xliff:g> என்ற எண்ணிற்கு அழைக்கவும்."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"மொபைல் நெட்வொர்க் அமைப்பு"</string>
     <string name="network_settings_title" msgid="514120489499925574">"மொபைல் நெட்வொர்க்"</string>
     <string name="label_available" msgid="1181658289009300430">"கிடைக்கின்ற நெட்வொர்க்குகள்"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"தேடுகிறது..."</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 21afe34..4eecc2e 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"కొత్త PIN చెల్లని అక్షరాలను కలిగి ఉంది."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PINని మార్చడం సాధ్యపడలేదు"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"మద్దతులేని సందేశ రకం, వినడానికి <xliff:g id="NUMBER">%s</xliff:g>కి కాల్ చేయండి."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"మొబైల్ నెట్‌వర్క్ సెట్టింగ్‌లు"</string>
     <string name="network_settings_title" msgid="514120489499925574">"మొబైల్ నెట్‌వర్క్"</string>
     <string name="label_available" msgid="1181658289009300430">"అందుబాటులో ఉన్న నెట్‌వర్క్‌లు"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"శోధిస్తోంది..."</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 7daa9f0..7f3a3d3 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"PIN ใหม่มีอักขระที่ไม่ถูกต้อง"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ไม่สามารถเปลี่ยน PIN ได้"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"ไม่รองรับข้อความประเภทนี้ โปรดโทร <xliff:g id="NUMBER">%s</xliff:g> เพื่อฟังข้อความเสียง"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"การตั้งค่าเครือข่ายมือถือ"</string>
     <string name="network_settings_title" msgid="514120489499925574">"เครือข่ายมือถือ"</string>
     <string name="label_available" msgid="1181658289009300430">"เครือข่ายที่ใช้งานได้"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"กำลังค้นหา…"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 232281e..66b0956 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Ang bagong PIN ay naglalaman ng mga di-wastong character."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Hindi nabago ang PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Hindi sinusuportahang uri ng mensahe, tawagan ang <xliff:g id="NUMBER">%s</xliff:g> upang pakinggan."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mga setting ng mobile network"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobile network"</string>
     <string name="label_available" msgid="1181658289009300430">"Mga available na network"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Naghahanap…"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 3f36d3f..4097ad7 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Yeni PIN, geçersiz karakterler içeriyor."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN değiştirilemedi"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Desteklenmeyen mesaj türü. Dinlemek için <xliff:g id="NUMBER">%s</xliff:g> numaralı telefonu arayın."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Mobil ağ ayarları"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobil ağ"</string>
     <string name="label_available" msgid="1181658289009300430">"Kullanılabilir ağlar"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Aranıyor..."</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index ef8260d..a430ee6 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новий PIN-код містить недійсні символи"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Не вдалося змінити PIN-код"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Повідомлення непідтримуваного типу. Зателефонуйте на номер <xliff:g id="NUMBER">%s</xliff:g>, щоб прослухати."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Налаштування мобільної мережі"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Мобільна мережа"</string>
     <string name="label_available" msgid="1181658289009300430">"Доступні мережі"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Пошук…"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 8acb520..2088b6b 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"‏نئے PIN میں غلط کریکٹرز شامل ہیں۔"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"‏PIN تبدیل کرنے سے قاصر"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"پیغام کی غیر تعاون یافتہ قسم، سننے کیلئے <xliff:g id="NUMBER">%s</xliff:g> پر کال کریں۔"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"موبائل نیٹ ورک کی ترتیبات"</string>
     <string name="network_settings_title" msgid="514120489499925574">"موبائل نیٹ ورک"</string>
     <string name="label_available" msgid="1181658289009300430">"دستیاب نیٹ ورکس"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"تلاش کر رہا ہے…"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 8050f11..d824f5f 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Yangi PIN kodda yaroqsiz belgilar mavjud."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN kodni o‘zgartirib bo‘lmadi"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Bu xabar turi qo‘llab-quvvatlanmaydi. Uni eshitish uchun <xliff:g id="NUMBER">%s</xliff:g> raqamiga qo‘ng‘iroq qiling."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Uyali tarmoq sozlamalari"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mobil tarmoq"</string>
     <string name="label_available" msgid="1181658289009300430">"Mavjud tarmoqlar"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Qidirilmoqda…"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 7d70605..b4a16e7 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Mã PIN mới chứa các ký tự không hợp lệ."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Không thể thay đổi mã PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Loại tin nhắn không được hỗ trợ, hãy gọi số <xliff:g id="NUMBER">%s</xliff:g> để nghe."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Cài đặt mạng di động"</string>
     <string name="network_settings_title" msgid="514120489499925574">"Mạng di động"</string>
     <string name="label_available" msgid="1181658289009300430">"Mạng khả dụng"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Đang tìm kiếm…"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 3c5c843..f980a77 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"新的 PIN 码包含无效字符。"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"无法更改 PIN 码"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"不受支持的语音邮件类型,请拨打 <xliff:g id="NUMBER">%s</xliff:g> 收听。"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"移动网络设置"</string>
     <string name="network_settings_title" msgid="514120489499925574">"移动网络"</string>
     <string name="label_available" msgid="1181658289009300430">"可用网络"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"正在搜索..."</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 65457b5..77accb0 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"新的 PIN 包含無效字元。"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"無法變更 PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"不支援的訊息類型,撥打 <xliff:g id="NUMBER">%s</xliff:g> 即可聆聽。"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"流動網絡設定"</string>
     <string name="network_settings_title" msgid="514120489499925574">"流動網絡"</string>
     <string name="label_available" msgid="1181658289009300430">"可用的網絡"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"正在搜尋..."</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 66d341e..0d0f929 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"新的 PIN 碼包含無效的字元。"</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"無法變更 PIN 碼"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"不支援的訊息類型,請撥打 <xliff:g id="NUMBER">%s</xliff:g> 聽取留言。"</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"行動網路設定"</string>
     <string name="network_settings_title" msgid="514120489499925574">"行動網路"</string>
     <string name="label_available" msgid="1181658289009300430">"可用的網路"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"搜尋中…"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 586e3eb..b44a903 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -158,7 +158,6 @@
     <string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"I-PIN entsha iqukethe izinhlamvu ezingavumelekile."</string>
     <string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Ayikwazi ukushintsha i-PIN"</string>
     <string name="vvm_unsupported_message_format" msgid="11795090778411977">"Uhlobo lomlayezo ongasekelwa, shayela ku-<xliff:g id="NUMBER">%s</xliff:g> ukuze ulalele."</string>
-    <string name="mobile_networks" msgid="5540397602919106177">"Izilungiselelo zenethiwekhi yeselula."</string>
     <string name="network_settings_title" msgid="514120489499925574">"Inethiwekhi yeselula"</string>
     <string name="label_available" msgid="1181658289009300430">"Amanethiwekhi atholakalayo"</string>
     <string name="load_networks_progress" msgid="5230707536168902952">"Iyasesha..."</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index 615d43f..1b612c9 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -232,9 +232,12 @@
          disconnecting the ongoing Telephony call when the call goes active. -->
     <bool name="config_support_handover_from">false</bool>
 
+    <!-- Flag indicating whether the device supports RTT (real-time text) -->
+    <bool name="config_support_rtt">false</bool>
+
     <!-- Flag indicating whether a system app can use video calling fallback if carrier video
          calling is not available. -->
-    <bool name="config_support_video_calling_fallback">false</bool>
+    <bool name="config_support_video_calling_fallback">true</bool>
 
     <!-- Whether the cellular radio is allowed to be power down when the Bluetooth can provide the data/call capabilities -->
     <bool name="config_allowRadioPowerDownOnBluetooth">false</bool>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 67c5747..c79bacc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -360,8 +360,6 @@
     <string name="vvm_unsupported_message_format">Unsupported message type, call <xliff:g id="number" example="*86">%s</xliff:g> to listen.</string>
 
     <!-- networks setting strings --><skip/>
-    <!-- Mobile network settings screen title -->
-    <string name="mobile_networks">Mobile network settings</string>
     <!-- Mobile network settings screen title/heading -->
     <string name="network_settings_title">Mobile network</string>
     <!-- Available networks screen title/heading -->
@@ -1491,4 +1489,114 @@
     <string name="mobile_data_activate_button">ADD DATA</string>
     <!-- activate data plan dialogue button for cancel further actions-->
     <string name="mobile_data_activate_cancel_button">CANCEL</string>
+
+    <!-- Call failed messages -->
+    <!-- In-call screen: status label displayed briefly after a call ends -->
+    <string name="clh_card_title_call_ended_txt">Call ended</string>
+    <!-- In-call screen: call failure reason (radio is off) -->
+    <string name="clh_callFailed_powerOff_txt">Radio off</string>
+    <!-- In-call screen: call failure reason (SIM error) -->
+    <string name="clh_callFailed_simError_txt">No SIM card or SIM card error</string>
+    <!-- In-call screen: call failure message displayed in an error dialog -->
+    <string name="clh_incall_error_out_of_service_txt">Mobile network not available</string>
+
+    <!-- See CallFailCause for details on what causes each message -->
+    <!-- In-call screen: call failure reason (Cause Number 1) -->
+    <string name="clh_callFailed_unassigned_number_txt">Unassigned (unallocated) number</string>
+    <!-- In-call screen: call failure reason (Cause Number 3) -->
+    <string name="clh_callFailed_no_route_to_destination_txt">No route to destination</string>
+    <!-- In-call screen: call failure reason (Cause Number 6) -->
+    <string name="clh_callFailed_channel_unacceptable_txt">Channel unacceptable</string>
+    <!-- In-call screen: call failure reason (Cause Number 8) -->
+    <string name="clh_callFailed_operator_determined_barring_txt">Operator determined barring</string>
+    <!-- In-call screen: call failure reason (Cause Number 16) -->
+    <string name="clh_callFailed_normal_call_clearing_txt">Normal call clearing</string>
+    <!-- In-call screen: call failure reason (Cause Number 17) -->
+    <string name="clh_callFailed_user_busy_txt">User busy</string>
+    <!-- In-call screen: call failure reason (Cause Number 18) -->
+    <string name="clh_callFailed_no_user_responding_txt">No user responding</string>
+    <!-- In-call screen: call failure reason (Cause Number 19) -->
+    <string name="clh_callFailed_user_alerting_txt">User alerting, no answer</string>
+    <!-- In-call screen: call failure reason (Cause Number 21) -->
+    <string name="clh_callFailed_call_rejected_txt">Call rejected</string>
+    <!-- In-call screen: call failure reason (Cause Number 22) -->
+    <string name="clh_callFailed_number_changed_txt">Number changed</string>
+    <!-- In-call screen: call failure reason (Cause Number 25) -->
+    <string name="clh_callFailed_pre_emption_txt">Pre-emption</string>
+    <!-- In-call screen: call failure reason (Cause Number 26) -->
+    <string name="clh_callFailed_non_selected_user_clearing_txt">Non selected user clearing</string>
+    <!-- In-call screen: call failure reason (Cause Number 27) -->
+    <string name="clh_callFailed_destination_out_of_order_txt">Destination out of order</string>
+    <!-- In-call screen: call failure reason (Cause Number 28) -->
+    <string name="clh_callFailed_invalid_number_format_txt">Invalid number format (incomplete number)</string>
+    <!-- In-call screen: call failure reason (Cause Number 29) -->
+    <string name="clh_callFailed_facility_rejected_txt">Facility rejected</string>
+    <!-- In-call screen: call failure reason (Cause Number 30) -->
+    <string name="clh_callFailed_response_to_STATUS_ENQUIRY_txt">Response to STATUS ENQUIRY</string>
+    <!-- In-call screen: call failure reason (Cause Number 31) -->
+    <string name="clh_callFailed_normal_unspecified_txt">Normal, unspecified</string>
+    <!-- In-call screen: call failure reason (Cause Number 34) -->
+    <string name="clh_callFailed_no_circuit_available_txt">No circuit/channel available</string>
+    <!-- In-call screen: call failure reason (Cause Number 38) -->
+    <string name="clh_callFailed_network_out_of_order_txt">Network out of order</string>
+    <!-- In-call screen: call failure reason (Cause Number 41) -->
+    <string name="clh_callFailed_temporary_failure_txt">Temporary failure</string>
+    <!-- In-call screen: call failure reason (Cause Number 42) -->
+    <string name="clh_callFailed_switching_equipment_congestion_txt">Switching equipment congestion</string>
+    <!-- In-call screen: call failure reason (Cause Number 43) -->
+    <string name="clh_callFailed_access_information_discarded_txt">Access information discarded</string>
+    <!-- In-call screen: call failure reason (Cause Number 44) -->
+    <string name="clh_callFailed_requested_circuit_txt">Requested circuit/channel not available</string>
+    <!-- In-call screen: call failure reason (Cause Number 47) -->
+    <string name="clh_callFailed_resources_unavailable_unspecified_txt">Resources unavailable, unspecified</string>
+    <!-- In-call screen: call failure reason (Cause Number 49) -->
+    <string name="clh_callFailed_quality_of_service_unavailable_txt">Quality of service unavailable</string>
+    <!-- In-call screen: call failure reason (Cause Number 50) -->
+    <string name="clh_callFailed_requested_facility_not_subscribed_txt">Requested facility not subscribed</string>
+    <!-- In-call screen: call failure reason (Cause Number 55) -->
+    <string name="clh_callFailed_incoming_calls_barred_within_the_CUG_txt">Incoming calls barred within the CUG</string>
+    <!-- In-call screen: call failure reason (Cause Number 57) -->
+    <string name="clh_callFailed_bearer_capability_not_authorized_txt">Bearer capability not authorized</string>
+    <!-- In-call screen: call failure reason (Cause Number 58) -->
+    <string name="clh_callFailed_bearer_capability_not_presently_available_txt">Bearer capability not presently available</string>
+    <!-- In-call screen: call failure reason (Cause Number 63) -->
+    <string name="clh_callFailed_service_or_option_not_available_unspecified_txt">Service or option not available, unspecified</string>
+    <!-- In-call screen: call failure reason (Cause Number 65) -->
+    <string name="clh_callFailed_bearer_service_not_implemented_txt">Bearer service not implemented</string>
+    <!-- In-call screen: call failure reason (Cause Number 68) -->
+    <string name="clh_callFailed_ACM_equal_to_or_greater_than_ACMmax_txt">ACM equal to or greater than ACMmax</string>
+    <!-- In-call screen: call failure reason (Cause Number 69) -->
+    <string name="clh_callFailed_requested_facility_not_implemented_txt">Requested facility not implemented</string>
+    <!-- In-call screen: call failure reason (Cause Number 70) -->
+    <string name="clh_callFailed_only_restricted_digital_information_bearer_capability_is_available_txt">Only restricted digital information bearer capability is available</string>
+    <!-- In-call screen: call failure reason (Cause Number 79) -->
+    <string name="clh_callFailed_service_or_option_not_implemented_unspecified_txt">Service or option not implemented, unspecified</string>
+    <!-- In-call screen: call failure reason (Cause Number 81) -->
+    <string name="clh_callFailed_invalid_transaction_identifier_value_txt">Invalid transaction identifier value</string>
+    <!-- In-call screen: call failure reason (Cause Number 87) -->
+    <string name="clh_callFailed_user_not_member_of_CUG_txt">User not member of CUG</string>
+    <!-- In-call screen: call failure reason (Cause Number 88) -->
+    <string name="clh_callFailed_incompatible_destination_txt">Incompatible destination</string>
+    <!-- In-call screen: call failure reason (Cause Number 91) -->
+    <string name="clh_callFailed_invalid_transit_network_selection_txt">Invalid transit network selection</string>
+    <!-- In-call screen: call failure reason (Cause Number 95) -->
+    <string name="clh_callFailed_semantically_incorrect_message_txt">Semantically incorrect message</string>
+    <!-- In-call screen: call failure reason (Cause Number 96) -->
+    <string name="clh_callFailed_invalid_mandatory_information_txt">Invalid mandatory information</string>
+    <!-- In-call screen: call failure reason (Cause Number 97) -->
+    <string name="clh_callFailed_message_type_non_existent_or_not_implemented_txt">Message type non-existent or not implemented</string>
+    <!-- In-call screen: call failure reason (Cause Number 98) -->
+    <string name="clh_callFailed_message_type_not_compatible_with_protocol_state_txt">Message type not compatible with protocol state</string>
+    <!-- In-call screen: call failure reason (Cause Number 99) -->
+    <string name="clh_callFailed_information_element_non_existent_or_not_implemented_txt">Information element non-existent or not implemented</string>
+    <!-- In-call screen: call failure reason (Cause Number 100) -->
+    <string name="clh_callFailed_conditional_IE_error_txt">Conditional IE error</string>
+    <!-- In-call screen: call failure reason (Cause Number 101) -->
+    <string name="clh_callFailed_message_not_compatible_with_protocol_state_txt">Message not compatible with protocol state</string>
+    <!-- In-call screen: call failure reason (Cause Number 102) -->
+    <string name="clh_callFailed_recovery_on_timer_expiry_txt">Recovery on timer expiry</string>
+    <!-- In-call screen: call failure reason (Cause Number 111) -->
+    <string name="clh_callFailed_protocol_Error_unspecified_txt">Protocol error, unspecified</string>
+    <!-- In-call screen: call failure reason (Cause Number 127) -->
+    <string name="clh_callFailed_interworking_unspecified_txt">Interworking, unspecified</string>
 </resources>
diff --git a/res/xml/network_setting_fragment.xml b/res/xml/network_setting_fragment.xml
index a4c115d..d334861 100644
--- a/res/xml/network_setting_fragment.xml
+++ b/res/xml/network_setting_fragment.xml
@@ -13,8 +13,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        android:title="@string/mobile_networks">
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
     <PreferenceScreen
         android:key="cdma_lte_data_service_key"
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index e5527bc..a3b0892 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -16,24 +16,18 @@
 
 package com.android.phone;
 
-import android.app.ActionBar;
 import android.app.Activity;
-import android.app.ActivityOptions;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
 import android.os.Bundle;
 import android.os.PersistableBundle;
-import android.os.UserHandle;
 import android.os.UserManager;
-import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
@@ -42,10 +36,9 @@
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.CarrierConfigManager;
-import android.telephony.ims.feature.ImsFeature;
 import android.telephony.PhoneStateListener;
 import android.telephony.TelephonyManager;
-import android.text.TextUtils;
+import android.telephony.ims.feature.ImsFeature;
 import android.util.Log;
 import android.view.MenuItem;
 import android.widget.Toast;
@@ -53,18 +46,12 @@
 import com.android.ims.ImsConfig;
 import com.android.ims.ImsException;
 import com.android.ims.ImsManager;
-import com.android.internal.telephony.CallForwardInfo;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
-import com.android.phone.common.util.SettingsUtil;
-import com.android.phone.settings.AccountSelectionPreference;
 import com.android.phone.settings.PhoneAccountSettingsFragment;
 import com.android.phone.settings.VoicemailSettingsActivity;
 import com.android.phone.settings.fdn.FdnSetting;
-import com.android.services.telephony.sip.SipUtil;
 
-import java.lang.String;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -144,7 +131,7 @@
         if (DBG) log("onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\"");
 
         if (preference == mEnableVideoCalling) {
-            if (ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())) {
+            if (mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()) {
                 PhoneGlobals.getInstance().phoneMgr.enableVideoCalling((boolean) objValue);
             } else {
                 AlertDialog.Builder builder = new AlertDialog.Builder(this);
@@ -296,13 +283,12 @@
             }
         }
 
-        if (ImsManager.isVtEnabledByPlatform(mPhone.getContext()) &&
-                ImsManager.isVtProvisionedOnDevice(mPhone.getContext()) &&
-                (carrierConfig.getBoolean(
+        if (mImsMgr.isVtEnabledByPlatform() && mImsMgr.isVtProvisionedOnDevice()
+                && (carrierConfig.getBoolean(
                         CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
-                        || mPhone.mDcTracker.isDataEnabled())) {
+                || mPhone.mDcTracker.isDataEnabled())) {
             boolean currentValue =
-                    ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())
+                    mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()
                     ? PhoneGlobals.getInstance().phoneMgr.isVideoCallingEnabled(
                             getOpPackageName()) : false;
             mEnableVideoCalling.setChecked(currentValue);
@@ -311,8 +297,8 @@
             prefSet.removePreference(mEnableVideoCalling);
         }
 
-        if (ImsManager.isVolteEnabledByPlatform(this) &&
-                !carrierConfig.getBoolean(
+        if (mImsMgr.isVolteEnabledByPlatform()
+                && !carrierConfig.getBoolean(
                         CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL)) {
             TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
             /* tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); */
@@ -338,14 +324,13 @@
             } else {
                 prefSet.removePreference(wifiCallingSettings);
             }
-        } else if (!ImsManager.isWfcEnabledByPlatform(mPhone.getContext()) ||
-                !ImsManager.isWfcProvisionedOnDevice(mPhone.getContext())) {
+        } else if (!mImsMgr.isWfcEnabledByPlatform() || !mImsMgr.isWfcProvisionedOnDevice()) {
             prefSet.removePreference(wifiCallingSettings);
         } else {
             int resId = com.android.internal.R.string.wifi_calling_off_summary;
-            if (ImsManager.isWfcEnabledByUser(mPhone.getContext())) {
+            if (mImsMgr.isWfcEnabledByUser()) {
                 boolean isRoaming = telephonyManager.isNetworkRoaming();
-                int wfcMode = ImsManager.getWfcMode(mPhone.getContext(), isRoaming);
+                int wfcMode = mImsMgr.getWfcMode(isRoaming);
                 switch (wfcMode) {
                     case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
                         resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index a26e3d8..1b1327f 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -516,6 +516,7 @@
         intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT |
                 Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
         SubscriptionManager.putPhoneIdAndSubIdExtra(intent, phoneId);
+        intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, phoneId);
         ActivityManager.broadcastStickyIntent(intent, UserHandle.USER_ALL);
         mHasSentConfigChange[phoneId] = true;
     }
@@ -776,11 +777,15 @@
         PersistableBundle retConfig = CarrierConfigManager.getDefaultConfig();
         if (SubscriptionManager.isValidPhoneId(phoneId)) {
             PersistableBundle config = mConfigFromDefaultApp[phoneId];
-            if (config != null)
+            if (config != null) {
                 retConfig.putAll(config);
+                retConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
+            }
             config = mConfigFromCarrierApp[phoneId];
-            if (config != null)
+            if (config != null) {
                 retConfig.putAll(config);
+                retConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
+            }
         }
         return retConfig;
     }
diff --git a/src/com/android/phone/CdmaOptions.java b/src/com/android/phone/CdmaOptions.java
index 8749565..7c09265 100644
--- a/src/com/android/phone/CdmaOptions.java
+++ b/src/com/android/phone/CdmaOptions.java
@@ -26,6 +26,8 @@
 import android.telephony.CarrierConfigManager;
 import android.text.TextUtils;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.telephony.Phone;
 
 /**
@@ -95,6 +97,8 @@
                     new Preference.OnPreferenceClickListener() {
                         @Override
                         public boolean onPreferenceClick(Preference preference) {
+                            MetricsLogger.action(mButtonAPNExpand.getContext(),
+                                    MetricsEvent.ACTION_MOBILE_NETWORK_APN_SETTINGS);
                             // We need to build the Intent by hand as the Preference Framework
                             // does not allow to add an Intent with some extras into a Preference
                             // XML file
diff --git a/src/com/android/phone/GsmUmtsOptions.java b/src/com/android/phone/GsmUmtsOptions.java
index a68b1cb..5cf19ad 100644
--- a/src/com/android/phone/GsmUmtsOptions.java
+++ b/src/com/android/phone/GsmUmtsOptions.java
@@ -21,10 +21,11 @@
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceScreen;
-import android.preference.TwoStatePreference;
 import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
 
@@ -116,6 +117,8 @@
                     new Preference.OnPreferenceClickListener() {
                         @Override
                         public boolean onPreferenceClick(Preference preference) {
+                            MetricsLogger.action(mButtonAPNExpand.getContext(),
+                                    MetricsEvent.ACTION_MOBILE_NETWORK_APN_SETTINGS);
                             // We need to build the Intent by hand as the Preference Framework
                             // does not allow to add an Intent with some extras into a Preference
                             // XML file
diff --git a/src/com/android/phone/INetworkQueryService.aidl b/src/com/android/phone/INetworkQueryService.aidl
index b0fe992..f65c971 100644
--- a/src/com/android/phone/INetworkQueryService.aidl
+++ b/src/com/android/phone/INetworkQueryService.aidl
@@ -31,8 +31,14 @@
      * object on query completion.  If there is an existing request,
      * then just add the callback to the list of notifications
      * that will be sent upon query completion.
+     *
+     * It will send the network query with the use of
+     * <code>TelephonyManager.requestNetworkScan()</code> if the
+     * isIncrementalResult is true. And if the isIncrementalResult
+     * is set as false, it will try to send network query through
+     * <code>Phone.getAvailableNetworks()</code>.
      */
-    void startNetworkQuery(in INetworkQueryServiceCallback cb, in int phoneId);
+    void startNetworkQuery(in INetworkQueryServiceCallback cb, in int phoneId, boolean isIncrementalResult);
 
     /**
      * Tells the service that the requested query is to be ignored.
@@ -40,7 +46,7 @@
      * underlying RIL, but it ensures that the callback is removed
      * from the list of notifications.
      */
-    void stopNetworkQuery(in INetworkQueryServiceCallback cb);
+    void stopNetworkQuery();
 
     /**
      * Tells the service to unregister the network query callback.
diff --git a/src/com/android/phone/INetworkQueryServiceCallback.aidl b/src/com/android/phone/INetworkQueryServiceCallback.aidl
index 4c32883..2299f5e 100644
--- a/src/com/android/phone/INetworkQueryServiceCallback.aidl
+++ b/src/com/android/phone/INetworkQueryServiceCallback.aidl
@@ -16,6 +16,7 @@
 
 package com.android.phone;
 
+import android.telephony.CellInfo;
 import com.android.internal.telephony.OperatorInfo;
 
 /**
@@ -26,14 +27,25 @@
 oneway interface INetworkQueryServiceCallback {
 
     /**
-     * Called upon query completion, handing a status value and an
-     * array of OperatorInfo objects.
-     *
-     * @param networkInfoArray is the list of OperatorInfo. Can be
-     * null, indicating no results were found, or an error.
-     * @param status the status indicating if there were any
-     * problems with the request.
+     * Returns the scan results to the user, this callback will be
+     * called at least one time.
      */
-    void onQueryComplete(in List<OperatorInfo> networkInfoArray, int status);
+    void onResults(in List<CellInfo> results);
+
+    /**
+     * Informs the user that the scan has stopped.
+     *
+     * This callback will be called when the scan is finished or cancelled by the user.
+     * The related NetworkScanRequest will be deleted after this callback.
+     */
+    void onComplete();
+
+    /**
+     * Informs the user that there is some error about the scan.
+     *
+     * This callback will be called whenever there is any error about the scan,
+     * and the scan will be terminated. onComplete() will NOT be called.
+     */
+    void onError(int error);
 
 }
diff --git a/src/com/android/phone/ImsUtil.java b/src/com/android/phone/ImsUtil.java
index b6c88ae..4d8ff80 100644
--- a/src/com/android/phone/ImsUtil.java
+++ b/src/com/android/phone/ImsUtil.java
@@ -20,6 +20,7 @@
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
 import android.util.Log;
 
 import com.android.ims.ImsConfig;
@@ -52,8 +53,9 @@
      * @return {@code true} if WFC is supported by the platform and has been enabled by the user.
      */
     public static boolean isWfcEnabled(Context context) {
-        boolean isEnabledByPlatform = ImsManager.isWfcEnabledByPlatform(context);
-        boolean isEnabledByUser = ImsManager.isWfcEnabledByUser(context);
+        ImsManager imsManager = getDefaultImsManagerInstance(context);
+        boolean isEnabledByPlatform = imsManager.isWfcEnabledByPlatform();
+        boolean isEnabledByUser = imsManager.isWfcEnabledByUser();
         if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByPlatform=" + isEnabledByPlatform);
         if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByUser=" + isEnabledByUser);
         return isEnabledByPlatform && isEnabledByUser;
@@ -64,8 +66,8 @@
      * enabled, this will return {@code false}.
      */
     public static boolean isWfcModeWifiOnly(Context context) {
-        boolean isWifiOnlyMode =
-                ImsManager.getWfcMode(context) == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
+        boolean isWifiOnlyMode = getDefaultImsManagerInstance(context).getWfcMode()
+                == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
         if (DBG) Log.d(LOG_TAG, "isWfcModeWifiOnly :: isWifiOnlyMode" + isWifiOnlyMode);
         return isWfcEnabled(context) && isWifiOnlyMode;
     }
@@ -86,7 +88,7 @@
             return false;
         }
 
-        if (!ImsManager.isWfcProvisionedOnDevice(context)) {
+        if (!getDefaultImsManagerInstance(context).isWfcProvisionedOnDevice()) {
             return false;
         }
 
@@ -100,4 +102,8 @@
         }
         return false;
     }
+
+    private static ImsManager getDefaultImsManagerInstance(Context context) {
+        return ImsManager.getInstance(context, SubscriptionManager.getDefaultVoicePhoneId());
+    }
 }
diff --git a/src/com/android/phone/MobileDataPreference.java b/src/com/android/phone/MobileDataPreference.java
index fe70028..38d700e 100644
--- a/src/com/android/phone/MobileDataPreference.java
+++ b/src/com/android/phone/MobileDataPreference.java
@@ -36,6 +36,9 @@
 import android.view.View;
 import android.widget.Checkable;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
 import java.util.List;
 
 /**
@@ -156,6 +159,10 @@
 
     private void setMobileDataEnabled(boolean enabled) {
         if (DBG) Log.d(TAG, "setMobileDataEnabled(" + enabled + "," + mSubId + ")");
+
+        MetricsLogger.action(getContext(), MetricsEvent.ACTION_MOBILE_NETWORK_MOBILE_DATA_TOGGLE,
+                enabled);
+
         mTelephonyManager.setDataEnabled(mSubId, enabled);
         setChecked(enabled);
     }
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index 0cd3c05..c061fbc 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -49,13 +49,13 @@
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.CarrierConfigManager;
-import android.telephony.ims.feature.ImsFeature;
 import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.telephony.euicc.EuiccManager;
+import android.telephony.ims.feature.ImsFeature;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -76,7 +76,6 @@
 import com.android.phone.settings.PhoneAccountSettingsFragment;
 import com.android.settingslib.RestrictedLockUtils;
 
-
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -146,18 +145,31 @@
     }
 
     /**
-     * Whether to show the Enhanced 4G LTE settings.
+     * Whether to show the Enhanced 4G LTE settings in search result.
      *
      * <p>We show this settings if the VoLTE can be enabled by this device and the carrier app
-     * doesn't set {@link CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL} to false.
+     * doesn't set {@link CarrierConfigManager#KEY_HIDE_ENHANCED_4G_LTE_BOOL} to false.
      */
-    public static boolean hideEnhanced4gLteSettings(Context context,
-                PersistableBundle carrierConfig) {
-        return !(ImsManager.isVolteEnabledByPlatform(context)
-            && ImsManager.isVolteProvisionedOnDevice(context))
-            || carrierConfig.getBoolean(
-            CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL);
+    public static boolean hideEnhanced4gLteSettings(Context context) {
+        List<SubscriptionInfo> sil =
+                SubscriptionManager.from(context).getActiveSubscriptionInfoList();
+        // Check all active subscriptions. We only hide the button if it's disabled for all
+        // active subscriptions.
+        if (sil != null) {
+            for (SubscriptionInfo subInfo : sil) {
+                ImsManager imsManager = ImsManager.getInstance(context, subInfo.getSimSlotIndex());
+                PersistableBundle carrierConfig = PhoneGlobals.getInstance()
+                        .getCarrierConfigForSubId(subInfo.getSubscriptionId());
+                if ((imsManager.isVolteEnabledByPlatform()
+                        && imsManager.isVolteProvisionedOnDevice())
+                        || carrierConfig.getBoolean(
+                        CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL)) {
+                    return false;
+                }
+            }
+        }
 
+        return true;
     }
 
     public static class MobileNetworkFragment extends PreferenceFragment implements
@@ -186,6 +198,7 @@
         private static final String BUTTON_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
         private static final String BUTTON_CARRIER_SETTINGS_KEY = "carrier_settings_key";
         private static final String BUTTON_CDMA_SYSTEM_SELECT_KEY = "cdma_system_select_key";
+        private static final String BUTTON_CDMA_SUBSCRIPTION_KEY = "cdma_subscription_key";
         private static final String BUTTON_CARRIER_SETTINGS_EUICC_KEY =
                 "carrier_settings_euicc_key";
         private static final String BUTTON_WIFI_CALLING_KEY = "wifi_calling_key";
@@ -196,6 +209,8 @@
         private static final String CATEGORY_CALLING_KEY = "calling";
         private static final String CATEGORY_GSM_APN_EXPAND_KEY = "category_gsm_apn_key";
         private static final String CATEGORY_CDMA_APN_EXPAND_KEY = "category_cdma_apn_key";
+        private static final String BUTTON_GSM_APN_EXPAND_KEY = "button_gsm_apn_key";
+        private static final String BUTTON_CDMA_APN_EXPAND_KEY = "button_cdma_apn_key";
 
         private final BroadcastReceiver mPhoneChangeReceiver = new PhoneChangeReceiver();
 
@@ -260,17 +275,11 @@
             public void onCallStateChanged(int state, String incomingNumber) {
                 if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
 
-                Activity activity = getActivity();
-                if (activity == null) {
-                    return;
-                }
-
                 int subId = mPhone != null
                         ? mPhone.getSubId() : SubscriptionManager.INVALID_SUBSCRIPTION_ID;
                 PersistableBundle carrierConfig =
                         PhoneGlobals.getInstance().getCarrierConfigForSubId(subId);
-                boolean enabled = is4gLtePrefEnabled(activity.getApplicationContext(),
-                        carrierConfig);
+                boolean enabled = is4gLtePrefEnabled(carrierConfig);
                 Preference pref = getPreferenceScreen().findPreference(BUTTON_4G_LTE_KEY);
                 if (pref != null) pref.setEnabled(enabled && hasActiveSubscriptions());
 
@@ -328,6 +337,9 @@
         public void onPositiveButtonClick(DialogFragment dialog) {
             mPhone.setDataRoamingEnabled(true);
             mButtonDataRoam.setChecked(true);
+            MetricsLogger.action(getContext(),
+                    getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam),
+                    true);
         }
 
         @Override
@@ -561,8 +573,11 @@
             final SubscriptionInfo sir = mSubscriptionManager
                     .getActiveSubscriptionInfoForSimSlotIndex(slotId);
             if (sir != null) {
-                mPhone = PhoneFactory.getPhone(
-                        SubscriptionManager.getPhoneId(sir.getSubscriptionId()));
+                int phoneId = SubscriptionManager.getPhoneId(sir.getSubscriptionId());
+                if (SubscriptionManager.isValidPhoneId(phoneId)) {
+                    mPhone = PhoneFactory.getPhone(phoneId);
+                    mImsMgr = ImsManager.getInstance(getContext(), phoneId);
+                }
             }
             if (mPhone == null) {
                 // Do the best we can
@@ -622,12 +637,6 @@
 
             bindNetworkQueryService();
 
-            if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
-                mUnavailable = true;
-                activity.setContentView(R.layout.telephony_disallowed_preference_screen);
-                return;
-            }
-
             addPreferencesFromResource(R.xml.network_setting_fragment);
 
             mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY);
@@ -688,7 +697,13 @@
         @Override
         public void onActivityCreated(Bundle savedInstanceState) {
             super.onActivityCreated(savedInstanceState);
-            initializeSubscriptions();
+            if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)
+                    || !mUm.isSystemUser()) {
+                mUnavailable = true;
+                getActivity().setContentView(R.layout.telephony_disallowed_preference_screen);
+            } else {
+                initializeSubscriptions();
+            }
         }
 
         private class PhoneChangeReceiver extends BroadcastReceiver {
@@ -719,11 +734,6 @@
                 return;
             }
 
-            final Activity activity = getActivity();
-            if (activity == null || activity.isDestroyed()) {
-                Log.e(LOG_TAG, "onResume:- with no valid activity.");
-                return;
-            }
             // upon resumption from the sub-activity, make sure we re-enable the
             // preferences.
             getPreferenceScreen().setEnabled(true);
@@ -738,15 +748,10 @@
                 updatePreferredNetworkUIFromDb();
             }
 
-            if (ImsManager.isVolteEnabledByPlatform(activity)
-                    && ImsManager.isVolteProvisionedOnDevice(activity)) {
-                mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
-            }
+            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
 
             // NOTE: Buttons will be enabled/disabled in mPhoneStateListener
-            boolean enh4glteMode = ImsManager.isEnhanced4gLteModeSettingEnabledByUser(activity)
-                    && ImsManager.isNonTtyOrTtyOnVolteEnabled(activity);
-            mButton4glte.setChecked(enh4glteMode);
+            updateEnhanced4gLteState();
 
             // Video calling and WiFi calling state might have changed.
             updateCallingCategory();
@@ -993,21 +998,7 @@
                 android.util.Log.d(LOG_TAG, "keep ltePref");
             }
 
-            Preference pref = prefSet.findPreference(BUTTON_4G_LTE_KEY);
-            try {
-                if ((mImsMgr.getImsServiceStatus() != ImsFeature.STATE_READY)
-                        || hideEnhanced4gLteSettings(getActivity(), carrierConfig)) {
-                    if (pref != null) {
-                        prefSet.removePreference(pref);
-                    }
-                }
-            } catch (ImsException ex) {
-                log("Exception when trying to get ImsServiceStatus: " + ex);
-                if (pref != null) {
-                    prefSet.removePreference(pref);
-                }
-            }
-
+            updateEnhanced4gLteState();
             updateCallingCategory();
 
             // Enable link to CMAS app settings depending on the value in config.xml.
@@ -1022,6 +1013,19 @@
                 }
             }
 
+            /**
+             * Listen to extra preference changes that need as Metrics events logging.
+             */
+            if (prefSet.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY) != null) {
+                prefSet.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)
+                        .setOnPreferenceChangeListener(this);
+            }
+
+            if (prefSet.findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY) != null) {
+                prefSet.findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)
+                        .setOnPreferenceChangeListener(this);
+            }
+
             // Get the networkMode from Settings.System and displays it
             mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
             mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
@@ -1040,8 +1044,7 @@
              * but you do need to remember that this all needs to work when subscriptions
              * change dynamically such as when hot swapping sims.
              */
-            boolean canChange4glte = is4gLtePrefEnabled(activity.getApplicationContext(),
-                    carrierConfig);
+            boolean canChange4glte = is4gLtePrefEnabled(carrierConfig);
             boolean useVariant4glteTitle = carrierConfig.getBoolean(
                     CarrierConfigManager.KEY_ENHANCED_4G_LTE_TITLE_VARIANT_BOOL);
             int enhanced4glteModeTitleId = useVariant4glteTitle ?
@@ -1054,7 +1057,6 @@
             mButton4glte.setEnabled(hasActiveSubscriptions && canChange4glte);
             mLteDataServicePref.setEnabled(hasActiveSubscriptions);
             Preference ps;
-            PreferenceScreen root = getPreferenceScreen();
             ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS);
             if (ps != null) {
                 ps.setEnabled(hasActiveSubscriptions);
@@ -1106,6 +1108,8 @@
          * display value.
          */
         public boolean onPreferenceChange(Preference preference, Object objValue) {
+            sendMetricsEventPreferenceChanged(getPreferenceScreen(), preference, objValue);
+
             final int phoneSubId = mPhone.getSubId();
             if (preference == mButtonPreferredNetworkMode) {
                 //NOTE onPreferenceChange seems to be called even if there is no change
@@ -1209,11 +1213,9 @@
                             .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
                 }
             } else if (preference == mButton4glte) {
-                SwitchPreference enhanced4gModePref = (SwitchPreference) preference;
-                boolean enhanced4gMode = !enhanced4gModePref.isChecked();
-                enhanced4gModePref.setChecked(enhanced4gMode);
-                ImsManager.setEnhanced4gLteModeSetting(getActivity(),
-                        enhanced4gModePref.isChecked());
+                boolean enhanced4gMode = !mButton4glte.isChecked();
+                mButton4glte.setChecked(enhanced4gMode);
+                mImsMgr.setEnhanced4gLteModeSetting(mButton4glte.isChecked());
             } else if (preference == mButtonDataRoam) {
                 if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
 
@@ -1225,6 +1227,9 @@
                             CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL)) {
                         mPhone.setDataRoamingEnabled(true);
                     } else {
+                        // MetricsEvent with no value update.
+                        MetricsLogger.action(getContext(),
+                                getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam));
                         // First confirm with a warning dialog about charges
                         mOkClicked = false;
                         RoamingDialogFragment fragment = new RoamingDialogFragment();
@@ -1234,19 +1239,27 @@
                     }
                 } else {
                     mPhone.setDataRoamingEnabled(false);
+                    MetricsLogger.action(getContext(),
+                            getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam),
+                            false);
+                    return true;
                 }
-                return true;
             } else if (preference == mVideoCallingPref) {
                 // If mButton4glte is not checked, mVideoCallingPref should be disabled.
                 // So it only makes sense to call phoneMgr.enableVideoCalling if it's checked.
                 if (mButton4glte.isChecked()) {
-                    PhoneGlobals.getInstance().phoneMgr.enableVideoCalling((boolean) objValue);
+                    mImsMgr.setVtSetting((boolean) objValue);
                     return true;
                 } else {
                     loge("mVideoCallingPref should be disabled if mButton4glte is not checked.");
                     mVideoCallingPref.setEnabled(false);
                     return false;
                 }
+            } else if (preference == getPreferenceScreen()
+                    .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)
+                    || preference == getPreferenceScreen()
+                    .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)) {
+                return true;
             }
 
             updateBody();
@@ -1254,9 +1267,10 @@
             return true;
         }
 
-        private boolean is4gLtePrefEnabled(Context context, PersistableBundle carrierConfig) {
+        private boolean is4gLtePrefEnabled(PersistableBundle carrierConfig) {
             return (mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE)
-                    && ImsManager.isNonTtyOrTtyOnVolteEnabled(context)
+                    && mImsMgr != null
+                    && mImsMgr.isNonTtyOrTtyOnVolteEnabled()
                     && carrierConfig.getBoolean(
                             CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL);
         }
@@ -1613,14 +1627,15 @@
                 } else {
                     removePref = true;
                 }
-            } else if (!ImsManager.isWfcEnabledByPlatform(mPhone.getContext())
-                    || !ImsManager.isWfcProvisionedOnDevice(mPhone.getContext())) {
+            } else if (mImsMgr == null
+                    || !mImsMgr.isWfcEnabledByPlatform()
+                    || !mImsMgr.isWfcProvisionedOnDevice()) {
                 removePref = true;
             } else {
                 int resId = com.android.internal.R.string.wifi_calling_off_summary;
-                if (ImsManager.isWfcEnabledByUser(mPhone.getContext())) {
-                    boolean isRoaming = mButtonDataRoam.isChecked();
-                    int wfcMode = ImsManager.getWfcMode(mPhone.getContext(), isRoaming);
+                if (mImsMgr.isWfcEnabledByUser()) {
+                    boolean isRoaming = mTelephonyManager.isNetworkRoaming();
+                    int wfcMode = mImsMgr.getWfcMode(isRoaming);
                     switch (wfcMode) {
                         case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
                             resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
@@ -1646,6 +1661,34 @@
             }
         }
 
+        private void updateEnhanced4gLteState() {
+            if (mButton4glte == null) {
+                return;
+            }
+
+            PersistableBundle carrierConfig = PhoneGlobals.getInstance()
+                    .getCarrierConfigForSubId(mPhone.getSubId());
+
+            try {
+                if ((mImsMgr == null
+                        || mImsMgr.getImsServiceStatus() != ImsFeature.STATE_READY
+                        || !mImsMgr.isVolteEnabledByPlatform()
+                        || !mImsMgr.isVolteProvisionedOnDevice()
+                        || carrierConfig.getBoolean(
+                        CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL))) {
+                    getPreferenceScreen().removePreference(mButton4glte);
+                } else {
+                    // NOTE: Buttons will be enabled/disabled in mPhoneStateListener
+                    boolean enh4glteMode = mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()
+                            && mImsMgr.isNonTtyOrTtyOnVolteEnabled();
+                    mButton4glte.setChecked(enh4glteMode);
+                }
+            } catch (ImsException ex) {
+                log("Exception when trying to get ImsServiceStatus: " + ex);
+                getPreferenceScreen().removePreference(mButton4glte);
+            }
+        }
+
         private void updateVideoCallState() {
             if (mVideoCallingPref == null || mCallingCategory == null) {
                 return;
@@ -1654,30 +1697,23 @@
             PersistableBundle carrierConfig = PhoneGlobals.getInstance()
                     .getCarrierConfigForSubId(mPhone.getSubId());
 
-            boolean removePref = false;
-
-            if (ImsManager.isVtEnabledByPlatform(mPhone.getContext())
-                    && ImsManager.isVtProvisionedOnDevice(mPhone.getContext())
+            if (mImsMgr != null
+                    && mImsMgr.isVtEnabledByPlatform()
+                    && mImsMgr.isVtProvisionedOnDevice()
                     && (carrierConfig.getBoolean(
-                            CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
-                            || mPhone.mDcTracker.isDataEnabled())) {
-                boolean enhanced4gLteEnabled = mButton4glte.isChecked();
-                mVideoCallingPref.setEnabled(enhanced4gLteEnabled);
-                boolean currentValue = enhanced4gLteEnabled
-                        ? PhoneGlobals.getInstance().phoneMgr.isVideoCallingEnabled(
-                        getContext().getOpPackageName()) : false;
-                mVideoCallingPref.setChecked(currentValue);
-                if (enhanced4gLteEnabled) {
+                        CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
+                        || mPhone.mDcTracker.isDataEnabled())) {
+                mCallingCategory.addPreference(mVideoCallingPref);
+                if (!mButton4glte.isChecked()) {
+                    mVideoCallingPref.setEnabled(false);
+                    mVideoCallingPref.setChecked(false);
+                } else {
+                    mVideoCallingPref.setEnabled(true);
+                    mVideoCallingPref.setChecked(mImsMgr.isVtEnabledByUser());
                     mVideoCallingPref.setOnPreferenceChangeListener(this);
                 }
             } else {
-                removePref = true;
-            }
-
-            if (removePref) {
                 mCallingCategory.removePreference(mVideoCallingPref);
-            } else {
-                mCallingCategory.addPreference(mVideoCallingPref);
             }
         }
 
@@ -1813,17 +1849,104 @@
             return false;
         }
 
+        /**
+         * Metrics events related methods. it takes care of all preferences possible in this
+         * fragment(except a few that log on their own). It doesn't only include preferences in
+         * network_setting_fragment.xml, but also those defined in GsmUmtsOptions and CdmaOptions.
+         */
         private void sendMetricsEventPreferenceClicked(
                 PreferenceScreen preferenceScreen, Preference preference) {
-            if (preference == mMobileDataPref) {
-                MetricsLogger.action(getContext(),
-                        MetricsEvent.ACTION_MOBILE_NETWORK_MOBILE_DATA_TOGGLE,
-                        ((MobileDataPreference) preference).mChecked);
-            } else if (preference == mDataUsagePref) {
-                MetricsLogger.action(getContext(),
-                        MetricsEvent.ACTION_MOBILE_NETWORK_DATA_USAGE);
+            final int category = getMetricsEventCategory(preferenceScreen, preference);
+            if (category == MetricsEvent.VIEW_UNKNOWN) {
+                return;
             }
-            // TODO: add Metrics constants for other preferences and send events here accordingly.
+
+            // Send MetricsEvent on click. It includes preferences other than SwitchPreferences,
+            // which send MetricsEvent in onPreferenceChange.
+            // For ListPreferences, we log it here without a value, only indicating it's clicked to
+            // open the list dialog. When a value is chosen, another MetricsEvent is logged with
+            // new value in onPreferenceChange.
+            if (preference == mLteDataServicePref || preference == mDataUsagePref
+                    || preference == mEuiccSettingsPref || preference == mAdvancedOptions
+                    || preference == mWiFiCallingPref || preference == mButtonPreferredNetworkMode
+                    || preference == mButtonEnabledNetworks
+                    || preference == preferenceScreen.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)
+                    || preference == preferenceScreen.findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)
+                    || preference == preferenceScreen.findPreference(BUTTON_GSM_APN_EXPAND_KEY)
+                    || preference == preferenceScreen.findPreference(BUTTON_CDMA_APN_EXPAND_KEY)
+                    || preference == preferenceScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY)) {
+                MetricsLogger.action(getContext(), category);
+            }
+        }
+
+        private void sendMetricsEventPreferenceChanged(
+                PreferenceScreen preferenceScreen, Preference preference, Object newValue) {
+            final int category = getMetricsEventCategory(preferenceScreen, preference);
+            if (category == MetricsEvent.VIEW_UNKNOWN) {
+                return;
+            }
+
+            // MetricsEvent logging with new value, for SwitchPreferences and ListPreferences.
+            if (preference == mButton4glte || preference == mVideoCallingPref) {
+                MetricsLogger.action(getContext(), category, (Boolean) newValue);
+            } else if (preference == mButtonPreferredNetworkMode
+                    || preference == mButtonEnabledNetworks
+                    || preference == preferenceScreen
+                            .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)
+                    || preference == preferenceScreen
+                            .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)) {
+                // Network select preference sends metrics event in its own listener.
+                MetricsLogger.action(getContext(), category, Integer.valueOf((String) newValue));
+            }
+        }
+
+        private int getMetricsEventCategory(
+                PreferenceScreen preferenceScreen, Preference preference) {
+
+            if (preference == null) {
+                return MetricsEvent.VIEW_UNKNOWN;
+            } else if (preference == mMobileDataPref) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_MOBILE_DATA_TOGGLE;
+            } else if (preference == mButtonDataRoam) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_DATA_ROAMING_TOGGLE;
+            } else if (preference == mDataUsagePref) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_DATA_USAGE;
+            } else if (preference == mLteDataServicePref) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_SET_UP_DATA_SERVICE;
+            } else if (preference == mAdvancedOptions) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_EXPAND_ADVANCED_FIELDS;
+            } else if (preference == mButton4glte) {
+                return MetricsEvent.ACTION_MOBILE_ENHANCED_4G_LTE_MODE_TOGGLE;
+            } else if (preference == mButtonPreferredNetworkMode) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_SELECT_PREFERRED_NETWORK;
+            } else if (preference == mButtonEnabledNetworks) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_SELECT_ENABLED_NETWORK;
+            } else if (preference == mEuiccSettingsPref) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_EUICC_SETTING;
+            } else if (preference == mWiFiCallingPref) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_WIFI_CALLING;
+            } else if (preference == mVideoCallingPref) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_VIDEO_CALLING_TOGGLE;
+            } else if (preference == preferenceScreen
+                            .findPreference(NetworkOperators.BUTTON_AUTO_SELECT_KEY)) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_AUTO_SELECT_NETWORK_TOGGLE;
+            } else if (preference == preferenceScreen
+                            .findPreference(NetworkOperators.BUTTON_NETWORK_SELECT_KEY)) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK;
+            } else if (preference == preferenceScreen
+                            .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_CDMA_SYSTEM_SELECT;
+            } else if (preference == preferenceScreen
+                            .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_CDMA_SUBSCRIPTION_SELECT;
+            } else if (preference == preferenceScreen.findPreference(BUTTON_GSM_APN_EXPAND_KEY)
+                    || preference == preferenceScreen.findPreference(BUTTON_CDMA_APN_EXPAND_KEY)) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_APN_SETTINGS;
+            } else if (preference == preferenceScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY)) {
+                return MetricsEvent.ACTION_MOBILE_NETWORK_CARRIER_SETTINGS;
+            } else {
+                return MetricsEvent.VIEW_UNKNOWN;
+            }
         }
 
         private void updateGsmUmtsOptions(PreferenceFragment prefFragment,
diff --git a/src/com/android/phone/NetworkOperators.java b/src/com/android/phone/NetworkOperators.java
index 4ac5c84..05cfe42 100644
--- a/src/com/android/phone/NetworkOperators.java
+++ b/src/com/android/phone/NetworkOperators.java
@@ -30,6 +30,8 @@
 import android.util.AttributeSet;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.telephony.CommandException;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
@@ -112,6 +114,8 @@
         if (preference == mAutoSelect) {
             boolean autoSelect = (Boolean) newValue;
             selectNetworkAutomatic(autoSelect);
+            MetricsLogger.action(getContext(),
+                    MetricsEvent.ACTION_MOBILE_NETWORK_AUTO_SELECT_NETWORK_TOGGLE, autoSelect);
             return true;
         }
         return false;
diff --git a/src/com/android/phone/NetworkQueryService.java b/src/com/android/phone/NetworkQueryService.java
index 84fde87..86f4b11 100644
--- a/src/com/android/phone/NetworkQueryService.java
+++ b/src/com/android/phone/NetworkQueryService.java
@@ -19,7 +19,6 @@
 import android.app.Service;
 import android.content.Context;
 import android.content.Intent;
-import com.android.internal.telephony.OperatorInfo;
 import android.os.AsyncResult;
 import android.os.Binder;
 import android.os.Handler;
@@ -27,12 +26,23 @@
 import android.os.Message;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
-import android.telephony.SubscriptionManager;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneFactory;
+import android.telephony.AccessNetworkConstants;
+import android.telephony.CellIdentityGsm;
+import android.telephony.CellInfo;
+import android.telephony.CellInfoGsm;
+import android.telephony.NetworkScan;
+import android.telephony.NetworkScanRequest;
+import android.telephony.RadioAccessSpecifier;
+import android.telephony.TelephonyManager;
+import android.telephony.TelephonyScanManager;
 import android.util.Log;
 
+import com.android.internal.telephony.OperatorInfo;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneFactory;
+
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Service code used to assist in querying the network for service
@@ -44,7 +54,10 @@
     private static final boolean DBG = true;
 
     // static events
-    private static final int EVENT_NETWORK_SCAN_COMPLETED = 100;
+    private static final int EVENT_NETWORK_SCAN_VIA_PHONE_COMPLETED = 100;
+    private static final int EVENT_NETWORK_SCAN_RESULTS = 200;
+    private static final int EVENT_NETWORK_SCAN_ERROR = 300;
+    private static final int EVENT_NETWORK_SCAN_COMPLETED = 400;
 
     // static states indicating the query status of the service
     private static final int QUERY_READY = -1;
@@ -55,10 +68,20 @@
     public static final int QUERY_EXCEPTION = 1;
 
     static final String ACTION_LOCAL_BINDER = "com.android.phone.intent.action.LOCAL_BINDER";
-    
+
     /** state of the query service */
     private int mState;
-    
+
+    private NetworkScan mNetworkScan;
+
+    // NetworkScanRequest parameters
+    private static final int SCAN_TYPE = NetworkScanRequest.SCAN_TYPE_ONE_SHOT;
+    private static final boolean INCREMENTAL_RESULTS = true;
+    // The parameters below are in seconds
+    private static final int SEARCH_PERIODICITY_SEC = 5;
+    private static final int MAX_SEARCH_TIME_SEC = 60;
+    private static final int INCREMENTAL_RESULTS_PERIODICITY_SEC = 3;
+
     /**
      * Class for clients to access.  Because we know this service always
      * runs in the same process as its clients, we don't need to deal with
@@ -81,57 +104,150 @@
             switch (msg.what) {
                 // if the scan is complete, broadcast the results.
                 // to all registerd callbacks.
+                case EVENT_NETWORK_SCAN_VIA_PHONE_COMPLETED:
+                    if (DBG) log("scan via Phone completed, broadcasting results");
+                    broadcastQueryResults(msg);
+                    break;
+
+                case EVENT_NETWORK_SCAN_RESULTS:
+                    if (DBG) log("get scan results, broadcasting results");
+                    broadcastQueryResults(msg);
+                    break;
+
+                case EVENT_NETWORK_SCAN_ERROR:
+                    if (DBG) log("get scan error, broadcasting error code");
+                    broadcastQueryResults(msg);
+                    break;
+
                 case EVENT_NETWORK_SCAN_COMPLETED:
-                    if (DBG) log("scan completed, broadcasting results");
-                    broadcastQueryResults((AsyncResult) msg.obj);
+                    if (DBG) log("network scan or stop network query completed");
+                    broadcastQueryResults(msg);
                     break;
             }
         }
     };
-    
-    /** 
+
+    /**
      * List of callback objects, also used to synchronize access to 
      * itself and to changes in state.
      */
     final RemoteCallbackList<INetworkQueryServiceCallback> mCallbacks =
-        new RemoteCallbackList<INetworkQueryServiceCallback> ();
-    
+            new RemoteCallbackList<INetworkQueryServiceCallback>();
+
+    /**
+     * This implementation of NetworkScanCallbackImpl is used to receive callback notifications from
+     * the Telephony Manager.
+     */
+    public class NetworkScanCallbackImpl extends TelephonyScanManager.NetworkScanCallback {
+
+        /** Returns the scan results to the user, this callback will be called at least one time. */
+        public void onResults(List<CellInfo> results) {
+            if (DBG) log("got network scan results: " + results.size());
+            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_RESULTS, results);
+            msg.sendToTarget();
+        }
+
+        /**
+         * Informs the user that the scan has stopped.
+         *
+         * This callback will be called when the scan is finished or cancelled by the user.
+         * The related NetworkScanRequest will be deleted after this callback.
+         */
+        public void onComplete() {
+            if (DBG) log("network scan completed");
+            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED);
+            msg.sendToTarget();
+        }
+
+        /**
+         * Informs the user that there is some error about the scan.
+         *
+         * This callback will be called whenever there is any error about the scan, and the scan
+         * will be terminated. onComplete() will NOT be called.
+         */
+        public void onError(int error) {
+            if (DBG) log("network scan got error: " + error);
+            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_ERROR, error, 0 /* arg2 */);
+            msg.sendToTarget();
+        }
+    }
+
     /**
      * Implementation of the INetworkQueryService interface.
      */
     private final INetworkQueryService.Stub mBinder = new INetworkQueryService.Stub() {
-        
+
         /**
          * Starts a query with a INetworkQueryServiceCallback object if
          * one has not been started yet.  Ignore the new query request
          * if the query has been started already.  Either way, place the
-         * callback object in the queue to be notified upon request 
+         * callback object in the queue to be notified upon request
          * completion.
          */
-        public void startNetworkQuery(INetworkQueryServiceCallback cb, int phoneId) {
+        public void startNetworkQuery(
+                INetworkQueryServiceCallback cb, int phoneId, boolean isIncrementalResult) {
             if (cb != null) {
                 // register the callback to the list of callbacks.
                 synchronized (mCallbacks) {
                     mCallbacks.register(cb);
                     if (DBG) log("registering callback " + cb.getClass().toString());
-                    
+
                     switch (mState) {
                         case QUERY_READY:
-                            // TODO: we may want to install a timeout here in case we
-                            // do not get a timely response from the RIL.
-                            Phone phone = PhoneFactory.getPhone(phoneId);
-                            if (phone != null) {
-                                phone.getAvailableNetworks(
-                                        mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED));
+
+                            if (isIncrementalResult) {
+                                if (DBG) log("start network scan via TelephonManager");
+                                TelephonyManager tm = (TelephonyManager) getSystemService(
+                                        Context.TELEPHONY_SERVICE);
+                                // The Radio Access Specifiers below are meant to scan
+                                // all the bands for all the supported technologies.
+                                RadioAccessSpecifier gsm = new RadioAccessSpecifier(
+                                        AccessNetworkConstants.AccessNetworkType.GERAN,
+                                        null /* bands */,
+                                        null /* channels */);
+                                RadioAccessSpecifier lte = new RadioAccessSpecifier(
+                                        AccessNetworkConstants.AccessNetworkType.EUTRAN,
+                                        null /* bands */,
+                                        null /* channels */);
+                                RadioAccessSpecifier wcdma = new RadioAccessSpecifier(
+                                        AccessNetworkConstants.AccessNetworkType.UTRAN,
+                                        null /* bands */,
+                                        null /* channels */);
+                                RadioAccessSpecifier[] radioAccessSpecifier = {gsm, lte, wcdma};
+                                NetworkScanRequest networkScanRequest = new NetworkScanRequest(
+                                        SCAN_TYPE,
+                                        radioAccessSpecifier,
+                                        SEARCH_PERIODICITY_SEC,
+                                        MAX_SEARCH_TIME_SEC,
+                                        INCREMENTAL_RESULTS,
+                                        INCREMENTAL_RESULTS_PERIODICITY_SEC,
+                                        null /* List of PLMN ids (MCC-MNC) */);
+
+                                // Construct a NetworkScanCallback
+                                NetworkQueryService.NetworkScanCallbackImpl
+                                        networkScanCallback =
+                                        new NetworkQueryService.NetworkScanCallbackImpl();
+
+                                // Request network scan
+                                mNetworkScan = tm.requestNetworkScan(networkScanRequest,
+                                        networkScanCallback);
                                 mState = QUERY_IS_RUNNING;
-                                if (DBG) log("starting new query");
                             } else {
-                                if (DBG) {
-                                    log("phone is null");
+                                Phone phone = PhoneFactory.getPhone(phoneId);
+                                if (phone != null) {
+                                    phone.getAvailableNetworks(
+                                            mHandler.obtainMessage(
+                                                    EVENT_NETWORK_SCAN_VIA_PHONE_COMPLETED));
+                                    mState = QUERY_IS_RUNNING;
+                                    if (DBG) log("start network scan via Phone");
+                                } else {
+                                    if (DBG) {
+                                        log("phone is null");
+                                    }
                                 }
                             }
+
                             break;
-                            
                         // do nothing if we're currently busy.
                         case QUERY_IS_RUNNING:
                             if (DBG) log("query already in progress");
@@ -141,19 +257,24 @@
                 }
             }
         }
-        
+
         /**
          * Stops a query with a INetworkQueryServiceCallback object as
          * a token.
          */
-        public void stopNetworkQuery(INetworkQueryServiceCallback cb) {
-            // currently we just unregister the callback, since there is 
-            // no way to tell the RIL to terminate the query request.  
-            // This means that the RIL may still be busy after the stop 
-            // request was made, but the state tracking logic ensures
-            // that the delay will only last for 1 request even with
-            // repeated button presses in the NetworkSetting activity.
-            unregisterCallback(cb);
+        public void stopNetworkQuery() {
+            if (DBG) log("stop network query");
+            // Tells the RIL to terminate the query request.
+            if (mNetworkScan != null) {
+                try {
+                    mNetworkScan.stop();
+                    mState = QUERY_READY;
+                } catch (RemoteException e) {
+                    if (DBG) log("stop mNetworkScan failed");
+                } catch (IllegalArgumentException e) {
+                    // Do nothing, scan has already completed.
+                }
+            }
         }
 
         /**
@@ -171,7 +292,7 @@
 
     @Override
     public void onCreate() {
-        mState = QUERY_READY;        
+        mState = QUERY_READY;
     }
 
     /**
@@ -180,7 +301,7 @@
     @Override
     public void onStart(Intent intent, int startId) {
     }
-    
+
     /**
      * Handle the bind request.
      */
@@ -198,38 +319,85 @@
      * Broadcast the results from the query to all registered callback
      * objects. 
      */
-    private void broadcastQueryResults (AsyncResult ar) {
+    private void broadcastQueryResults(Message msg) {
         // reset the state.
         synchronized (mCallbacks) {
             mState = QUERY_READY;
-            
-            // see if we need to do any work.
-            if (ar == null) {
-                if (DBG) log("AsyncResult is null.");
-                return;
-            }
-    
-            // TODO: we may need greater accuracy here, but for now, just a
-            // simple status integer will suffice.
-            int exception = (ar.exception == null) ? QUERY_OK : QUERY_EXCEPTION;
-            if (DBG) log("AsyncResult has exception " + exception);
-            
+
             // Make the calls to all the registered callbacks.
             for (int i = (mCallbacks.beginBroadcast() - 1); i >= 0; i--) {
-                INetworkQueryServiceCallback cb = mCallbacks.getBroadcastItem(i); 
+                INetworkQueryServiceCallback cb = mCallbacks.getBroadcastItem(i);
                 if (DBG) log("broadcasting results to " + cb.getClass().toString());
                 try {
-                    cb.onQueryComplete((ArrayList<OperatorInfo>) ar.result, exception);
+                    switch (msg.what) {
+                        case EVENT_NETWORK_SCAN_VIA_PHONE_COMPLETED:
+                            AsyncResult ar = (AsyncResult) msg.obj;
+                            if (ar != null) {
+                                cb.onResults(getCellInfoList((List<OperatorInfo>) ar.result));
+                            } else {
+                                if (DBG) log("AsyncResult is null.");
+                            }
+                            // Send the onComplete() callback to indicate the one-time network
+                            // scan has completed.
+                            cb.onComplete();
+                            break;
+
+                        case EVENT_NETWORK_SCAN_RESULTS:
+                            cb.onResults((List<CellInfo>) msg.obj);
+                            break;
+
+                        case EVENT_NETWORK_SCAN_COMPLETED:
+                            cb.onComplete();
+                            break;
+
+                        case EVENT_NETWORK_SCAN_ERROR:
+                            cb.onError(msg.arg1);
+                            break;
+                    }
                 } catch (RemoteException e) {
                 }
             }
-            
+
             // finish up.
             mCallbacks.finishBroadcast();
         }
     }
-    
+
+    /**
+     * Wraps up a list of OperatorInfo object to a list of CellInfo object. GsmCellInfo is used here
+     * only because operatorInfo does not contain technology type while CellInfo is an abstract
+     * object that requires to specify technology type. It doesn't matter which CellInfo type to
+     * use here, since we only want to wrap the operator info and PLMN to a CellInfo object.
+     */
+    private List<CellInfo> getCellInfoList(List<OperatorInfo> operatorInfoList) {
+        List<CellInfo> cellInfoList = new ArrayList<>();
+        for (OperatorInfo oi: operatorInfoList) {
+            String operatorNumeric = oi.getOperatorNumeric();
+            String mcc = null;
+            String mnc = null;
+            log("operatorNumeric: " + operatorNumeric);
+            if (operatorNumeric != null && operatorNumeric.matches("^[0-9]{5,6}$")) {
+                mcc = operatorNumeric.substring(0, 3);
+                mnc = operatorNumeric.substring(3);
+            }
+            CellIdentityGsm cig = new CellIdentityGsm(
+                    Integer.MAX_VALUE /* lac */,
+                    Integer.MAX_VALUE /* cid */,
+                    Integer.MAX_VALUE /* arfcn */,
+                    Integer.MAX_VALUE /* bsic */,
+                    mcc,
+                    mnc,
+                    oi.getOperatorAlphaLong(),
+                    oi.getOperatorAlphaShort());
+
+            CellInfoGsm ci = new CellInfoGsm();
+            ci.setCellIdentity(cig);
+            cellInfoList.add(ci);
+        }
+        return cellInfoList;
+    }
+
     private static void log(String msg) {
         Log.d(LOG_TAG, msg);
-    }    
-}
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/phone/NetworkSelectListPreference.java b/src/com/android/phone/NetworkSelectListPreference.java
index 936c2a0..cc54b09 100644
--- a/src/com/android/phone/NetworkSelectListPreference.java
+++ b/src/com/android/phone/NetworkSelectListPreference.java
@@ -19,6 +19,7 @@
 import android.app.ProgressDialog;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.metrics.LogMaker;
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.Message;
@@ -27,6 +28,16 @@
 import android.os.RemoteException;
 import android.preference.ListPreference;
 import android.preference.Preference;
+import android.telephony.CellInfo;
+import android.telephony.CellInfoCdma;
+import android.telephony.CellInfoGsm;
+import android.telephony.CellInfoLte;
+import android.telephony.CellInfoWcdma;
+import android.telephony.CellSignalStrengthCdma;
+import android.telephony.CellSignalStrengthGsm;
+import android.telephony.CellSignalStrengthLte;
+import android.telephony.CellSignalStrengthWcdma;
+import android.telephony.NetworkScan;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.BidiFormatter;
@@ -35,10 +46,13 @@
 import android.util.AttributeSet;
 import android.util.Log;
 
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.telephony.OperatorInfo;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
 
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -54,19 +68,22 @@
     private static final String LOG_TAG = "networkSelect";
     private static final boolean DBG = true;
 
-    private static final int EVENT_NETWORK_SCAN_COMPLETED = 100;
-    private static final int EVENT_NETWORK_SELECTION_DONE = 200;
+    private static final int EVENT_NETWORK_SELECTION_DONE = 1;
+    private static final int EVENT_NETWORK_SCAN_RESULTS = 2;
+    private static final int EVENT_NETWORK_SCAN_ERROR = 3;
+    private static final int EVENT_NETWORK_SCAN_COMPLETED = 4;
 
     //dialog ids
     private static final int DIALOG_NETWORK_SELECTION = 100;
     private static final int DIALOG_NETWORK_LIST_LOAD = 200;
 
     private int mPhoneId = SubscriptionManager.INVALID_PHONE_INDEX;
-    private List<OperatorInfo> mOperatorInfoList;
-    private OperatorInfo mOperatorInfo;
+    private List<CellInfo> mCellInfoList;
+    private CellInfo mCellInfo;
 
     private int mSubId;
     private NetworkOperators mNetworkOperators;
+    private boolean mNeedScanAgain;
 
     private ProgressDialog mProgressDialog;
     public NetworkSelectListPreference(Context context, AttributeSet attrs) {
@@ -74,13 +91,15 @@
     }
 
     public NetworkSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
+                                       int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
     }
 
     @Override
     protected void onClick() {
-        loadNetworksList();
+        sendMetricsEvent(null);
+        // Scan the network with setting the isIncrementalResult as true via TelephonyManager first.
+        loadNetworksList(true);
     }
 
     private final Handler mHandler = new Handler() {
@@ -88,10 +107,6 @@
         public void handleMessage(Message msg) {
             AsyncResult ar;
             switch (msg.what) {
-                case EVENT_NETWORK_SCAN_COMPLETED:
-                    networksListLoaded((List<OperatorInfo>) msg.obj, msg.arg1);
-                    break;
-
                 case EVENT_NETWORK_SELECTION_DONE:
                     if (DBG) logd("hideProgressPanel");
                     try {
@@ -106,15 +121,98 @@
                         mNetworkOperators.displayNetworkSelectionFailed(ar.exception);
                     } else {
                         if (DBG) {
-                            logd("manual network selection: succeeded!"
-                                    + getNetworkTitle(mOperatorInfo));
+                            logd("manual network selection: succeeded! "
+                                    + getNetworkTitle(mCellInfo));
                         }
                         mNetworkOperators.displayNetworkSelectionSucceeded();
                     }
                     mNetworkOperators.getNetworkSelectionMode();
                     break;
-            }
 
+                case EVENT_NETWORK_SCAN_RESULTS:
+                    List<CellInfo> results = (List<CellInfo>) msg.obj;
+                    results.removeIf(cellInfo -> cellInfo == null);
+                    if (results.size() > 0) {
+                        boolean isInvalidCellInfoList = true;
+                        // Regard the list as invalid only if all the elements in the list are
+                        // invalid.
+                        for (CellInfo cellInfo : results) {
+                            if (!isInvalidCellInfo(cellInfo)) {
+                                isInvalidCellInfoList = false;
+                                break;
+                            }
+                        }
+                        if (isInvalidCellInfoList) {
+                            mNeedScanAgain = true;
+                            if (DBG) {
+                                logd("Invalid cell info. Stop current network scan "
+                                        + "and start a new one via old API");
+                            }
+                            // Stop current network scan flow. This behavior will result in a
+                            // onComplete() callback, after which we will start a new network query
+                            // via Phone.getAvailableNetworks(). This behavior might also result in
+                            // a onError() callback if the modem did not stop network query
+                            // successfully. In this case we will display network query failed
+                            // instead of resending a new request.
+                            try {
+                                if (mNetworkQueryService != null) {
+                                    mNetworkQueryService.stopNetworkQuery();
+                                }
+                            } catch (RemoteException e) {
+                                loge("exception from stopNetworkQuery " + e);
+                            }
+                        } else {
+                            // TODO(b/70530820): Display the scan results incrementally after
+                            // finalizing the UI desing on Mobile Network Setting page. For now,
+                            // just update the CellInfo list when received the onResult callback,
+                            // and display the scan result when received the onComplete callback
+                            // in the end.
+                            mCellInfoList = new ArrayList<>(results);
+                            if (DBG) logd("CALLBACK_SCAN_RESULTS" + mCellInfoList.toString());
+                        }
+                    }
+
+                    break;
+
+                case EVENT_NETWORK_SCAN_ERROR:
+                    int error = msg.arg1;
+                    if (DBG) logd("error while querying available networks " + error);
+                    if (error == NetworkScan.ERROR_UNSUPPORTED) {
+                        if (DBG) {
+                            logd("Modem does not support: try to scan network again via Phone");
+                        }
+                        loadNetworksList(false);
+                    } else {
+                        try {
+                            if (mNetworkQueryService != null) {
+                                mNetworkQueryService.unregisterCallback(mCallback);
+                            }
+                        } catch (RemoteException e) {
+                            loge("onError: exception from unregisterCallback " + e);
+                        }
+                        displayNetworkQueryFailed(error);
+                    }
+                    break;
+
+                case EVENT_NETWORK_SCAN_COMPLETED:
+                    if (mNeedScanAgain) {
+                        logd("CellInfo is invalid to display. Start a new scan via Phone. ");
+                        loadNetworksList(false);
+                        mNeedScanAgain = false;
+                    } else {
+                        try {
+                            if (mNetworkQueryService != null) {
+                                mNetworkQueryService.unregisterCallback(mCallback);
+                            }
+                        } catch (RemoteException e) {
+                            loge("onComplete: exception from unregisterCallback " + e);
+                        }
+                        if (DBG) logd("scan complete, load the cellInfosList");
+                        // Modify UI to indicate users that the scan has completed.
+                        networksListLoaded();
+                    }
+                    break;
+            }
             return;
         }
     };
@@ -126,11 +224,34 @@
      */
     private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() {
 
-        /** place the message on the looper queue upon query completion. */
-        public void onQueryComplete(List<OperatorInfo> networkInfoArray, int status) {
-            if (DBG) logd("notifying message loop of query completion.");
-            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED,
-                    status, 0, networkInfoArray);
+        /** Returns the scan results to the user, this callback will be called at lease one time. */
+        public void onResults(List<CellInfo> results) {
+            if (DBG) logd("get scan results.");
+            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_RESULTS, results);
+            msg.sendToTarget();
+        }
+
+        /**
+         * Informs the user that the scan has stopped.
+         *
+         * This callback will be called when the scan is finished or cancelled by the user.
+         * The related NetworkScanRequest will be deleted after this callback.
+         */
+        public void onComplete() {
+            if (DBG) logd("network scan completed.");
+            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED);
+            msg.sendToTarget();
+        }
+
+        /**
+         * Informs the user that there is some error about the scan.
+         *
+         * This callback will be called whenever there is any error about the scan, and the scan
+         * will be terminated. onComplete() will NOT be called.
+         */
+        public void onError(int error) {
+            if (DBG) logd("get onError callback with error code: " + error);
+            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_ERROR, error, 0 /* arg2 */);
             msg.sendToTarget();
         }
     };
@@ -138,10 +259,12 @@
     @Override
     //implemented for DialogInterface.OnCancelListener
     public void onCancel(DialogInterface dialog) {
+        if (DBG) logd("user manually close the dialog");
         // request that the service stop the query with this callback object.
         try {
             if (mNetworkQueryService != null) {
-                mNetworkQueryService.stopNetworkQuery(mCallback);
+                mNetworkQueryService.stopNetworkQuery();
+                mNetworkQueryService.unregisterCallback(mCallback);
             }
             // If cancelled, we query NetworkSelectMode and update states of AutoSelect button.
             mNetworkOperators.getNetworkSelectionMode();
@@ -160,18 +283,6 @@
         }
     }
 
-    /**
-     * Return normalized carrier name given network info.
-     *
-     * @param ni is network information in OperatorInfo type.
-     */
-    public String getNormalizedCarrierName(OperatorInfo ni) {
-        if (ni != null) {
-            return ni.getOperatorAlphaLong() + " (" + ni.getOperatorNumeric() + ")";
-        }
-        return null;
-    }
-
     // This method is provided besides initialize() because bind to network query service
     // may be binded after initialize(). In that case this method needs to be called explicitly
     // to set mNetworkQueryService. Otherwise mNetworkQueryService will remain null.
@@ -181,12 +292,13 @@
 
     // This initialize method needs to be called for this preference to work properly.
     protected void initialize(int subId, INetworkQueryService queryService,
-            NetworkOperators networkOperators, ProgressDialog progressDialog) {
+                              NetworkOperators networkOperators, ProgressDialog progressDialog) {
         mSubId = subId;
         mNetworkQueryService = queryService;
         mNetworkOperators = networkOperators;
         // This preference should share the same progressDialog with networkOperators category.
         mProgressDialog = progressDialog;
+        mNeedScanAgain = false;
 
         if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
             mPhoneId = SubscriptionManager.getPhoneId(mSubId);
@@ -232,7 +344,7 @@
     }
 
     private void displayNetworkSelectionInProgress() {
-        showProgressBar(DIALOG_NETWORK_SELECTION);
+        showProgressDialog(DIALOG_NETWORK_SELECTION);
     }
 
     private void displayNetworkQueryFailed(int error) {
@@ -249,15 +361,17 @@
                 NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
     }
 
-    private void loadNetworksList() {
+    private void loadNetworksList(boolean isIncrementalResult) {
         if (DBG) logd("load networks list...");
 
-        showProgressBar(DIALOG_NETWORK_LIST_LOAD);
+        if (!mNeedScanAgain) {
+            // Avoid blinking while showing the dialog again.
+            showProgressDialog(DIALOG_NETWORK_LIST_LOAD);
+        }
 
-        // delegate query request to the service.
         try {
             if (mNetworkQueryService != null) {
-                mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId);
+                mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId, isIncrementalResult);
             } else {
                 displayNetworkQueryFailed(NetworkQueryService.QUERY_EXCEPTION);
             }
@@ -267,25 +381,9 @@
         }
     }
 
-    /**
-     * networksListLoaded has been rewritten to take an array of
-     * OperatorInfo objects and a status field, instead of an
-     * AsyncResult.  Otherwise, the functionality which takes the
-     * OperatorInfo array and creates a list of preferences from it,
-     * remains unchanged.
-     */
-    private void networksListLoaded(List<OperatorInfo> result, int status) {
+    private void networksListLoaded() {
         if (DBG) logd("networks list loaded");
 
-        // used to un-register callback
-        try {
-            if (mNetworkQueryService != null) {
-                mNetworkQueryService.unregisterCallback(mCallback);
-            }
-        } catch (RemoteException e) {
-            loge("networksListLoaded: exception from unregisterCallback " + e);
-        }
-
         // update the state of the preferences.
         if (DBG) logd("hideProgressPanel");
 
@@ -301,49 +399,106 @@
         }
 
         setEnabled(true);
-        clearList();
 
-        if (status != NetworkQueryService.QUERY_OK) {
-            if (DBG) logd("error while querying available networks");
-            displayNetworkQueryFailed(status);
-        } else {
-            if (result != null) {
-                // create a preference for each item in the list.
-                // just use the operator name instead of the mildly
-                // confusing mcc/mnc.
-                mOperatorInfoList = result;
-                CharSequence[] networkEntries = new CharSequence[result.size()];
-                CharSequence[] networkEntryValues = new CharSequence[result.size()];
-                for (int i = 0; i < mOperatorInfoList.size(); i++) {
-                    if (mOperatorInfoList.get(i).getState() == OperatorInfo.State.FORBIDDEN) {
-                        networkEntries[i] = getNetworkTitle(mOperatorInfoList.get(i))
-                            + " "
-                            + getContext().getResources().getString(R.string.forbidden_network);
-                    } else {
-                        networkEntries[i] = getNetworkTitle(mOperatorInfoList.get(i));
-                    }
-                    networkEntryValues[i] = Integer.toString(i + 2);
+        if (mCellInfoList != null) {
+            // create a preference for each item in the list.
+            // just use the operator name instead of the mildly
+            // confusing mcc/mnc.
+            List<CharSequence> networkEntriesList = new ArrayList<>();
+            List<CharSequence> networkEntryValuesList = new ArrayList<>();
+            for (CellInfo cellInfo: mCellInfoList) {
+                // Display each operator name only once.
+                String networkTitle = getNetworkTitle(cellInfo);
+                if (!networkEntriesList.contains(networkTitle)) {
+                    networkEntriesList.add(networkTitle);
+                    networkEntryValuesList.add(Integer.toString(networkEntriesList.size() + 1));
                 }
-
-                setEntries(networkEntries);
-                setEntryValues(networkEntryValues);
-
-                super.onClick();
-            } else {
-                displayEmptyNetworkList();
             }
+            setEntries(networkEntriesList.toArray(new CharSequence[networkEntriesList.size()]));
+            setEntryValues(networkEntryValuesList.toArray(
+                    new CharSequence[networkEntryValuesList.size()]));
+
+            super.onClick();
+        } else {
+            displayEmptyNetworkList();
         }
     }
 
+    private void dismissProgressBar() {
+        if (mProgressDialog != null && mProgressDialog.isShowing()) {
+            mProgressDialog.dismiss();
+        }
+    }
+
+    private void showProgressDialog(int id) {
+        if (mProgressDialog == null) {
+            mProgressDialog = new ProgressDialog(getContext());
+        } else {
+            // Dismiss progress bar if it's showing now.
+            dismissProgressBar();
+        }
+
+        switch (id) {
+            case DIALOG_NETWORK_SELECTION:
+                final String networkSelectMsg = getContext().getResources()
+                        .getString(R.string.register_on_network,
+                                getNetworkTitle(mCellInfo));
+                mProgressDialog.setMessage(networkSelectMsg);
+                mProgressDialog.setCanceledOnTouchOutside(false);
+                mProgressDialog.setCancelable(false);
+                mProgressDialog.setIndeterminate(true);
+                break;
+            case DIALOG_NETWORK_LIST_LOAD:
+                mProgressDialog.setMessage(
+                        getContext().getResources().getString(R.string.load_networks_progress));
+                mProgressDialog.setCanceledOnTouchOutside(false);
+                mProgressDialog.setCancelable(true);
+                mProgressDialog.setIndeterminate(false);
+                mProgressDialog.setOnCancelListener(this);
+                break;
+            default:
+        }
+        mProgressDialog.show();
+    }
+
+    /**
+     * Implemented to support onPreferenceChangeListener to look for preference
+     * changes specifically on this button.
+     *
+     * @param preference is the preference to be changed, should be network select button.
+     * @param newValue should be the value of the selection as index of operators.
+     */
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        int operatorIndex = findIndexOfValue((String) newValue);
+        mCellInfo = mCellInfoList.get(operatorIndex);
+        if (DBG) logd("selected network: " + mCellInfo.toString());
+
+        sendMetricsEvent(getNetworkTitle(mCellInfo));
+
+        Message msg = mHandler.obtainMessage(EVENT_NETWORK_SELECTION_DONE);
+        Phone phone = PhoneFactory.getPhone(mPhoneId);
+        if (phone != null) {
+            OperatorInfo operatorInfo = getOperatorInfoFromCellInfo(mCellInfo);
+            if (DBG) logd("manually selected network: " + operatorInfo.toString());
+            phone.selectNetworkManually(operatorInfo, true, msg);
+            displayNetworkSelectionInProgress();
+        } else {
+            loge("Error selecting network. phone is null.");
+        }
+        return true;
+    }
+
     /**
      * Returns the title of the network obtained in the manual search.
      *
-     * @param ni contains the information of the network.
-     *
+     * @param cellInfo contains the information of the network.
      * @return Long Name if not null/empty, otherwise Short Name if not null/empty,
      * else MCCMNC string.
      */
-    private String getNetworkTitle(OperatorInfo ni) {
+    private String getNetworkTitle(CellInfo cellInfo) {
+        OperatorInfo ni = getOperatorInfoFromCellInfo(cellInfo);
+
         if (!TextUtils.isEmpty(ni.getOperatorAlphaLong())) {
             return ni.getOperatorAlphaLong();
         } else if (!TextUtils.isEmpty(ni.getOperatorAlphaShort())) {
@@ -354,74 +509,79 @@
         }
     }
 
-    private void clearList() {
-        if (mOperatorInfoList != null) {
-            mOperatorInfoList.clear();
-        }
-    }
-
-    private void dismissProgressBar() {
-        if (mProgressDialog != null && mProgressDialog.isShowing()) {
-            mProgressDialog.dismiss();
-        }
-    }
-
-    private void showProgressBar(int id) {
-        if (mProgressDialog == null) {
-            mProgressDialog = new ProgressDialog(getContext());
+    /**
+     * Wrap a cell info into an operator info.
+     */
+    private OperatorInfo getOperatorInfoFromCellInfo(CellInfo cellInfo) {
+        OperatorInfo oi;
+        if (cellInfo instanceof CellInfoLte) {
+            CellInfoLte lte = (CellInfoLte) cellInfo;
+            oi = new OperatorInfo(
+                    (String) lte.getCellIdentity().getOperatorAlphaLong(),
+                    (String) lte.getCellIdentity().getOperatorAlphaShort(),
+                    lte.getCellIdentity().getMobileNetworkOperator());
+        } else if (cellInfo instanceof CellInfoWcdma) {
+            CellInfoWcdma wcdma = (CellInfoWcdma) cellInfo;
+            oi = new OperatorInfo(
+                    (String) wcdma.getCellIdentity().getOperatorAlphaLong(),
+                    (String) wcdma.getCellIdentity().getOperatorAlphaShort(),
+                    wcdma.getCellIdentity().getMobileNetworkOperator());
+        } else if (cellInfo instanceof CellInfoGsm) {
+            CellInfoGsm gsm = (CellInfoGsm) cellInfo;
+            oi = new OperatorInfo(
+                    (String) gsm.getCellIdentity().getOperatorAlphaLong(),
+                    (String) gsm.getCellIdentity().getOperatorAlphaShort(),
+                    gsm.getCellIdentity().getMobileNetworkOperator());
+        } else if (cellInfo instanceof CellInfoCdma) {
+            CellInfoCdma cdma = (CellInfoCdma) cellInfo;
+            oi = new OperatorInfo(
+                    (String) cdma.getCellIdentity().getOperatorAlphaLong(),
+                    (String) cdma.getCellIdentity().getOperatorAlphaShort(),
+                    "" /* operator numeric */);
         } else {
-            // Dismiss progress bar if it's showing now.
-            dismissProgressBar();
+            oi = new OperatorInfo("", "", "");
         }
-
-        if ((id == DIALOG_NETWORK_SELECTION) || (id == DIALOG_NETWORK_LIST_LOAD)) {
-            switch (id) {
-                case DIALOG_NETWORK_SELECTION:
-                    final String networkSelectMsg = getContext().getResources()
-                            .getString(R.string.register_on_network,
-                                    getNetworkTitle(mOperatorInfo));
-                    mProgressDialog.setMessage(networkSelectMsg);
-                    mProgressDialog.setCanceledOnTouchOutside(false);
-                    mProgressDialog.setCancelable(false);
-                    mProgressDialog.setIndeterminate(true);
-                    break;
-                case DIALOG_NETWORK_LIST_LOAD:
-                    mProgressDialog.setMessage(
-                            getContext().getResources().getString(R.string.load_networks_progress));
-                    mProgressDialog.setCanceledOnTouchOutside(false);
-                    mProgressDialog.setCancelable(true);
-                    mProgressDialog.setIndeterminate(false);
-                    mProgressDialog.setOnCancelListener(this);
-                    break;
-                default:
-            }
-            mProgressDialog.show();
-        }
+        return oi;
     }
 
+
     /**
-     * Implemented to support onPreferenceChangeListener to look for preference
-     * changes specifically on this button.
-     *
-     * @param preference is the preference to be changed, should be network select button.
-     * @param newValue should be the value of the selection as index of operators.
+     * Check if the CellInfo is valid to display. If a CellInfo has signal strength but does
+     * not have operator info, it is invalid to display.
      */
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        int operatorIndex = findIndexOfValue((String) newValue);
-        mOperatorInfo = mOperatorInfoList.get(operatorIndex);
-
-        if (DBG) logd("selected network: " + getNetworkTitle(mOperatorInfo));
-
-        Message msg = mHandler.obtainMessage(EVENT_NETWORK_SELECTION_DONE);
-        Phone phone = PhoneFactory.getPhone(mPhoneId);
-        if (phone != null) {
-            phone.selectNetworkManually(mOperatorInfo, true, msg);
-            displayNetworkSelectionInProgress();
+    private boolean isInvalidCellInfo(CellInfo cellInfo) {
+        if (DBG) logd("Check isInvalidCellInfo: " + cellInfo.toString());
+        CharSequence al = null;
+        CharSequence as = null;
+        boolean hasSignalStrength = false;
+        if (cellInfo instanceof CellInfoLte) {
+            CellInfoLte lte = (CellInfoLte) cellInfo;
+            al = lte.getCellIdentity().getOperatorAlphaLong();
+            as = lte.getCellIdentity().getOperatorAlphaShort();
+            hasSignalStrength = !lte.getCellSignalStrength().equals(new CellSignalStrengthLte());
+        } else if (cellInfo instanceof CellInfoWcdma) {
+            CellInfoWcdma wcdma = (CellInfoWcdma) cellInfo;
+            al = wcdma.getCellIdentity().getOperatorAlphaLong();
+            as = wcdma.getCellIdentity().getOperatorAlphaShort();
+            hasSignalStrength = !wcdma.getCellSignalStrength().equals(
+                    new CellSignalStrengthWcdma());
+        } else if (cellInfo instanceof CellInfoGsm) {
+            CellInfoGsm gsm = (CellInfoGsm) cellInfo;
+            al = gsm.getCellIdentity().getOperatorAlphaLong();
+            as = gsm.getCellIdentity().getOperatorAlphaShort();
+            hasSignalStrength = !gsm.getCellSignalStrength().equals(new CellSignalStrengthGsm());
+        } else if (cellInfo instanceof CellInfoCdma) {
+            CellInfoCdma cdma = (CellInfoCdma) cellInfo;
+            al = cdma.getCellIdentity().getOperatorAlphaLong();
+            as = cdma.getCellIdentity().getOperatorAlphaShort();
+            hasSignalStrength = !cdma.getCellSignalStrength().equals(new CellSignalStrengthCdma());
         } else {
-            loge("Error selecting network. phone is null.");
+            return true;
         }
-
-        return true;
+        if (TextUtils.isEmpty(al) && TextUtils.isEmpty(as) && hasSignalStrength) {
+            return true;
+        }
+        return false;
     }
 
     @Override
@@ -435,7 +595,7 @@
         final SavedState myState = new SavedState(superState);
         myState.mDialogListEntries = getEntries();
         myState.mDialogListEntryValues = getEntryValues();
-        myState.mOperatorInfoList = mOperatorInfoList;
+        myState.mCellInfoList = mCellInfoList;
         return myState;
     }
 
@@ -455,8 +615,8 @@
         if (getEntryValues() == null && myState.mDialogListEntryValues != null) {
             setEntryValues(myState.mDialogListEntryValues);
         }
-        if (mOperatorInfoList == null && myState.mOperatorInfoList != null) {
-            mOperatorInfoList = myState.mOperatorInfoList;
+        if (mCellInfoList == null && myState.mCellInfoList != null) {
+            mCellInfoList = myState.mCellInfoList;
         }
 
         super.onRestoreInstanceState(myState.getSuperState());
@@ -471,14 +631,14 @@
     private static class SavedState extends BaseSavedState {
         CharSequence[] mDialogListEntries;
         CharSequence[] mDialogListEntryValues;
-        List<OperatorInfo> mOperatorInfoList;
+        List<CellInfo> mCellInfoList;
 
         SavedState(Parcel source) {
             super(source);
             final ClassLoader boot = Object.class.getClassLoader();
             mDialogListEntries = source.readCharSequenceArray();
             mDialogListEntryValues = source.readCharSequenceArray();
-            mOperatorInfoList = source.readParcelableList(mOperatorInfoList, boot);
+            mCellInfoList = source.readParcelableList(mCellInfoList, boot);
         }
 
         @Override
@@ -486,7 +646,7 @@
             super.writeToParcel(dest, flags);
             dest.writeCharSequenceArray(mDialogListEntries);
             dest.writeCharSequenceArray(mDialogListEntryValues);
-            dest.writeParcelableList(mOperatorInfoList, flags);
+            dest.writeParcelableList(mCellInfoList, flags);
         }
 
         SavedState(Parcelable superState) {
@@ -505,6 +665,21 @@
                 };
     }
 
+    private void sendMetricsEvent(String network) {
+        final LogMaker logMaker =
+                new LogMaker(MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK)
+                        .setType(MetricsEvent.TYPE_ACTION);
+
+        if (network != null) {
+            // Since operator list is loaded dynamically from modem, we cannot know which network
+            // user chooses if we only record integer index of newValue. So a new tag and a string
+            // value (network) is added in this MetricsEvent.
+            logMaker.addTaggedData(MetricsEvent.FIELD_MOBILE_NETWORK, network);
+        }
+
+        MetricsLogger.action(logMaker);
+    }
+
     private void logd(String msg) {
         Log.d(LOG_TAG, "[NetworksList] " + msg);
     }
@@ -512,4 +687,4 @@
     private void loge(String msg) {
         Log.e(LOG_TAG, "[NetworksList] " + msg);
     }
-}
+}
\ No newline at end of file
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index 97daa34..d36c761 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -45,7 +45,6 @@
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
-import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -162,7 +161,7 @@
     /* package */ void refreshMwi(int subId) {
         // In a single-sim device, subId can be -1 which means "no sub id".  In this case we will
         // reference the single subid stored in the mMwiVisible map.
-        if (subId == SubscriptionInfoHelper.NO_SUB_ID) {
+        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
             if (mMwiVisible.keySet().size() == 1) {
                 Set<Integer> keySet = mMwiVisible.keySet();
                 Iterator<Integer> keyIt = keySet.iterator();
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index c750d27..8127eae 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -39,7 +39,7 @@
 import android.os.Message;
 import android.os.Messenger;
 import android.os.PersistableBundle;
-import android.os.Process;
+import android.os.RemoteException;
 import android.os.ResultReceiver;
 import android.os.ServiceManager;
 import android.os.UserHandle;
@@ -67,6 +67,7 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyHistogram;
 import android.telephony.TelephonyManager;
+import android.telephony.UiccSlotInfo;
 import android.telephony.UssdResponse;
 import android.telephony.VisualVoicemailSmsFilterSettings;
 import android.text.TextUtils;
@@ -78,6 +79,7 @@
 import com.android.ims.ImsManager;
 import com.android.ims.internal.IImsMMTelFeature;
 import com.android.ims.internal.IImsRcsFeature;
+import com.android.ims.internal.IImsRegistration;
 import com.android.ims.internal.IImsServiceFeatureCallback;
 import com.android.internal.telephony.CallManager;
 import com.android.internal.telephony.CallStateException;
@@ -105,6 +107,7 @@
 import com.android.internal.telephony.uicc.UiccCard;
 import com.android.internal.telephony.uicc.UiccCardApplication;
 import com.android.internal.telephony.uicc.UiccController;
+import com.android.internal.telephony.uicc.UiccSlot;
 import com.android.internal.telephony.util.VoicemailNotificationSettingsUtil;
 import com.android.internal.util.HexDump;
 import com.android.phone.vvm.PhoneAccountHandleConverter;
@@ -177,6 +180,8 @@
     private static final int CMD_HANDLE_USSD_REQUEST = 47;
     private static final int CMD_GET_FORBIDDEN_PLMNS = 48;
     private static final int EVENT_GET_FORBIDDEN_PLMNS_DONE = 49;
+    private static final int CMD_SWITCH_SLOTS = 50;
+    private static final int EVENT_SWITCH_SLOTS_DONE = 51;
 
     /** The singleton instance. */
     private static PhoneInterfaceManager sInstance;
@@ -939,6 +944,22 @@
                               onCompleted);
                     break;
 
+                case CMD_SWITCH_SLOTS:
+                    request = (MainThreadRequest) msg.obj;
+                    int[] physicalSlots = (int[]) request.argument;
+                    onCompleted = obtainMessage(EVENT_SWITCH_SLOTS_DONE, request);
+                    UiccController.getInstance().switchSlots(physicalSlots, onCompleted);
+                    break;
+
+                case EVENT_SWITCH_SLOTS_DONE:
+                    ar = (AsyncResult) msg.obj;
+                    request = (MainThreadRequest) ar.userObj;
+                    request.result = (ar.exception == null);
+                    synchronized (request) {
+                        request.notifyAll();
+                    }
+                    break;
+
                 default:
                     Log.w(LOG_TAG, "MainThreadHandler: unexpected message code: " + msg.what);
                     break;
@@ -1540,7 +1561,7 @@
         int subId = mSubscriptionController.getDefaultDataSubId();
         final Phone phone = getPhone(subId);
         if (phone != null) {
-            phone.setDataEnabled(true);
+            phone.setUserDataEnabled(true);
             return true;
         } else {
             return false;
@@ -1554,7 +1575,7 @@
         int subId = mSubscriptionController.getDefaultDataSubId();
         final Phone phone = getPhone(subId);
         if (phone != null) {
-            phone.setDataEnabled(false);
+            phone.setUserDataEnabled(false);
             return true;
         } else {
             return false;
@@ -1769,6 +1790,18 @@
       return phone == null ? null : phone.getDeviceSvn();
     }
 
+    @Override
+    public int getSubscriptionCarrierId(int subId) {
+        final Phone phone = getPhone(subId);
+        return phone == null ? TelephonyManager.UNKNOWN_CARRIER_ID : phone.getCarrierId();
+    }
+
+    @Override
+    public String getSubscriptionCarrierName(int subId) {
+        final Phone phone = getPhone(subId);
+        return phone == null ? null : phone.getCarrierName();
+    }
+
     //
     // Internal helper methods.
     //
@@ -2596,6 +2629,15 @@
         return PhoneFactory.getImsResolver().getRcsFeatureAndListen(slotId, callback);
     }
 
+    /**
+     * Returns the {@link IImsRegistration} structure associated with the slotId and feature
+     * specified.
+     */
+    public IImsRegistration getImsRegistration(int slotId, int feature) throws RemoteException {
+        enforceModifyPermission();
+        return PhoneFactory.getImsResolver().getImsRegistration(slotId, feature);
+    }
+
     public void setImsRegistrationState(boolean registered) {
         enforceModifyPermission();
         mPhone.setImsRegistrationState(registered);
@@ -2616,9 +2658,13 @@
      * Set the network selection mode to manual with the selected carrier.
      */
     @Override
-    public boolean setNetworkSelectionModeManual(int subId, OperatorInfo operator,
+    public boolean setNetworkSelectionModeManual(int subId, String operatorNumeric,
             boolean persistSelection) {
         enforceModifyPermissionOrCarrierPrivilege(subId);
+        OperatorInfo operator = new OperatorInfo(
+                /* operatorAlphaLong */ "",
+                /* operatorAlphaShort */ "",
+                operatorNumeric);
         if (DBG) log("setNetworkSelectionModeManual: subId:" + subId + " operator:" + operator);
         ManualNetworkSelectionArgument arg = new ManualNetworkSelectionArgument(operator,
                 persistSelection);
@@ -2745,28 +2791,46 @@
      * @param enable {@code true} turn turn data on, else {@code false}
      */
     @Override
-    public void setDataEnabled(int subId, boolean enable) {
+    public void setUserDataEnabled(int subId, boolean enable) {
         enforceModifyPermissionOrCarrierPrivilege(subId);
         int phoneId = mSubscriptionController.getPhoneId(subId);
-        if (DBG) log("getDataEnabled: subId=" + subId + " phoneId=" + phoneId);
+        if (DBG) log("setUserDataEnabled: subId=" + subId + " phoneId=" + phoneId);
         Phone phone = PhoneFactory.getPhone(phoneId);
         if (phone != null) {
-            if (DBG) log("setDataEnabled: subId=" + subId + " enable=" + enable);
-            phone.setDataEnabled(enable);
+            if (DBG) log("setUserDataEnabled: subId=" + subId + " enable=" + enable);
+            phone.setUserDataEnabled(enable);
         } else {
-            loge("setDataEnabled: no phone for subId=" + subId);
+            loge("setUserDataEnabled: no phone for subId=" + subId);
         }
     }
 
     /**
-     * Get whether mobile data is enabled.
+     * Get the user enabled state of Mobile Data.
+     *
+     * TODO: remove and use isUserDataEnabled.
+     * This can't be removed now because some vendor codes
+     * calls through ITelephony directly while they should
+     * use TelephonyManager.
+     *
+     * @return true on enabled
+     */
+    @Override
+    public boolean getDataEnabled(int subId) {
+        return isUserDataEnabled(subId);
+    }
+
+    /**
+     * Get whether mobile data is enabled per user setting.
+     *
+     * There are other factors deciding whether mobile data is actually enabled, but they are
+     * not considered here. See {@link #isDataEnabled(int)} for more details.
      *
      * Accepts either ACCESS_NETWORK_STATE, MODIFY_PHONE_STATE or carrier privileges.
      *
      * @return {@code true} if data is enabled else {@code false}
      */
     @Override
-    public boolean getDataEnabled(int subId) {
+    public boolean isUserDataEnabled(int subId) {
         try {
             mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
                     null);
@@ -2774,14 +2838,45 @@
             enforceModifyPermissionOrCarrierPrivilege(subId);
         }
         int phoneId = mSubscriptionController.getPhoneId(subId);
-        if (DBG) log("getDataEnabled: subId=" + subId + " phoneId=" + phoneId);
+        if (DBG) log("isUserDataEnabled: subId=" + subId + " phoneId=" + phoneId);
         Phone phone = PhoneFactory.getPhone(phoneId);
         if (phone != null) {
-            boolean retVal = phone.getDataEnabled();
-            if (DBG) log("getDataEnabled: subId=" + subId + " retVal=" + retVal);
+            boolean retVal = phone.isUserDataEnabled();
+            if (DBG) log("isUserDataEnabled: subId=" + subId + " retVal=" + retVal);
             return retVal;
         } else {
-            if (DBG) loge("getDataEnabled: no phone subId=" + subId + " retVal=false");
+            if (DBG) loge("isUserDataEnabled: no phone subId=" + subId + " retVal=false");
+            return false;
+        }
+    }
+
+    /**
+     * Get whether mobile data is enabled.
+     *
+     * Comparable to {@link #isUserDataEnabled(int)}, this considers all factors deciding
+     * whether mobile data is actually enabled.
+     *
+     * Accepts either ACCESS_NETWORK_STATE, MODIFY_PHONE_STATE or carrier privileges.
+     *
+     * @return {@code true} if data is enabled else {@code false}
+     */
+    @Override
+    public boolean isDataEnabled(int subId) {
+        try {
+            mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
+                    null);
+        } catch (Exception e) {
+            enforceModifyPermissionOrCarrierPrivilege(subId);
+        }
+        int phoneId = mSubscriptionController.getPhoneId(subId);
+        if (DBG) log("isDataEnabled: subId=" + subId + " phoneId=" + phoneId);
+        Phone phone = PhoneFactory.getPhone(phoneId);
+        if (phone != null) {
+            boolean retVal = phone.isDataEnabled();
+            if (DBG) log("isDataEnabled: subId=" + subId + " retVal=" + retVal);
+            return retVal;
+        } else {
+            if (DBG) loge("isDataEnabled: no phone subId=" + subId + " retVal=false");
             return false;
         }
     }
@@ -3093,7 +3188,7 @@
     @Override
     public void enableVideoCalling(boolean enable) {
         enforceModifyPermission();
-        ImsManager.setVtSetting(mPhone.getContext(), enable);
+        ImsManager.getInstance(mPhone.getContext(), mPhone.getPhoneId()).setVtSetting(enable);
     }
 
     @Override
@@ -3106,9 +3201,10 @@
         // enabled video calling, if IMS is disabled we aren't able to support video calling.
         // In the long run, we may instead need to check if there exists a connection service
         // which can support video calling.
-        return ImsManager.isVtEnabledByPlatform(mPhone.getContext())
-                && ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())
-                && ImsManager.isVtEnabledByUser(mPhone.getContext());
+        ImsManager imsManager = ImsManager.getInstance(mPhone.getContext(), mPhone.getPhoneId());
+        return imsManager.isVtEnabledByPlatform()
+                && imsManager.isEnhanced4gLteModeSettingEnabledByUser()
+                && imsManager.isVtEnabledByUser();
     }
 
     @Override
@@ -3285,7 +3381,7 @@
             if (SubscriptionManager.isUsableSubIdValue(subId) && !mUserManager.hasUserRestriction(
                     UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
                 // Enable data
-                setDataEnabled(subId, true);
+                setUserDataEnabled(subId, true);
                 // Set network selection mode to automatic
                 setNetworkSelectionModeAutomatic(subId);
                 // Set preferred mobile network type to the best available
@@ -3872,4 +3968,46 @@
 
         return p.getSignalStrength();
     }
+
+    @Override
+    public UiccSlotInfo[] getUiccSlotsInfo() {
+        enforceReadPrivilegedPermission();
+
+        UiccSlot[] slots = UiccController.getInstance().getUiccSlots();
+        if (slots == null) return null;
+        UiccSlotInfo[] infos = new UiccSlotInfo[slots.length];
+        for (int i = 0; i < slots.length; i++) {
+            UiccSlot slot = slots[i];
+
+            String cardId = UiccController.getInstance().getUiccCard(i).getCardId();
+
+            int cardState = 0;
+            switch (slot.getCardState()) {
+                case CARDSTATE_ABSENT:
+                    cardState = UiccSlotInfo.CARD_STATE_INFO_ABSENT;
+                    break;
+                case CARDSTATE_PRESENT:
+                    cardState = UiccSlotInfo.CARD_STATE_INFO_PRESENT;
+                    break;
+                case CARDSTATE_ERROR:
+                    cardState = UiccSlotInfo.CARD_STATE_INFO_ERROR;
+                    break;
+                case CARDSTATE_RESTRICTED:
+                    cardState = UiccSlotInfo.CARD_STATE_INFO_RESTRICTED;
+                    break;
+                default:
+                    break;
+
+            }
+
+            infos[i] = new UiccSlotInfo(slot.isActive(), slot.isEuicc(), cardId, cardState);
+        }
+        return infos;
+    }
+
+    @Override
+    public boolean switchSlots(int[] physicalSlots) {
+        enforceModifyPermission();
+        return (Boolean) sendRequest(CMD_SWITCH_SLOTS, physicalSlots);
+    }
 }
diff --git a/src/com/android/phone/PhoneSearchIndexablesProvider.java b/src/com/android/phone/PhoneSearchIndexablesProvider.java
index ed3c7df..9c5f354 100644
--- a/src/com/android/phone/PhoneSearchIndexablesProvider.java
+++ b/src/com/android/phone/PhoneSearchIndexablesProvider.java
@@ -36,7 +36,6 @@
 import android.provider.SearchIndexablesContract.RawData;
 import android.provider.SearchIndexablesProvider;
 import android.support.annotation.VisibleForTesting;
-import android.telephony.TelephonyManager;
 import android.telephony.euicc.EuiccManager;
 
 public class PhoneSearchIndexablesProvider extends SearchIndexablesProvider {
@@ -103,7 +102,8 @@
             final String[] values = new String[]{"preferred_network_mode_key", "button_roaming_key",
                     "cdma_lte_data_service_key", "enabled_networks_key", "enhanced_4g_lte",
                     "button_apn_key", "button_network_select_key", "carrier_settings_key",
-                    "cdma_system_select_key", "esim_list_profile"};
+                    "cdma_system_select_key", "esim_list_profile", "mobile_data_enable",
+                    "data_usage_summary", "wifi_calling_key", "video_calling_key"};
             for (String nik : values) {
                 cursor.addRow(createNonIndexableRow(nik));
             }
@@ -116,6 +116,7 @@
             }
         }
         cursor.addRow(createNonIndexableRow("carrier_settings_euicc_key" /* key */));
+        cursor.addRow(createNonIndexableRow("advanced_options" /* key */));
         return cursor;
     }
 
@@ -124,10 +125,7 @@
     }
 
     @VisibleForTesting boolean isEnhanced4gLteHidden() {
-        TelephonyManager telephonyManager =
-                (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
-        return MobileNetworkSettings
-                .hideEnhanced4gLteSettings(getContext(), telephonyManager.getCarrierConfig());
+        return MobileNetworkSettings.hideEnhanced4gLteSettings(getContext());
     }
 
     private Object[] createNonIndexableRow(String key) {
diff --git a/src/com/android/phone/SubscriptionInfoHelper.java b/src/com/android/phone/SubscriptionInfoHelper.java
index 9f0ebd0..7c373e0 100644
--- a/src/com/android/phone/SubscriptionInfoHelper.java
+++ b/src/com/android/phone/SubscriptionInfoHelper.java
@@ -20,12 +20,12 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
+import android.telecom.PhoneAccountHandle;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
-import com.android.phone.PhoneGlobals;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
 
@@ -37,7 +37,6 @@
  * helping extract this info and perform common operations using this info.
  */
 public class SubscriptionInfoHelper {
-    public static final int NO_SUB_ID = -1;
 
     // Extra on intent containing the id of a subscription.
     public static final String SUB_ID_EXTRA =
@@ -46,17 +45,24 @@
     private static final String SUB_LABEL_EXTRA =
             "com.android.phone.settings.SubscriptionInfoHelper.SubscriptionLabel";
 
-    private static Context mContext;
+    private Context mContext;
 
-    private static int mSubId = NO_SUB_ID;
-    private static String mSubLabel;
+    private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+    private String mSubLabel;
 
     /**
      * Instantiates the helper, by extracting the subscription id and label from the intent.
      */
     public SubscriptionInfoHelper(Context context, Intent intent) {
         mContext = context;
-        mSubId = intent.getIntExtra(SUB_ID_EXTRA, NO_SUB_ID);
+        PhoneAccountHandle phoneAccountHandle =
+                intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+        if (phoneAccountHandle != null) {
+            mSubId = PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccountHandle);
+        }
+        if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            mSubId = intent.getIntExtra(SUB_ID_EXTRA, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        }
         mSubLabel = intent.getStringExtra(SUB_LABEL_EXTRA);
     }
 
@@ -118,7 +124,7 @@
     }
 
     public boolean hasSubId() {
-        return mSubId != NO_SUB_ID;
+        return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     }
 
     public int getSubId() {
diff --git a/src/com/android/services/telephony/DisconnectCauseUtil.java b/src/com/android/services/telephony/DisconnectCauseUtil.java
index 01ccf79..361e5dc 100644
--- a/src/com/android/services/telephony/DisconnectCauseUtil.java
+++ b/src/com/android/services/telephony/DisconnectCauseUtil.java
@@ -20,6 +20,7 @@
 import android.media.ToneGenerator;
 import android.telecom.DisconnectCause;
 
+import com.android.internal.telephony.CallFailCause;
 import com.android.phone.ImsUtil;
 import com.android.phone.PhoneGlobals;
 import com.android.phone.common.R;
@@ -34,7 +35,8 @@
     * @param telephonyDisconnectCause The code for the reason for the disconnect.
     */
     public static DisconnectCause toTelecomDisconnectCause(int telephonyDisconnectCause) {
-        return toTelecomDisconnectCause(telephonyDisconnectCause, null /* reason */);
+        return toTelecomDisconnectCause(telephonyDisconnectCause,
+                CallFailCause.NOT_VALID, null /* reason */);
     }
 
    /**
@@ -47,10 +49,25 @@
     */
     public static DisconnectCause toTelecomDisconnectCause(
             int telephonyDisconnectCause, String reason) {
+        return toTelecomDisconnectCause(telephonyDisconnectCause, CallFailCause.NOT_VALID, reason);
+    }
+
+   /**
+    * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more
+    * generic {@link android.telecom.DisconnectCause}.object, possibly populated with a localized
+    * message and tone.
+    *
+    * @param telephonyDisconnectCause The code for the reason for the disconnect.
+    * @param telephonyPerciseDisconnectCause The code for the percise reason for the disconnect.
+    * @param reason Description of the reason for the disconnect, not intended for the user to see..
+    */
+    public static DisconnectCause toTelecomDisconnectCause(
+            int telephonyDisconnectCause, int telephonyPerciseDisconnectCause, String reason) {
         Context context = PhoneGlobals.getInstance();
         return new DisconnectCause(
                 toTelecomDisconnectCauseCode(telephonyDisconnectCause),
-                toTelecomDisconnectCauseLabel(context, telephonyDisconnectCause),
+                toTelecomDisconnectCauseLabel(context, telephonyDisconnectCause,
+                        telephonyPerciseDisconnectCause),
                 toTelecomDisconnectCauseDescription(context, telephonyDisconnectCause),
                 toTelecomDisconnectReason(context,telephonyDisconnectCause, reason),
                 toTelecomDisconnectCauseTone(telephonyDisconnectCause));
@@ -168,8 +185,23 @@
      * Returns a label for to the disconnect cause to be shown to the user.
      */
     private static CharSequence toTelecomDisconnectCauseLabel(
+            Context context, int telephonyDisconnectCause, int telephonyPerciseDisconnectCause) {
+        CharSequence label;
+        if (telephonyPerciseDisconnectCause != CallFailCause.NOT_VALID) {
+            label = getLabelFromPreciseDisconnectCause(context, telephonyPerciseDisconnectCause,
+                    telephonyDisconnectCause);
+        } else {
+            label = getLabelFromDisconnectCause(context, telephonyDisconnectCause);
+        }
+        return label;
+    }
+
+    /**
+     * Returns a label for to the generic disconnect cause to be shown to the user.
+     */
+    private static CharSequence getLabelFromDisconnectCause(
             Context context, int telephonyDisconnectCause) {
-        if (context == null ) {
+        if (context == null) {
             return "";
         }
 
@@ -264,6 +296,190 @@
     }
 
     /**
+     * Returns a label for to the precise disconnect cause to be shown to the user.
+     */
+    private static CharSequence getLabelFromPreciseDisconnectCause(
+            Context context, int telephonyPreciseDisconnectCause, int telephonyDisconnectCause) {
+        if (context == null) {
+            return "";
+        }
+
+        Integer resourceId = null;
+        switch (telephonyPreciseDisconnectCause) {
+            case CallFailCause.UNOBTAINABLE_NUMBER:
+                resourceId = R.string.clh_callFailed_unassigned_number_txt;
+                break;
+            case CallFailCause.NO_ROUTE_TO_DEST:
+                resourceId = R.string.clh_callFailed_no_route_to_destination_txt;
+                break;
+            case CallFailCause.CHANNEL_UNACCEPTABLE:
+                resourceId = R.string.clh_callFailed_channel_unacceptable_txt;
+                break;
+            case CallFailCause.OPERATOR_DETERMINED_BARRING:
+                resourceId = R.string.clh_callFailed_operator_determined_barring_txt;
+                break;
+            case CallFailCause.NORMAL_CLEARING:
+                resourceId = R.string.clh_callFailed_normal_call_clearing_txt;
+                break;
+            case CallFailCause.USER_BUSY:
+                resourceId = R.string.clh_callFailed_user_busy_txt;
+                break;
+            case CallFailCause.NO_USER_RESPONDING:
+                resourceId = R.string.clh_callFailed_no_user_responding_txt;
+                break;
+            case CallFailCause.USER_ALERTING_NO_ANSWER:
+                resourceId = R.string.clh_callFailed_user_alerting_txt;
+                break;
+            case CallFailCause.CALL_REJECTED:
+                resourceId = R.string.clh_callFailed_call_rejected_txt;
+                break;
+            case CallFailCause.NUMBER_CHANGED:
+                resourceId = R.string.clh_callFailed_number_changed_txt;
+                break;
+            case CallFailCause.PRE_EMPTION:
+                resourceId = R.string.clh_callFailed_pre_emption_txt;
+                break;
+            case CallFailCause.NON_SELECTED_USER_CLEARING:
+                resourceId = R.string.clh_callFailed_non_selected_user_clearing_txt;
+                break;
+            case CallFailCause.DESTINATION_OUT_OF_ORDER:
+                resourceId = R.string.clh_callFailed_destination_out_of_order_txt;
+                break;
+            case CallFailCause.INVALID_NUMBER_FORMAT:
+                resourceId = R.string.clh_callFailed_invalid_number_format_txt;
+                break;
+            case CallFailCause.FACILITY_REJECTED:
+                resourceId = R.string.clh_callFailed_facility_rejected_txt;
+                break;
+            case CallFailCause.STATUS_ENQUIRY:
+                resourceId = R.string.clh_callFailed_response_to_STATUS_ENQUIRY_txt;
+                break;
+            case CallFailCause.NORMAL_UNSPECIFIED:
+                resourceId = R.string.clh_callFailed_normal_unspecified_txt;
+                break;
+            case CallFailCause.NO_CIRCUIT_AVAIL:
+                resourceId = R.string.clh_callFailed_no_circuit_available_txt;
+                break;
+            case CallFailCause.NETWORK_OUT_OF_ORDER:
+                resourceId = R.string.clh_callFailed_network_out_of_order_txt;
+                break;
+            case CallFailCause.TEMPORARY_FAILURE:
+                resourceId = R.string.clh_callFailed_temporary_failure_txt;
+                break;
+            case CallFailCause.SWITCHING_CONGESTION:
+                resourceId = R.string.clh_callFailed_switching_equipment_congestion_txt;
+                break;
+            case CallFailCause.ACCESS_INFORMATION_DISCARDED:
+                resourceId = R.string.clh_callFailed_access_information_discarded_txt;
+                break;
+            case CallFailCause.CHANNEL_NOT_AVAIL:
+                resourceId = R.string.clh_callFailed_requested_circuit_txt;
+                break;
+            case CallFailCause.RESOURCES_UNAVAILABLE_UNSPECIFIED:
+                resourceId = R.string.clh_callFailed_resources_unavailable_unspecified_txt;
+                break;
+            case CallFailCause.QOS_NOT_AVAIL:
+                resourceId = R.string.clh_callFailed_quality_of_service_unavailable_txt;
+                break;
+            case CallFailCause.REQUESTED_FACILITY_NOT_SUBSCRIBED:
+                resourceId = R.string.clh_callFailed_requested_facility_not_subscribed_txt;
+                break;
+            case CallFailCause.INCOMING_CALL_BARRED_WITHIN_CUG:
+                resourceId = R.string.clh_callFailed_incoming_calls_barred_within_the_CUG_txt;
+                break;
+            case CallFailCause.BEARER_CAPABILITY_NOT_AUTHORISED:
+                resourceId = R.string.clh_callFailed_bearer_capability_not_authorized_txt;
+                break;
+            case CallFailCause.BEARER_NOT_AVAIL:
+                resourceId = R.string.clh_callFailed_bearer_capability_not_presently_available_txt;
+                break;
+            case CallFailCause.SERVICE_OR_OPTION_NOT_AVAILABLE:
+                resourceId =
+                        R.string.clh_callFailed_service_or_option_not_available_unspecified_txt;
+                break;
+            case CallFailCause.BEARER_SERVICE_NOT_IMPLEMENTED:
+                resourceId = R.string.clh_callFailed_bearer_service_not_implemented_txt;
+                break;
+            case CallFailCause.ACM_LIMIT_EXCEEDED:
+                resourceId = R.string.clh_callFailed_ACM_equal_to_or_greater_than_ACMmax_txt;
+                break;
+            case CallFailCause.REQUESTED_FACILITY_NOT_IMPLEMENTED:
+                resourceId = R.string.clh_callFailed_requested_facility_not_implemented_txt;
+                break;
+            case CallFailCause.ONLY_RESTRICTED_DIGITAL_INFO_BC_AVAILABLE:
+                resourceId = R.string
+                        .clh_callFailed_only_restricted_digital_information_bearer_capability_is_available_txt;
+                break;
+            case CallFailCause.SERVICE_OR_OPTION_NOT_IMPLEMENTED:
+                resourceId =
+                        R.string.clh_callFailed_service_or_option_not_implemented_unspecified_txt;
+                break;
+            case CallFailCause.INVALID_TRANSACTION_ID_VALUE:
+                resourceId = R.string.clh_callFailed_invalid_transaction_identifier_value_txt;
+                break;
+            case CallFailCause.USER_NOT_MEMBER_OF_CUG:
+                resourceId = R.string.clh_callFailed_user_not_member_of_CUG_txt;
+                break;
+            case CallFailCause.INCOMPATIBLE_DESTINATION:
+                resourceId = R.string.clh_callFailed_incompatible_destination_txt;
+                break;
+            case CallFailCause.INVALID_TRANSIT_NETWORK_SELECTION:
+                resourceId = R.string.clh_callFailed_invalid_transit_network_selection_txt;
+                break;
+            case CallFailCause.SEMANTICALLY_INCORRECT_MESSAGE:
+                resourceId = R.string.clh_callFailed_semantically_incorrect_message_txt;
+                break;
+            case CallFailCause.INVALID_MANDATORY_INFORMATION:
+                resourceId = R.string.clh_callFailed_invalid_mandatory_information_txt;
+                break;
+            case CallFailCause.MESSAGE_TYPE_NON_EXISTENT:
+                resourceId =
+                        R.string.clh_callFailed_message_type_non_existent_or_not_implemented_txt;
+                break;
+            case CallFailCause.MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROT_STATE:
+                resourceId = R.string
+                        .clh_callFailed_message_type_not_compatible_with_protocol_state_txt;
+                break;
+            case CallFailCause.IE_NON_EXISTENT_OR_NOT_IMPLEMENTED:
+                resourceId = R.string
+                        .clh_callFailed_information_element_non_existent_or_not_implemented_txt;
+                break;
+            case CallFailCause.CONDITIONAL_IE_ERROR:
+                resourceId = R.string.clh_callFailed_conditional_IE_error_txt;
+                break;
+            case CallFailCause.MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE:
+                resourceId = R.string.clh_callFailed_message_not_compatible_with_protocol_state_txt;
+                break;
+            case CallFailCause.RECOVERY_ON_TIMER_EXPIRY:
+                resourceId = R.string.clh_callFailed_recovery_on_timer_expiry_txt;
+                break;
+            case CallFailCause.PROTOCOL_ERROR_UNSPECIFIED:
+                resourceId = R.string.clh_callFailed_protocol_Error_unspecified_txt;
+                break;
+            case CallFailCause.INTERWORKING_UNSPECIFIED:
+                resourceId = R.string.clh_callFailed_interworking_unspecified_txt;
+                break;
+            default:
+                switch (telephonyDisconnectCause) {
+                    case android.telephony.DisconnectCause.POWER_OFF:
+                        resourceId = R.string.clh_callFailed_powerOff_txt;
+                        break;
+                    case android.telephony.DisconnectCause.ICC_ERROR:
+                        resourceId = R.string.clh_callFailed_simError_txt;
+                        break;
+                    case android.telephony.DisconnectCause.OUT_OF_SERVICE:
+                        resourceId = R.string.clh_incall_error_out_of_service_txt;
+                        break;
+                    default:
+                        resourceId = R.string.clh_card_title_call_ended_txt;
+                        break;
+                }
+                break;
+        }
+        return context.getResources().getString(resourceId);
+    }
+
+    /**
      * Returns a description of the disconnect cause to be shown to the user.
      */
     private static CharSequence toTelecomDisconnectCauseDescription(
diff --git a/src/com/android/services/telephony/Log.java b/src/com/android/services/telephony/Log.java
index a56e8b1..9941a59 100644
--- a/src/com/android/services/telephony/Log.java
+++ b/src/com/android/services/telephony/Log.java
@@ -43,7 +43,6 @@
         // Register Telephony with the Telecom Logger.
         android.telecom.Log.setTag(TAG);
         android.telecom.Log.setSessionContext(context);
-        android.telecom.Log.initMd5Sum();
     }
 
     // Relay log messages to Telecom
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 8963229..3f21d17 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -83,6 +83,7 @@
         private boolean mIsVideoConferencingSupported;
         private boolean mIsMergeOfWifiCallsAllowedWhenVoWifiOff;
         private boolean mIsManageImsConferenceCallSupported;
+        private boolean mIsShowPreciseFailedCause;
 
         AccountEntry(Phone phone, boolean isEmergency, boolean isDummy) {
             mPhone = phone;
@@ -184,8 +185,8 @@
             }
 
             mIsVideoCapable = mPhone.isVideoEnabled();
-            boolean isVideoEnabledByPlatform =
-                    ImsManager.isVtEnabledByPlatform(mPhone.getContext());
+            boolean isVideoEnabledByPlatform = ImsManager.getInstance(mPhone.getContext(),
+                    mPhone.getPhoneId()).isVtEnabledByPlatform();
 
             if (!mIsPrimaryUser) {
                 Log.i(this, "Disabling video calling for secondary user.");
@@ -226,6 +227,12 @@
                         isHandoverFromSupported);
             }
 
+            boolean isDeviceRttSupported = mContext.getResources().getBoolean(
+                    R.bool.config_support_rtt);
+            if (isDeviceRttSupported && isCarrierRttSupported()) {
+                capabilities |= PhoneAccount.CAPABILITY_RTT;
+            }
+
             extras.putBoolean(PhoneAccount.EXTRA_SUPPORTS_VIDEO_CALLING_FALLBACK,
                     mContext.getResources()
                             .getBoolean(R.bool.config_support_video_calling_fallback));
@@ -241,6 +248,7 @@
             mIsMergeOfWifiCallsAllowedWhenVoWifiOff =
                     isCarrierMergeOfWifiCallsAllowedWhenVoWifiOff();
             mIsManageImsConferenceCallSupported = isCarrierManageImsConferenceCallSupported();
+            mIsShowPreciseFailedCause = isCarrierShowPreciseFailedCause();
 
             if (isEmergency && mContext.getResources().getBoolean(
                     R.bool.config_emergency_account_emergency_calls_only)) {
@@ -390,6 +398,12 @@
                     b.getBoolean(CarrierConfigManager.KEY_SUPPORT_VIDEO_CONFERENCE_CALL_BOOL);
         }
 
+        private boolean isCarrierRttSupported() {
+            PersistableBundle b =
+                    PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
+            return b != null && b.getBoolean(CarrierConfigManager.KEY_RTT_SUPPORTED_BOOL);
+        }
+
         /**
          * Determines from carrier config whether merging of wifi calls is allowed when VoWIFI is
          * turned off.
@@ -417,6 +431,19 @@
         }
 
         /**
+         * Determines from carrier config whether showing percise call diconnect cause to user
+         * is supported.
+         *
+         * @return {@code true} if showing percise call diconnect cause to user is supported,
+         *         {@code false} otherwise.
+         */
+        private boolean isCarrierShowPreciseFailedCause() {
+            PersistableBundle b =
+                    PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
+            return b.getBoolean(CarrierConfigManager.KEY_SHOW_PRECISE_FAILED_CAUSE_BOOL);
+        }
+
+        /**
          * Where a device supports instant lettering and call subjects, retrieves the necessary
          * PhoneAccount extras for those features.
          * @return The {@link PhoneAccount} extras associated with the current subscription.
@@ -507,6 +534,16 @@
         public boolean isManageImsConferenceCallSupported() {
             return mIsManageImsConferenceCallSupported;
         }
+
+        /**
+         * Indicates whether this account supports showing the precise call disconnect cause
+         * to user (i.e. conferencing).
+         * @return {@code true} if the account supports showing the precise call disconnect cause,
+         *         {@code false} otherwise.
+         */
+        public boolean isShowPreciseFailedCause() {
+            return mIsShowPreciseFailedCause;
+        }
     }
 
     private OnSubscriptionsChangedListener mOnSubscriptionsChangedListener =
@@ -694,6 +731,23 @@
     }
 
     /**
+     * showing precise call disconnect cause to the user.
+     *
+     * @param handle The {@link PhoneAccountHandle}.
+     * @return {@code True} if showing precise call disconnect cause to the user is supported.
+     */
+    boolean isShowPreciseFailedCause(PhoneAccountHandle handle) {
+        synchronized (mAccountsLock) {
+            for (AccountEntry entry : mAccounts) {
+                if (entry.getPhoneAccountHandle().equals(handle)) {
+                    return entry.isShowPreciseFailedCause();
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
      * @return Reference to the {@code TelecomAccountRegistry}'s subscription manager.
      */
     SubscriptionManager getSubscriptionManager() {
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 26aeaba..2358160 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -33,7 +33,6 @@
 import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
 import android.telephony.CarrierConfigManager;
-import android.telephony.DisconnectCause;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
 import android.util.Pair;
@@ -41,6 +40,7 @@
 import com.android.ims.ImsCall;
 import com.android.ims.ImsCallProfile;
 import com.android.internal.telephony.Call;
+import com.android.internal.telephony.CallFailCause;
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection.Capability;
 import com.android.internal.telephony.Connection.PostDialListener;
@@ -521,6 +521,16 @@
     protected final boolean mIsOutgoing;
 
     /**
+     * Indicates whether this call is using assisted dialing.
+     */
+    private boolean mIsUsingAssistedDialing;
+
+    /**
+     * Indicates whether this connection supports showing preciese call failed cause.
+     */
+    private boolean mShowPreciseFailedCause;
+
+    /**
      * Listeners to our TelephonyConnection specific callbacks
      */
     private final Set<TelephonyConnectionListener> mTelephonyListeners = Collections.newSetFromMap(
@@ -823,6 +833,8 @@
                 isExternalConnection());
         newProperties = changeBitmask(newProperties, PROPERTY_HAS_CDMA_VOICE_PRIVACY,
                 mIsCdmaVoicePrivacyEnabled);
+        newProperties = changeBitmask(newProperties, PROPERTY_ASSISTED_DIALING_USED,
+                mIsUsingAssistedDialing);
 
         if (getConnectionProperties() != newProperties) {
             setConnectionProperties(newProperties);
@@ -1356,8 +1368,14 @@
                         fireOnOriginalConnectionRetryDial(cause
                                 == android.telephony.DisconnectCause.EMERGENCY_PERM_FAILURE);
                     } else {
+                        int preciseDisconnectCause = CallFailCause.NOT_VALID;
+                        if (mShowPreciseFailedCause) {
+                            preciseDisconnectCause =
+                                    mOriginalConnection.getPreciseDisconnectCause();
+                        }
                         setDisconnected(DisconnectCauseUtil.toTelecomDisconnectCause(
                                 mOriginalConnection.getDisconnectCause(),
+                                preciseDisconnectCause,
                                 mOriginalConnection.getVendorDisconnectCause()));
                         close();
                     }
@@ -1379,6 +1397,7 @@
         updateConnectionProperties();
         updateAddress();
         updateMultiparty();
+        refreshDisableAddCall();
     }
 
     /**
@@ -1673,6 +1692,15 @@
     }
 
     /**
+     * Sets whether this connection supports showing precise call disconnect cause.
+     * @param showPreciseFailedCause  {@code true} if showing precise call
+     * disconnect cause is supported by this connection, {@code false} otherwise.
+     */
+    public void setShowPreciseFailedCause(boolean showPreciseFailedCause) {
+        mShowPreciseFailedCause = showPreciseFailedCause;
+    }
+
+    /**
      * Whether the original connection is an IMS connection.
      * @return {@code True} if the original connection is an IMS connection, {@code false}
      *     otherwise.
@@ -1692,6 +1720,15 @@
         return mWasImsConnection;
     }
 
+    boolean getIsUsingAssistedDialing() {
+        return mIsUsingAssistedDialing;
+    }
+
+    void setIsUsingAssistedDialing(Boolean isUsingAssistedDialing) {
+        mIsUsingAssistedDialing = isUsingAssistedDialing;
+        updateConnectionProperties();
+    }
+
     private static Uri getAddressFromNumber(String number) {
         // Address can be null for blocked calls.
         if (number == null) {
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index f4ee745..8584d42 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -421,7 +421,11 @@
                     isEmergencyNumber, handle, phone);
             // If there was a failure, the resulting connection will not be a TelephonyConnection,
             // so don't place the call!
-            if(resultConnection instanceof TelephonyConnection) {
+            if (resultConnection instanceof TelephonyConnection) {
+                if (request.getExtras() != null && request.getExtras().getBoolean(
+                        TelecomManager.EXTRA_USE_ASSISTED_DIALING, false)) {
+                    ((TelephonyConnection) resultConnection).setIsUsingAssistedDialing(true);
+                }
                 placeOutgoingConnection((TelephonyConnection) resultConnection, phone, request);
             }
             return resultConnection;
@@ -1049,6 +1053,9 @@
             returnConnection.setManageImsConferenceCallSupported(
                     TelecomAccountRegistry.getInstance(this).isManageImsConferenceCallSupported(
                             phoneAccountHandle));
+            returnConnection.setShowPreciseFailedCause(
+                    TelecomAccountRegistry.getInstance(this).isShowPreciseFailedCause(
+                            phoneAccountHandle));
         }
         return returnConnection;
     }
diff --git a/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java b/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java
index 730db93..2176d6b 100644
--- a/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java
+++ b/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java
@@ -119,21 +119,21 @@
                 SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
         assertThat(cursor1.getColumnNames()).isEqualTo(
                 SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
-        assertThat(cursor1.getCount()).isEqualTo(11);
+        assertThat(cursor1.getCount()).isEqualTo(16);
 
         when(mUserManager.isAdminUser()).thenReturn(true);
         Cursor cursor2 = mProvider
                 .queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
-        assertThat(cursor2.getCount()).isEqualTo(1);
+        assertThat(cursor2.getCount()).isEqualTo(2);
 
         mProvider.setIsEuiccSettingsHidden(true /* isEuiccSettingsHidden */);
         Cursor cursor3 = mProvider
                 .queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
-        assertThat(cursor3.getCount()).isEqualTo(2);
+        assertThat(cursor3.getCount()).isEqualTo(3);
 
         mProvider.setIsEnhanced4gLteHidden(true /* isEnhanced4gLteHidden */);
         Cursor cursor4 = mProvider
                 .queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
-        assertThat(cursor4.getCount()).isEqualTo(3);
+        assertThat(cursor4.getCount()).isEqualTo(4);
     }
 }