Merge "Restore the OEM hook implementation and usage"
diff --git a/Android.mk b/Android.mk
index 24fb423..4846ea1 100644
--- a/Android.mk
+++ b/Android.mk
@@ -30,12 +30,23 @@
         src/com/android/phone/INetworkQueryServiceCallback.aidl
 LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
 
+LOCAL_RESOURCE_DIR += \
+    frameworks/support/v7/appcompat/res \
+    frameworks/support/v7/preference/res \
+    frameworks/support/v7/recyclerview/res \
+    frameworks/support/v14/preference/res
+
 LOCAL_AAPT_FLAGS := \
     --auto-add-overlay \
     --extra-packages com.android.phone.common \
-    --extra-packages com.android.services.telephony.sip
+    --extra-packages com.android.services.telephony.sip \
+    --extra-packages android.support.v7.appcompat \
+    --extra-packages android.support.v7.preference \
+    --extra-packages android.support.v7.recyclerview \
+    --extra-packages android.support.v14.preference
 
 LOCAL_PACKAGE_NAME := TeleService
+LOCAL_PRIVATE_PLATFORM_APIS := true
 
 LOCAL_CERTIFICATE := platform
 LOCAL_PRIVILEGED_MODULE := true
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 58a65d7..c9281d1 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.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" />
+    <protected-broadcast android:name= "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED" />
 
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
     <uses-permission android:name="android.permission.CALL_PHONE" />
@@ -149,8 +153,9 @@
     <uses-permission android:name="android.permission.BIND_CARRIER_SERVICES" />
     <!-- BIND_CARRIER_MESSAGING_SERVICE has been deprecated in favor of BIND_CARRIER_SERVICES. -->
     <uses-permission android:name="android.permission.BIND_CARRIER_MESSAGING_SERVICE" />
-    <uses-permission android:name="com.android.permission.BIND_EUICC_SERVICE" />
-    <uses-permission android:name="com.android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" />
+    <uses-permission android:name="android.permission.BIND_EUICC_SERVICE" />
+    <uses-permission android:name="com.android.permission.BIND_TELEPHONY_NETWORK_SERVICE" />
+    <uses-permission android:name="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" />
     <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
@@ -173,6 +178,10 @@
          presses home. -->
     <uses-permission android:name="android.permission.STOP_APP_SWITCHES" />
     <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
+    <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
+    <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
+    <uses-permission android:name="android.permission.BIND_TELEPHONY_DATA_SERVICE" />
+    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
 
     <application android:name="PhoneApp"
             android:persistent="true"
@@ -232,105 +241,6 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="OutgoingCallBroadcaster"
-                android:enabled="false"
-                android:theme="@style/OutgoingCallBroadcasterTheme"
-                android:permission="android.permission.CALL_PHONE"
-                android:screenOrientation="nosensor"
-                android:configChanges="orientation|screenSize|keyboardHidden"
-                android:excludeFromRecents="true">
-            <!-- CALL action intent filters, for the various ways
-                 of initiating an outgoing call. -->
-            <intent-filter>
-                <action android:name="android.intent.action.CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="tel" />
-            </intent-filter>
-            <intent-filter android:icon="@drawable/ic_launcher_sip_call">
-                <action android:name="android.intent.action.CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="sip" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="android.intent.action.CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="voicemail" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="android.intent.action.CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/phone" />
-                <data android:mimeType="vnd.android.cursor.item/phone_v2" />
-                <data android:mimeType="vnd.android.cursor.item/person" />
-            </intent-filter>
-        </activity>
-
-        <activity-alias android:name="EmergencyOutgoingCallBroadcaster"
-                android:enabled="false"
-                android:targetActivity="OutgoingCallBroadcaster"
-                android:permission="android.permission.CALL_PRIVILEGED">
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_EMERGENCY" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="tel" />
-            </intent-filter>
-            <intent-filter android:icon="@drawable/ic_launcher_sip_call"
-                    android:priority="1000">
-                <action android:name="android.intent.action.CALL_EMERGENCY" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="sip" />
-            </intent-filter>
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_EMERGENCY" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="voicemail" />
-            </intent-filter>
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_EMERGENCY" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/phone" />
-                <data android:mimeType="vnd.android.cursor.item/person" />
-            </intent-filter>
-        </activity-alias>
-
-        <activity-alias android:name="PrivilegedOutgoingCallBroadcaster"
-                android:enabled="false"
-                android:targetActivity="OutgoingCallBroadcaster"
-                android:screenOrientation="nosensor"
-                android:permission="android.permission.CALL_PRIVILEGED">
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_PRIVILEGED" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="tel" />
-            </intent-filter>
-            <intent-filter android:icon="@drawable/ic_launcher_sip_call"
-                    android:priority="1000">
-                <action android:name="android.intent.action.CALL_PRIVILEGED" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="sip" />
-            </intent-filter>
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_PRIVILEGED" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="voicemail" />
-            </intent-filter>
-            <intent-filter android:priority="1000">
-                <action android:name="android.intent.action.CALL_PRIVILEGED" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/phone" />
-                <data android:mimeType="vnd.android.cursor.item/phone_v2" />
-                <data android:mimeType="vnd.android.cursor.item/person" />
-            </intent-filter>
-        </activity-alias>
-
-        <receiver android:name="ProcessOutgoingCallTest" android:exported="false"
-            android:enabled="false">
-            <intent-filter android:priority="1">
-                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </receiver>
-
         <!-- "Mobile network settings" screen, used on both
              non-voice-capable tablets and regular phone devices. -->
         <activity android:name="MobileNetworkSettings"
@@ -339,6 +249,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
                 <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.settings.NETWORK_OPERATOR_SETTINGS" />
                 <action android:name="android.settings.DATA_ROAMING_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
@@ -348,20 +259,24 @@
             android:targetActivity="MobileNetworkSettings" />
 
         <!-- networks setting -->
-        <!-- service to handle network query requests sent to RIL -->
-        <service android:name="NetworkQueryService" />
-
-        <activity android:name="NetworkSetting"
-                android:label="@string/networks"
-                android:configChanges="orientation|screenSize|keyboardHidden"
-                android:theme="@style/NetworkOperatorsSettingsTheme">
+        <!-- "Choose network" screen. Used only when the Automatically
+             select network turned off-->
+        <activity android:name="NetworkSelectSettingActivity"
+            android:label="@string/choose_network_title"
+            android:theme="@style/NetworkOperatorsSettingsTheme"
+            android:configChanges="orientation|screenSize">
             <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.NETWORK_OPERATOR_SETTINGS" />
+                <action android:name="android.settings.DATA_ROAMING_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
 
+        <!-- service to handle network query requests sent to RIL -->
+        <service android:name="NetworkQueryService" />
+
         <activity android:name="GsmUmtsCallOptions"
                 android:label="@string/gsm_umts_options"
                 android:theme="@style/DialerSettingsLight">
@@ -387,6 +302,15 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="GsmUmtsCallBarringOptions"
+                android:label="@string/labelCallBarring"
+                android:configChanges="orientation|screenSize|keyboardHidden"
+                android:theme="@style/CallSettingsWithoutDividerTheme">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="GsmUmtsAdditionalCallOptions"
                 android:label="@string/labelGSMMore"
                 android:configChanges="orientation|screenSize|keyboardHidden"
@@ -576,13 +500,6 @@
 
         <!-- End SIP -->
 
-        <activity android:name="ErrorDialogActivity"
-                android:configChanges="orientation|screenSize|keyboardHidden"
-                android:excludeFromRecents="true"
-                android:launchMode="singleInstance"
-                android:theme="@style/Empty">
-        </activity>
-
         <activity android:name="MMIDialogActivity"
                 android:configChanges="orientation|screenSize|keyboardHidden"
                 android:excludeFromRecents="true"
@@ -624,6 +541,7 @@
                 <action android:name="android.telecom.ConnectionService" />
             </intent-filter>
         </service>
+
         <provider
                 android:name="PhoneSearchIndexablesProvider"
                 android:authorities="com.android.phone"
@@ -659,5 +577,19 @@
         <service
             android:name="com.android.phone.vvm.RemoteVvmTaskManager"
             android:exported="false"/>
+        <service android:name="com.android.internal.telephony.dataconnection.CellularDataService"
+            android:permission="android.permission.BIND_TELEPHONY_DATA_SERVICE" >
+            <intent-filter>
+                <action android:name="android.telephony.data.DataService" />
+            </intent-filter>
+        </service>
+
+        <service android:name="com.android.internal.telephony.CellularNetworkService"
+            android:permission="android.permission.BIND_TELEPHONY_NETWORK_SERVICE" >
+            <intent-filter>
+                <action android:name="android.telephony.NetworkService" />
+            </intent-filter>
+        </service>
+
     </application>
 </manifest>
diff --git a/OWNERS b/OWNERS
index e6fad06..f190411 100644
--- a/OWNERS
+++ b/OWNERS
@@ -6,5 +6,6 @@
 rgreenwalt@google.com
 tgunn@google.com
 refuhoo@google.com
-sanketpadawe@google.com
-mpq@google.com
\ No newline at end of file
+mpq@google.com
+jminjie@google.com
+shuoq@google.com
diff --git a/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml b/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml
new file mode 100644
index 0000000..905dc55
--- /dev/null
+++ b/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- Variant of progress_indeterminate_horizontal_material in frameworks/base/core/res, which
+     draws the whole height of the progress bar instead having blank space above and below the
+     bar. -->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:drawable="@drawable/vector_drawable_progress_indeterminate_horizontal_trimmed" >
+    <target
+        android:name="rect2_grp"
+        android:animation="@*android:anim/progress_indeterminate_horizontal_rect2" />
+    <target
+        android:name="rect1_grp"
+        android:animation="@*android:anim/progress_indeterminate_horizontal_rect1" />
+</animated-vector>
\ No newline at end of file
diff --git a/res/drawable/signal_strength_1x.xml b/res/drawable/signal_strength_1x.xml
new file mode 100644
index 0000000..d1d2229
--- /dev/null
+++ b/res/drawable/signal_strength_1x.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2018 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="8.5dp"
+    android:height="17dp"
+    android:viewportWidth="12.0"
+    android:viewportHeight="24.0"
+    android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M8.600000,5.500000l1.200000,-3.000000l1.900000,0.000000L9.700000,6.700000l2.200000,4.300000L9.900000,11.000000L8.700000,7.900000L7.400000,11.000000L5.500000,11.000000l2.100000,-4.300000L5.600000,2.500000l1.900000,0.000000L8.600000,5.500000z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/signal_strength_3g.xml b/res/drawable/signal_strength_3g.xml
new file mode 100644
index 0000000..49f52a9
--- /dev/null
+++ b/res/drawable/signal_strength_3g.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2018 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="9.208dp"
+    android:height="17dp"
+    android:viewportWidth="13.0"
+    android:viewportHeight="24.0"
+    android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M12.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.700000,9.000000 6.700000,7.900000L6.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000s-0.500000,-0.300000 -0.900000,-0.300000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S8.400000,5.000000 8.400000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.799999,7.800000L9.600000,7.800000L9.600000,6.600000l2.900000,0.000000L12.500000,9.900000z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/signal_strength_g.xml b/res/drawable/signal_strength_g.xml
new file mode 100644
index 0000000..7258c94
--- /dev/null
+++ b/res/drawable/signal_strength_g.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2018 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="4.958dp"
+    android:height="17dp"
+    android:viewportWidth="7.0"
+    android:viewportHeight="24.0"
+    android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/signal_strength_lte.xml b/res/drawable/signal_strength_lte.xml
new file mode 100644
index 0000000..e6edd24
--- /dev/null
+++ b/res/drawable/signal_strength_lte.xml
@@ -0,0 +1,31 @@
+<!--
+Copyright (C) 2018 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="9.208dp"
+    android:height="17dp"
+    android:viewportWidth="13.0"
+    android:viewportHeight="24.0"
+    android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M8.300000,3.800000L7.000000,3.800000L7.000000,11.000000L5.300000,11.000000L5.300000,3.800000L4.000000,3.800000L4.000000,2.500000l4.300000,0.000000L8.300000,3.800000z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M12.400000,7.300000l-1.700000,0.000000l0.000000,2.400000l2.100000,0.000000L12.799999,11.000000L9.000000,11.000000L9.000000,2.500000l3.700000,0.000000l0.000000,1.300000l-2.100000,0.000000l0.000000,2.100000l1.700000,0.000000L12.300000,7.300000z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml b/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml
new file mode 100644
index 0000000..dc0352a
--- /dev/null
+++ b/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- Variant of vector_drawable_progress_indeterminate_horizontal in frameworks/base/core/res, which
+     draws the whole height of the progress bar instead having blank space above and below the
+     bar. -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="10dp"
+    android:width="360dp"
+    android:viewportHeight="10"
+    android:viewportWidth="360" >
+    <group
+        android:name="progress_group"
+        android:translateX="180"
+        android:translateY="5" >
+        <path
+            android:name="background_track"
+            android:pathData="M -180.0,-5.0 l 360.0,0 l 0,10.0 l -360.0,0 Z"
+            android:fillColor="?android:attr/colorControlActivated"
+            android:fillAlpha="?android:attr/disabledAlpha"/>
+        <group
+            android:name="rect2_grp"
+            android:translateX="-197.60001"
+            android:scaleX="0.1" >
+            <path
+                android:name="rect2"
+                android:pathData="M -144.0,-5.0 l 288.0,0 l 0,10.0 l -288.0,0 Z"
+                android:fillColor="?android:attr/colorControlActivated" />
+        </group>
+        <group
+            android:name="rect1_grp"
+            android:translateX="-522.59998"
+            android:scaleX="0.1" >
+            <path
+                android:name="rect1"
+                android:pathData="M -144.0,-5.0 l 288.0,0 l 0,10.0 l -288.0,0 Z"
+                android:fillColor="?android:attr/colorControlActivated" />
+        </group>
+    </group>
+</vector>
\ No newline at end of file
diff --git a/res/layout/choose_network.xml b/res/layout/choose_network.xml
new file mode 100644
index 0000000..2c327c56
--- /dev/null
+++ b/res/layout/choose_network.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/choose_network_content"
+    android:layout_height="match_parent"
+    android:layout_width="match_parent">
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/choose_network_progress_header.xml b/res/layout/choose_network_progress_header.xml
new file mode 100644
index 0000000..671c297
--- /dev/null
+++ b/res/layout/choose_network_progress_header.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<FrameLayout
+    android:layout_width="match_parent"
+    android:layout_height="3dp"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <View
+        android:id="@+id/progress_bar_background"
+        style="@style/TrimmedHorizontalProgressBar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="?android:attr/colorSecondary" />
+    <ProgressBar
+        android:id="@+id/progress_bar_animation"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        style="@style/TrimmedHorizontalProgressBar"
+        android:indeterminate="true" />
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/edit_fdn_contact_screen.xml b/res/layout/edit_fdn_contact_screen.xml
index 24e0c6b..c7ba0d4 100644
--- a/res/layout/edit_fdn_contact_screen.xml
+++ b/res/layout/edit_fdn_contact_screen.xml
@@ -31,7 +31,8 @@
         android:singleLine="true"
         android:scrollHorizontally="true"
         android:autoText="false"
-        android:capitalize="words" />
+        android:capitalize="words"
+        android:textAlignment="viewStart" />
 
     <EditText android:id="@+id/fdn_number"
         android:hint="@string/number"
@@ -42,7 +43,8 @@
         android:singleLine="true"
         android:scrollHorizontally="true"
         android:autoText="false"
-        android:capitalize="none" />
+        android:capitalize="none"
+        android:textAlignment="viewStart" />
 
     <Button android:id="@+id/button"
         android:layout_width="wrap_content"
diff --git a/res/layout/text_view_preference.xml b/res/layout/text_view_preference.xml
new file mode 100644
index 0000000..3677b3b
--- /dev/null
+++ b/res/layout/text_view_preference.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+  android:id="@+id/text"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:padding="16dp"
+  android:fontFamily="sans-serif"
+  android:linksClickable="true"
+  android:singleLine="false"/>
+
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index e5ab85d..e5c422c 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Stemboodskapdiens (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Kennisgewings"</string>
-    <string name="networks" msgid="8873030692174541976">"Netwerkoperateurs"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Nooduitsendings"</string>
     <string name="call_settings" msgid="6112441768261754562">"Oproepinstellings"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Bykomende instellings"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Geen netwerke gevind nie."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Deursoek netwerke"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Fout het voorgekom terwyl netwerke gesoek is."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registreer op <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Jou SIM-kaart laat nie \'n verbinding na hierdie netwerk toe nie."</string>
     <string name="connect_later" msgid="2308119155752343975">"Kan nie nou aan hierdie netwerk koppel nie. Probeer later weer."</string>
     <string name="registration_done" msgid="495135664535876612">"Geregistreer op die netwerk."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Kies \'n netwerkoperateur"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Soek alle beskikbare netwerke"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Kies outomaties netwerk"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Netwerk"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Outomatiese registrasie..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Voorkeurnetwerktipe"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Verander die netwerkbedryfsmodus"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Voorkeurnetwerktipe"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(verbode)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA verkies"</item>
     <item msgid="8442633436636425221">"Net GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Dit kan baie duur wees."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Laat dataswerwing toe?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Datagebruik"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobiele data gebruik tussen <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobiele data gebruik <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Gevorderd"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Diensverskaffer"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"diensverskaffer, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobiele data"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobiele data"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Verkry toegang tot data deur selnetwerk te gebruik"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Skakel mobiele data af?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Keuse vereis"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Verander data-SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Gebruik <xliff:g id="NEW_SIM">%1$s</xliff:g> pleks van <xliff:g id="OLD_SIM">%2$s</xliff:g> vir mobiele data?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi-oproepe"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Diensverskaffervideo-oproepe"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM//UMTS-opsies"</string>
@@ -486,7 +487,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobiele netwerk is nie beskikbaar nie. Koppel aan \'n draadlose netwerk om \'n oproep te maak."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Voer \'n geldige nommer in om \'n oproep te maak."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Oproep het misluk."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Oproep kan nie op die oomblik bygevoeg word nie."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Oproep kan nie op die oomblik bygevoeg word nie. Jy kan probeer in verbinding tree deur \'n boodskap te stuur."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Diens word nie gesteun nie"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kan nie oproepe wissel nie."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kan nie oproep skei nie."</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 1f8e4fb..9020be2 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"የድምጽ መልዕክት (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"ማሳወቂያዎች"</string>
-    <string name="networks" msgid="8873030692174541976">"የአውታረ መረብ ትእምርተ ከዋኝ"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"የአስቸኳይ አደጋ ስርጭቶች"</string>
     <string name="call_settings" msgid="6112441768261754562">"የጥሪ ቅንብሮች"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"ተጨማሪ ቅንብሮች"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"ምንም አውታረመረብ አልተገኘም።"</string>
-    <string name="search_networks" msgid="1601136049300882441">"አውታረመረቦች ፈልግ"</string>
     <string name="network_query_error" msgid="6828516148953325006">"አውታረ መረቦች በመፈለግ ላይ ስህተት"</string>
     <string name="register_on_network" msgid="9055203954040805084">"በ<xliff:g id="NETWORK">%s</xliff:g> ላይ በመመዝገብ ላይ..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"የSIM ካርድህ ወደዚህ አውታረመረብ  ግንኙነት አይፈቅድም።"</string>
     <string name="connect_later" msgid="2308119155752343975">"በአሁን ጊዜ ወደዚህ አውታረ መረብ ማገናኘት አልተቻለም፡፡ በኋላ እንደገና ሞክር፡፡"</string>
     <string name="registration_done" msgid="495135664535876612">"በአውታረ መረብ ላይ የተመዘገበ።"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"የአውታረ መረብ ከዋኝ ምረጥ"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"የሚገኙ አውታረመረቦች በሙሉ ፈልግ"</string>
     <string name="select_automatically" msgid="1046727200631770962">"አውታረ መረብን በራስ ሰር ይምረጡ"</string>
     <string name="network_select_title" msgid="7733107364757544558">"አውታረ መረብ"</string>
     <string name="register_automatically" msgid="6017849844573519637">"ራስ ሰር ምዝገባ...."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"የሚመረጠው የአውታረ መረብ አይነት"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"የአውታረመረቡንመከወኛ ሁነታ ለውጥ"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"የሚመረጠው የአውታረ መረብ አይነት"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(የተከለከለ)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA ይመረጣል"</item>
     <item msgid="8442633436636425221">"GSM ብቻ"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"ከፍተኛ ክፍያዎችን ሊያስከትልብዎት ይችላል።"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"የውሂብ ዝውውር ፍቀድ?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"የውሂብ አጠቃቀም"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> ጥቅም ላይ የዋለ የተንቀሳቃሽ ስልክ ውሂብ ከ<xliff:g id="ID_2">%2$s</xliff:g> መካከል"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> ጥቅም ላይ የዋለ የተንቀሳቃሽ ስልክ ውሂብ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"የላቀ"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"አገልግሎት አቅራቢ"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"አገልግሎት አቅራቢ፣ esim፣ ሲም፣ euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"የተንቀሳቃሽ ስልክ ውሂብ"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"የተንቀሳቃሽ ስልክ ውሂብ"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"የተንቀሳቃሽ ስልክ አውታረ መረብን በመጠቀም ውሂብን ይድረሱበት"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"የተንቀሳቃሽ ስልክ ውሂብ ይጥፋ?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"መምረጥ ያስፈልጋል"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"የውሂብ ሲም ይቀየር?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"ለተንቀሳቃሽ ስልክ ውሂብ በ<xliff:g id="OLD_SIM">%2$s</xliff:g> ፈንታ <xliff:g id="NEW_SIM">%1$s</xliff:g>ን ይጠቀማሉ?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"የWi-Fi ጥሪ"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"የአገልግሎት አቅራቢ የቪዲዮ ጥሪ"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS አማራጮች"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"የተንቀሳቃሽ ስልክ አውታረ መረብ አይገኝም። ጥሪ ለማድረግ ከሽቦ አልባ አውታረ መረብ ጋር ያገናኙ።"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"አንድ ጥሪ ለማድረግ የሚሰራ ቁጥር ያስገቡ።"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"ጥሪ አልተሳካም።"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"ጥሪ በአሁኑ ጊዜ ሊታከል አይችልም።"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"ጥሪ አሁን መታከል አይችልም። መልዕክት በመላክ ለማግኘት መሞከር ይችላሉ።"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"አገልግሎት አይደገፍም"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ጥሪዎችን መቀያየር አልተቻለም።"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ጥሪን መለየት አልተቻለም።"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 918e356..f850115 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -27,7 +27,7 @@
     <string name="onHold" msgid="9035493194749959955">"معلقة"</string>
     <string name="mmiStarted" msgid="6347869857061147003">"‏بدأ رمز MMI"</string>
     <string name="ussdRunning" msgid="485588686340541690">"‏جارٍ تشغيل رمز USSD..."</string>
-    <string name="mmiCancelled" msgid="2771923949751842276">"‏تم إلغاء كود MMI"</string>
+    <string name="mmiCancelled" msgid="2771923949751842276">"‏تم إلغاء رمز MMI"</string>
     <string name="cancel" msgid="5044513931633602634">"إلغاء"</string>
     <string name="enter_input" msgid="1810529547726803893">"‏يجب أن تتراوح حروف رسالة USSD بين <xliff:g id="MIN_LEN">%d</xliff:g> و<xliff:g id="MAX_LEN">%d</xliff:g>. يُرجى إعادة المحاولة."</string>
     <string name="manageConferenceLabel" msgid="4691922394301969053">"إدارة مكالمة جماعية"</string>
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"البريد الصوتي (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"الإشعارات"</string>
-    <string name="networks" msgid="8873030692174541976">"مشغلو الشبكة"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"عمليات البث في حالات الطوارئ"</string>
     <string name="call_settings" msgid="6112441768261754562">"إعدادات الاتصال"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"إعدادات إضافية"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"لم يتم العثور على شبكات."</string>
-    <string name="search_networks" msgid="1601136049300882441">"بحث في الشبكات"</string>
     <string name="network_query_error" msgid="6828516148953325006">"حدث خطأ أثناء البحث عن شبكات."</string>
     <string name="register_on_network" msgid="9055203954040805084">"جارٍ التسجيل على <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"‏لا تسمح شريحة SIM بالاتصال بهذه الشبكة."</string>
     <string name="connect_later" msgid="2308119155752343975">"يتعذر الاتصال بهذه الشبكة في الوقت الحالي. حاول مرة أخرى لاحقًا."</string>
     <string name="registration_done" msgid="495135664535876612">"مسجل على الشبكة."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"اختر مشغل شبكة جوال"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"البحث عن كل الشبكات المتاحة"</string>
     <string name="select_automatically" msgid="1046727200631770962">"تحديد الشبكة تلقائيًا"</string>
     <string name="network_select_title" msgid="7733107364757544558">"الشبكة"</string>
     <string name="register_automatically" msgid="6017849844573519637">"التسجيل التلقائي..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"نوع الشبكة المفضل"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"تغيير وضع تشغيل الشبكة"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"نوع الشبكة المفضل"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(محظور)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"‏GSM/WCDMA المفضل"</item>
     <item msgid="8442633436636425221">"‏نظام GSM فقط"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"قد يكلف ذلك رسومًا مرتفعة."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"السماح بتجوال البيانات؟"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"استخدام البيانات"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"تم استخدام <xliff:g id="ID_1">%1$s</xliff:g> من بيانات الجوال خلال الفترة بين <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"تم استخدام <xliff:g id="ID_1">%1$s</xliff:g> من بيانات الجوال خلال الفترة بين <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"إعدادات متقدمة"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"مشغل شبكة الجوّال"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"‏مشغل شبكة الجوال، esim، sim، euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"بيانات الجوال"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"بيانات الجوّال"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"الوصول إلى البيانات باستخدام شبكة الجوال"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"هل تريد إيقاف تشغيل بيانات الجوّال؟"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"يلزم التحديد"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"‏هل تريد تغيير شريحة SIM للبيانات؟"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"هل تريد استخدام <xliff:g id="NEW_SIM">%1$s</xliff:g> بدلاً من <xliff:g id="OLD_SIM">%2$s</xliff:g> لبيانات الجوّال؟"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"‏الاتصال عبر Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"مكالمة فيديو باستخدام مشغل شبكة الجوال"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"‏خيارات نظام GSM/النظام العالمي لاتصالات الجوال عن بعد (UMTS)"</string>
@@ -418,7 +419,7 @@
     <string name="pin2_invalid" msgid="5470854099230755944">"‏لم يتم تحديث FDN لأنك كتبت رقم تعريف شخصي غير صحيح."</string>
     <string name="fdn_invalid_number" msgid="8602417141715473998">"‏لم يتم تحديث FDN نظرًا لأن الرقم فارغ أو يتجاوز طوله 20 رقمًا."</string>
     <string name="pin2_or_fdn_invalid" msgid="6025144083384701197">"‏لم يتم تحديث FDN. رقم PIN2 غير صحيح، أو تم رفض رقم الهاتف."</string>
-    <string name="fdn_failed" msgid="540018079008319747">"‏أخفقت عملية FDN!"</string>
+    <string name="fdn_failed" msgid="540018079008319747">"‏تعذّر إتمام عملية FDN!"</string>
     <string name="simContacts_emptyLoading" msgid="2203331234764498011">"‏جارٍ القراءة من شريحة SIM..."</string>
     <string name="simContacts_empty" msgid="5270660846489561932">"‏ليس هناك جهات اتصال على شريحة SIM."</string>
     <string name="simContacts_title" msgid="1861472842524839921">"حدد جهات اتصال لاستيرادها"</string>
@@ -481,8 +482,8 @@
     <string name="incall_error_out_of_service" msgid="8587993036435080418">"شبكة الجوال غير متاحة."</string>
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"شبكة الجوّال ليست متوفرة. اتصل بشبكة لاسلكية لإجراء مكالمة."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"لإجراء مكالمة، أدخل رقمًا صالحًا."</string>
-    <string name="incall_error_call_failed" msgid="5891978320269774095">"أخفقت المكالمة."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"لا يمكن إضافة مكالمة في الوقت الحالي."</string>
+    <string name="incall_error_call_failed" msgid="5891978320269774095">"تعذّرت المكالمة."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"يتعذر إجراء المكالمة في الوقت الحالي. يمكنك محاولة التواصل من خلال إرسال رسالة."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"الخدمة ليست متوفرة"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"يتعذر تبديل المكالمات."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"يتعذر فصل المكالمة."</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 7b3734d..5984aea 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Səsli məktub (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"SP:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Bildirişlər"</string>
-    <string name="networks" msgid="8873030692174541976">"Şəbəkə operatorları"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Təcili yayımlar"</string>
     <string name="call_settings" msgid="6112441768261754562">"Zəng parametrləri"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Əlavə parametrlər"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Şəbəkə tapılmadı"</string>
-    <string name="search_networks" msgid="1601136049300882441">"Şəbəkə axtarın"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Şəbəkə axtarışı zamanı xəta baş verdi."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> şəbəkəsində qeydiyyatdan keçirilir…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Sizin SIM kart bu şəbəkəyə bağlantıya icazə vermir."</string>
     <string name="connect_later" msgid="2308119155752343975">"Hazırda bu şəbəkəyə qoşulmaq olmur. Sonra təkrar sınayın."</string>
     <string name="registration_done" msgid="495135664535876612">"Şəbəkədə qeydiyyatdan keçib."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Şəbəkə operatoru seçin"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Bütün əlçatımlı şəbəkələri axtarın"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Avtomatik olaraq şəbəkə seçin"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Şəbəkə"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Avtomatik qeydiyyat ..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tərcih edilən şəbəkə növü"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Şəbəkə əməliyyat rejimini dəyişin"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tərcih edilən şəbəkə növü"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(qadağandır)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA\'ya üstünlük verilib"</item>
     <item msgid="8442633436636425221">"Yalnız GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Sizə əhəmiyyətli xərclər tətbiq edilə bilər."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Məlumat rominqinə icazə verilsin?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Data istifadəsi"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> ərzində <xliff:g id="ID_1">%1$s</xliff:g> mobil data istifadə edildi"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> ərzində <xliff:g id="ID_1">%1$s</xliff:g> mobil data istifadə edildi"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Qabaqcıl"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Mobil Operator"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operator, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobil Data"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobil data"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Mobil şəbəkədən istifadə edərək dataya daxil olun"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Mobil data söndürülsün?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Seçim tələb olunur"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Data SİM-i dəyişilsin?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Mobil data üçün <xliff:g id="OLD_SIM">%2$s</xliff:g> əvəzinə <xliff:g id="NEW_SIM">%1$s</xliff:g> istifadə edilsin?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi zəngi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Operator video zəngi"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS Seçimlər"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobil şəbəkə əlçatmazdır. Zəng etmək üçün Wi-Fi şəbəkəsinə qoşulun."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Zəngi yerləşdirmək üçün düzgün nömrə daxil edin."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Zəng alınmadı."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Hazırda çağrı edilə bilməz."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Hazırda zəngi əlavə etmək mümkün deyil. Mesaj göndərərək təkrar əlaqə saxlaya bilərsiniz."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Xidmət dəstəklənmir"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Zəngləri keçirmək mümkün deyil."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Zəngi ayırmaq mümkün deyil."</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 7df23ed..c2a4088 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Glasovna pošta (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Obaveštenja"</string>
-    <string name="networks" msgid="8873030692174541976">"Mrežni operateri"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Hitni prenosi"</string>
     <string name="call_settings" msgid="6112441768261754562">"Podešavanja poziva"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Dodatna podešavanja"</string>
@@ -159,23 +158,17 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nisu pronađene mreže."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Pretraži mreže"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Greška tokom traženja mreža."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registrovanje na <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM kartica ne dozvoljava vezu sa ovom mrežom."</string>
     <string name="connect_later" msgid="2308119155752343975">"Trenutno nije moguće povezati se sa ovom mrežom. Probajte ponovo kasnije."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrovano na mreži."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Izaberite mrežnog operatera"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Potraži sve dostupne mreže"</string>
-    <!-- no translation found for select_automatically (1046727200631770962) -->
-    <skip />
-    <!-- no translation found for network_select_title (7733107364757544558) -->
-    <skip />
+    <string name="select_automatically" msgid="1046727200631770962">"Automatski izaberi mrežu"</string>
+    <string name="network_select_title" msgid="7733107364757544558">"Mreža"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatska registracija..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Željeni tip mreže"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Promena režima rada mreže"</string>
@@ -212,37 +205,35 @@
     <item msgid="1524224863879435516">"Samo GSM"</item>
     <item msgid="3817924849415716259">"GSM/WCDMA ima prednost"</item>
   </string-array>
-    <!-- no translation found for call_category (5863978196309462052) -->
-    <skip />
-    <!-- no translation found for network_operator_category (4830701959205735636) -->
-    <skip />
+    <string name="call_category" msgid="5863978196309462052">"Pozivanje"</string>
+    <string name="network_operator_category" msgid="4830701959205735636">"Mreža"</string>
     <string name="enhanced_4g_lte_mode_title" msgid="522191650223239171">"Poboljšani 4G LTE režim"</string>
     <string name="enhanced_4g_lte_mode_title_variant" msgid="4871126028907265406">"Napredno pozivanje"</string>
     <string name="enhanced_4g_lte_mode_summary" msgid="2332175070522125850">"Korišćenje LTE usluga za poboljšanje glasovnih i drugih komunikacija (preporučeno)"</string>
     <string name="data_enabled" msgid="5972538663568715366">"Podaci su omogućeni"</string>
     <string name="data_enable_summary" msgid="2382798156640007971">"Omogućavanje potrošnje podataka"</string>
     <string name="dialog_alert_title" msgid="6751344986194435476">"Pažnja"</string>
-    <!-- no translation found for roaming (7894878421600247140) -->
-    <skip />
+    <string name="roaming" msgid="7894878421600247140">"Roming"</string>
     <string name="roaming_enable" msgid="7331106985174381987">"Povezivanje sa uslugom za podatke tokom rominga"</string>
     <string name="roaming_disable" msgid="1843417228755568110">"Povezivanje sa uslugom za podatke tokom rominga"</string>
     <string name="roaming_reenable_message" msgid="8913735676127858115">"Veza za prenos podataka je prekinuta zato što ste napustili kućnu mrežu sa isključenim prenosom podataka u romingu."</string>
     <string name="roaming_warning" msgid="1603164667540144353">"Mogu da nastanu značajni troškovi."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Dozvoljavate li prenos podataka u romingu?"</string>
-    <!-- no translation found for data_usage_title (8759619109516889802) -->
-    <skip />
-    <!-- no translation found for data_usage_template (8065650945732671045) -->
-    <skip />
+    <string name="data_usage_title" msgid="8759619109516889802">"Upotreba podataka"</string>
+    <string name="data_usage_template" msgid="8065650945732671045">"Potrošili ste <xliff:g id="ID_1">%1$s</xliff:g> mobilnih podataka u periodu <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Napredno"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Mobilni operater"</string>
+    <!-- no translation found for keywords_carrier_settings_euicc (783429609643157743) -->
+    <skip />
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <!-- no translation found for mobile_data_settings_title (3273340917802377121) -->
-    <skip />
-    <!-- no translation found for mobile_data_settings_summary (5087255915840576895) -->
-    <skip />
-    <!-- no translation found for wifi_calling_settings_title (7741961465416430470) -->
-    <skip />
-    <!-- no translation found for video_calling_settings_title (539714564273795574) -->
-    <skip />
+    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobilni podaci"</string>
+    <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Koristite podatke preko mobilne mreže"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Želite li da isključite mobilne podatke?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Potrebno je da izaberete nešto"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Da promenimo SIM za podatke?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Želite li da za mobilne podatke koristite <xliff:g id="NEW_SIM">%1$s</xliff:g> umesto <xliff:g id="OLD_SIM">%2$s</xliff:g>?"</string>
+    <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Pozivanje preko Wi-Fi-ja"</string>
+    <string name="video_calling_settings_title" msgid="539714564273795574">"Video pozivanje preko operatera"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opcije za GSM/UMTS"</string>
     <string name="cdma_options" msgid="4016822858172249884">"CDMA opcije"</string>
     <string name="throttle_data_usage" msgid="3715677828160555808">"Korišćenje podataka"</string>
@@ -607,4 +598,18 @@
     <string name="change_pin_confirm_pins_dont_match" msgid="4795052654904027909">"PIN-ovi se ne podudaraju"</string>
     <string name="change_pin_succeeded" msgid="2022852286442211151">"PIN kôd govorne pošte je ažuriran"</string>
     <string name="change_pin_system_error" msgid="8308462387154257840">"Podešavanje PIN-a nije uspelo"</string>
+    <string name="mobile_data_status_roaming_turned_off_subtext" msgid="935636805765823307">"Prenos podataka u romingu je isključen"</string>
+    <string name="mobile_data_status_roaming_turned_on_subtext" msgid="1335176927083781041">"Prenos podataka u romingu je uključen"</string>
+    <string name="mobile_data_status_roaming_without_plan_subtext" msgid="3568412513831673037">"Trenutno ste u romingu, potreban vam je paket za prenos podataka"</string>
+    <string name="mobile_data_status_roaming_with_plan_subtext" msgid="8721998948811064377">"Trenutno ste u romingu, paket za prenos podataka je aktivan"</string>
+    <string name="mobile_data_status_no_plan_subtext" msgid="4887747337017565725">"Nema preostalih mobilnih podataka"</string>
+    <string name="mobile_data_activate_prepaid" msgid="7447025165850512683">"Nema preostalih mobilnih podataka"</string>
+    <string name="mobile_data_activate_prepaid_summary" msgid="5705389791791637666">"Dodaj mobilne podatke preko: <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+    <string name="mobile_data_activate_roaming_plan" msgid="5998161536947086264">"Nema paketa u romingu"</string>
+    <string name="mobile_data_activate_roaming_plan_summary" msgid="511202908883425459">"Dodaj paket u romingu preko: <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+    <string name="mobile_data_activate_footer" msgid="5979019929980140594">"Mobilne podatke ili paket u romingu možete da dodate preko mobilnog operatera: <xliff:g id="PROVIDER_NAME">%s</xliff:g>."</string>
+    <string name="mobile_data_activate_diag_title" msgid="9044252207707864493">"Želite li da dodate prenos podataka?"</string>
+    <string name="mobile_data_activate_diag_message" msgid="8216154678758451453">"Prenos podataka ćete morati da dodate preko: <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+    <string name="mobile_data_activate_button" msgid="3682400969184405446">"DODAJ PRENOS PODATAKA"</string>
+    <string name="mobile_data_activate_cancel_button" msgid="1708022171547398765">"OTKAŽI"</string>
 </resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index a5d3f5f..b1fddb2 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Галасавая пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ГП:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Апавяшчэнні"</string>
-    <string name="networks" msgid="8873030692174541976">"Сеткавыя аператары"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Экстранныя трансляцыі"</string>
     <string name="call_settings" msgid="6112441768261754562">"Налады выклікаў"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Дадатковыя налады"</string>
@@ -159,23 +158,17 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Сеткі не знойдзены."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Шукаць сеткі"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Памылка падчас пошуку сетак."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Рэгістрацыя ў сетцы <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Ваша SIM-карта не дазваляе падключацца да гэтай сеткі."</string>
     <string name="connect_later" msgid="2308119155752343975">"Зараз немагчыма падключыцца да гэтай сеткі. Паўтарыце спробу пазней."</string>
     <string name="registration_done" msgid="495135664535876612">"Зарэгістраваны ў сетцы."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Выберыце аператара сеткі"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Пошук усіх даступных сетак"</string>
-    <!-- no translation found for select_automatically (1046727200631770962) -->
-    <skip />
-    <!-- no translation found for network_select_title (7733107364757544558) -->
-    <skip />
+    <string name="select_automatically" msgid="1046727200631770962">"Выбіраць сетку аўтаматычна"</string>
+    <string name="network_select_title" msgid="7733107364757544558">"Сетка"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Аўтаматычная рэгістрацыя..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Прыярытэтны тып сеткі"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Змяніць рэжым работы сеткі"</string>
@@ -212,37 +205,35 @@
     <item msgid="1524224863879435516">"Толькі GSM"</item>
     <item msgid="3817924849415716259">"Пажадана GSM/WCDMA"</item>
   </string-array>
-    <!-- no translation found for call_category (5863978196309462052) -->
-    <skip />
-    <!-- no translation found for network_operator_category (4830701959205735636) -->
-    <skip />
+    <string name="call_category" msgid="5863978196309462052">"Выклік"</string>
+    <string name="network_operator_category" msgid="4830701959205735636">"Сетка"</string>
     <string name="enhanced_4g_lte_mode_title" msgid="522191650223239171">"Удасканалены рэжым 4G LTE"</string>
     <string name="enhanced_4g_lte_mode_title_variant" msgid="4871126028907265406">"Пашыраны выклік"</string>
     <string name="enhanced_4g_lte_mode_summary" msgid="2332175070522125850">"Карыстайцеся службамі LTE, каб палепшыць галасавую і іншую сувязь (рэкаменд.)"</string>
     <string name="data_enabled" msgid="5972538663568715366">"Дадзеныя ўключаныя"</string>
     <string name="data_enable_summary" msgid="2382798156640007971">"Дазволіць выкарыстанне даных"</string>
     <string name="dialog_alert_title" msgid="6751344986194435476">"Увага"</string>
-    <!-- no translation found for roaming (7894878421600247140) -->
-    <skip />
+    <string name="roaming" msgid="7894878421600247140">"Роўмінг"</string>
     <string name="roaming_enable" msgid="7331106985174381987">"Падключацца да сэрвісаў перадачы даных у роўмінгу"</string>
     <string name="roaming_disable" msgid="1843417228755568110">"Падключацца да сэрвісаў перадачы даных у роўмінгу"</string>
     <string name="roaming_reenable_message" msgid="8913735676127858115">"Падлучэнне для перадачы дадзеных страчана, таму што вы выйшлі з зоны пакрыцця сваёй сеткі, а перадача дадзеных у роўмінгу адключана."</string>
     <string name="roaming_warning" msgid="1603164667540144353">"Гэта можа прывесці да значных выдаткаў."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Дазволіць перадачу даных у роўмінгу?"</string>
-    <!-- no translation found for data_usage_title (8759619109516889802) -->
-    <skip />
-    <!-- no translation found for data_usage_template (8065650945732671045) -->
-    <skip />
+    <string name="data_usage_title" msgid="8759619109516889802">"Выкарыстанне даных"</string>
+    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> мабільны трафік, выкарыстаны ў перыяд <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Пашыраныя налады"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Аператар"</string>
+    <!-- no translation found for keywords_carrier_settings_euicc (783429609643157743) -->
+    <skip />
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <!-- no translation found for mobile_data_settings_title (3273340917802377121) -->
-    <skip />
-    <!-- no translation found for mobile_data_settings_summary (5087255915840576895) -->
-    <skip />
-    <!-- no translation found for wifi_calling_settings_title (7741961465416430470) -->
-    <skip />
-    <!-- no translation found for video_calling_settings_title (539714564273795574) -->
-    <skip />
+    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Мабільная перадача даных"</string>
+    <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Доступ да даных па мабільнай сетцы"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Выключыць мабільную перадачу даных?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Трэба выбраць"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Змяніць SIM-карту для даных?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Выкарыстоўваць <xliff:g id="NEW_SIM">%1$s</xliff:g> замест <xliff:g id="OLD_SIM">%2$s</xliff:g> для мабільнай перадачы даных?"</string>
+    <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi-тэлефанія"</string>
+    <string name="video_calling_settings_title" msgid="539714564273795574">"Відэавыклікі праз аператара"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Параметры GSM/UMTS"</string>
     <string name="cdma_options" msgid="4016822858172249884">"Параметры CDMA"</string>
     <string name="throttle_data_usage" msgid="3715677828160555808">"Выкарыстанне трафіку"</string>
@@ -609,4 +600,18 @@
     <string name="change_pin_confirm_pins_dont_match" msgid="4795052654904027909">"PIN-код не супадае"</string>
     <string name="change_pin_succeeded" msgid="2022852286442211151">"PIN-код галасавой пошты абноўлены"</string>
     <string name="change_pin_system_error" msgid="8308462387154257840">"Немагчыма прызначыць PIN-код"</string>
+    <string name="mobile_data_status_roaming_turned_off_subtext" msgid="935636805765823307">"Перадача даных у роўмінгу выключана"</string>
+    <string name="mobile_data_status_roaming_turned_on_subtext" msgid="1335176927083781041">"Перадача даных у роўмінгу ўключана"</string>
+    <string name="mobile_data_status_roaming_without_plan_subtext" msgid="3568412513831673037">"Зараз у роўмінгу, патрэбны план перадачы даных"</string>
+    <string name="mobile_data_status_roaming_with_plan_subtext" msgid="8721998948811064377">"Зараз уключаны план перадачы даных у роўмінгу"</string>
+    <string name="mobile_data_status_no_plan_subtext" msgid="4887747337017565725">"Няма плана мабільнай перадачы даных"</string>
+    <string name="mobile_data_activate_prepaid" msgid="7447025165850512683">"Няма плана мабільнай перадачы даных"</string>
+    <string name="mobile_data_activate_prepaid_summary" msgid="5705389791791637666">"Дадаць план мабільнай перадачы даных з дапамогай <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+    <string name="mobile_data_activate_roaming_plan" msgid="5998161536947086264">"Няма плана роўмінга"</string>
+    <string name="mobile_data_activate_roaming_plan_summary" msgid="511202908883425459">"Дадаць план роўмінга з дапамогай <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+    <string name="mobile_data_activate_footer" msgid="5979019929980140594">"Можаце дадаць план мабільнай перадачы даных або роўмінга свайго аператара, <xliff:g id="PROVIDER_NAME">%s</xliff:g>."</string>
+    <string name="mobile_data_activate_diag_title" msgid="9044252207707864493">"Дадаць даныя?"</string>
+    <string name="mobile_data_activate_diag_message" msgid="8216154678758451453">"Магчыма, спатрэбіцца дадаць даныя з дапамогай <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+    <string name="mobile_data_activate_button" msgid="3682400969184405446">"ДАДАЦЬ ДАНЫЯ"</string>
+    <string name="mobile_data_activate_cancel_button" msgid="1708022171547398765">"СКАСАВАЦЬ"</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 4ed9bbc..9ec3901 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Гласова поща (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Известия"</string>
-    <string name="networks" msgid="8873030692174541976">"Мрежови оператори"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Спешни излъчвания"</string>
     <string name="call_settings" msgid="6112441768261754562">"Настройки за обаждане"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Допълнителни настройки"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Не са намерени мрежи."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Търсене на мрежи"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Грешка при търсенето на мрежи."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Извършва се регистрация на <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM картата ви не позволява връзка с тази мрежа."</string>
     <string name="connect_later" msgid="2308119155752343975">"В момента не може да се осъществи връзка с тази мрежа. Опитайте отново по-късно."</string>
     <string name="registration_done" msgid="495135664535876612">"Регистрация в мрежа."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Избиране на мрежов оператор"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Търсене на всички налични мрежи"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Автоматично избиране на мрежа"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Мрежа"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Регистрира се автоматично..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Предпочитан тип мрежа"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Промяна на операционния режим на мрежата"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Предпочитан тип мрежа"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(забранена)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Предпочита се GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Само GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Това може да доведе до високи такси."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Да се разреши ли роуминг на данни?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Използване на данни"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> мобилни данни са използвани за периода <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> мобилни данни са използвани за периода <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Разширени"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Оператор"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"оператор, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Мобилни данни"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Мобилни данни"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Достъп до данните през мобилната мрежа"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Да се изключат ли мобилните данни?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Изборът е задължителен"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Да се промени ли SIM за данни?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Да се използва ли <xliff:g id="NEW_SIM">%1$s</xliff:g> вместо <xliff:g id="OLD_SIM">%2$s</xliff:g> за пренос на мобилни данни?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Обаждания през Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Видеообаждания от оператора"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Опции за GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Няма мобилна мрежа. Свържете се с безжична, за да се обадите."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"За да извършите обаждане, въведете валиден номер."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Обаждането не бе успешно."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Понастоящем обаждането не може да бъде добавено."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Обаждането не може да бъде добавено сега. Може да се опитате да се свържете чрез изпращане на съобщение."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Услугата не се поддържа"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Обажданията не могат да се превключат."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Обаждането не може да се отдели."</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index ff79af3..2823559 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"ভয়েসমেল (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"বিজ্ঞপ্তি"</string>
-    <string name="networks" msgid="8873030692174541976">"নেটওয়ার্ক অপারেটর"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"জরুরী সম্প্রচার"</string>
     <string name="call_settings" msgid="6112441768261754562">"কল সেটিংস"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"অতিরিক্ত সেটিংস"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"কোনো নেটওয়ার্ক পাওয়া যায়নি৷"</string>
-    <string name="search_networks" msgid="1601136049300882441">"নেটওয়ার্কগুলি খুঁজুন"</string>
     <string name="network_query_error" msgid="6828516148953325006">"নেটওয়ার্কগুলির জন্য অনুসন্ধান করার সময় ত্রুটি৷"</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> এ নিবন্ধিত করা হচ্ছে…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"আপনার সিম কার্ড এই নেটওয়ার্কে সংযোগ স্থাপনের অনুমতি দেয় না৷"</string>
     <string name="connect_later" msgid="2308119155752343975">"এই মুহূর্তে এই নেটওয়ার্কের সাথে সংযোগ স্থাপন করা যাচ্ছে না৷ পরে আবার চেষ্টা করুন৷"</string>
     <string name="registration_done" msgid="495135664535876612">"নেটওয়ার্কে নিবন্ধিত করা হয়েছে৷"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"একটি নেটওয়ার্ক অপারেটর বেছে নিন"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"সমস্ত উপলব্ধ নেটওয়ার্কের জন্য খুঁজুন"</string>
     <string name="select_automatically" msgid="1046727200631770962">"স্বয়ংক্রিয়ভাবে নেটওয়ার্ক বেছে নিন"</string>
     <string name="network_select_title" msgid="7733107364757544558">"নেটওয়ার্ক"</string>
     <string name="register_automatically" msgid="6017849844573519637">"স্বয়ংক্রিয় নিবন্ধীকরণ..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"পছন্দের নেটওয়ার্ক"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"নেটওয়ার্ক অপারেটিং মোড পরিবর্তন করুন"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"পছন্দের নেটওয়ার্ক"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(নিষিদ্ধ)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA ব্যবহার করতে চাই"</item>
     <item msgid="8442633436636425221">"শুধুমাত্র GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"আপনাকে উল্লেখযোগ্য পরিমাণে চার্জ করা হতে পারে৷"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"ডেটা রোমিংয়ের অনুমতি দেবেন?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ডেটার ব্যবহার"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> এর মধ্যে <xliff:g id="ID_1">%1$s</xliff:g> মোবাইল ডেটা ব্যবহার করা হয়েছে"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> এর মধ্যে <xliff:g id="ID_1">%1$s</xliff:g> মোবাইল ডেটা ব্যবহার করা হয়েছে"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"উন্নত"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"পরিষেবা প্রদানকারী"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"পরিষেবা প্রদানকারী, ই-সিম, সিম, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"মোবাইল ডেটা"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"মোবাইল ডেটা"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"মোবাইল নেটওয়ার্ক ব্যবহার করে ডেটা অ্যাক্সেস করুন"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"মোবাইল ডেটা বন্ধ করবেন?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"নির্বাচন করার প্রয়োজন"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"ডেটা সিম পরিবর্তন করবেন?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"মোবাইল ডেটার জন্য <xliff:g id="OLD_SIM">%2$s</xliff:g> এর বদলে <xliff:g id="NEW_SIM">%1$s</xliff:g> ব্যবহার করবেন?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"ওয়াই-ফাই কলিং"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"পরিষেবা প্রদানকারীর ভিডিও কলিং"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS বিকল্পগুলি"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"মোবাইল নেটওয়ার্ক উপলব্ধ নেই৷ একটি কল করতে কোনো ওয়্যারলেস নেটওয়ার্কে সংযোগ করুন৷"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"কোনো কল স্থাপন করতে, একটি বৈধ নম্বর লিখুন৷"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"কল ব্যর্থ হয়েছে৷"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"এই মুহূর্তে কল যোগ করা যাবে না৷"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"এই সময়ে কলটি যোগ করা যাবে না। আপনি একটি মেসেজ পাঠিয়ে যোগাযোগ করার চেষ্টা করতে পারেন।"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"পরিষেবা সমর্থিত নয়"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"কলগুলি স্যুইচ করা যাবে না৷"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"কল আলাদা করা যাবে না৷"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index b91641e..000469d 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -66,7 +66,7 @@
     <string name="phone_accounts_ask_every_time" msgid="4346499067149985702">"Prvo pitaj"</string>
     <string name="phone_accounts_default_account_label" msgid="4183772241814460014">"Nema dostupnih mreža"</string>
     <string name="phone_accounts_settings_header" msgid="4141710640883261094">"Postavke"</string>
-    <string name="phone_accounts_choose_accounts" msgid="5232948804226424002">"Izaberi račune"</string>
+    <string name="phone_accounts_choose_accounts" msgid="5232948804226424002">"Odaberi račune"</string>
     <string name="phone_accounts_selection_header" msgid="1365215726106915865">"Telefonski računi"</string>
     <string name="phone_accounts_add_sip_account" msgid="2023821743341923271">"Dodaj SIP račun"</string>
     <string name="phone_accounts_configure_account_settings" msgid="1361715069911607109">"Konfiguriraj postavke računa"</string>
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Govorna pošta (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"GP:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Obavještenja"</string>
-    <string name="networks" msgid="8873030692174541976">"Mrežni operateri"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Hitna emitiranja"</string>
     <string name="call_settings" msgid="6112441768261754562">"Postavke poziva"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Dodatne postavke"</string>
@@ -147,7 +146,7 @@
     <string name="fw_change_failed" msgid="5298103228470214665">"Nije moguće promijeniti broj za preusmjeravanje.\nObratite se svom operateru ako se ovaj problem nastavi."</string>
     <string name="fw_get_in_vm_failed" msgid="8862896836093833973">"Nije moguće preuzeti i sačuvati trenutne postavke broja za preusmjeravanje.\nŽelite li i dalje preći na novu mrežu?"</string>
     <string name="no_change" msgid="3186040086622435212">"Nisu izvršene promjene."</string>
-    <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Izaberite uslugu govorne pošte"</string>
+    <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Odaberite uslugu govorne pošte"</string>
     <string name="voicemail_default" msgid="2001233554889016880">"Vaš operater"</string>
     <string name="vm_change_pin_old_pin" msgid="7295220109886682573">"Stari PIN"</string>
     <string name="vm_change_pin_new_pin" msgid="5412922262839438097">"Novi PIN"</string>
@@ -159,23 +158,17 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nije pronađena nijedna mreža."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Pretraži mreže"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Greška prilikom traženja mreža."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registriranje na <xliff:g id="NETWORK">%s</xliff:g> u toku…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Vaša SIM kartica ne dozvoljava povezivanje na ovu mrežu."</string>
     <string name="connect_later" msgid="2308119155752343975">"Trenutno nije moguće povezati se s ovom mrežom. Pokušajte ponovo kasnije."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrirano na mrežu."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Odaberite operatera"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Traži sve dostupne mreže"</string>
-    <!-- no translation found for select_automatically (1046727200631770962) -->
-    <skip />
-    <!-- no translation found for network_select_title (7733107364757544558) -->
-    <skip />
+    <string name="select_automatically" msgid="1046727200631770962">"Automatski odaberi mrežu"</string>
+    <string name="network_select_title" msgid="7733107364757544558">"Mreža"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatska registracija u toku…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Preferirana vrsta mreže"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Promijeni način rada mreže"</string>
@@ -212,37 +205,35 @@
     <item msgid="1524224863879435516">"Samo GSM"</item>
     <item msgid="3817924849415716259">"Preferiraj GSM/WCDMA"</item>
   </string-array>
-    <!-- no translation found for call_category (5863978196309462052) -->
-    <skip />
-    <!-- no translation found for network_operator_category (4830701959205735636) -->
-    <skip />
+    <string name="call_category" msgid="5863978196309462052">"Pozivanje"</string>
+    <string name="network_operator_category" msgid="4830701959205735636">"Mreža"</string>
     <string name="enhanced_4g_lte_mode_title" msgid="522191650223239171">"Poboljšani 4G LTE način rada"</string>
     <string name="enhanced_4g_lte_mode_title_variant" msgid="4871126028907265406">"Napredno pozivanje"</string>
     <string name="enhanced_4g_lte_mode_summary" msgid="2332175070522125850">"Koristi LTE usluge za poboljšanje glasovne i drugih komunikacija (preporučeno)"</string>
     <string name="data_enabled" msgid="5972538663568715366">"Podaci su omogućeni"</string>
     <string name="data_enable_summary" msgid="2382798156640007971">"Dozvoli korištenje podataka"</string>
     <string name="dialog_alert_title" msgid="6751344986194435476">"Pažnja"</string>
-    <!-- no translation found for roaming (7894878421600247140) -->
-    <skip />
+    <string name="roaming" msgid="7894878421600247140">"Roming"</string>
     <string name="roaming_enable" msgid="7331106985174381987">"Povezivanje na usluge prijenosa podataka u romingu"</string>
     <string name="roaming_disable" msgid="1843417228755568110">"Povezivanje na usluge prijenosa podataka u romingu"</string>
     <string name="roaming_reenable_message" msgid="8913735676127858115">"Izgubili ste podatkovnu vezu jer ste napustili matičnu mrežu dok je roming podataka isključen."</string>
     <string name="roaming_warning" msgid="1603164667540144353">"Može dovesti do značajnih troškova."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Dozvoliti roming podataka?"</string>
-    <!-- no translation found for data_usage_title (8759619109516889802) -->
-    <skip />
-    <!-- no translation found for data_usage_template (8065650945732671045) -->
-    <skip />
+    <string name="data_usage_title" msgid="8759619109516889802">"Prijenos podataka"</string>
+    <string name="data_usage_template" msgid="8065650945732671045">"Iskorišteno je <xliff:g id="ID_1">%1$s</xliff:g> prijenosa podataka u periodu od <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Napredno"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operater"</string>
+    <!-- no translation found for keywords_carrier_settings_euicc (783429609643157743) -->
+    <skip />
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <!-- no translation found for mobile_data_settings_title (3273340917802377121) -->
-    <skip />
-    <!-- no translation found for mobile_data_settings_summary (5087255915840576895) -->
-    <skip />
-    <!-- no translation found for wifi_calling_settings_title (7741961465416430470) -->
-    <skip />
-    <!-- no translation found for video_calling_settings_title (539714564273795574) -->
-    <skip />
+    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Prijenos mobilnih podataka"</string>
+    <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Pristup prijenosu podataka mobilnom mrežom"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Isključiti prijenos mobilnih podataka?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Potreban izbor"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Promijeniti podatkovni SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Koristiti SIM karticu <xliff:g id="NEW_SIM">%1$s</xliff:g> umjesto SIM kartice <xliff:g id="OLD_SIM">%2$s</xliff:g> za prijenos mobilnih podataka?"</string>
+    <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi pozivanje"</string>
+    <string name="video_calling_settings_title" msgid="539714564273795574">"Operater video pozivanja"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS opcije"</string>
     <string name="cdma_options" msgid="4016822858172249884">"CDMA opcije"</string>
     <string name="throttle_data_usage" msgid="3715677828160555808">"Korištenje podataka"</string>
@@ -607,4 +598,18 @@
     <string name="change_pin_confirm_pins_dont_match" msgid="4795052654904027909">"PIN-ovi se ne podudaraju"</string>
     <string name="change_pin_succeeded" msgid="2022852286442211151">"PIN govorne pošte je ažuriran"</string>
     <string name="change_pin_system_error" msgid="8308462387154257840">"Nije moguće postaviti PIN"</string>
+    <string name="mobile_data_status_roaming_turned_off_subtext" msgid="935636805765823307">"Roming podataka je isključen"</string>
+    <string name="mobile_data_status_roaming_turned_on_subtext" msgid="1335176927083781041">"Roming podataka je uključen"</string>
+    <string name="mobile_data_status_roaming_without_plan_subtext" msgid="3568412513831673037">"Trenutno u romingu, potreban je plan za podatke"</string>
+    <string name="mobile_data_status_roaming_with_plan_subtext" msgid="8721998948811064377">"Trenutno u romingu, plan za podatke je aktivan"</string>
+    <string name="mobile_data_status_no_plan_subtext" msgid="4887747337017565725">"Nema preostalih mobilnih podataka"</string>
+    <string name="mobile_data_activate_prepaid" msgid="7447025165850512683">"Nema preostalih mobilnih podataka"</string>
+    <string name="mobile_data_activate_prepaid_summary" msgid="5705389791791637666">"Dodajte mobilne podatke pomoću pružaoca usluga <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+    <string name="mobile_data_activate_roaming_plan" msgid="5998161536947086264">"Nema plana za roming"</string>
+    <string name="mobile_data_activate_roaming_plan_summary" msgid="511202908883425459">"Dodajte plan za roming pomoću pružaoca usluga <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+    <string name="mobile_data_activate_footer" msgid="5979019929980140594">"Možete dodati mobilne podatke ili plan za roming pomoću operatera, <xliff:g id="PROVIDER_NAME">%s</xliff:g>."</string>
+    <string name="mobile_data_activate_diag_title" msgid="9044252207707864493">"Dodati podatke?"</string>
+    <string name="mobile_data_activate_diag_message" msgid="8216154678758451453">"Možda ćete morati dodati podatke preko pružaoca usluga <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+    <string name="mobile_data_activate_button" msgid="3682400969184405446">"DODAJTE PODATKE"</string>
+    <string name="mobile_data_activate_cancel_button" msgid="1708022171547398765">"OTKAŽI"</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 0658fa1..fa56382 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Bústia de veu (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"CV:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notificacions"</string>
-    <string name="networks" msgid="8873030692174541976">"Operadors de xarxa"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Missatges d\'emergència"</string>
     <string name="call_settings" msgid="6112441768261754562">"Configuració de trucada"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Configuració addicional"</string>
@@ -154,30 +153,27 @@
     <string name="vm_change_pin_progress_message" msgid="3977357361934350336">"Espera un moment."</string>
     <string name="vm_change_pin_error_too_short" msgid="5974971097302710497">"El PIN nou és massa curt."</string>
     <string name="vm_change_pin_error_too_long" msgid="8476870806115051865">"El PIN nou és massa llarg."</string>
-    <string name="vm_change_pin_error_too_weak" msgid="7883744811891784882">"El PIN nou no és prou segur. Les contrasenyes segures no poden contenir seqüències contínues ni dígits repetits."</string>
+    <string name="vm_change_pin_error_too_weak" msgid="7883744811891784882">"El PIN nou no és prou segur. Les contrasenyes segures no poden contenir dígits repetits ni consecutius."</string>
     <string name="vm_change_pin_error_mismatch" msgid="2754685537970757317">"El PIN antic no coincideix."</string>
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"No s\'ha trobat cap xarxa."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Cerca xarxes"</string>
     <string name="network_query_error" msgid="6828516148953325006">"S\'ha produït un error en cercar xarxes."</string>
     <string name="register_on_network" msgid="9055203954040805084">"S\'està registrant a <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"La targeta SIM no et permet connectar-te a aquesta xarxa."</string>
     <string name="connect_later" msgid="2308119155752343975">"Ara mateix no es pot connectar a aquesta xarxa. Torna-ho a provar més tard."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrat a la xarxa."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Tria un operador de xarxa"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Cerca totes les xarxes disponibles"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Selecciona la xarxa automàticament"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Xarxa"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Registre automàtic..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tipus de xarxa preferit"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Canvia el mode de funcionament de la xarxa"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tipus de xarxa preferit"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(prohibit)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Mode GSM/WCDMA preferit"</item>
     <item msgid="8442633436636425221">"Només GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"És possible que se\'t facturin càrrecs elevats."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Permetre la itinerància de dades?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Ús de dades"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> de dades mòbils utilitzats durant el període <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Ús de dades mòbils en el període <xliff:g id="ID_2">%2$s</xliff:g>: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Configuració avançada"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operador de telefonia mòbil"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operador, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Dades mòbils"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Dades mòbils"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Accedeix a les dades amb una xarxa mòbil"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Vols desactivar les dades mòbils?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Has de seleccionar una preferència"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Vols canviar la SIM de dades?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Vols fer servir <xliff:g id="NEW_SIM">%1$s</xliff:g> en lloc de <xliff:g id="OLD_SIM">%2$s</xliff:g> per a les dades mòbils?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Trucades per Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videotrucades amb l\'operador de telefonia mòbil"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opcions de GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"La xarxa mòbil no està disponible. Per fer una trucada, connecta\'t a una xarxa sense fil."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Per realitzar una trucada, introdueix un número vàlid."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"No s\'ha pogut fer la trucada."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"En aquest moment no es pot afegir la trucada."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"En aquest moment no es pot afegir la trucada. Prova d\'enviar un missatge."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"El servei no és compatible."</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"No es pot canviar de trucada."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"No es pot separar la trucada."</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index f02e013..8ce0361 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -34,7 +34,7 @@
     <string name="ok" msgid="3811371167865772377">"OK"</string>
     <string name="audio_mode_speaker" msgid="27649582100085266">"Reproduktor"</string>
     <string name="audio_mode_earpiece" msgid="4156527186373869107">"Sluchátko"</string>
-    <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Kabelová náhlavní soupr."</string>
+    <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Kabelová sluchátka"</string>
     <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
     <string name="wait_prompt_str" msgid="7601815427707856238">"Odeslat následující tóny?\n"</string>
     <string name="pause_prompt_str" msgid="1789964702154314806">"Odesílání tónů\n"</string>
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Hlasová schránka (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"HS:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Oznámení"</string>
-    <string name="networks" msgid="8873030692174541976">"Síťoví operátoři"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Výstražné zprávy o výjimečné situaci"</string>
     <string name="call_settings" msgid="6112441768261754562">"Nastavení hovorů"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Další nastavení"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Žádná síť nebyla nalezena."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Vyhledávání sítí"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Při vyhledávání sítí došlo k chybě."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Probíhá registrace v síti <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Vaše SIM karta nepovoluje připojení k této síti."</string>
     <string name="connect_later" msgid="2308119155752343975">"K této síti se momentálně nelze přihlásit. Zkuste to znovu později."</string>
     <string name="registration_done" msgid="495135664535876612">"Přihlášení k síti bylo úspěšné."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Vybrat síťového operátora"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Hledat všechny dostupné sítě"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Vybírat síť automaticky"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Síť"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatická registrace..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Preferovaný typ sítě"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Změnit provozní režim sítě"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Preferovaný typ sítě"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(zakázáno)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA – preferováno"</item>
     <item msgid="8442633436636425221">"Pouze GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Mohou vám být účtovány vysoké poplatky."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Povolit datový roaming?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Využití dat"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"V období <xliff:g id="ID_2">%2$s</xliff:g> jste využili <xliff:g id="ID_1">%1$s</xliff:g> mobilních dat"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"V období <xliff:g id="ID_2">%2$s</xliff:g> jste využili <xliff:g id="ID_1">%1$s</xliff:g> mobilních dat"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Rozšířená nastavení"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operátor"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operátor, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobilní data"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobilní data"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Přistupovat k datům přes mobilní síť"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Vypnout mobilní data?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Vyžadován výběr"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Změnit SIM kartu pro data?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Chcete pro mobilní data místo SIM karty <xliff:g id="NEW_SIM">%1$s</xliff:g> používat SIM kartu <xliff:g id="OLD_SIM">%2$s</xliff:g>?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Volání přes Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videohovory přes operátora"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Možnosti GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobilní síť není k dispozici. Pokud chcete provést hovor, připojte se k bezdrátové síti."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Chcete-li uskutečnit hovor, zadejte platné telefonní číslo."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Volání se nezdařilo."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Hovor teď není možné přidat."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Hovor momentálně není možné přidat. Můžete místo toho zkusit poslat zprávu."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Služba není podporována."</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Hovory nelze přepnout."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Hovor nelze rozdělit."</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 51585a2..cff52ec 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Telefonsvarer (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Underretninger"</string>
-    <string name="networks" msgid="8873030692174541976">"Netværksudbydere"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Nødudsendelser"</string>
     <string name="call_settings" msgid="6112441768261754562">"Indstillinger for opkald"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Yderligere indstillinger"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Der blev ikke fundet nogen netværk."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Søg efter netværk"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Der opstod en fejl, mens der blev søgt efter netværk."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registrerer på <xliff:g id="NETWORK">%s</xliff:g> ..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Dit SIM-kort tillader ikke en forbindelse til dette netværk."</string>
     <string name="connect_later" msgid="2308119155752343975">"Der kan ikke oprettes forbindelse til dette netværk lige nu. Prøv igen senere."</string>
     <string name="registration_done" msgid="495135664535876612">"Registreret på netværket."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Vælg en netværksudbyder"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Søg efter alle tilgængelige netværk"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Vælg netværk automatisk"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Netværk"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatisk registrering..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Foretrukken netværkstype"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Skift netværksdriftstilstand"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Foretrukken netværkstype"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(forbudt)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA foretrækkes"</item>
     <item msgid="8442633436636425221">"Kun GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Du kan risikere at skulle betale høje gebyrer."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Vil du tillade dataroaming?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Dataforbrug"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobildata er brugt i perioden <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobildata er brugt i perioden <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avanceret"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Mobilselskab"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"mobilselskab, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobildata"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobildata"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Få adgang til data via mobilnetværk"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Vil du deaktivere mobildata?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Du har ikke valgt endnu"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Skift SIM-kortet til data?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Vil du bruge <xliff:g id="NEW_SIM">%1$s</xliff:g> i stedet for <xliff:g id="OLD_SIM">%2$s</xliff:g> til mobildata?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi-opkald"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videoopkald via mobilselskab"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Indstillinger for GSM/UMTS"</string>
@@ -488,7 +489,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobilnetværk er ikke tilgængeligt. Opret forbindelse til et trådløst netværk for at foretage et opkald."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Indtast et gyldigt nummer for at foretage et opkald."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Opkald mislykkedes."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Opkaldet kan ikke tilføjes på nuværende tidspunkt."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Opkaldet kan ikke tilføjes lige nu. Du kan prøve at sende en besked i stedet."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Tjenesten er ikke understøttet"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kan ikke skifte opkald."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kan ikke adskille opkald."</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 40f473a..fc0d730 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Mailbox (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"MB:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Benachrichtigungen"</string>
-    <string name="networks" msgid="8873030692174541976">"Mobilfunkanbieter"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Notfallbenachrichtigungen"</string>
     <string name="call_settings" msgid="6112441768261754562">"Anrufeinstellungen"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Zusätzliche Einstellungen"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Keine Netzwerke gefunden"</string>
-    <string name="search_networks" msgid="1601136049300882441">"Netzwerke suchen"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Fehler bei der Netzwerksuche"</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registrierung in <xliff:g id="NETWORK">%s</xliff:g> läuft..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Deine SIM-Karte unterstützt keine Verbindung mit diesem Netzwerk."</string>
     <string name="connect_later" msgid="2308119155752343975">"Momentan kann keine Verbindung zu diesem Netzwerk aufgebaut werden. Bitte versuche es später erneut."</string>
     <string name="registration_done" msgid="495135664535876612">"In Netzwerk registriert."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Mobilfunkanbieter auswählen"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Nach allen verfügbaren Netzwerken suchen"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Netzwerk automatisch auswählen"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Netzwerk"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatische Registrierung..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Bevorzugter Netzwerktyp"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Netzwerkbetriebsmodus ändern"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Bevorzugter Netzwerktyp"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(nicht zulässig)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA bevorzugt"</item>
     <item msgid="8442633436636425221">"Nur GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Es können hohe Gebühren anfallen."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Daten-Roaming zulassen?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Datennutzung"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobile Daten genutzt im Zeitraum <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Im Zeitraum <xliff:g id="ID_2">%2$s</xliff:g> genutzte mobile Daten: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Erweitert"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Mobilfunkanbieter"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"Anbieter, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobile Daten"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobile Daten"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Datenzugriff über Mobilfunknetz"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Mobile Daten deaktivieren?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Auswahl erforderlich"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"SIM für mobile Daten ändern?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"<xliff:g id="NEW_SIM">%1$s</xliff:g> anstelle von <xliff:g id="OLD_SIM">%2$s</xliff:g> für mobile Daten verwenden?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Anrufe über WLAN"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videoanrufe über Mobilfunkanbieter"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM-/UMTS-Optionen"</string>
@@ -486,7 +487,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Es ist kein Mobilfunknetz verfügbar. Stelle zum Telefonieren eine WLAN-Verbindung her."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Gib eine gültige Nummer ein."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Fehler beim Anruf."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Der Anruf kann momentan nicht hinzugefügt werden."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Der Anruf kann momentan nicht hinzugefügt werden. Versuche stattdessen, eine Nachricht zu senden."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Dienst wird nicht unterstützt"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Anruf kann nicht gewechselt werden."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Anruf kann nicht getrennt werden."</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 2fdd4d6..6a819dc 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Τηλεφωνητής (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ΑΤ:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Ειδοποιήσεις"</string>
-    <string name="networks" msgid="8873030692174541976">"Εταιρείες δικτύου"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Εκπομπές έκτακτης ανάγκης"</string>
     <string name="call_settings" msgid="6112441768261754562">"Ρυθμίσεις κλήσης"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Πρόσθετες ρυθμίσεις"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Δεν βρέθηκαν δίκτυα."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Αναζήτηση δικτύων"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Προέκυψε σφάλμα κατά την αναζήτηση δικτύων."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Εγγραφή στο δίκτυο <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Η κάρτα SIM δεν επιτρέπει τη σύνδεση με αυτό το δίκτυο."</string>
     <string name="connect_later" msgid="2308119155752343975">"Δεν είναι δυνατή η σύνδεση στο δίκτυο αυτήν τη στιγμή. Παρακαλούμε ξαναπροσπαθήστε αργότερα."</string>
     <string name="registration_done" msgid="495135664535876612">"Έγινε εγγραφή στο δίκτυο."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Επιλέξτε μια εταιρεία δικτύου"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Αναζήτηση διαθέσιμων δικτύων"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Αυτόματη επιλογή δικτύου"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Δίκτυο"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Αυτόματη εγγραφή..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Προτιμώμενος τύπος δικτύου"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Αλλαγή κατάστασης λειτουργίας δικτύου"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Προτιμώμενος τύπος δικτύου"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(απαγορευμένο)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Προτιμώνται GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Μόνο GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Ενδέχεται να επιβαρυνθείτε με σημαντικές χρεώσεις."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Να επιτρέπεται η περιαγωγή δεδομένων;"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Χρήση δεδομένων"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> δεδομένα κινητής τηλεφωνίας σε χρήση μεταξύ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> δεδομένα κινητής τηλεφωνίας σε χρήση μεταξύ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Σύνθετες ρυθμίσεις"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Εταιρεία κινητής τηλεφωνίας"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"εταιρεία κινητής τηλεφωνίας, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Δεδομένα κινητής τηλεφωνίας"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Δεδομένα κινητής τηλεφωνίας"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Πρόσβαση σε δεδομένα μέσω δικτύου κινητής τηλεφωνίας"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Απενεργοποίηση δεδομένων κινητής τηλεφωνίας;"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Απαιτείται επιλογή"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Αλλαγή SIM δεδομένων;"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Χρήση <xliff:g id="NEW_SIM">%1$s</xliff:g> αντί για <xliff:g id="OLD_SIM">%2$s</xliff:g> για τα δεδομένα κινητής τηλεφωνίας;"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Κλήσεις μέσω Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Βιντεοκλήση μέσω εταιρείας κινητής τηλεφωνίας"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Επιλογές GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Το δίκτυο κινητής τηλεφωνίας δεν είναι διαθέσιμο. Συνδεθείτε σε ένα ασύρματο δίκτυο για να πραγματοποιήσετε μια κλήση."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Για να πραγματοποιήσετε κλήση, εισαγάγετε έναν έγκυρο αριθμό."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Η κλήση απέτυχε."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Δεν είναι δυνατή η προσθήκη κλήσης αυτήν τη στιγμή."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Δεν είναι δυνατή η προσθήκη της κλήσης αυτήν τη στιγμή. Δοκιμάστε να επικοινωνήσετε με αποστολή μηνύματος."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Η υπηρεσία δεν υποστηρίζεται"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Δεν είναι δυνατή η εναλλαγή κλήσεων."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Δεν είναι δυνατός ο διαχωρισμός της κλήσης."</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index dc86577..fb47ff8 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notifications"</string>
-    <string name="networks" msgid="8873030692174541976">"Network operators"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Emergency broadcasts"</string>
     <string name="call_settings" msgid="6112441768261754562">"Call settings"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Additional settings"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"No networks found."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Search networks"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Error while searching for networks."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registering on <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Your SIM card doesn\'t allow a connection to this network."</string>
     <string name="connect_later" msgid="2308119155752343975">"Can\'t connect to this network at the moment. Try again later."</string>
     <string name="registration_done" msgid="495135664535876612">"Registered on network."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Choose a network operator"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Search for all available networks"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Automatically select network"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Network"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatic registration..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Preferred network type"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Change the network operating mode"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Preferred network type"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(forbidden)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA preferred"</item>
     <item msgid="8442633436636425221">"GSM only"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"You may incur significant charges."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Allow data roaming?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Data usage"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobile data used between <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobile data used <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Advanced"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operator"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"carrier, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobile data"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobile data"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Access data using mobile network"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Turn off mobile data?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Selection required"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Change data SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Use <xliff:g id="NEW_SIM">%1$s</xliff:g> instead of <xliff:g id="OLD_SIM">%2$s</xliff:g> for mobile data?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi calling"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Carrier video calling"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS Options"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobile network isn\'t available. Connect to a wireless network to make a call."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"To place a call, enter a valid number."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Call failed."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Call cannot be added at the moment."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Call cannot be added at this time. You can try to get in touch by sending a message."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Service not supported"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Can\'t switch calls."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Can\'t separate call."</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index dc86577..fb47ff8 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notifications"</string>
-    <string name="networks" msgid="8873030692174541976">"Network operators"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Emergency broadcasts"</string>
     <string name="call_settings" msgid="6112441768261754562">"Call settings"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Additional settings"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"No networks found."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Search networks"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Error while searching for networks."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registering on <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Your SIM card doesn\'t allow a connection to this network."</string>
     <string name="connect_later" msgid="2308119155752343975">"Can\'t connect to this network at the moment. Try again later."</string>
     <string name="registration_done" msgid="495135664535876612">"Registered on network."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Choose a network operator"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Search for all available networks"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Automatically select network"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Network"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatic registration..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Preferred network type"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Change the network operating mode"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Preferred network type"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(forbidden)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA preferred"</item>
     <item msgid="8442633436636425221">"GSM only"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"You may incur significant charges."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Allow data roaming?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Data usage"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobile data used between <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobile data used <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Advanced"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operator"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"carrier, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobile data"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobile data"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Access data using mobile network"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Turn off mobile data?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Selection required"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Change data SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Use <xliff:g id="NEW_SIM">%1$s</xliff:g> instead of <xliff:g id="OLD_SIM">%2$s</xliff:g> for mobile data?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi calling"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Carrier video calling"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS Options"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobile network isn\'t available. Connect to a wireless network to make a call."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"To place a call, enter a valid number."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Call failed."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Call cannot be added at the moment."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Call cannot be added at this time. You can try to get in touch by sending a message."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Service not supported"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Can\'t switch calls."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Can\'t separate call."</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index dc86577..fb47ff8 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notifications"</string>
-    <string name="networks" msgid="8873030692174541976">"Network operators"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Emergency broadcasts"</string>
     <string name="call_settings" msgid="6112441768261754562">"Call settings"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Additional settings"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"No networks found."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Search networks"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Error while searching for networks."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registering on <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Your SIM card doesn\'t allow a connection to this network."</string>
     <string name="connect_later" msgid="2308119155752343975">"Can\'t connect to this network at the moment. Try again later."</string>
     <string name="registration_done" msgid="495135664535876612">"Registered on network."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Choose a network operator"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Search for all available networks"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Automatically select network"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Network"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatic registration..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Preferred network type"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Change the network operating mode"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Preferred network type"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(forbidden)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA preferred"</item>
     <item msgid="8442633436636425221">"GSM only"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"You may incur significant charges."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Allow data roaming?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Data usage"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobile data used between <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobile data used <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Advanced"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operator"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"carrier, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobile data"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobile data"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Access data using mobile network"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Turn off mobile data?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Selection required"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Change data SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Use <xliff:g id="NEW_SIM">%1$s</xliff:g> instead of <xliff:g id="OLD_SIM">%2$s</xliff:g> for mobile data?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi calling"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Carrier video calling"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS Options"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobile network isn\'t available. Connect to a wireless network to make a call."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"To place a call, enter a valid number."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Call failed."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Call cannot be added at the moment."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Call cannot be added at this time. You can try to get in touch by sending a message."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Service not supported"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Can\'t switch calls."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Can\'t separate call."</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 5f77b7b..d493bce 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Buzón de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"Correo de voz:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notificaciones"</string>
-    <string name="networks" msgid="8873030692174541976">"Operadores de red"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Transmisiones de emergencia"</string>
     <string name="call_settings" msgid="6112441768261754562">"Configuración de llamadas"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Configuración adicional"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"No se encontraron redes."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Buscar redes"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Error al buscar redes."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registrando en <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Tu tarjeta SIM no permite una conexión con esta red."</string>
     <string name="connect_later" msgid="2308119155752343975">"No se puede establecer una conexión con la red en este momento. Vuelve a intentarlo más adelante."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrado en la red."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Elegir un operador de red"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Buscar todas las redes disponibles"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Seleccionar red de forma automática"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Red"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Registro automático…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tipo de red preferido"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Cambiar el modo operativo de la red"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tipo de red preferido"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(prohibido)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA preferido"</item>
     <item msgid="8442633436636425221">"Solo GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Puede ocasionar gastos importantes."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"¿Deseas permitir el roaming de datos?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Uso de datos"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Datos móviles usados entre <xliff:g id="ID_2">%2$s</xliff:g>: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Datos móviles usados: <xliff:g id="ID_1">%1$s</xliff:g>, <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avanzada"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Proveedor"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"proveedor, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Datos móviles"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Datos móviles"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Acceder a los datos usando la red móvil"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"¿Deseas desactivar los datos móviles?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Selección requerida"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"¿Cambiar SIM para datos?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"¿Deseas usar <xliff:g id="NEW_SIM">%1$s</xliff:g> en lugar de <xliff:g id="OLD_SIM">%2$s</xliff:g> para datos móviles?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Llamada con Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videollamada con el proveedor"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opciones de GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"La red móvil no está disponible. Conéctate a una red inalámbrica para realizar una llamada."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para realizar una llamada, ingresa un número válido."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Error en la llamada"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"No se puede agregar la llamada en este momento."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"No se puede agregar la llamada en este momento. Para comunicarte, puedes enviar un mensaje."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Servicio no compatible"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"No se puede cambiar llamadas."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"No se puede desviar la llamada."</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 3a8fabe..6f8359c 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Buzón de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"Buzón de voz:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notificaciones"</string>
-    <string name="networks" msgid="8873030692174541976">"Operadores de red"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Difusiones de emergencia"</string>
     <string name="call_settings" msgid="6112441768261754562">"Ajustes de llamadas"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Ajustes adicionales"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"No se ha encontrado ninguna red."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Buscar redes"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Se ha producido un error al buscar redes."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registrándose en <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"La tarjeta SIM no permite establecer conexión con esta red."</string>
     <string name="connect_later" msgid="2308119155752343975">"No se puede conectar a la red en este momento. Inténtalo de nuevo más tarde."</string>
     <string name="registration_done" msgid="495135664535876612">"Conexión con la red establecida"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Selecciona un operador de red"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Buscar todas las redes disponibles"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Seleccionar una red automáticamente"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Red"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Registro automático..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tipo de red preferida"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Cambiar el modo operativo de la red"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tipo de red preferida"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(prohibida)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Preferencia: GSM o WCDMA"</item>
     <item msgid="8442633436636425221">"Solo GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"El coste de este servicio puede ser significativo."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"¿Permitir itinerancia de datos?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Uso de datos"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Datos móviles utilizados entre el <xliff:g id="ID_2">%2$s</xliff:g>: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Se han utilizado <xliff:g id="ID_1">%1$s</xliff:g> en el periodo del <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avanzados"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operador"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operador, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>: <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Datos móviles"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Datos móviles"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Acceder a los datos con la red móvil"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"¿Quieres desactivar los datos móviles?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Debes seleccionar una opción"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"¿Cambiar la SIM de datos?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"¿Quieres usar la tarjeta <xliff:g id="NEW_SIM">%1$s</xliff:g> en lugar de <xliff:g id="OLD_SIM">%2$s</xliff:g> para los datos móviles?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Llamadas por Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videollamadas a través del operador"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opciones GSM/UMTS"</string>
@@ -486,7 +487,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"La red móvil no está disponible. Conéctate a una para llamar."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para realizar una llamada, introduce un número válido."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"No se ha podido llamar."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"No se puede añadir la llamada en este momento."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"No se puede realizar la llamada en estos momentos. Intenta ponerte en contacto mediante un mensaje."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Servicio no admitido"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"No se pueden intercambiar llamadas."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"No se pueden separar llamadas."</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index bc29aeb..73e1fa5 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Kõnepost (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"KP:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Märguanded"</string>
-    <string name="networks" msgid="8873030692174541976">"Võrguoperaatorid"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Hädaolukorra märguanded"</string>
     <string name="call_settings" msgid="6112441768261754562">"Kõneseaded"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Lisaseaded"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Võrke ei leitud."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Otsi võrke"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Viga võrkude otsimisel."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registreerimine võrku <xliff:g id="NETWORK">%s</xliff:g> ..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Teie SIM-kaart ei võimalda ühendust selle võrguga."</string>
     <string name="connect_later" msgid="2308119155752343975">"Võrguga ei saa praegu ühendust. Proovige hiljem uuesti."</string>
     <string name="registration_done" msgid="495135664535876612">"Võrku registreeritud."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Võrguoperaatori valimine"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Otsi kõiki saadaolevaid võrke"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Vali võrk automaatselt"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Võrk"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automaatne registreerimine ..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Eelistatud võrgutüüp"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Muuda võrgu töörežiimi"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Eelistatud võrgutüüp"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(keelatud)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Eelistatud: GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Ainult GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Lisanduda võivad suured tasud."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Kas lubada andmeside rändlus?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Andmekasutus"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Vahemikus <xliff:g id="ID_2">%2$s</xliff:g> on kasutatud <xliff:g id="ID_1">%1$s</xliff:g> mobiilset andmesidet"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Vahemikus <xliff:g id="ID_2">%2$s</xliff:g> on kasutatud <xliff:g id="ID_1">%1$s</xliff:g> mobiilset andmesidet"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Täpsemad"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operaator"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operaator, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobiilne andmeside"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobiilne andmeside"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Juurdepääs andmetele mobiilsidevõrgu abil"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Kas lülitada mobiilne andmeside välja?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Valik on tegemata"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Muuta andmeside SIM-kaarti?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Kas kasutada mobiilse andmeside puhul vana SIM-kaardi <xliff:g id="OLD_SIM">%2$s</xliff:g> asemel uut SIM-kaarti <xliff:g id="NEW_SIM">%1$s</xliff:g>?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"WiFi-kõned"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Operaatori videokõne"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM-i/UMTS-i valikud"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobiilsidevõrk pole saadaval. Helistamiseks looge ühendus traadita võrguga."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Helistamiseks sisestage kehtiv number."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Kõne ebaõnnestus."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Kõnet ei saa praegu lisada."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Kõnet ei saa praegu lisada. Proovige helistamise asemel sõnum saata."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Teenust ei toetata"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kõnesid ei saa vahetada."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kõnet ei saa eraldada."</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 489ea78..9dce3d4 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Erantzungailua (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"Erantzungailua:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Jakinarazpenak"</string>
-    <string name="networks" msgid="8873030692174541976">"Sare-operadoreak"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Larrialdietako igorpenak"</string>
     <string name="call_settings" msgid="6112441768261754562">"Deien ezarpenak"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Ezarpen gehigarriak"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Ez da sarerik aurkitu."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Bilatu sareak"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Errore bat gertatu da sareak bilatzean."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> sarean erregistratzen…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM txartelak ez dizu sare honetara konektatzea baimentzen."</string>
     <string name="connect_later" msgid="2308119155752343975">"Une honetan, ezin da sare horretara konektatu. Saiatu berriro geroago."</string>
     <string name="registration_done" msgid="495135664535876612">"Sarean erregistratuta."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Aukeratu sare-operadorea"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Bilatu sare erabilgarri guztiak"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Hautatu sarea automatikoki"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Sarea"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Erregistratze automatikoa…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Sare mota hobetsia"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Aldatu sarearen funtzionamendu modua"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Sare mota hobetsia"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(debekatuta)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA hobetsita"</item>
     <item msgid="8442633436636425221">"GSM soilik"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Baliteke kostu handiak ordaindu behar izatea."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Ibiltaritzako datuak baimendu nahi dituzu?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Datuen erabilera"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Datuen <xliff:g id="ID_1">%1$s</xliff:g> erabili dira data hauen artean: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Datuen <xliff:g id="ID_1">%1$s</xliff:g> erabili dira data hauen artean: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Ezarpen aurreratuak"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operadorea"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operadorea, esim, esim txartela, sim, sim txartela, euicc, euicc txartela"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>: <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Datu mugikorrak"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Datu mugikorrak"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Atzitu datuak datu-konexioaren bidez"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Datu-konexioa desaktibatu nahi duzu?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Hautatu egin behar da"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Datuetarako SIMa aldatu nahi duzu?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Datu-konexiorako, <xliff:g id="NEW_SIM">%1$s</xliff:g> txartela erabili nahi duzu <xliff:g id="OLD_SIM">%2$s</xliff:g> txartelaren ordez?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi bidezko deiak"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Operadorearen bideo-deiak"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS aukerak"</string>
@@ -488,7 +489,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Sare mugikorra ez dago erabilgarri. Deia egiteko, konektatu haririk gabeko sare batera."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Deitzeko, idatzi balio duen zenbaki bat."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Ezin izan da deitu."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Une honetan ezin da gehitu deirik."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Une honetan, ezin da egin deia. Deitu ordez, mezu bat bidaltzen saia zaitezke."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Ez da zerbitzua onartzen"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Ezin da deiz aldatu."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Ezin da deia bereizi."</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index b318bb1..45502d2 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"پست صوتی (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"اعلان‌ها"</string>
-    <string name="networks" msgid="8873030692174541976">"اپراتورهای شبکه"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"پخش هشدارهای اضطراری"</string>
     <string name="call_settings" msgid="6112441768261754562">"تنظیمات تماس"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"تنظیمات بیشتر"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"شبکه‌ای یافت نشد."</string>
-    <string name="search_networks" msgid="1601136049300882441">"جستجوی شبکه‌ها"</string>
     <string name="network_query_error" msgid="6828516148953325006">"خطا هنگام جستجو برای شبکه‌ها."</string>
     <string name="register_on_network" msgid="9055203954040805084">"در حال ثبت در <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"سیم کارت شما اجازه اتصال به این شبکه را نمی‌دهد."</string>
     <string name="connect_later" msgid="2308119155752343975">"اتصال به این شبکه در حال حاضر امکان‌پذیر نیست. بعداً دوباره امتحان کنید."</string>
     <string name="registration_done" msgid="495135664535876612">"در شبکه ثبت شد."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"انتخاب یک اپراتور شبکه"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"جستجوی همه شبکه‌های موجود"</string>
     <string name="select_automatically" msgid="1046727200631770962">"انتخاب خودکار شبکه"</string>
     <string name="network_select_title" msgid="7733107364757544558">"شبکه"</string>
     <string name="register_automatically" msgid="6017849844573519637">"ثبت خودکار..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"نوع شبکه برگزیده"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"تغییر حالت عملکرد شبکه"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"نوع شبکه برگزیده"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(ممنوع است)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"‏GSM/WCDMA برگزیده"</item>
     <item msgid="8442633436636425221">"‏فقط GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"شاید هزینه زیادی برای شما داشته باشد."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"رومینگ داده مجاز است؟"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"مصرف داده"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> داده تلفن همراه مصرف‌شده بین <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> داده تلفن همراه مصرف‌شده در <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"پیشرفته"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"شرکت مخابراتی"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"‏شرکت مخابراتی، esim،‏ sim،‏ euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"داده‌ تلفن همراه"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"داده تلفن همراه"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"دسترسی به داده‌ها با استفاده از شبکه تلفن همراه"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"داده تلفن همراه خاموش شود؟"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"انتخاب ضروری است"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"سیم‌کارت داده تغییر کند؟"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"برای داده تلفن همراه، از <xliff:g id="NEW_SIM">%1$s</xliff:g> به‌جای <xliff:g id="OLD_SIM">%2$s</xliff:g> استفاده شود؟"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"‏تماس ازطریق Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"تماس ویدیویی با شرکت مخابراتی"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"‏گزینه‌های GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"شبکه تلفن همراه دردسترس نیست. برای برقراری تماس به شبکه بی‌سیم متصل شوید."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"برای برقراری تماس، یک شماره معتبر وارد کنید."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"تماس ناموفق بود."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"فعلاً نمی‌توانید تماس اضافه کنید."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"درحال حاضر برقراری تماس امکان‌پذیر نیست. می‌توانید با ارسال پیام ارتباط برقرار کنید."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"سرویس پشتیبانی نمی‌شود"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"نمی‌توانید بین تماس‌ها جابجا شوید."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"نمی‌توانید تماس را جدا کنید."</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 56ffca4..012e352 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Puhelinvastaaja (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"Vast.:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Ilmoitukset"</string>
-    <string name="networks" msgid="8873030692174541976">"Verkko-operaattorit"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Hätätilalähetykset"</string>
     <string name="call_settings" msgid="6112441768261754562">"Puheluasetukset"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Lisäasetukset"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Ei verkkoja."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Verkkohaku"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Virhe haettaessa verkkoja."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Rekisteröidään verkkoon <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM-kortti ei anna muodostaa yhteyttä tähän verkkoon."</string>
     <string name="connect_later" msgid="2308119155752343975">"Tähän verkkoon ei saa yhteyttä juuri nyt. Yritä myöhemmin uudelleen."</string>
     <string name="registration_done" msgid="495135664535876612">"Rekisteröity verkkoon."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Valitse verkko-operaattori"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Etsi kaikki käytettävissä olevat verkot"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Valitse verkko automaattisesti"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Verkko"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automaattinen rekisteröinti..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Ensisijainen verkko"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Vaihda verkon käyttötilaa"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Ensisijainen verkko"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(kielletty)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Ensisijaisesti GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Vain GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Siitä voi aiheutua huomattavia kuluja."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Sallitaanko tiedonsiirto roaming-tilassa?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Datan käyttö"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobiilidataa käytetty <xliff:g id="ID_2">%2$s</xliff:g>."</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobiilidataa käytetty <xliff:g id="ID_2">%2$s</xliff:g>."</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Lisäasetukset"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operaattori"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operaattori, eSIM, SIM, eUICC"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobiilidata"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobiilidata"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Käytä dataa mobiiliverkon kautta."</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Poistetaanko mobiilidata käytöstä?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Valinta on pakollinen"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Vaihdetaanko tied.siirto-SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Käytetäänkö SIM-kortin <xliff:g id="NEW_SIM">%1$s</xliff:g> mobiilidataa kortin <xliff:g id="OLD_SIM">%2$s</xliff:g> sijaan?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi-puhelut"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videopuheluiden operaattori"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS-asetukset"</string>
@@ -486,7 +487,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobiiliverkko ei ole käytettävissä. Yhdistä langattomaan verkkoon, jos haluat soittaa puhelun."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Soita antamalla kelvollinen numero."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Puhelu epäonnistui."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Puhelua ei voi lisätä juuri nyt."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Puhelua ei voi lisätä juuri nyt. Voit sen sijaan yrittää lähettää viestin."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Palvelua ei tueta"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Puhelua ei voi vaihtaa."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Puhelua ei voi erottaa."</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 5ad08fc..ba372d6 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Messagerie vocale (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"MV :"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notifications"</string>
-    <string name="networks" msgid="8873030692174541976">"Opérateur de réseau"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Diffusions d\'urgence"</string>
     <string name="call_settings" msgid="6112441768261754562">"Paramètres d\'appel"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Autres paramètres"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Aucun réseau trouvé"</string>
-    <string name="search_networks" msgid="1601136049300882441">"Rechercher les réseaux"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Une erreur s\'est produite lors de la recherche de réseaux."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Enregistrement sur <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Votre carte SIM ne permet pas de vous connecter à ce réseau."</string>
     <string name="connect_later" msgid="2308119155752343975">"Impossible de se connecter à ce réseau pour le moment. Veuillez réessayer plus tard."</string>
     <string name="registration_done" msgid="495135664535876612">"Enregistré sur le réseau"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Sélectionner un opérateur réseau"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Chercher tous les réseaux disponibles"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Sélectionner automatiquement le réseau"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Réseau"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Enregistrement automatique…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Type de réseau préféré"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Changer le mode de fonctionnement du réseau"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Type de réseau préféré"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(interdit)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA de préférence"</item>
     <item msgid="8442633436636425221">"GSM uniquement"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Des frais importants peuvent s\'appliquer."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Autoriser les données en itinérance?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Utilisation de données"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> de données mobiles utilisées pendant la période suivante : <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> de données mobiles utilisées pendant la période suivante : <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avancés"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Opérateur"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"fournisseur de services, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Données mobiles"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Données mobiles"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Accéder aux données sur réseau cellulaire"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Désactiver les données mobiles?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Sélection requise"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Changer de SIM pour les données?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Utiliser la carte SIM <xliff:g id="NEW_SIM">%1$s</xliff:g> au lieu de la carte <xliff:g id="OLD_SIM">%2$s</xliff:g> pour les données mobiles?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Appels Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Appels vidéo par l\'entremise du fournisseur de services"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Options GSM/UMTS"</string>
@@ -486,7 +487,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Le réseau mobile n\'est pas accessible. Connectez-vous à un réseau sans fil pour effectuer un appel."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Pour faire un appel, entrez un numéro valide."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Échec de l\'appel."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Impossible d\'ajouter l\'appel pour le moment."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Impossible d\'ajouter l\'appel pour le moment. Vous pouvez essayer de joindre la personne en lui envoyant un message."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Service non pris en charge"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Impossible de faire des appels."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Impossible de séparer les appels."</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a2230b9..a95a939 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Mess. vocale (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"MV :"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notifications"</string>
-    <string name="networks" msgid="8873030692174541976">"Opérateurs de réseau"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Messages d\'urgence"</string>
     <string name="call_settings" msgid="6112441768261754562">"Paramètres d\'appel"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Autres paramètres"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Aucun réseau trouvé."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Rechercher les réseaux"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Une erreur s\'est produite lors de la recherche de réseaux."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Enregistrement sur <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Votre carte SIM ne permet pas de vous connecter à ce réseau."</string>
     <string name="connect_later" msgid="2308119155752343975">"Impossible de se connecter à ce réseau pour le moment. Veuillez réessayer ultérieurement."</string>
     <string name="registration_done" msgid="495135664535876612">"Enregistré sur le réseau."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Sélectionner un opérateur réseau"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Chercher tous les réseaux disponibles"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Sélectionner automatiquement le réseau"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Réseau"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Enregistrement automatique…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Type de réseau préféré"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Changer le mode de fonctionnement du réseau"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Type de réseau préféré"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(interdit)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA de préférence"</item>
     <item msgid="8442633436636425221">"GSM uniquement"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Des frais importants peuvent s\'appliquer."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Autoriser l\'itinérance des données ?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Consommation des données"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> de données mobiles utilisées pendant la période suivante : <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> de données mobiles utilisées pendant la période suivante : <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Paramètres avancés"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Opérateur"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"opérateur, eSIM, SIM, eUICC"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Données mobiles"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Données mobiles"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Accéder aux données via le réseau mobile"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Désactiver les données mobiles ?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Sélection requise"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Modifier la SIM des données ?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Utiliser la carte SIM <xliff:g id="NEW_SIM">%1$s</xliff:g> au lieu de la carte <xliff:g id="OLD_SIM">%2$s</xliff:g> pour les données mobiles ?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Appels Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Appels vidéo via l\'opérateur"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Options GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Le réseau mobile n\'est pas disponible. Connectez-vous à un réseau sans fil pour passer un appel."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Pour émettre un appel, veuillez saisir un numéro valide."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Échec de l\'appel."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Impossible d\'ajouter un appel pour le moment."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Impossible d\'ajouter un appel pour le moment. Essayez plutôt d\'envoyer un message."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Service incompatible"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Impossible de changer d\'appel."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Impossible d\'isoler l\'appel."</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index bc2634f..1e91d59 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Correo de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"CV:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notificacións"</string>
-    <string name="networks" msgid="8873030692174541976">"Operadores de rede"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Difusións de urxencia"</string>
     <string name="call_settings" msgid="6112441768261754562">"Configuración de chamada"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Configuración adicional"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Non se atopou ningunha rede."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Buscar redes"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Produciuse un erro durante a busca de redes."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Rexistrando en <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"A tarxeta SIM non permite unha conexión a esta rede."</string>
     <string name="connect_later" msgid="2308119155752343975">"Non se pode conectar con esta rede agora. Téntao de novo máis tarde."</string>
     <string name="registration_done" msgid="495135664535876612">"Rexistrado na rede"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Escolle un operador de rede"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Busca todas as redes dispoñibles"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Seleccionar rede automaticamente"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Rede"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Rexistro automático..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tipo de rede preferido"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Cambiar o modo de funcionamento da rede"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tipo de rede preferido"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(non permitido)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Preferencia: GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Só GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"É posible que se apliquen custos elevados."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Permitir a itinerancia de datos?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Uso de datos"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Datos móbiles usados no período do <xliff:g id="ID_2">%2$s</xliff:g>: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Datos móbiles usados no período do <xliff:g id="ID_2">%2$s</xliff:g>: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avanzado"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operador"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operador, eSIM, SIM, eUICC"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>: <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Datos móbiles"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Datos móbiles"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Acceder aos datos cunha rede móbil"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Queres desactivar os datos móbiles?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"É necesario seleccionar unha opción"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Queres cambiar a SIM de datos?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Queres usar a tarxeta <xliff:g id="NEW_SIM">%1$s</xliff:g> en lugar da <xliff:g id="OLD_SIM">%2$s</xliff:g> para os datos móbiles?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Chamadas por wifi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videochamadas do operador"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opcións de GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"A rede móbil non está dispoñible. Conéctate a unha rede sen fíos para facer unha chamada."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para realizar unha chamada, introduce un número válido."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Produciuse un erro na chamada."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Non se pode engadir a chamada neste momento."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Non se pode realizar a chamada neste momento. Podes tentar poñerte en contacto mediante unha mensaxe."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Servizo non compatible"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Non se poden cambiar as chamadas."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Non se pode separar a chamada."</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index e16bdfe..945d93b 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"વૉઇસમેઇલ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"સૂચનાઓ"</string>
-    <string name="networks" msgid="8873030692174541976">"નેટવર્ક ઓપરેટર્સ"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"કટોકટીના બ્રોડકાસ્ટ્સ"</string>
     <string name="call_settings" msgid="6112441768261754562">"કૉલ સેટિંગ્સ"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"વધારાની સેટિંગ્સ"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"કોઈ નેટવર્ક મળ્યું નથી."</string>
-    <string name="search_networks" msgid="1601136049300882441">"નેટવર્ક્સ શોધો"</string>
     <string name="network_query_error" msgid="6828516148953325006">"નેટવર્ક્સ શોધતી વખતે ભૂલ આવી."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> પર નોંધણી કરી રહ્યાં છે…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"તમારું SIM કાર્ડ આ નેટવર્કથી કનેક્શનને મંજૂરી આપતું નથી."</string>
     <string name="connect_later" msgid="2308119155752343975">"હમણાં આ નેટવર્કથી કનેક્ટ કરી શકાતું નથી. પછીથી ફરી પ્રયાસ કરો."</string>
     <string name="registration_done" msgid="495135664535876612">"નેટવર્ક પર નોંધણી કરી."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"એક નેટવર્ક ઓપરેટર પસંદ કરો"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"બધા ઉપલબ્ધ નેટવર્ક્સ માટે શોધો"</string>
     <string name="select_automatically" msgid="1046727200631770962">"નેટવર્ક આપમેળે પસંદ કરો"</string>
     <string name="network_select_title" msgid="7733107364757544558">"નેટવર્ક"</string>
     <string name="register_automatically" msgid="6017849844573519637">"સ્વયંચાલિત નોંધણી…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"પસંદગીનો નેટવર્ક પ્રકાર"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"નેટવર્ક ઓપરેટિંગ મોડ બદલો"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"પસંદગીનો નેટવર્ક પ્રકાર"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(પ્રતિબંધિત)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA પસંદ કરેલ છે"</item>
     <item msgid="8442633436636425221">"ફક્ત GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"તમારાથી આંશિક શુલ્ક લઈ શકાય છે."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"ડેટા રોમિંગને મંજૂરી આપીએ?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ડેટા વપરાશ"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> ની વચ્ચે <xliff:g id="ID_1">%1$s</xliff:g> મોબાઇલ ડેટાનો વપરાશ કરવામાં આવ્યો"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> મોબાઇલ ડેટાનો ઉપયોગ <xliff:g id="ID_2">%2$s</xliff:g> ના રોજ સુધી કરવામાં આવ્યો"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"વિગતવાર"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"કૅરિઅર"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"કૅરિઅર, ઇ-સિમ, સિમ, ઇયુઆઇસીસી"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"મોબાઇલ ડેટા"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"મોબાઇલ ડેટા"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"મોબાઇલ નેટવર્કનો વપરાશ કરીને ડેટા ઍક્સેસ કરો"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"મોબાઇલ ડેટા બંધ કરીએ?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"પસંદગી આવશ્યક છે"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"ડેટા SIM બદલીએ?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"મોબાઇલ ડેટા માટે <xliff:g id="OLD_SIM">%2$s</xliff:g> ને બદલે <xliff:g id="NEW_SIM">%1$s</xliff:g> નો ઉપયોગ કરીએ?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi કૉલિંગ"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"કેરિયર વિડિઓ કૉલિંગ"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS વિકલ્પો"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"મોબાઇલ નેટવર્ક ઉપલબ્ધ નથી. કૉલ કરવા માટે વાયરલેસ નેટવર્ક સાથે કનેક્ટ કરો."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"કૉલ કરવા માટે, માન્ય નંબર દાખલ કરો."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"કૉલ નિષ્ફળ થયો."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"આ સમયે કૉલ ઉમેરી શકાતો નથી."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"આ સમયે કૉલ ઉમેરી શકાતો નથી. તમે એક સંદેશ મોકલીને સંપર્ક કરવાનો પ્રયાસ કરી શકો છો."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"સેવા સમર્થિત નથી"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"કૉલ્સ સ્વિચ કરી શકાતા નથી."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"અલગ કૉલ કરી શકાતો નથી."</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 924d5b7..291616a 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"वॉइसमेल (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"नोटिफ़िकेशन"</string>
-    <string name="networks" msgid="8873030692174541976">"नेटवर्क ऑपरेटर"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"आपातकालीन प्रसारण"</string>
     <string name="call_settings" msgid="6112441768261754562">"कॉल सेटिंग"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"अतिरिक्त सेटिंग"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"कोई नेटवर्क नहीं मिला."</string>
-    <string name="search_networks" msgid="1601136049300882441">"नेटवर्क खोजें"</string>
     <string name="network_query_error" msgid="6828516148953325006">"नेटवर्क खोज के दौरान गड़बड़ी."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> पर पंजीकरण कर रहा है…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"आपका सिम कार्ड इस नेटवर्क पर कनेक्शन की अनुमति नहीं देता है."</string>
     <string name="connect_later" msgid="2308119155752343975">"अभी इस नेटवर्क से कनेक्ट नहीं कर सकते. बाद में पुन: प्रयास करें."</string>
     <string name="registration_done" msgid="495135664535876612">"नेटवर्क पर पंजीकृत."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"कोई नेटवर्क ऑपरेटर चुनें"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"सभी उपलब्ध नेटवर्क खोजें"</string>
     <string name="select_automatically" msgid="1046727200631770962">"अपने आप नेटवर्क चुनें"</string>
     <string name="network_select_title" msgid="7733107364757544558">"नेटवर्क"</string>
     <string name="register_automatically" msgid="6017849844573519637">"स्वचालित पंजीकरण..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"पसंदीदा नेटवर्क प्रकार"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"नेटवर्क संचालन मोड बदलें"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"पसंदीदा नेटवर्क प्रकार"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(मना है)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA पसंदीदा"</item>
     <item msgid="8442633436636425221">"केवल GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"आपको बहुत अधिक शुल्‍क देना पड़ सकता है."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"डेटा रोमिंग की अनुमति दें?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"डेटा उपयोग"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> के बीच <xliff:g id="ID_1">%1$s</xliff:g> मोबाइल डेटा का उपयोग किया गया"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> में <xliff:g id="ID_1">%1$s</xliff:g> मोबाइल डेटा का उपयोग किया गया"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"उन्नत"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"वाहक"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"वाहक, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"मोबाइल डेटा"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"मोबाइल डेटा"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"मोबाइल नेटवर्क का उपयोग करके डेटा एक्सेस करें"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"मोबाइल डेटा बंद करना चाहते हैं?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"चुनना ज़रूरी है"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"डेटा सिम बदलें?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"मोबाइल डेटा के लिए <xliff:g id="OLD_SIM">%2$s</xliff:g> के बजाय <xliff:g id="NEW_SIM">%1$s</xliff:g> का उपयोग करना चाहते हैं?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"वाई-फ़ाई कॉलिंग"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"वाहक वीडियो कॉलिंग"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS विकल्प"</string>
@@ -276,9 +277,9 @@
     <string name="enable_disable_administrative" msgid="6501582322182059412">"व्यवस्थापकीय"</string>
     <string name="administrative_enable" msgid="1750086122962032235">"व्यवस्थापकीय सक्षम किया गया"</string>
     <string name="administrative_disable" msgid="8433273857248698539">"व्यवस्थापकीय अक्षम किया गया"</string>
-    <string name="enable_disable_maintenance" msgid="1819693083025106678">"रखरखाव"</string>
-    <string name="maintenance_enable" msgid="8566636458770971189">"रखरखाव सक्षम किया गया"</string>
-    <string name="maintenance_disable" msgid="7340189100885066077">"रखरखाव अक्षम किया गया"</string>
+    <string name="enable_disable_maintenance" msgid="1819693083025106678">"रख-रखाव"</string>
+    <string name="maintenance_enable" msgid="8566636458770971189">"रख-रखाव सक्षम किया गया"</string>
+    <string name="maintenance_disable" msgid="7340189100885066077">"रख-रखाव अक्षम किया गया"</string>
     <string name="general_news_settings" msgid="4968779723948432978">"सामान्य समाचार"</string>
     <string name="bf_news_settings" msgid="3935593091894685267">"व्यवसाय और वित्तीय समाचार"</string>
     <string name="sports_news_settings" msgid="7649399631270052835">"खेल समाचार"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"मोबाइल नेटवर्क उपलब्‍ध नहीं है. कॉल करने के लिए किसी वायरलेस नेटवर्क से कनेक्‍ट करें."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"कॉल करने के लिए, मान्‍य नंबर डालें."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"कॉल विफल."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"इस समय कॉल नहीं जोड़ा जा सकता."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"अभी कॉल जोड़ा नहीं जा सकता. आप संदेश भेजकर संपर्क करने की कोशिश कर सकते हैं."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"सेवा समर्थित नहीं है"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"कॉल स्‍विच नहीं किए जा सकते."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"कॉल अलग नहीं किया जा सकता."</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index b611784..2849d4a 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Govorna pošta (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Obavijesti"</string>
-    <string name="networks" msgid="8873030692174541976">"Mrežni operateri"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Hitna emitiranja"</string>
     <string name="call_settings" msgid="6112441768261754562">"Postavke poziva"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Dodatne postavke"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nije pronađena mreža."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Pretraži mreže"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Pogreška tijekom pretraživanja mreža."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Prijava na <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Vaša SIM kartica ne dopušta povezivanje s ovom mrežom."</string>
     <string name="connect_later" msgid="2308119155752343975">"Povezivanje s tom mrežom trenutačno nije moguće. Pokušajte kasnije."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrirano na mreži."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Odaberite mrežnog operatera"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Pretraži sve dostupne mreže"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Automatski odaberi mrežu"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Mreža"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatska prijava…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Željena vrsta mreže"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Promijenite način rada mreže"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Željena vrsta mreže"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(zabranjeno)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Preporučeno: GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Samo GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"To se može skupo naplaćivati."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Želite li dopustiti roaming podataka?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Potrošnja podataka"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Potrošeno je <xliff:g id="ID_1">%1$s</xliff:g> mobilnih podataka u sljedećem razdoblju: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Potrošeno je <xliff:g id="ID_1">%1$s</xliff:g> mobilnih podataka u sljedećem razdoblju: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Napredno"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Davatelj usluge"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operater, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobilni podaci"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobilni podaci"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Pristupanje podacima pomoću mobilne mreže"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Želite li isključiti mobilne podatke?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Odabir je obvezan"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Promijeniti podatkovni SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Želite li za mobilne podatke upotrijebiti <xliff:g id="NEW_SIM">%1$s</xliff:g> umjesto <xliff:g id="OLD_SIM">%2$s</xliff:g>?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi pozivi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videopozivanje putem mobilnog operatera"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opcije za GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobilna mreža nije dostupna. Povežite se s bežičnom mrežom da biste uputili poziv."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Unesite važeći broj da biste uspostavili poziv."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Poziv nije uspio."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Poziv trenutačno nije moguć."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Poziv se trenutačno ne može dodati. Pokušajte poslati poruku."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Usluga nije podržana"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Prebacivanje poziva nije moguće."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Odvajanje poziva nije moguće."</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 266ad7f..ab240de 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Hangposta (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"HP:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Értesítések"</string>
-    <string name="networks" msgid="8873030692174541976">"Mobilszolgáltatók"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Sürgősségi adások"</string>
     <string name="call_settings" msgid="6112441768261754562">"Hívásbeállítások"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"További beállítások"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nem található hálózat."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Hálózatkeresés"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Hiba történt a hálózatok keresése közben."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Regisztrálás a(z) <xliff:g id="NETWORK">%s</xliff:g> hálózaton..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM kártyája nem teszi lehetővé a kapcsolódást ehhez a hálózathoz."</string>
     <string name="connect_later" msgid="2308119155752343975">"Most nem lehet csatlakozni a hálózathoz. Próbálja meg később."</string>
     <string name="registration_done" msgid="495135664535876612">"Regisztrálva a hálózaton."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Válassza ki a hálózat üzemeltetőjét"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Az összes elérhető hálózat megkeresése"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Hálózat automatikus kiválasztása"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Hálózat"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatikus regisztráció..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Preferált hálózattípus"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"A hálózati üzemmód megváltoztatása"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Preferált hálózattípus"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(tiltott)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA a preferált"</item>
     <item msgid="8442633436636425221">"Csak GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Lehet, hogy jelentős összeget számítanak fel érte."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Engedélyezi az adatbarangolást?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Adathasználat"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobiladat felhasználva a következő dátumok között: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobiladat felhasználva a következő dátumok között: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Speciális"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Szolgáltató"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"szolgáltató, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobiladatok"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobiladatok"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Adathozzáférés a mobilhálózaton keresztül"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Kikapcsolja a mobiladatokat?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Kijelölés szükséges"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Módosítja az adat SIM-kártyát?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"A(z) <xliff:g id="NEW_SIM">%1$s</xliff:g> SIM-kártyát szeretné használni a(z) <xliff:g id="OLD_SIM">%2$s</xliff:g> helyett mobiladat-kapcsolat esetén?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi-hívás"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Szolgáltatói videohívás"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS beállítások"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"A mobilhálózat nem érhető el. Hívás indításához csatlakozzon egy vezeték nélküli hálózathoz."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Hívásindításhoz adjon meg egy érvényes számot."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Sikertelen hívás."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Jelenleg nem lehet hívást indítani."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Jelenleg nem indítható hívás. Üzenet küldésével érheti el a másik felet."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"A szolgáltatás nem támogatott"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"A hívások közötti váltás sikertelen."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"A híváselkülönítés sikertelen."</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 13e9571..62b04d0 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Ձայնային փոստ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ՁՓ՝"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Ծանուցումներ"</string>
-    <string name="networks" msgid="8873030692174541976">"Կապի օպերատորներ"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Ծանուցումներ արտակարգ իրավիճակների մասին"</string>
     <string name="call_settings" msgid="6112441768261754562">"Զանգի կարգավորումներ"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Լրացուցիչ կարգավորումներ"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Ոչ մի ցանց չի գտնվել:"</string>
-    <string name="search_networks" msgid="1601136049300882441">"Որոնել ցանցեր"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Սխալ՝ ցանցերի որոնման ժամանակ"</string>
     <string name="register_on_network" msgid="9055203954040805084">"Գրանցվում է <xliff:g id="NETWORK">%s</xliff:g>-ում..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Ձեր SIM քարտը թույլ չի տալիս այս ցանցին միանալ:"</string>
     <string name="connect_later" msgid="2308119155752343975">"Հնարավոր չէ միանալ այս ցանցին հիմա: Կրկին փորձեք մի փոքր ուշ:"</string>
     <string name="registration_done" msgid="495135664535876612">"Գրանցված է ցանցում:"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Ընտրեք ցանցային օպերատորին"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Որոնել բոլոր հասանելի ցանցերը"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Ավտոմատ ընտրել ցանցը"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Ցանց"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Ավտոմատ գրանցում..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Ցանցի նախընտրելի տեսակը"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Փոխել ցանցային գործավար ռեժիմը"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Ցանցի նախընտրելի տեսակը"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(արգելված)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA նախընտրելի"</item>
     <item msgid="8442633436636425221">"Միայն GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Դրա համար ձեզանից կարող են խոշոր վճարներ գանձվել:"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Թույլատրե՞լ տվյալների ռոումինգը:"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Թրաֆիկի օգտագործում"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Oգտագործվել է <xliff:g id="ID_1">%1$s</xliff:g> բջջային ինտերնետ (<xliff:g id="ID_2">%2$s</xliff:g>)"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Oգտագործվել է <xliff:g id="ID_1">%1$s</xliff:g> բջջային ինտերնետ (<xliff:g id="ID_2">%2$s</xliff:g>)"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Լրացուցիչ"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Օպերատոր"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"օպերատոր, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Բջջային ինտերնետ"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Բջջային ինտերնետ"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Օգտվել բջջային ինտերնետից"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Անջատե՞լ բջջային ինտերնետը։"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Ընտրեք SIM քարտը"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Փոխե՞լ բջջային ինտերնետի SIM-ը"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Օգտագործե՞լ <xliff:g id="NEW_SIM">%1$s</xliff:g> քարտը <xliff:g id="OLD_SIM">%2$s</xliff:g> քարտի փոխարեն բջջային ինտերնետի համար:"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Զանգեր Wi-Fi-ի միջոցով"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Տեսազանգեր բջջային ցանցի միջոցով"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS ընտրանքներ"</string>
@@ -488,7 +489,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Բջջային ցանցն անհասանելի է: Զանգելու համար միացեք Wi-Fi ցանցին:"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Զանգ կատարելու համար մուտքագրեք ճիշտ համար:"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Զանգը ձախողվեց:"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Այս պահին հնարավոր չէ զանգել:"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Զանգն այս պահին հնարավոր չէ ավելացնել: Փորձեք հաղորդագրություն ուղարկել:"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Ծառայությունը չի աջակցվում"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Հնարավոր չէ փոխանջատել զանգը:"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Հնարավոր չէ առանձնացնել զանգը:"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 5985603..cdd93b7 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Kotak pesan (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notifikasi"</string>
-    <string name="networks" msgid="8873030692174541976">"Operator jaringan"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Siaran darurat"</string>
     <string name="call_settings" msgid="6112441768261754562">"Setelan panggilan"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Setelan tambahan"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Jaringan tidak ditemukan."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Telusuri jaringan"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Kesalahan ketika menelusuri jaringan."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Mendaftarkan pada <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Kartu SIM Anda tidak mengizinkan sambungan ke jaringan ini."</string>
     <string name="connect_later" msgid="2308119155752343975">"Tidak dapat terhubung ke jaringan ini sekarang. Coba lagi nanti."</string>
     <string name="registration_done" msgid="495135664535876612">"Terdaftar pada jaringan."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Pilih operator jaringan"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Telusuri semua jaringan yang tersedia"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Pilih jaringan secara otomatis"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Jaringan"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Pendaftaran otomatis..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Jenis jaringan yang dipilih"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Ubah mode pengoperasian jaringan"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Jenis jaringan yang dipilih"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(terlarang)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA lebih disukai"</item>
     <item msgid="8442633436636425221">"GSM saja"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Anda dapat dikenakan biaya yang cukup besar."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Izinkan roaming data?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Penggunaan data"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> data seluler digunakan antara <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> data seluler digunakan pada <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Lanjutan"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operator"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operator, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Data Seluler"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Data seluler"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Mengakses data menggunakan jaringan seluler"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Nonaktifkan data seluler?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Perlu memilih SIM"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Ubah SIM data?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Gunakan <xliff:g id="NEW_SIM">%1$s</xliff:g> dan bukan <xliff:g id="OLD_SIM">%2$s</xliff:g> untuk data seluler?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Panggilan Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Video call operator"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opsi GSM//UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Jaringan seluler tidak tersedia. Sambungkan ke jaringan nirkabel untuk melakukan panggilan."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Untuk melakukan panggilan telepon, masukkan nomor yang valid."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Telepon gagal."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Panggilan tidak dapat ditambahkan untuk saat ini."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Panggilan tidak bisa ditambahkan saat ini. Anda bisa mencoba menghubungi dengan mengirim pesan."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Layanan tidak didukung"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Tidak dapat berganti panggilan telepon."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Tidak dapat memisahkan panggilan telepon."</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 81ee9e8..1f87beb 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Talhólf (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"Talhólf:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Tilkynningar"</string>
-    <string name="networks" msgid="8873030692174541976">"Símafyrirtæki"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Neyðarútsendingar"</string>
     <string name="call_settings" msgid="6112441768261754562">"Símtalsstillingar"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Viðbótarstillingar"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Engin símkerfi fundust."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Leita að símkerfi"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Villa kom upp við símkerfaleit."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Skráning á <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM-kortið leyfir ekki tengingu við þetta símkerfi."</string>
     <string name="connect_later" msgid="2308119155752343975">"Ekki næst tenging við þetta kerfi á þessari stundu. Reyndu aftur síðar."</string>
     <string name="registration_done" msgid="495135664535876612">"Skráð á símkerfi."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Veldu símafyrirtæki"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Leita að öllum tiltækum símkerfum"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Velja netkerfi sjálfkrafa"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Netkerfi"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Sjálfvirk skráning…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Valin símkerfistegund"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Breyta virknihætti símkerfis"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Valin símkerfistegund"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(bannað)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA fyrsta val"</item>
     <item msgid="8442633436636425221">"GSM eingöngu"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Þetta getur haft mikinn kostnað í för með sér."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Leyfa gagnareiki?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Gagnanotkun"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> farsímagögn notuð á tímabilinu <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> af farsímagögnum notuð <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Ítarlegt"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Símafyrirtæki"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"símafyrirtæki, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Farsímagögn"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Farsímagögn"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Aðgangur að gögnum um farsímakerfi"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Slökkva á farsímagögnum?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Val er áskilið"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Skipta um SIM-kort fyrir gögn?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Nota <xliff:g id="NEW_SIM">%1$s</xliff:g> í stað <xliff:g id="OLD_SIM">%2$s</xliff:g> fyrir farsímagögn?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi símtöl"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Myndsímtöl um símkerfi"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Valkostir GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Farsímakerfi er ekki tiltækt. Tengstu þráðlausu neti til að hringja."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Sláðu inn gilt númer til að hringja símtal."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Tókst ekki að hringja."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Ekki er hægt að bæta símtali við sem stendur."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Ekki er hægt að bæta símtali við að svo stöddu. Þú getur reynt að hafa samband með því að senda skilaboð."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Þjónusta ekki studd"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Ekki hægt að skipta milli símtala."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Ekki hægt að aðskilja símtal."</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 87f3cf2..b96864a 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Segreteria (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ST:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notifiche"</string>
-    <string name="networks" msgid="8873030692174541976">"Operatori di rete"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Trasmissioni di emergenza"</string>
     <string name="call_settings" msgid="6112441768261754562">"Impostazioni chiamate"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Altre impostazioni"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nessuna rete trovata."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Cerca reti"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Errore durante la ricerca di reti."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registrazione su <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"La scheda SIM non consente la connessione a questa rete."</string>
     <string name="connect_later" msgid="2308119155752343975">"Impossibile connettersi a questa rete in questo momento. Riprova più tardi."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrato sulla rete."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Scegli un operatore di rete"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Cerca tutte le reti disponibili"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Seleziona automaticamente la rete"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Rete"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Registrazione automatica..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tipo di rete preferito"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Cambia la modalità di funzionamento della rete"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tipo di rete preferito"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(vietato)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA preferito"</item>
     <item msgid="8442633436636425221">"Solo GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"I costi potrebbero essere elevati."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Consentire il roaming dei dati?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Utilizzo dati"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Utilizzo dati del dispositivo mobile: <xliff:g id="ID_1">%1$s</xliff:g> nel periodo <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Utilizzo dati mobili: <xliff:g id="ID_1">%1$s</xliff:g> nel periodo <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avanzate"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operatore"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operatore, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> - <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Dati mobili"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Dati mobili"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Accedi ai dati tramite la rete mobile"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Disattivare i dati mobili?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Fai una scelta"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Cambiare la SIM per i dati?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Utilizzare <xliff:g id="NEW_SIM">%1$s</xliff:g> anziché <xliff:g id="OLD_SIM">%2$s</xliff:g> per i dati mobili?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Chiamate Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videochiamata dell\'operatore"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opzioni GSM/UMTS"</string>
@@ -486,7 +487,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"La rete cellulare non è disponibile. Connettiti a una rete wireless per effettuare una chiamata."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Per effettuare una chiamata, inserisci un numero valido."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Chiamata non riuscita."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Al momento non è possibile aggiungere la chiamata."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Impossibile aggiungere la chiamata al momento. Prova a inviare un messaggio."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Servizio non supportato"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Impossibile cambiare chiamata."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Impossibile separare la chiamata."</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 6f404ff..9e22e08 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"דואר קולי (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"דואר קולי:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"עדכונים"</string>
-    <string name="networks" msgid="8873030692174541976">"מפעילי רשת"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"שידורי חירום"</string>
     <string name="call_settings" msgid="6112441768261754562">"הגדרות שיחה"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"הגדרות נוספות"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"לא נמצאו רשתות."</string>
-    <string name="search_networks" msgid="1601136049300882441">"חפש רשתות"</string>
     <string name="network_query_error" msgid="6828516148953325006">"שגיאה במהלך חיפוש רשתות."</string>
     <string name="register_on_network" msgid="9055203954040805084">"נרשם ב-<xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"‏כרטיס ה-SIM לא מאפשר חיבור לרשת זו."</string>
     <string name="connect_later" msgid="2308119155752343975">"לא ניתן להתחבר לרשת זו כעת. נסה שוב מאוחר יותר."</string>
     <string name="registration_done" msgid="495135664535876612">"רשום ברשת."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"בחר ספק רשת"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"חפש את כל הרשתות הזמינות"</string>
     <string name="select_automatically" msgid="1046727200631770962">"בחירה אוטומטית של הרשת"</string>
     <string name="network_select_title" msgid="7733107364757544558">"רשת"</string>
     <string name="register_automatically" msgid="6017849844573519637">"רישום אוטומטי..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"סוג רשת מועדף"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"שנה את מצב ההפעלה של הרשת"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"סוג רשת מועדף"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(אסור)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"‏GSM/WCDMA מועדפת"</item>
     <item msgid="8442633436636425221">"‏GSM בלבד"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"ייתכנו שיעורי חיוב גבוהים."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"האם לאפשר נדידה?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"שימוש בחבילת הגלישה"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"השתמשת ב-<xliff:g id="ID_1">%1$s</xliff:g> מחבילת הגלישה בתאריכים <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"השתמשת ב-<xliff:g id="ID_1">%1$s</xliff:g> מחבילת הגלישה בתאריכים <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"הגדרות מתקדמות"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"ספק"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"‏ספק, esim, ‏sim‏, ‏euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"חבילת גלישה"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"חבילת גלישה"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"שימוש בחבילת הגלישה דרך הרשת הסלולרית"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"להשבית את חבילת הגלישה?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"עליך לבחור אפשרות"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"‏לשנות את ה-SIM של חבילת הגלישה?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"להשתמש בחבילת הגלישה ב-<xliff:g id="NEW_SIM">%1$s</xliff:g> במקום ב-<xliff:g id="OLD_SIM">%2$s</xliff:g>?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"‏שיחות Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"שיחות וידאו באמצעות הספק הסלולרי"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"‏אפשרויות GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"הרשת הסלולרית לא זמינה. עליך להתחבר לרשת אלחוטית כדי להתקשר."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"כדי להתקשר, הזן מספר טלפון חוקי."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"השיחה נכשלה."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"לא ניתן להוסיף את השיחה כרגע."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"לא ניתן להוסיף את השיחה כרגע. ניתן לנסות לשלוח הודעה."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"שירות לא נתמך"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"לא ניתן לעבור בין שיחות."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"לא ניתן להפריד שיחה."</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 41eff8c..1aeb37d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"ボイスメール(<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"通知"</string>
-    <string name="networks" msgid="8873030692174541976">"通信事業者"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"緊急速報メール"</string>
     <string name="call_settings" msgid="6112441768261754562">"通話設定"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"その他の設定"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"ネットワークが見つかりません。"</string>
-    <string name="search_networks" msgid="1601136049300882441">"ネットワークを検索"</string>
     <string name="network_query_error" msgid="6828516148953325006">"ネットワークの検索中にエラーが発生しました。"</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g>に登録中..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"お使いのSIMカードではこのネットワークに接続できません。"</string>
     <string name="connect_later" msgid="2308119155752343975">"現在このネットワークに接続できません。しばらくしてからもう一度お試しください。"</string>
     <string name="registration_done" msgid="495135664535876612">"ネットワークに登録されました。"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"通信事業者を選択する"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"利用可能なすべてのネットワークを検索する"</string>
     <string name="select_automatically" msgid="1046727200631770962">"ネットワークを自動的に選択"</string>
     <string name="network_select_title" msgid="7733107364757544558">"ネットワーク"</string>
     <string name="register_automatically" msgid="6017849844573519637">"自動登録..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"優先ネットワークタイプ"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"ネットワーク動作モードの変更"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"優先ネットワークタイプ"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(禁止)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM / WCDMA を優先"</item>
     <item msgid="8442633436636425221">"GSM のみ"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"高額な通信料が発生することがあります。"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"データ ローミングを許可しますか?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"データ使用量"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g>のモバイルデータ使用量: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> のモバイルデータ使用量: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"詳細設定"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"携帯通信会社"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"携帯通信会社、esim、sim、euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"モバイルデータ"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"モバイルデータ"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"モバイル ネットワーク経由でデータにアクセス"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"モバイルデータを OFF にしますか?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"選択してください"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"データ SIM を変更しますか?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"モバイルデータに <xliff:g id="OLD_SIM">%2$s</xliff:g> ではなく <xliff:g id="NEW_SIM">%1$s</xliff:g> を使用しますか?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi 通話"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"携帯通信会社のビデオ通話"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTSオプション"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"モバイル ネットワークを利用できません。電話をかけるにはワイヤレス ネットワークに接続してください。"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"発信するには、有効な番号を入力してください。"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"発信できませんでした。"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"現在、通話を追加できません。"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"現在、通話を追加できません。連絡するには、メッセージを送信してみてください。"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"サービスはサポートされていません"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"通話を切り替えられません。"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"通話を分割できません。"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 04f9721..0798e33 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"ხმოვანი ფოსტა (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"შეტყობინებები"</string>
-    <string name="networks" msgid="8873030692174541976">"ქსელის ოპერატორები"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"სასწრაფო გადაცემები"</string>
     <string name="call_settings" msgid="6112441768261754562">"ზარის პარამეტრები"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"დამატებითი პარამეტრები"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"ქსელები ვერ მოიძებნა."</string>
-    <string name="search_networks" msgid="1601136049300882441">"ქსელების ძიება"</string>
     <string name="network_query_error" msgid="6828516148953325006">"შეცდომა ქსელების ძიებისას."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g>-ზე რეგისტრაცია…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"თქვენი SIM ბარათი ამ ქსელთან კავშირის უფლებას არ იძლევა."</string>
     <string name="connect_later" msgid="2308119155752343975">"ამჟამად ქსელთან დაკავშირება ვერ ხერხდება. სცადეთ ისევ მოგვიანებით."</string>
     <string name="registration_done" msgid="495135664535876612">"რეგისტრირებულია ქსელში."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"აირჩიეთ ქსელის ოპერატორი"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"ყველა ხელმისაწვდომი ქსელების მოძიება"</string>
     <string name="select_automatically" msgid="1046727200631770962">"ქსელის ავტომატურად არჩევა"</string>
     <string name="network_select_title" msgid="7733107364757544558">"ქსელი"</string>
     <string name="register_automatically" msgid="6017849844573519637">"ავტომატური რეგისტრაცია…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ქსელის სასურველი ტიპი"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"ქსელის ოპერირების რეჟიმის შეცვლა"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ქსელის სასურველი ტიპი"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(აკრძალული)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA უპირატესობით"</item>
     <item msgid="8442633436636425221">"მხოლოდ GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"თქვენ შეიძლება წარმოგეშვათ მნიშვნელოვანი ხარჯები."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"გსურთ, ჩაირთოს ინტერნეტის როუმინგი?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"მონაცემთა გამოყენება"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> მობილური ინტერნეტი გამოყენებულია <xliff:g id="ID_2">%2$s</xliff:g>-ში"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> მობილური ინტერნეტი გამოყენებულია: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"გაფართოებული"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"ოპერატორი"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"ოპერატორი, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"მობილური ინტერნეტი"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"მობილური ინტერნეტი"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"მობილურ ინტერნეტზე წვდომა მობილური ქსელის გამოყენებით"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"გსურთ მობილური ინტერნეტის გამორთვა?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"არჩევანი აუცილებელია"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"შეიცვალოს მობ.ინტერნეტის SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"გსურთ, მობილური ინტერნეტისთვის გამოიყენოთ <xliff:g id="NEW_SIM">%1$s</xliff:g> <xliff:g id="OLD_SIM">%2$s</xliff:g>-ის ნაცვლად?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi დარეკვა"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"ვიდეო დარეკვა ოპერატორით"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS ვარიანტები"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"მობილური ქსელი მიუწვდომელია. ზარის განსახორციელებლად დაუკავშირდით უსადენო ქსელს."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ზარის განხორციელებისათვის, შეიყვანეთ მოქმედი ნომერი."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"ზარი ვერ განხორციელდა."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"ამჯერად ზარის დამატება ვერ ხერხდება."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"ამჟამად ზარის დამატება შეუძლებელია. შეგიძლიათ სცადოთ დაკავშირება შეტყობინების გაგზავნით."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"მომსახურება არ არის მხარდაჭერილი"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ვერ ხორციელდება ზარების გადართვა."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ვერ ხორციელდება ზარის გამოყოფა."</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index bea220c..8944ebb 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Дауыстық пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ДХ:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Хабарландырулар"</string>
-    <string name="networks" msgid="8873030692174541976">"Желі операторлары"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Жедел таратылымдар"</string>
     <string name="call_settings" msgid="6112441768261754562">"Қоңырау параметрлері"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Қосымша параметрлер"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Ешқандай желілер табылмады."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Желілерді іздеу"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Желі іздеу барысында қателік орын алды."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> желісіне тіркелуде…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM картаңыз бұл желіге жалғануға рұқсат бермейді."</string>
     <string name="connect_later" msgid="2308119155752343975">"Дәл қазір бұл желіге жалғана алмайды. Кейінірек қайта әрекеттеніп көріңіз."</string>
     <string name="registration_done" msgid="495135664535876612">"Желіге тіркелді."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Желі операторын таңдау"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Барлық қол жетімді желілерді іздеу"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Желіні автоматты түрде таңдау"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Желі"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Aвтоматты тіркелу…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Қалаулы желі түрі"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Желі жұмысының режимін өзгерту"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Қалаулы желі түрі"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(тыйым салынған)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA таңдалған"</item>
     <item msgid="8442633436636425221">"Тек қана GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Қомақты ақы алынуы мүмкін."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Деректер роумингіне рұқсат берілсін бе?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Деректер трафигі"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> аралығында <xliff:g id="ID_1">%1$s</xliff:g> мобильдік дерек қолданылды"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> аралығында <xliff:g id="ID_1">%1$s</xliff:g> мобильдік дерек қолданылды"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Қосымша"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Оператор"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"оператор, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Мобильдік деректер"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Мобильдік деректер"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Деректерге мобильдік желі арқылы кіру"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Мобильдік байланысты өшіру қажет пе?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Таңдау қажет"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"SIM картасын ауыстыру қажет пе?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"<xliff:g id="OLD_SIM">%2$s</xliff:g> орнына <xliff:g id="NEW_SIM">%1$s</xliff:g> пайдалану қажет пе?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi қоңыраулары"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Оператор бейне қоңыраулары"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS опциялары"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Мобильдік желі қолжетімді емес. Қоңырау шалу үшін сымсыз желіге қосылыңыз."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Қоңырау шалу үшін жарамды нөмірді енгізіңіз."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Қоңырау шалынбады."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Қоңырауды қазіргі уақытта қосу мүмкін емес."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Қоңырауды қазір қосу мүмкін емес. Хабар жіберіп хабарласуға болады."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Қызметке қолдау көрсетілмейді"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Қоңырауларды ауыстыру мүмкін емес."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Қоңырауды бөлу мүмкін емес."</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 0754f72..c61d7e9 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"សារជាសម្លេង (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"ការ​ជូនដំណឹង"</string>
-    <string name="networks" msgid="8873030692174541976">"ប្រតិបត្តិ​ករ​​​បណ្ដាញ"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"ការ​ផ្សាយ​ពេល​មាន​អាសន្ន"</string>
     <string name="call_settings" msgid="6112441768261754562">"កំណត់​ការ​ហៅ"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"ការ​កំណត់​បន្ថែម"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"រក​មិន​ឃើញ​បណ្ដាញ។"</string>
-    <string name="search_networks" msgid="1601136049300882441">"ស្វែងរក​បណ្ដាញ"</string>
     <string name="network_query_error" msgid="6828516148953325006">"កំហុស​ខណៈ​ស្វែងរក​បណ្ដាញ។"</string>
     <string name="register_on_network" msgid="9055203954040805084">"ចុះឈ្មោះ​នៅ​លើ <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"មិន​អនុញ្ញាត​ឲ្យ​ស៊ីមកាត​របស់​អ្នក​តភ្ជាប់​ទៅ​បណ្ដាញ​នេះ​ទេ។"</string>
     <string name="connect_later" msgid="2308119155752343975">"មិន​អាច​តភ្ជាប់​ទៅ​បណ្ដាញ​ឥឡូវ​នេះ​បាន​ទេ។ ព្យាយាម​ម្ដងទៀត​ពេលក្រោយ។"</string>
     <string name="registration_done" msgid="495135664535876612">"បាន​ចុះឈ្មោះ​នៅ​លើ​បណ្ដាញ។"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"ជ្រើស​ប្រតិបត្តិ​ករ​​បណ្ដាញ"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"ស្វែងរក​បណ្ដាញ​ដែល​មាន​ទាំង​អស់"</string>
     <string name="select_automatically" msgid="1046727200631770962">"ជ្រើសរើស​បណ្ដាញ​ដោយស្វ័យប្រវត្តិ"</string>
     <string name="network_select_title" msgid="7733107364757544558">"បណ្ដាញ"</string>
     <string name="register_automatically" msgid="6017849844573519637">"ការ​ចុះ​ឈ្មោះ​ដោយ​ស្វ័យ​ប្រវត្តិ ..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ប្រភេទ​បណ្ដាញ​​ដែល​​ពេញចិត្ត"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"ប្ដូរ​របៀប​ប្រតិបត្តិការ​បណ្ដាញ"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ប្រភេទ​បណ្ដាញ​​ដែល​​ពេញចិត្ត"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(ហាម)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"ប្រើ GSM/WCDMA ជា​អាទិភាព"</item>
     <item msgid="8442633436636425221">"GSM ប៉ុណ្ណោះ"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"អាចនាំឲ្យមានការគិតប្រាក់ច្រើនពីអ្នក។"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"អនុញ្ញាតឲ្យរ៉ូមីងទិន្នន័យ?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ការ​ប្រើ​ប្រាស់ទិន្នន័យ"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> ទិន្នន័យ​ទូរសព្ទ​ដែល​បាន​ប្រើ​នៅ​ចន្លោះ​ថ្ងៃ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"បានប្រើទិន្នន័យទូរសព្ទអស់ <xliff:g id="ID_1">%1$s</xliff:g> នៅថ្ងៃទី <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"កម្រិតខ្ពស់"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"ក្រុមហ៊ុន​បម្រើ​សេវា​ទូរសព្ទ"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"carrier, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"ទិន្នន័យ​ទូរសព្ទចល័ត"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"ទិន្នន័យ​ទូរសព្ទចល័ត"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"ចូល​ប្រើប្រាស់​ទិន្នន័យ​តាម​បណ្ដាញ​​ទូរសព្ទ​ចល័ត"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"បិទទិន្នន័យ​​ទូរសព្ទ​ចល័ត?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"ជម្រើស​ដែល​ត្រូវមាន"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"ប្ដូរ​ស៊ីមទិន្នន័យ?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"ប្រើប្រាស់ <xliff:g id="NEW_SIM">%1$s</xliff:g> ជំនួសឲ្យ <xliff:g id="OLD_SIM">%2$s</xliff:g> សម្រាប់​ទិន្នន័យ​ទូរសព្ទ​ចល័ត​ដែរ​ឬ​ទេ?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"ការហៅ​ទូរសព្ទ​តាម Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"ការហៅវីដេអូ​តាម​ក្រុមផ្ដល់​សេវា​ទូរសព្ទ"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"ជម្រើស GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"មិនមានបណ្តាញទូរសព្ទទេ។ ភ្ជាប់ទៅបណ្តាញឥតខ្សែ ដើម្បី​អាច​ហៅ​ទូរសព្ទ​បាន។"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ដើម្បីធ្វើការហៅ បញ្ចូលលេខដែលមានសុពលភាព។"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"បាន​បរាជ័យ​ការ​ហៅ។"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"មិន​អាច​បន្ថែម​​​ការ​ហៅ​ទូរសព្ទ​នៅ​ពេល​នេះ​​បាន​ទេ។"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"មិន​អាច​បញ្ចូល​ការហៅបាន​ទេ​នៅពេល​នេះ។ អ្នក​អាច​ព្យាយាម​ទាក់ទង​​តាមរយៈ​ការផ្ញើសារ។"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"សេវាកម្មមិនត្រូវបានគាំទ្រទេ។"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"មិនអាចឆ្លាស់ការហៅបានទេ។"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"មិនអាចបំបែកការហៅបានទេ។"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index c3952c1..a829e8c 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"ಧ್ವನಿಮೇಲ್ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"ಅಧಿಸೂಚನೆಗಳು"</string>
-    <string name="networks" msgid="8873030692174541976">"ನೆಟ್‌ವರ್ಕ್‌ ಆಪರೇಟರ್‌ಗಳು"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"ತುರ್ತು ಪ್ರಸಾರಗಳು"</string>
     <string name="call_settings" msgid="6112441768261754562">"ಕರೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"ಹೆಚ್ಚುವರಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"ಯಾವುದೇ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ."</string>
-    <string name="search_networks" msgid="1601136049300882441">"ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಹುಡುಕಿ"</string>
     <string name="network_query_error" msgid="6828516148953325006">"ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗಾಗಿ ಹುಡುಕುತ್ತಿರುವಾಗ ದೋಷ."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> ನಲ್ಲಿ ನೋಂದಾಯಿಸಲಾಗುತ್ತಿದೆ…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"ಈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕವನ್ನು ನಿಮ್ಮ ಸಿಮ್‌ ಕಾರ್ಡ್‌ ಅನುಮತಿಸುವುದಿಲ್ಲ."</string>
     <string name="connect_later" msgid="2308119155752343975">"ಇದೀಗ ಈ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
     <string name="registration_done" msgid="495135664535876612">"ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ನೋಂದಾಯಿಸಲಾಗಿದೆ."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"ನೆಟ್‌ವರ್ಕ್‌ ಆಪರೇಟರ್‌ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"ಎಲ್ಲ ಲಭ್ಯವಿರುವ ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗಾಗಿ ಹುಡುಕಿ"</string>
     <string name="select_automatically" msgid="1046727200631770962">"ನೆಟ್‌ವರ್ಕ್‌ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="network_select_title" msgid="7733107364757544558">"ನೆಟ್‌ವರ್ಕ್"</string>
     <string name="register_automatically" msgid="6017849844573519637">"ಸ್ವಯಂಚಾಲಿತ ನೋಂದಣಿ…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ಬಯಸಿದ ನೆಟ್‌ವರ್ಕ್‌ ಪ್ರಕಾರ"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"ನೆಟ್‌ವರ್ಕ್‌ ಕಾರ್ಯಾಚರಣಾ ಮೋಡ್‌ ಬದಲಿಸಿ"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ಬಯಸಿದ ನೆಟ್‌ವರ್ಕ್‌ ಪ್ರಕಾರ"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(ನಿಷೇಧಿತ)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA ಗೆ ಪ್ರಾಶಸ್ತ್ಯ ನೀಡಲಾಗಿದೆ"</item>
     <item msgid="8442633436636425221">"GSM ಮಾತ್ರ"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"ನೀವು ಗಣನೀಯವಾಗಿ ಶುಲ್ಕಗಳನ್ನು ತೆರಬೇಕಾಗಬಹುದು."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"ಡೇಟಾ ರೋಮಿಂಗ್ ಅನುಮತಿಸುವುದೇ?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ಡೇಟಾ ಬಳಕೆ"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> ನಡುವೆ ಬಳಸಲಾದ ಮೊಬೈಲ್ ಡೇಟಾ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> ಬಳಸಲಾದ ಮೊಬೈಲ್ ಡೇಟಾ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"ಸುಧಾರಿತ"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"ವಾಹಕ"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"carrier, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"ಮೊಬೈಲ್ ಡೇಟಾ"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"ಮೊಬೈಲ್ ಡೇಟಾ"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ ಬಳಸಿ ಡೇಟಾ ಪ್ರವೇಶಿಸಿ"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್ ಮಾಡಬೇಕೆ?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"ಆಯ್ಕೆ ಅಗತ್ಯವಿದೆ"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"ಡೇಟಾ ಸಿಮ್‌ ಬದಲಾಯಿಸುವುದೇ?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"ಮೊಬೈಲ್ ಡೇಟಾಗೆ <xliff:g id="OLD_SIM">%2$s</xliff:g> ಬದಲಿಗೆ <xliff:g id="NEW_SIM">%1$s</xliff:g> ಬಳಸಬೇಕೆ?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"ವಾಹಕ ವೀಡಿಯೊ ಕರೆ ಮಾಡುವಿಕೆ"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS ಆಯ್ಕೆಗಳು"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್ ಲಭ್ಯವಿಲ್ಲ. ಕರೆ ಮಾಡಲು ವೈರ್‌ಲೆಸ್ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಿ."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ಕರೆಯನ್ನು ಮಾಡಲು, ಮಾನ್ಯವಾದ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"ಕರೆ ವಿಫಲವಾಗಿದೆ."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"ಕರೆಯನ್ನು ಈ ಸಮಯದಲ್ಲಿ ಸೇರಿಸಲಾಗುವುದಿಲ್ಲ."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"ಈ ಸಮಯದಲ್ಲಿ ಕರೆಯನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಸಂದೇಶವನ್ನು ಕಳುಹಿಸುವ ಮೂಲಕ ನೀವು ಸಂಪರ್ಕಿಸಲು ಪ್ರಯತ್ನಿಸಬಹುದು."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"ಸೇವೆಯು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ಕರೆಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ಕರೆಯನ್ನು ಪ್ರತ್ಯೇಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index c396ac7..60577d7 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"음성사서함(<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"알림"</string>
-    <string name="networks" msgid="8873030692174541976">"네트워크 운영자"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"긴급 방송"</string>
     <string name="call_settings" msgid="6112441768261754562">"통화 설정"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"추가 설정"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"네트워크를 찾을 수 없습니다."</string>
-    <string name="search_networks" msgid="1601136049300882441">"네트워크 검색"</string>
     <string name="network_query_error" msgid="6828516148953325006">"네트워크를 검색하는 동안 오류가 발생했습니다."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g>에 등록 중..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM 카드에서 이 네트워크에 연결할 수 없습니다."</string>
     <string name="connect_later" msgid="2308119155752343975">"현재 네트워크에 연결할 수 없습니다. 나중에 다시 시도해 주세요."</string>
     <string name="registration_done" msgid="495135664535876612">"네트워크에 등록되었습니다."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"네트워크 운영자 선택"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"사용 가능한 모든 네트워크 검색"</string>
     <string name="select_automatically" msgid="1046727200631770962">"네트워크 자동 선택"</string>
     <string name="network_select_title" msgid="7733107364757544558">"네트워크"</string>
     <string name="register_automatically" msgid="6017849844573519637">"자동 등록..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"기본 네트워크 유형"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"네트워크 작동 모드 변경"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"기본 네트워크 유형"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(금지됨)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA로 기본 설정"</item>
     <item msgid="8442633436636425221">"GSM 전용"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"많은 요금이 부과될 수 있습니다."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"데이터 로밍을 허용하시겠습니까?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"데이터 사용량"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> 기간에 사용된 모바일 데이터: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> 기간에 사용된 모바일 데이터: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"고급"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"이동통신사"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"이동통신사, eSIM, SIM, eUICC"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"모바일 데이터"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"모바일 데이터"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"모바일 네트워크를 사용하여 데이터 액세스"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"모바일 데이터를 사용 중지하시겠습니까?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"선택 필요"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"데이터 SIM을 변경하시겠습니까?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"모바일 데이터에 <xliff:g id="OLD_SIM">%2$s</xliff:g> 대신 <xliff:g id="NEW_SIM">%1$s</xliff:g>을(를) 사용하시겠습니까?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi 통화"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"이동통신사 화상 통화"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS 옵션"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"모바일 네트워크를 사용할 수 없습니다. 전화를 걸려면 무선 네트워크에 연결하세요."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"전화를 걸려면 올바른 번호를 입력하세요."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"전화 연결 실패"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"현재 통화를 추가할 수 없습니다."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"현재는 통화를 추가할 수 없습니다. 메시지를 보내 연락해 보세요."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"지원되지 않는 서비스입니다."</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"통화를 전환할 수 없습니다."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"통화를 분리할 수 없습니다."</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 6903e2c..db6c96c 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -79,7 +79,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Үн почтасы (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ҮП:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Эскертмелер"</string>
-    <string name="networks" msgid="8873030692174541976">"Тармактык операторлор"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Өзгөчө кырдаал тууралуу кулактандыруу"</string>
     <string name="call_settings" msgid="6112441768261754562">"Чалуу жөндөөлөрү"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Кошумча жөндөөлөр"</string>
@@ -160,26 +159,23 @@
     <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>
     <string name="load_networks_progress" msgid="5230707536168902952">"Изделүүдө…"</string>
     <string name="empty_networks_list" msgid="4249426905018815316">"Эч тармак табылган жок."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Тармактарды издөө"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Тармактарды издөө учурунда ката кетти."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> тармагына катталууда…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Сиздин SIM-картаңыз бул түйүнгө кошулганга жол бербейт."</string>
     <string name="connect_later" msgid="2308119155752343975">"Бул түйүнгө азыр кошулуу мүмкүн эмес. Бир аздан соң кайра аракеттениңиз."</string>
     <string name="registration_done" msgid="495135664535876612">"Тармакка катталды."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Оператор тандоо"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Бардык жеткиликтүү тармактарды издөө"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Тармакты автоматтык түрдө тандоо"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Тармак"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Автоматтык катталуу…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Тармактын түрү"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Тармактын иштөө режимин өзгөртүңүз"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Тармактын түрү"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(тыюу салынган)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA артыкчылыктуу"</item>
     <item msgid="8442633436636425221">"GSM гана"</item>
@@ -246,12 +242,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Көп акча төлөп калышыңыз мүмкүн."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Интернет-роумингди иштетесизби?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Дайындардын өткөрүлүшү"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> аралыгында <xliff:g id="ID_1">%1$s</xliff:g> мобилдик трафик колдонулду"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> аралыгында <xliff:g id="ID_1">%1$s</xliff:g> мобилдик трафик колдонулду"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Өркүндөтүлгөн"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Байланыш оператору"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"carrier, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Мобилдик Интернет"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Мобилдик Интернет"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Интернетке мобилдик тармак аркылуу чыгасыз"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Мобилдик Интернетти өчүрөсүзбү?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Тандоо керек"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Дайындар SIM\'и өзгөртүлсүнбү?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Мобилдик Интернетти пайдалануу үчүн <xliff:g id="OLD_SIM">%2$s</xliff:g> SIM картасынын ордуна <xliff:g id="NEW_SIM">%1$s</xliff:g> SIM картасын колдоносузбу?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi аркылуу чалуу"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Видео чалуулар"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS мүмкүнчүлүктөрү"</string>
@@ -486,7 +487,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Мобилдик тармак жеткиликтүү эмес. Чалуу үчүн зымсыз тармакка туташыңыз."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Чалуу үчүн, жарактуу номер киргизиңиз."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Чалынбай калды."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Бул жолу чалууну кошуу мүмкүн эмес."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Чалуу бул жолу кошулбай койду. Билдирүү жөнөтүп, байланышсаңыз болот."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Кызмат колдоого алынбайт"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Чалуулар которуштурулбай жатат."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Чалуу бөлүнбөй жатат."</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index ce1cd47..1824c4c 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"ຂໍ້​ຄວາມ​ສຽງ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM​:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"ການແຈ້ງເຕືອນ"</string>
-    <string name="networks" msgid="8873030692174541976">"ຜູ່ໃຫ້ບໍລິການເຄືອຂ່າຍ"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"​ການ​ອອກອາກາດ​ສຸກ​ເສີນ"</string>
     <string name="call_settings" msgid="6112441768261754562">"ການຕັ້ງຄ່າການໂທ"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"ການຕັ້ງຄ່າເພີ່ມເຕີມ"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"ບໍ່ພົບເຄືອຂ່າຍ."</string>
-    <string name="search_networks" msgid="1601136049300882441">"ຊອກຫາເຄືອຂ່າຍ"</string>
     <string name="network_query_error" msgid="6828516148953325006">"ເກີດຄວາມຜິດພາດໃນລະຫວ່າງການຊອກຫາເຄືອຂ່າຍ."</string>
     <string name="register_on_network" msgid="9055203954040805084">"ກຳລັງລົງທະບຽນກັບ <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM card ຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ເຊື່ອມຕໍ່ກັບເຄືອຂ່າຍນີ້."</string>
     <string name="connect_later" msgid="2308119155752343975">"ບໍ່ສາມາດເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍນີ້ໃນເວລານີ້ໄດ້. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ."</string>
     <string name="registration_done" msgid="495135664535876612">"ລົງທະບຽນໃນເຄືອຂ່າຍແລ້ວ."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"ເລືອກເຄືອຂ່າຍຜູ່ໃຫ້ບໍລິການ"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"ຊອກຫາເຄືອຂ່າຍທີ່ມີທັງໝົດ"</string>
     <string name="select_automatically" msgid="1046727200631770962">"ເລືອກເຄືອຂ່າຍອັດຕະໂນມັດ"</string>
     <string name="network_select_title" msgid="7733107364757544558">"ເຄືອຂ່າຍ"</string>
     <string name="register_automatically" msgid="6017849844573519637">"ກຳລັງລົງທະບຽນອັດຕະໂນມັດ..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ປະ​ເພດ​ເຄືອ​ຂ່າຍທີ່ຕ້ອງການ"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"ປ່ຽນຮູບແບບປະຕິບັດການຂອງເຄືອຂ່າຍ"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ປະ​ເພດ​ເຄືອ​ຂ່າຍທີ່ຕ້ອງການ"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(ຂໍ້ມູນຕ້ອງຫ້າມ)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"ຕ້ອງການ GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"GSM ເທົ່ານັ້ນ"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"ທ່ານ​ອາດ​ຈະ​ເສຍ​ຄ່າ​ໃຊ້​ຈ່າຍ​ຫຼາຍ."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"ອະນຸຍາດໃຫ້ໂຣມມິງຂໍ້ມູນບໍ?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ການນຳໃຊ້ຂໍ້ມູນ"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"ການນຳໃຊ້ອິນເຕີເນັດ <xliff:g id="ID_1">%1$s</xliff:g> ລະຫວ່າງ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"ໃຊ້ອິນເຕີເນັດໄປແລ້ວ <xliff:g id="ID_1">%1$s</xliff:g> ລະຫວ່າງ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"ຂັ້ນສູງ"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"ຜູ່ໃຫ້ບໍລິການ"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"ຜູ້ໃຫ້ບໍລິການ, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"ອິນເຕີເນັດມືຖື"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"ອິນເຕີເນັດມືຖື"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"ເຂົ້າເຖິງອິນເຕີເນັດຜ່ານເຄືອຂ່າຍມືຖື"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"ປິດອິນເຕີເນັດມືຖືໄວ້ບໍ?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"ຕ້ອງເລືອກອັນໃດອັນໜຶ່ງ"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"​ປ່ຽນ​ຊິມ​ອິນເຕີເນັດບໍ?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"ໃຊ້ <xliff:g id="NEW_SIM">%1$s</xliff:g> ແທນ <xliff:g id="OLD_SIM">%2$s</xliff:g> ສຳລັບອິນເຕີເນັດມືຖືບໍ?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"ການໂທ Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"ການໂທວິດີໂອເຄືອຂ່າຍ"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"ໂຕເລືອກ GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"ບໍ່ສາມາດໃຊ້ອິນເຕີເນັດມືຖືໄດ້. ກະລຸນາເຊື່ອມຕໍ່ຫາ Wi-Fi ເພື່ອໂທ."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ເພື່ອ​ທີ່​ຈະ​ໂທ, ປ້ອນ​ເບີ​ໂທ​ທີ່​ໃຊ້​ໄດ້​ເຂົ້າ​ໄປ."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"ໂທບໍ່ສຳເລັດ."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"ບໍ່ສາມາດເພີ່ມການໂທໄດ້ໃນເວລານີ້."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"ບໍ່ສາມາດໂທໄດ້ໃນຕອນນີ້. ທ່ານສາມາດລອງຕິດຕໍ່ຫາໄດ້ໂດຍການສົ່ງຂໍ້ຄວາມ."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"ການ​ບໍ​ລິ​ການ​ບໍ່​ຮອງ​ຮັບ"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ບໍ່​ສາ​ມາດ​ສະ​ຫຼັບ​ສາ​ຍ​ໂທ​ໄດ້."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ບໍ່​ສາ​ມາດ​ແຍກ​ສາຍ​ໂທ​ໄດ້."</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 8ebbd82..633d54a 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Balso paštas (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"BP:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Pranešimai"</string>
-    <string name="networks" msgid="8873030692174541976">"Tinklo operatoriai"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Avarinės transliacijos"</string>
     <string name="call_settings" msgid="6112441768261754562">"Skambinimo nustatymai"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Papildomi nustatymai"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nerasta tinklų."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Ieškoti tinklų"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Klaida ieškant tinklų."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registruojama <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM kortelė neleidžia užmegzti ryšio su šiuo tinklu."</string>
     <string name="connect_later" msgid="2308119155752343975">"Dabar prie šio tinklo prisijungti nepavyksta. Bandykite dar kartą vėliau."</string>
     <string name="registration_done" msgid="495135664535876612">"Registruota tinkle."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Pasirinkite tinklo operatorių"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Ieškoti galimų tinklų"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Automatiškai pasirinkti tinklą"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Tinklas"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatinė registracija..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Pageidaujamas tinklo tipas"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Pakeisti tinklo veikimo režimą"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Pageidaujamas tinklo tipas"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(uždrausta)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Pageidaujama GSM / WCDMA"</item>
     <item msgid="8442633436636425221">"Tik GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Galite būti apmokestinti dideliais mokesčiais."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Leisti tarptinklinį duomenų ryšį?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Duomenų naudojimas"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> išnaudota mobiliojo ryšio duomenų: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> išnaudota mobiliojo ryšio duomenų: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Išplėstiniai"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operatorius"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operatorius, esim kortelė, sim kortelė, euicc kortelė"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"„<xliff:g id="CARRIER_NAME">%1$s</xliff:g>“ – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobiliojo ryšio duomenys"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobiliojo ryšio duomenys"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Prieiga prie duomenų naudojant mobiliojo ryšio tinklą"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Išjungti mobiliojo ryšio duomenis?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Būtina pasirinkti"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Keisti duomenų SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Naudoti „<xliff:g id="NEW_SIM">%1$s</xliff:g>“ vietoj „<xliff:g id="OLD_SIM">%2$s</xliff:g>“ mobiliojo ryšio duomenims?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"„Wi-Fi“ skambinimas"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Operatoriaus vaizdo skambučiai"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM / UMTS parinktys"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobiliojo ryšio tinklas nepasiekiamas. Prisijunkite prie belaidžio ryšio tinklo, kad galėtumėte skambinti."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Kad galėtumėte paskambinti, įveskite tinkamą numerį."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Paskambinti nepavyko."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Šiuo metu skambučio atlikti negalima."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Šiuo metu skambučio pridėti negalima. Galite pabandyti susisiekti išsiųsdami pranešimą."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Paslauga nepalaikoma"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nepavyko perjungti skambučių."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nepavyko atskirti skambučio."</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index b45f42e..4c700af 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Balss pasts (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"BP:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Paziņojumi"</string>
-    <string name="networks" msgid="8873030692174541976">"Tīkla operatori"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Ārkārtas paziņojumi"</string>
     <string name="call_settings" msgid="6112441768261754562">"Zvanu iestatījumi"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Papildu iestatījumi"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Neviens tīkls nav atrasts."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Meklēt tīklus"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Tīklu meklēšanas laikā radās kļūda."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Notiek reģistrēšana šādā tīklā: <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM karte neļauj izveidot savienojumu ar šo tīklu."</string>
     <string name="connect_later" msgid="2308119155752343975">"Pašlaik nevar izveidot savienojumu ar šo tīklu. Vēlāk mēģiniet vēlreiz."</string>
     <string name="registration_done" msgid="495135664535876612">"Reģistrēts tīklā."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Izvēlēties tīkla operatoru"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Meklēt visus pieejamos tīklus"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Automātiski atlasīt tīklu"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Tīkls"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automātiska reģistrācija..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Ieteicamais tīkla veids"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Mainiet tīkla darbības režīmu"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Ieteicamais tīkla veids"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(aizliegts)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Ieteicamais režīms: GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Tikai GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Var rasties ievērojamas izmaksas."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Vai atļaut datu viesabonēšanu?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Datu lietojums"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobilo datu izmantoti šādā laika periodā: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobilo datu izmantoti šādā laika periodā: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Papildu"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Mobilo sakaru operators"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"mobilo sakaru operators, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobilie dati"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobilie dati"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Piekļuve datiem, izmantojot mobilo tīklu"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Vai izslēgt mobilos datus?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Jāveic atlase"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Vai mainīt datu SIM karti?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Vai mobilajiem datiem izmantot <xliff:g id="NEW_SIM">%1$s</xliff:g>, nevis <xliff:g id="OLD_SIM">%2$s</xliff:g>?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi zvani"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Mobilo sakaru operatora videozvani"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS opcijas"</string>
@@ -484,7 +485,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobilais tīkls nav pieejams. Lai veiktu zvanu, izveidojiet savienojumu ar bezvadu tīklu."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Lai veiktu zvanu, ievadiet derīgu numuru."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Zvans neizdevās."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Pašlaik nevar pievienot zvanu."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Pašlaik nevar pievienot zvanu. Varat mēģināt sūtīt īsziņu."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Pakalpojums netiek atbalstīts"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nevar pārslēgt zvanus."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nevar nošķirt zvanu."</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 541ca0a..d6d4cad 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Говорна пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ГП:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Известувања"</string>
-    <string name="networks" msgid="8873030692174541976">"Оператори на мрежа"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Итни емитувања"</string>
     <string name="call_settings" msgid="6112441768261754562">"Поставки на повик"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Дополнителни поставки"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Не се пронајдени мрежи."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Пребарај мрежи"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Грешка при пребарување мрежи."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Регистрирање на <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Вашата SIM картичка не дозволува поврзување со оваа мрежа."</string>
     <string name="connect_later" msgid="2308119155752343975">"Не може да се поврзе со оваа мрежа во моментов. Обидете се повторно подоцна."</string>
     <string name="registration_done" msgid="495135664535876612">"Регистрирање на мрежа."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Избери оператор на мрежа"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Пребарај ги сите достапни мрежи"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Избери мрежа автоматски"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Мрежа"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Автоматска регистрација..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Претпочитан тип мрежа"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Промени го режимот на работа на мрежата"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Претпочитан тип мрежа"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(забрането)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Претпочитан: GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Само GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Може да направите големи трошоци."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Дозволи интернет-роаминг?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Потрошен сообраќај"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> потрошен мобилен интернет во периодот <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> потрошен мобилен интернет во периодот <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Напредни"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Оператор"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"оператор, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> - <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Мобилен интернет"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Мобилен интернет"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Пристапете до податоците преку мобилна мрежа"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Да се исклучи мобилниот интернет?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Треба да се избере"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Да се промени SIM за интернет?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Да се користи <xliff:g id="NEW_SIM">%1$s</xliff:g> наместо <xliff:g id="OLD_SIM">%2$s</xliff:g> за мобилен интернет?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Повикување преку Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Видеоповикување преку оператор"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Опции за GSM/UMTS"</string>
@@ -488,7 +489,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Не е достапна мобилна мрежа. Поврзете се на безжична мрежа за да повикате."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"За да повикате, внесете важечки број."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Повикот не успеа."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Повикот не може да се додаде во моментов."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Повикот не може да се додаде во моментов. Може да се обидете да стапите во контакт со испраќање порака."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Услугата не е поддржана"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Не може да префрли повици."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Не може да оддели повик."</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 18ade9c..75f0b50 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"ശബ്ദമെയിൽ(<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"അറിയിപ്പുകൾ"</string>
-    <string name="networks" msgid="8873030692174541976">"നെറ്റ്‌വർക്ക് ഓപ്പറേറ്റർമാർ"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"അടിയന്തര പ്രക്ഷേപണങ്ങൾ"</string>
     <string name="call_settings" msgid="6112441768261754562">"കോൾ ക്രമീകരണങ്ങൾ"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"അധിക ക്രമീകരണങ്ങൾ"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"നെറ്റ്‌വർക്കുകളൊന്നും കണ്ടെത്തിയില്ല."</string>
-    <string name="search_networks" msgid="1601136049300882441">"നെറ്റ്‌വർക്കുകൾ തിരയുക"</string>
     <string name="network_query_error" msgid="6828516148953325006">"നെറ്റ്‌വർക്കുകൾക്കായി തിരയുമ്പോൾ പിശക്."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> എന്നതിൽ രജിസ്റ്റർ ചെയ്യുന്നു…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"നിങ്ങളുടെ സിം കാർഡ് ഈ നെറ്റ്‌വർക്കിലേക്ക് ഒരു കണക്ഷൻ അനുവദിക്കുന്നില്ല."</string>
     <string name="connect_later" msgid="2308119155752343975">"ഈ നെറ്റ്‌വർക്കിൽ ഇപ്പോൾ കണക്റ്റുചെയ്യാനാകുന്നില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string>
     <string name="registration_done" msgid="495135664535876612">"ഒരു നെറ്റ്‌വർക്കിൽ രജിസ്റ്റർ ചെയ്‌തു."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"ഒരു നെ‌റ്റ്‌വർക്ക് ഓപ്പറേറ്ററെ തിരഞ്ഞെടുക്കുക"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"ലഭ്യമായ എല്ലാ നെറ്റ്‌വർക്കുകൾക്കായും തിരയുക"</string>
     <string name="select_automatically" msgid="1046727200631770962">"സ്വയമേവ നെറ്റ്‌വർക്ക് തിരഞ്ഞെടുക്കുക"</string>
     <string name="network_select_title" msgid="7733107364757544558">"നെറ്റ്‌വർക്ക്"</string>
     <string name="register_automatically" msgid="6017849844573519637">"യാന്ത്രിക രജിസ്‌ട്രേഷൻ…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"തിരഞ്ഞെടുത്ത നെറ്റ്‌വർക്ക് തരം"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"നെറ്റ്‌വർക്ക് ഓപ്പറേറ്റുചെയ്യൽ മോഡ് മാറ്റുക"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"തിരഞ്ഞെടുത്ത നെറ്റ്‌വർക്ക് തരം"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(നിരോധിക്കപ്പെട്ടത്)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA തിരഞ്ഞെടുത്തത്"</item>
     <item msgid="8442633436636425221">"GSM മാത്രം"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"നിങ്ങളിൽ നിന്ന് നിർദ്ദിഷ്‌ട നിരക്കുകൾ ഈടാക്കിയേക്കാം."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"ഡാറ്റ റോമിംഗ് അനുവദിക്കണോ?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ഡാറ്റ ഉപയോഗം"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> തീയതിയ്‌ക്കിടയിൽ <xliff:g id="ID_1">%1$s</xliff:g> മൊബൈൽ ഡാറ്റ ഉപയോഗിച്ചു"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> തീയതികൾക്കിടയിൽ <xliff:g id="ID_1">%1$s</xliff:g> മൊബൈൽ ഡാറ്റ ഉപയോഗിച്ചു"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"വിപുലമായത്"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"കാരിയര്‍"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"കാരിയർ, ഇ-സിം, സിം, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"മൊബൈൽ ഡാറ്റ"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"മൊബൈൽ ഡാറ്റ"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"മൊബൈൽ നെറ്റ്‌വർക്ക് ഉപയോഗിച്ച് ഡാറ്റ ആക്‌സസ് ചെയ്യുക"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"മൊബൈൽ ഡാറ്റ ഓഫാക്കണോ?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"തിരഞ്ഞെടുക്കൽ ആവശ്യമാണ്"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"ഡാറ്റ SIM മാറ്റണോ?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"മൊബൈൽ ഡാറ്റയ്ക്ക് <xliff:g id="OLD_SIM">%2$s</xliff:g>-ന് പകരം <xliff:g id="NEW_SIM">%1$s</xliff:g> ഉപയോഗിക്കണോ?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"വൈഫൈ കോളിംഗ്"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"സേവനദായക വീഡിയോ കോളിംഗ്"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS ഓപ്‌ഷനുകൾ"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"മൊബൈൽ നെറ്റ്‌വർക്ക് ലഭ്യമല്ല. കോൾ വിളിക്കാൻ വയർലെസ്സ് നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ഒരു കോൾ ചെയ്യുന്നതിന്, സാധുതയുള്ള നമ്പർ നൽകുക."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"കോൾ ചെയ്യാനായില്ല."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"കോൾ ഇപ്പോൾ ചേർക്കാനാകില്ല."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"ഇപ്പോൾ കോൾ ചേർക്കാനാവില്ല. നിങ്ങൾക്കൊരു സന്ദേശമയച്ചുകൊണ്ട് ബന്ധപ്പെടാൻ ശ്രമിക്കാം."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"സേവനം പിന്തുണയ്‌ക്കുന്നില്ല"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"കോളുകൾ മാറാനാവില്ല."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"കോൾ വേർതിരിക്കാനാവില്ല."</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index ff91084..92cb9dc 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Дуут шуудан ( <xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g> )"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ДШ:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Мэдэгдэл"</string>
-    <string name="networks" msgid="8873030692174541976">"Сүлжээний операторууд"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Онцгой байдлын нэвтрүүлэг"</string>
     <string name="call_settings" msgid="6112441768261754562">"Дуудлагын тохиргоо"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Нэмэлт тохиргоо"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Сүлжээ олдсонгүй."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Сүлжээ хайх"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Сүлжээ хайх явцад алдаа гарлаа."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Бүртгэж байна <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Таны SIM карт энэ сүлжээнд холбогдохыг зөвшөөрөхгүй байна."</string>
     <string name="connect_later" msgid="2308119155752343975">"Сүлжээнд одоо холбогдох боломжгүй байна. Дараа дахин оролдоно уу."</string>
     <string name="registration_done" msgid="495135664535876612">"Сүлжээнд бүртгэгдсэн."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Сүлжээний операторыг сонгоно уу"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Боломжит бүх сүлжээг хайх"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Сүлжээг автоматаар сонгох"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Сүлжээ"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Автомат бүртгэл…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Сүлжээний үндсэн төрөл"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Сүлжээний ажиллах төлвийг өөрчлөх"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Сүлжээний үндсэн төрөл"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(хориотой)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA эхэнд нь"</item>
     <item msgid="8442633436636425221">"Зөвхөн GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Таны төлбөр өндөр гарах магадлалтайг анхааруулж байна."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Дата роуминг үйлчилгээг идэвхжүүлэх үү?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Дата ашиглалт"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> мобайл дата ашиглагдсан <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> мобайл дата ашигласан <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Нарийвчилсан"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Оператор компани"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"carrier, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Мобайл дата"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Мобайл дата"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Мобайл сүлжээг ашиглан датанд хандах"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Мобайл датаг унтраах уу?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Сонгох шаардлагатай"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Дата SIM солих уу?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Мобайл дата ашиглахын тулд <xliff:g id="OLD_SIM">%2$s</xliff:g>-н оронд <xliff:g id="NEW_SIM">%1$s</xliff:g>-г ашиглах уу?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi дуудлага"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Үүрэн компанийн видео дуудлага"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS Тохиргоо"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Мобайл сүлжээнд холбогдох боломжгүй байна. Дуудлага хийхийн тулд утасгүй интернетэд холбогдоно уу."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Дуудлага хийхийн тулд хүчин төгөлдөр дугаар оруулна уу."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Дуудлага амжилтгүй болсон."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Одоо дуудлага нэмэх боломжгүй."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Дуудлагыг энэ удаад нэмэх боломжгүй. Та зурвас илгээн холбоо тогтоохыг оролдох боломжтой."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Үйлчилгээг дэмждэггүй байна"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Дуудлагыг солих боломжгүй байна."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Дуудлагыг салгаж чадахгүй байна."</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 7dfeb67..4d84040 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"व्हॉइसमेल (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"सूचना"</string>
-    <string name="networks" msgid="8873030692174541976">"नेटवर्क ऑपरेटर"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"आणीबाणी प्रसारणे"</string>
     <string name="call_settings" msgid="6112441768261754562">"कॉल सेटिंग्ज"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"अतिरिक्त सेटिंग्ज"</string>
@@ -88,7 +87,7 @@
     <string name="sum_cdma_call_settings" msgid="284753265979035549">"अतिरिक्त CDMA केवळ कॉल सेटिंग्‍ज"</string>
     <string name="labelNwService" msgid="4699970172021870983">"नेटवर्क सेवा सेटिंग्ज"</string>
     <string name="labelCallerId" msgid="3888899447379069198">"कॉलर आयडी"</string>
-    <string name="sum_loading_settings" msgid="1826692909391168620">"सेटिंग्ज लोड करीत आहे..."</string>
+    <string name="sum_loading_settings" msgid="1826692909391168620">"सेटिंग्ज लोड करत आहे..."</string>
     <string name="sum_hide_caller_id" msgid="1071407020290873782">"केल्‍या जाणार्‍या कॉलमध्‍ये नंबर लपविला"</string>
     <string name="sum_show_caller_id" msgid="6768534125447290401">"केल्‍या जाणार्‍या कॉलमध्‍ये नंबर प्रदर्शित केला"</string>
     <string name="sum_default_caller_id" msgid="1954518825510901365">"माझा नंबर केल्‍या जाणार्‍या कॉलमध्‍ये प्रदर्शित करण्‍यासाठी डीफॉल्‍ट ऑपरेटर सेटिंग्‍जचा वापर करा"</string>
@@ -100,23 +99,23 @@
     <string name="labelCF" msgid="2574386948026924737">"कॉल अग्रेषण"</string>
     <string name="labelCFU" msgid="8147177368148660600">"नेहमी अग्रेषित करा"</string>
     <string name="messageCFU" msgid="3560082430662923687">"नेहमी हा नंबर वापरा"</string>
-    <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"सर्व कॉल अग्रेषित करीत आहे"</string>
-    <string name="sum_cfu_enabled" msgid="2450052502198827927">"सर्व कॉल <xliff:g id="PHONENUMBER">{0}</xliff:g> वर अग्रेषित करीत आहे"</string>
+    <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"सर्व कॉल अग्रेषित करत आहे"</string>
+    <string name="sum_cfu_enabled" msgid="2450052502198827927">"सर्व कॉल <xliff:g id="PHONENUMBER">{0}</xliff:g> वर अग्रेषित करत आहे"</string>
     <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"नंबर अनुपलब्‍ध आहे"</string>
     <string name="sum_cfu_disabled" msgid="8384177689501334080">"बंद"</string>
     <string name="labelCFB" msgid="6139853033106283172">"व्यस्त असताना"</string>
     <string name="messageCFB" msgid="3711089705936187129">"नंबर व्‍यस्‍त असताना"</string>
-    <string name="sum_cfb_enabled" msgid="5984198104833116690">"<xliff:g id="PHONENUMBER">{0}</xliff:g> वर अग्रेषित करीत आहे"</string>
+    <string name="sum_cfb_enabled" msgid="5984198104833116690">"<xliff:g id="PHONENUMBER">{0}</xliff:g> वर अग्रेषित करत आहे"</string>
     <string name="sum_cfb_disabled" msgid="4913145177320506827">"बंद"</string>
     <string name="disable_cfb_forbidden" msgid="3506984333877998061">"आपला फोन व्‍यस्‍त असताना आपला ऑपरेटर कॉल अग्रेषण करणे अक्षम करण्‍यास समर्थन करीत नाही."</string>
     <string name="labelCFNRy" msgid="1736067178393744351">"उत्तर न दिल्यास"</string>
     <string name="messageCFNRy" msgid="672317899884380374">"नंबर अनुत्तरित असताना"</string>
-    <string name="sum_cfnry_enabled" msgid="6955775691317662910">"<xliff:g id="PHONENUMBER">{0}</xliff:g> वर अग्रेषित करीत आहे"</string>
+    <string name="sum_cfnry_enabled" msgid="6955775691317662910">"<xliff:g id="PHONENUMBER">{0}</xliff:g> वर अग्रेषित करत आहे"</string>
     <string name="sum_cfnry_disabled" msgid="3884684060443538097">"बंद"</string>
     <string name="disable_cfnry_forbidden" msgid="4308233959150658058">"आपला फोन उत्तर देत नसताना आपला ऑपरेटर कॉल अग्रेषण करणे अक्षम करण्‍यास समर्थन करीत नाही."</string>
     <string name="labelCFNRc" msgid="2614827454402079766">"पोहचण्‍यायोग्‍य नसताना"</string>
     <string name="messageCFNRc" msgid="6380695421020295119">"नंबर पोहचण्‍यायोग्‍य नसताना"</string>
-    <string name="sum_cfnrc_enabled" msgid="7010898346095497421">"<xliff:g id="PHONENUMBER">{0}</xliff:g> वर अग्रेषित करीत आहे"</string>
+    <string name="sum_cfnrc_enabled" msgid="7010898346095497421">"<xliff:g id="PHONENUMBER">{0}</xliff:g> वर अग्रेषित करत आहे"</string>
     <string name="sum_cfnrc_disabled" msgid="2684474391807469832">"बंद"</string>
     <string name="disable_cfnrc_forbidden" msgid="5646361343094064333">"आपला फोन पोहचण्‍यायोग्‍य नसताना आपला वाहक कॉल अग्रेषण करणे अक्षम करण्‍यास समर्थन करीत नाही."</string>
     <string name="updating_title" msgid="6146755386174019046">"कॉल सेटिंग्ज"</string>
@@ -124,7 +123,7 @@
     <string name="call_settings_with_label" msgid="3401177261468593519">"सेटिंग्ज (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="7970259216988931777">"कॉल सेटिंग्ज त्रुटी"</string>
     <string name="reading_settings" msgid="1920291699287055284">"सेटिंग्‍ज वाचत आहे…"</string>
-    <string name="updating_settings" msgid="8171225533884883252">"सेटिंग्ज अपडेट करीत आहे..."</string>
+    <string name="updating_settings" msgid="8171225533884883252">"सेटिंग्ज अपडेट करत आहे..."</string>
     <string name="reverting_settings" msgid="4752151682666912828">"सेटिंग्‍ज परत करत आहे…"</string>
     <string name="response_error" msgid="6674110501330139405">"नेटवर्क वरून अनपेक्षित प्रतिसाद."</string>
     <string name="exception_error" msgid="7027667130619518211">"नेटवर्क किंवा सिम कार्ड त्रुटी."</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"कोणतीही नेटवर्क आढळली नाहीत."</string>
-    <string name="search_networks" msgid="1601136049300882441">"नेटवर्क शोधा"</string>
     <string name="network_query_error" msgid="6828516148953325006">"नेटवर्क शोधताना त्रुटी."</string>
-    <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> वर नोंदणी करीत आहे…"</string>
+    <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> वर नोंदणी करत आहे…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"आपले सिम कार्ड या नेटवर्कच्‍या कनेक्‍शनला अनुमती देत नाही."</string>
     <string name="connect_later" msgid="2308119155752343975">"आत्ता या नेटवर्कशी कनेक्‍ट करू शकत नाही. नंतर पुन्‍हा प्रयत्‍न करा."</string>
     <string name="registration_done" msgid="495135664535876612">"नेटवर्कवर नोंदणी केली."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"नेटवर्क ऑपरेटर निवडा"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"सर्व उपलब्ध नेटवर्क शोधा"</string>
     <string name="select_automatically" msgid="1046727200631770962">"स्वयंचलितपणे नेटवर्क निवडा"</string>
     <string name="network_select_title" msgid="7733107364757544558">"नेटवर्क"</string>
     <string name="register_automatically" msgid="6017849844573519637">"स्‍वयंचलित नोंदणी…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"प्राधान्‍यकृत नेटवर्क प्रकार"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"नेटवर्क कार्य करण्‍याचा मोड बदला"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"प्राधान्‍यकृत नेटवर्क प्रकार"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(मनाई केलेले)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA प्राधान्‍यकृत"</item>
     <item msgid="8442633436636425221">"केवळ GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"आपल्‍याला लक्षणीय रोमिंग शुल्‍क लागू शकते."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"डेटा रोमिंगला अनुमती द्यायची?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"डेटा वापर"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> दरम्यान <xliff:g id="ID_1">%1$s</xliff:g> मोबाइल डेटा वापरला गेला"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> दरम्यान <xliff:g id="ID_1">%1$s</xliff:g> मोबाइल डेटा वापरला गेला"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"प्रगत"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"वाहक"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"carrier, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"मोबाइल डेटा"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"मोबाइल डेटा"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"मोबाइल नेटवर्क वापरून डेटा मध्‍ये प्रवेश करा"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"मोबाइल डेटा बंद करायचा?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"निवड आवश्यक"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"डेटा सिम बदलायचे?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"मोबाइल डेटासाठी <xliff:g id="OLD_SIM">%2$s</xliff:g> ऐवजी <xliff:g id="NEW_SIM">%1$s</xliff:g> वापरायचे?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"वाय-फाय कॉलिंग"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"वाहक व्हिडिओ कॉलिंग"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS पर्याय"</string>
@@ -405,12 +406,12 @@
     <string name="get_pin2" msgid="8204677063922225311">"PIN2 टाईप करा"</string>
     <string name="name" msgid="7329028332786872378">"नाव"</string>
     <string name="number" msgid="7905950798349903858">"नंबर"</string>
-    <string name="save" msgid="4094274636321939086">"जतन करा"</string>
+    <string name="save" msgid="4094274636321939086">"सेव्ह करा"</string>
     <string name="add_fdn_contact" msgid="2481915899633353976">"निश्चित डायलिंग नंबर जोडा"</string>
     <string name="adding_fdn_contact" msgid="7627379633721940991">"निश्चित डायलिंग नंबर जोडत आहे..."</string>
     <string name="fdn_contact_added" msgid="7458335758501736665">"निश्चित डायलिंग नंबर जोडला."</string>
-    <string name="edit_fdn_contact" msgid="7976936035587081480">"निश्चित डायलिंग नंबर संपादित करीत आहे..."</string>
-    <string name="updating_fdn_contact" msgid="8370929876849803600">"निश्चित डायलिंग नंबर अपडेट करीत आहे..."</string>
+    <string name="edit_fdn_contact" msgid="7976936035587081480">"निश्चित डायलिंग नंबर संपादित करत आहे..."</string>
+    <string name="updating_fdn_contact" msgid="8370929876849803600">"निश्चित डायलिंग नंबर अपडेट करत आहे..."</string>
     <string name="fdn_contact_updated" msgid="5497828782609005017">"निश्चित डायलिंग नंबर अपडेट केला."</string>
     <string name="delete_fdn_contact" msgid="6668958073074151717">"निश्चित डायलिंग नंबर हटवा"</string>
     <string name="deleting_fdn_contact" msgid="5669163206349319969">"निश्चित डायलिंग नंबर हटवित आहे..."</string>
@@ -434,12 +435,12 @@
     <string name="invalidPin" msgid="5981171102258684792">"4 ते 8 अंकांचा पिन टाईप करा."</string>
     <string name="disable_sim_pin" msgid="3419351358300716472">"सिम पिन साफ करा"</string>
     <string name="enable_sim_pin" msgid="4845145659651484248">"सिम पिन सेट करा"</string>
-    <string name="enable_in_progress" msgid="3417917024688497010">"पिन सेट करीत आहे…"</string>
+    <string name="enable_in_progress" msgid="3417917024688497010">"पिन सेट करत आहे…"</string>
     <string name="enable_pin_ok" msgid="2918545971413270063">"पिन सेट केला"</string>
     <string name="disable_pin_ok" msgid="2109571368635883688">"पिन साफ केला"</string>
     <string name="pin_failed" msgid="5644377896213584760">"पिन चुकीचा आहे"</string>
     <string name="pin_changed" msgid="4455736268023261662">"पिन अपडेट केला"</string>
-    <string name="puk_requested" msgid="5921393215789090200">"संकेतशब्द चुकीचा आहे. पिन आता अवरोधित केला. PUK ची विनंती केली."</string>
+    <string name="puk_requested" msgid="5921393215789090200">"पासवर्ड चुकीचा आहे. पिन आता अवरोधित केला. PUK ची विनंती केली."</string>
     <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
     <string name="oldPin2Label" msgid="8559146795026261502">"जुना PIN2"</string>
     <string name="newPin2Label" msgid="4573956902204349054">"नवीन PIN2"</string>
@@ -451,15 +452,15 @@
     <string name="invalidPuk2" msgid="7059081153334815973">"8 अंक असलेला एक PUK2 प्रविष्‍ट करा."</string>
     <string name="pin2_changed" msgid="3724522579945610956">"पिन2 अपडेट केला"</string>
     <string name="label_puk2_code" msgid="4688069961795341948">"PUK2 कोड प्रविष्‍ट करा"</string>
-    <string name="fdn_enable_puk2_requested" msgid="4991074891459554705">"संकेतशब्द चुकीचा आहे. पिन2 आता अवरोधित केला. पुन्हा प्रयत्न करण्‍यासाठी, पिन 2 बदला."</string>
-    <string name="puk2_requested" msgid="5831015200030161434">"संकेतशब्द चुकीचा आहे. सिम आता लॉक केले आहे. PUK2 प्रविष्‍ट करा."</string>
+    <string name="fdn_enable_puk2_requested" msgid="4991074891459554705">"पासवर्ड चुकीचा आहे. पिन2 आता अवरोधित केला. पुन्हा प्रयत्न करण्‍यासाठी, पिन 2 बदला."</string>
+    <string name="puk2_requested" msgid="5831015200030161434">"पासवर्ड चुकीचा आहे. सिम आता लॉक केले आहे. PUK2 प्रविष्‍ट करा."</string>
     <string name="puk2_blocked" msgid="3150263853077280049">"PUK2 कायमचे अवरोधित केले आहे."</string>
     <string name="pin2_attempts" msgid="720736232885011507">\n"आपल्‍याकडे <xliff:g id="NUMBER">%d</xliff:g> शिल्लक प्रयत्न आहेत."</string>
     <string name="pin2_unblocked" msgid="7791600368153469078">"पिन2 अवरोधित केला नाही"</string>
     <string name="pin2_error_exception" msgid="1088689322248996699">"नेटवर्क किंवा सिम कार्ड त्रुटी"</string>
     <string name="doneButton" msgid="2859593360997984240">"पूर्ण झाले"</string>
     <string name="voicemail_settings_number_label" msgid="8524164258691887790">"व्हॉइसमेल नंबर"</string>
-    <string name="card_title_dialing" msgid="5769417478498348054">"डायल करीत आहे"</string>
+    <string name="card_title_dialing" msgid="5769417478498348054">"डायल करत आहे"</string>
     <string name="card_title_redialing" msgid="8253487008234167266">"रीडायल करत आहे"</string>
     <string name="card_title_conf_call" msgid="1162980346189744501">"परिषद कॉल"</string>
     <string name="card_title_incoming_call" msgid="7364539451234646909">"येणारे कॉल"</string>
@@ -480,9 +481,9 @@
     <string name="incall_error_emergency_only" msgid="4678640422710818317">"नेटवर्कवर नोंदणीकृत नाही."</string>
     <string name="incall_error_out_of_service" msgid="8587993036435080418">"मोबाइल नेटवर्क उपलब्ध नाही."</string>
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"मोबाइल नेटवर्क उपलब्‍ध नाही. कॉल करण्‍यासाठी वायरलेस नेटवर्कशी कनेक्‍ट करा."</string>
-    <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"कॉल करण्यासाठी, एक वैध नंबर प्रविष्ट करा."</string>
+    <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"कॉल करण्यासाठी, एक वैध नंबर एंटर करा."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"कॉल अयशस्वी झाला."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"यावेळी कॉल जोडला जाऊ शकत नाही."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"या वेळी कॉल जोडू शकत नाही. तुम्ही संदेश पाठवून संपर्क करण्याचा प्रयत्न करू शकता."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"सेवा समर्थित नाही"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"कॉल स्विच करू शकत नाही."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"कॉल विभक्त करू शकत नाही."</string>
@@ -494,7 +495,7 @@
     <string name="incall_error_wfc_only_no_wireless_network" msgid="1782466780452640089">"कॉल करण्‍यासाठी वायरलेस नेटवर्कशी कनेक्‍ट करा."</string>
     <string name="incall_error_promote_wfc" msgid="106510757624022064">"कॉल करण्यासाठी वाय-फाय कॉलिंग सक्षम करा."</string>
     <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"आणीबाणीचा कॉल"</string>
-    <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"रेडिओ चालू करीत आहे..."</string>
+    <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"रेडिओ चालू करत आहे..."</string>
     <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"सेवा नाही. पुन्हा प्रयत्न करत आहे…"</string>
     <string name="radio_off_during_emergency_call" msgid="2535800034010306830">"आणीबाणी कॉलदरम्यान विमान मोडमध्ये प्रवेश करू शकत नाही."</string>
     <string name="dial_emergency_error" msgid="1509085166367420355">"कॉल करू शकत नाही. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> हा आणीबाणी नंबर नाहीये."</string>
@@ -513,7 +514,7 @@
     <string name="onscreenVideoCallText" msgid="4800924186056115442">"व्हिडिओ कॉल"</string>
     <string name="importSimEntry" msgid="6614358325359736031">"आयात"</string>
     <string name="importAllSimEntries" msgid="1503181169636198673">"सर्व आयात करा"</string>
-    <string name="importingSimContacts" msgid="7374056215462575769">"सिम संपर्क आयात करीत आहे"</string>
+    <string name="importingSimContacts" msgid="7374056215462575769">"सिम संपर्क आयात करत आहे"</string>
     <string name="importToFDNfromContacts" msgid="2130620207013368580">"संपर्कांमधून आयात करा"</string>
     <string name="singleContactImportedMsg" msgid="6868483416182599206">"आयात केलेला संपर्क"</string>
     <string name="failedToImportSingleContactMsg" msgid="415399285420353917">"संपर्क आयात करण्यात अयशस्वी"</string>
@@ -535,8 +536,8 @@
     <string name="network_error_message" msgid="3394780436230411413">"त्रुटी संदेश"</string>
     <string name="ota_title_activate" msgid="8616918561356194398">"आपला फोन सक्रिय करा"</string>
     <string name="ota_touch_activate" msgid="6553212803262586244">"आपली फोन सेवा सक्रिय करण्‍यासाठी एक विशिष्‍ट कॉल केला जाणे आवश्‍यक आहे. \n\n“सक्रिय करा” दाबल्‍यानंतर, आपला फोन सक्रिय करण्‍यासाठी प्रदान केलेल्‍या सूचना ऐका."</string>
-    <string name="ota_hfa_activation_title" msgid="2234246934160473981">"सक्रिय करीत आहे..."</string>
-    <string name="ota_hfa_activation_dialog_message" msgid="8092479227918463415">"फोन आपली मोबाइल डेटा सेवा सक्रिय करीत आहे.\n\nयास सुमारे 5 मिनिटे लागतील."</string>
+    <string name="ota_hfa_activation_title" msgid="2234246934160473981">"सक्रिय करत आहे..."</string>
+    <string name="ota_hfa_activation_dialog_message" msgid="8092479227918463415">"फोन आपली मोबाइल डेटा सेवा सक्रिय करत आहे.\n\nयास सुमारे 5 मिनिटे लागतील."</string>
     <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"सक्रिय करणे वगळायचे?"</string>
     <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"आपण सक्रिय करणे वगळल्‍यास, आपण कॉल करू शकत नाही किंवा मोबाइल डेटा नेटवर्कशी कनेक्‍ट करू शकत नाही (आपण वाय-फाय नेटवर्कशी कनेक्‍ट करू शकत असला तरीही). आपण आपला फोन सक्रिय करेपर्यंत, आपण तो प्रत्‍येक वेळी चालू करताना आपल्‍याला तो सक्रिय करण्‍यास सांगितले जाईल."</string>
     <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"वगळा"</string>
@@ -545,7 +546,7 @@
     <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"सक्रीय करण्‍यात समस्या"</string>
     <string name="ota_listen" msgid="162923839877584937">"सक्रिय करणे पूर्ण झाले आहे असे आपल्‍याला ऐकू येईपर्यंत बोललेल्‍या सूचनांचे अनुसरण करा."</string>
     <string name="ota_speaker" msgid="6904589278542719647">"स्पीकर"</string>
-    <string name="ota_progress" msgid="460876637828044519">"आपल्‍या फोनचे प्रोग्रामिंग करीत आहे…"</string>
+    <string name="ota_progress" msgid="460876637828044519">"आपल्‍या फोनचे प्रोग्रामिंग करत आहे…"</string>
     <string name="ota_failure" msgid="7713756181204620397">"आपला फोन प्रोग्राम करणे शक्य झाले नाही"</string>
     <string name="ota_successful" msgid="1880780692887077407">"आपला फोन आता सक्रिय केला आहे. सेवा सुरू होण्‍यास सुमारे 15 मिनिटे लागू शकतात."</string>
     <string name="ota_unsuccessful" msgid="8072141612635635357">"आपला फोन सक्रिय केला नव्‍हता. \nआपल्‍याला अधिक चांगले कव्‍हरेज असलेले क्षेत्र (खिडकीजवळ किंवा बाहेर) शोधण्‍याची आवश्‍यकता असू शकते. \n\nपुन्‍हा प्रयत्‍न करा किंवा अधिक पर्यायांसाठी ग्राहक सेवेस कॉल करा."</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index c925ca0..76352fe 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Mel suara (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Pemberitahuan"</string>
-    <string name="networks" msgid="8873030692174541976">"Pengendali rangkaian"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Siaran kecemasan"</string>
     <string name="call_settings" msgid="6112441768261754562">"Tetapan panggilan"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Tetapan tambahan"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Tiada rangkaian ditemui."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Cari rangkaian"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Ralat ketika mencari rangkaian."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Mendaftar di <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Kad SIM anda tidak membenarkan sambungan ke rangkaian ini."</string>
     <string name="connect_later" msgid="2308119155752343975">"Tidak dapat menyambung kepada rangkaian ini sekarang. Cuba lagi nanti."</string>
     <string name="registration_done" msgid="495135664535876612">"Didaftarkan pada rangkaian."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Pilih pengendali rangkaian"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Cari semua rangkaian tersedia"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Pilih rangkaian secara automatik"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Rangkaian"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Pendaftaran automatik..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Jenis rangkaian pilihan"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Tukar mod pengendalian rangkaian"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Jenis rangkaian pilihan"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(dilarang)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA diutamakan"</item>
     <item msgid="8442633436636425221">"GSM sahaja"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Anda mungkin dikenakan caj yang tinggi."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Benarkan perayauan data?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Penggunaan data"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> data mudah alih digunakan antara <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> data mudah alih digunakan <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Terperinci"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Pembawa"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"pembawa, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Data Mudah Alih"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Data mudah alih"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Akses data menggunakan rangkaian mudah alih"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Matikan data mudah alih?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Pemilihan diperlukan"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Tukar SIM data?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Gunakan <xliff:g id="NEW_SIM">%1$s</xliff:g> dan bukannya <xliff:g id="OLD_SIM">%2$s</xliff:g> untuk data mudah alih?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Panggilan Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Panggilan video pembawa"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Pilihan GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Rangkaian selular tidak tersedia. Sambung ke rangkaian wayarles untuk membuat panggilan."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Untuk membuat panggilan, masukkan nombor yang sah."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Panggilan gagal."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Panggilan tidak boleh ditambahkan pada masa ini."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Panggilan tidak dapat ditambahkan pada masa ini. Anda boleh cuba menghantar mesej untuk berhubung."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Perkhidmatan tidak disokong"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Tidak dapat menukar panggilan."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Tidak dapat mengasingkan panggilan."</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index bfce936..fa0b96f 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"အသံစာပို့စနစ် ( <xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g> )"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"အသံစာပို့နစ်အမှတ် -"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"အကြောင်းကြားချက်များ"</string>
-    <string name="networks" msgid="8873030692174541976">"ကွန်ရက် အော်ပရေတာများ"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"အရေးပေါ် ထုတ်လွှင့်မှုများ"</string>
     <string name="call_settings" msgid="6112441768261754562">"ဖုန်းခေါ်ဆိုခြင်း ဆက်တင်များ"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"နောက်ထပ်ဆက်တင်များ"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"ကွန်ယက်များ မတွေ့ပါ"</string>
-    <string name="search_networks" msgid="1601136049300882441">"ကွန်ယက်များရှာဖေခြင်း"</string>
     <string name="network_query_error" msgid="6828516148953325006">"ကွန်ယက်များကို ရှာဖွေစဉ် အမှားဖြစ်ပေါ်ပါသည်"</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> တွင် မှတ်ပုံတင်နေခြင်း…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"ဒီကွန်ယက်ကို ဆက်သွယ်ရန် သင့်ရဲ့ ဆင်းမ်ကဒ်မှ ခွင့်မပြုပါ"</string>
     <string name="connect_later" msgid="2308119155752343975">"ကွန်ယက်ကို ဆက်သွယ်လို့မရပါ။ နောင်မှ ပြန်ကြိုးစားပါ"</string>
     <string name="registration_done" msgid="495135664535876612">"ကွန်ယက်ပေါ်တွင် မှတ်ပုံတင်ထားခြင်း"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"ကွန်ယက်ဝန်ဆောင်မှုကို ရွေးချယ်ပါ"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"ရရှိုနိုင်သောကွန်ယက်အားလုံးကို ရှာပါ"</string>
     <string name="select_automatically" msgid="1046727200631770962">"ကွန်ရက်ကို အလိုအလျောက် ရွေးချယ်ရန်"</string>
     <string name="network_select_title" msgid="7733107364757544558">"ကွန်ရက်"</string>
     <string name="register_automatically" msgid="6017849844573519637">"အလိုအလျောက် မှတ်ပုံတင်ခြင်း…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ပိုနှစ်သက်သော ကွန်ရက်အမျိုးအစား"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"ကွန်ရက် လုပ်ဆောင်မှုစနစ်အား ပြောင်းပါ"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ပိုနှစ်သက်သော ကွန်ရက်အမျိုးအစား"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(တားမြစ်ထားသည်)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA သုံးလိုပါသည်"</item>
     <item msgid="8442633436636425221">"GSM သာ"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"သိသာသည့် ငွေနူန်းထားသင့်အား ကျသင့်နိုင်ပါသည်။"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"ကွန်ရက်ပြင်ပဒေတာအသုံးပြုခြင်း ခွင့်​ပြုမည်လား?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ဒေတာအသုံးပြုမှု"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> အကြား မိုဘိုင်းဒေတာ <xliff:g id="ID_1">%1$s</xliff:g> ကို အသုံးပြုထားပါသည်"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> အထိ မိုဘိုင်းဒေတာ <xliff:g id="ID_1">%1$s</xliff:g> ကို အသုံးပြုထားပါသည်"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"အဆင့်မြင့်"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"ဝန်ဆောင်မှုပေးသူ"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"ဖုန်းလိုင်း၊ esim၊ ဆင်းမ်ကဒ်၊ euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"မိုဘိုင်းဒေတာ"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"မိုဘိုင်းဒေတာ"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"မိုဘိုင်းကွန်ရက်သုံးပြီး ဒေတာကို ဝင်သုံးခွင့်ပေးပါ"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"မိုဘိုင်းဒေတာကို ပိတ်မလား။"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"ရွေးချယ်မှု လိုအပ်ပါသည်"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"ဒေတာဆင်းမ်ကဒ်ကို ပြောင်းမလား။"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"မိုဘိုင်းဒေတာအတွက် <xliff:g id="OLD_SIM">%2$s</xliff:g> အစား <xliff:g id="NEW_SIM">%1$s</xliff:g> ကို အသုံးပြုမလား။"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi ခေါ်ဆိုခြင်း"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"ဝန်ဆောင်မှုပေးသူ၏ ဗီဒီယိုခေါ်ဆိုခြင်း"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS ရွေးချယ်မှုများ"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"မိုဘိုင်းကွန်ရက် မရနိုင်ပါ။ ခေါ်ဆိုမှုပြုလုပ်ရန် ကြိုးမဲ့ကွန်ရက်သို့ ချိတ်ဆက်လိုက်ပါ။"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ဖုန်းခေါ်ရန်အတွက်၊ သင့်လျော်သည့်နံပါတ် ရိုက်ထည့်ပါ။"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"ခေါ်ဆို၍ မရပါ။"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"ယခုအချိန်တွင် ခေါ်ဆိုမှု ထပ်မထည့်နိုင်ပါ။"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"ယခုအချိန်တွင် ခေါ်ဆိုမှု ထပ်မထည့်နိုင်ပါ။ မက်ဆေ့ဂျ်ပို့ဆောင်ခြင်းဖြင့်လည်း ဆက်သွယ်ရန်ကြိုးစားနိုင်ပါသည်။"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"ဤဝန်ဆောင်မှုအား မပံ့ပိုးပါ။"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ဖုန်းခေါ်ခြင်းများကြား မကူးပ​ြောင်းနိုင်ပါ။"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ဖုန်းခေါ်ခြင်းအား မခွဲထုတ်နိုင်ပါ။"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 876d35b..c090e7e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Talepostkasse (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"Svarer:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Varsler"</string>
-    <string name="networks" msgid="8873030692174541976">"Nettoperatører"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Nødvarsler"</string>
     <string name="call_settings" msgid="6112441768261754562">"Samtaleinnstillinger"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Flere innstillinger"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Fant ingen nettverk."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Søk etter nettverk"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Det oppsto en feil under søking etter nettverk."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Kobler til <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM-kortet tillater ingen tilkobling til dette nettverket."</string>
     <string name="connect_later" msgid="2308119155752343975">"Kan ikke koble til dette nettverket akkurat nå. Prøv på nytt senere."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrert i nettverket."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Velg en nettverksoperatør"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Søk etter alle tilgjengelige nettverk"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Velg nettverk automatisk"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Nettverk"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatisk registrering"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Foretrukket nettverkstype"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Bytt nettverksmodus"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Foretrukket nettverkstype"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(forbudt)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA er foretrukket"</item>
     <item msgid="8442633436636425221">"Bare GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Det kan medføre betydelige kostnader."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Vil du tillate roaming?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Databruk"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobildata brukt mellom <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobildata er brukt i perioden <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avansert"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operatør"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operatør, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobildata"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobildata"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Bruk data via mobilnettverket"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Vil du slå av mobildata?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Du må velge en SIM-innstilling"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Endre SIM-kort for databruk?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Vil du bruke <xliff:g id="NEW_SIM">%1$s</xliff:g> i stedet for <xliff:g id="OLD_SIM">%2$s</xliff:g> for mobildata?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi-anrop"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videoanrop via mobiloperatør"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS-innstillinger"</string>
@@ -488,7 +489,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobilnettverk er ikke tilgjengelig. Koble til et trådløst nettverk for å ringe."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Skriv inn et gyldig nummer for å plassere en samtale."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Anropet mislyktes."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Anropet kan ikke legges til akkurat nå."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Kan ikke legge til anropet akkurat nå. Du kan prøve å ta kontakt ved å sende en melding."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Tjenesten støttes ikke"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kan ikke bytte samtaler."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kan ikke splitte opp samtale."</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 913c0da..d033349 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"भ्वाइस मेल (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"सूचनाहरू"</string>
-    <string name="networks" msgid="8873030692174541976">"नेटवर्क संचालकहरू"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"आपतकालीन प्रसारणहरू"</string>
     <string name="call_settings" msgid="6112441768261754562">"कल सेटिङहरू"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"अतिरिक्त सेटिङहरू"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"कुनै नेटवर्कहरू भेटिएनन्।"</string>
-    <string name="search_networks" msgid="1601136049300882441">"नेटवर्कहरू खोज्नुहोस्"</string>
     <string name="network_query_error" msgid="6828516148953325006">"नेटवर्कको लागि खोजी कार्य गर्दा त्रुटि"</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> मा दर्ता गर्दै..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"तपाईंको SIM कार्डले यो नेटवर्कको लागि जडान अनुमति दिँदैन।"</string>
     <string name="connect_later" msgid="2308119155752343975">"यो नेटवर्कमा अहिले जडान हुन सक्दैन। पछि प्रयास गर्नुहोस्।"</string>
     <string name="registration_done" msgid="495135664535876612">"नेटवर्कमा दर्ता भयो।"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"नेटवर्क संचालक रोज्नुहोस्"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"सम्पूर्ण उपलब्ध नेटवर्कहरूको खोजी कार्य गर्नुहोस्"</string>
     <string name="select_automatically" msgid="1046727200631770962">"नेटवर्क स्वत:छान्नुहोस्"</string>
     <string name="network_select_title" msgid="7733107364757544558">"नेटवर्क"</string>
     <string name="register_automatically" msgid="6017849844573519637">"स्वतः दर्ता..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"रुचाइएको सञ्जाल प्रकार"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"नेटवर्क संचालन मोड परिवर्तन गर्नुहोस्"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"रुचाइएको सञ्जाल प्रकार"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(निषेध गरिएको)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA रुचाइयो"</item>
     <item msgid="8442633436636425221">"GSM मात्र"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"तपाईंलाई अत्यन्त धेरै शुल्क लाग्न सक्छ।"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"डेटा रोमिङको अनुमति दिने हो?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"डेटाको प्रयोग"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> देखि <xliff:g id="ID_2">%2$s</xliff:g> सम्म प्रयोग भएको मोबाइल डेटा"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> सम्म <xliff:g id="ID_1">%1$s</xliff:g> मोबाइल डेटा प्रयोग भयो"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"उन्नत"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"सेवा प्रदायक"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"सेवा प्रदायक, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"मोबाइल डेटा"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"मोबाइल डेटा"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"मोबाइल नेटवर्कको प्रयोग गरी डेटामाथि पहुँच गर्नुहोस्"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"मोबाइल डेटा निष्क्रिय पार्ने हो?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"चयन गर्न आवश्यक छ"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"डेटा सिम परिवर्तन गर्ने हो?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"मोबाइल डेटाका लागि <xliff:g id="OLD_SIM">%2$s</xliff:g> को सट्टा <xliff:g id="NEW_SIM">%1$s</xliff:g> को प्रयोग गर्ने हो?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi कल"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"सेवा प्रदायकको भिडियो कल"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS  विकल्पहरू"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"मोबाइल नेटवर्क उपलब्ध छैन। कल गर्न तारविनाको नेटवर्कमा जडान गर्नुहोस्।"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"एक कल गर्नको लागि, एक वैध नम्बर प्रविष्ट गर्नुहोस्।"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"कल विफल भयो।"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"यतिबेला कल थप गर्न सकिँदैन।"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"यतिबेला कल गर्न सकिएन। तपाईंले कुनै सन्देश पठाएर सम्पर्क गर्ने प्रयास गर्न सक्नुहुन्छ।"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"सेवा समर्थित छैन"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"कल स्विच गर्न सक्दैन।"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"कल अलग गर्न सक्दैन।"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index f031437..6115388 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Meldingen"</string>
-    <string name="networks" msgid="8873030692174541976">"Mobiele providers"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Nooduitzendingen"</string>
     <string name="call_settings" msgid="6112441768261754562">"Oproepinstellingen"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Aanvullende instellingen"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Geen netwerken gevonden."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Netwerken zoeken"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Fout tijdens zoeken naar netwerken."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registreren op <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Je simkaart staat geen verbinding met dit netwerk toe."</string>
     <string name="connect_later" msgid="2308119155752343975">"Kan nu geen verbinding maken met dit netwerk. Probeer het later opnieuw."</string>
     <string name="registration_done" msgid="495135664535876612">"Geregistreerd op netwerk."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Een mobiele provider kiezen"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Alle beschikbare netwerken zoeken"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Netwerk automatisch selecteren"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Netwerk"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatische registratie..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Voorkeursnetwerktype"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"De netwerkgebruiksmodus wijzigen"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Voorkeursnetwerktype"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(niet toegestaan)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Voorkeur voor GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Alleen GSM"</item>
@@ -240,16 +236,21 @@
     <string name="roaming" msgid="7894878421600247140">"Roaming"</string>
     <string name="roaming_enable" msgid="7331106985174381987">"Verbinding maken met gegevensservices tijdens roaming"</string>
     <string name="roaming_disable" msgid="1843417228755568110">"Verbinding maken met gegevensservices tijdens roaming"</string>
-    <string name="roaming_reenable_message" msgid="8913735676127858115">"De gegevensverbinding is verbroken, omdat je je thuisnetwerk hebt verlaten terwijl gegevensroaming was uitgeschakeld."</string>
+    <string name="roaming_reenable_message" msgid="8913735676127858115">"De gegevensverbinding is verbroken, omdat je je thuisnetwerk hebt verlaten terwijl dataroaming was uitgeschakeld."</string>
     <string name="roaming_warning" msgid="1603164667540144353">"Er kunnen hoge roamingkosten in rekening worden gebracht."</string>
-    <string name="roaming_alert_title" msgid="3654815360303826008">"Gegevensroaming toestaan?"</string>
+    <string name="roaming_alert_title" msgid="3654815360303826008">"Dataroaming toestaan?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Datagebruik"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobiele data gebruikt tussen <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobiele data gebruikt van <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Geavanceerd"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Provider"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"provider, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobiele data"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobiele data"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Datatoegang via mobiel netwerk"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Mobiele data uitschakelen?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Selectie vereist"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Sim voor gegevens wijzigen?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"<xliff:g id="NEW_SIM">%1$s</xliff:g> in plaats van <xliff:g id="OLD_SIM">%2$s</xliff:g> gebruiken voor mobiele data?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Bellen via wifi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Provider videogesprekken"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM-/UMTS-opties"</string>
@@ -264,7 +265,7 @@
     <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Maximum van <xliff:g id="USED_0">%1$s</xliff:g> overschreden\nGegevenssnelheid verlaagd tot <xliff:g id="USED_1">%2$d</xliff:g>  KB/s"</string>
     <string name="throttle_time_frame_subtext" msgid="7732763021560399960">" ٪<xliff:g id="USED_0">%1$d</xliff:g>van cyclus verstreken\nDe volgende periode start over <xliff:g id="USED_1">%2$d</xliff:g> dagen (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
     <string name="throttle_rate_subtext" msgid="2149102656120726855">"Gegevenssnelheid wordt verlaagd tot <xliff:g id="USED">%1$d</xliff:g>  KB/s als de limiet voor gegevensgebruik wordt overschreden"</string>
-    <string name="throttle_help_subtext" msgid="5217706521499010816">"Meer informatie over het beleid voor gegevensgebruik van je mobiele provider"</string>
+    <string name="throttle_help_subtext" msgid="5217706521499010816">"Meer informatie over het beleid voor datagebruik van je mobiele provider"</string>
     <string name="cell_broadcast_sms" msgid="5584192824053625842">"Infodienstbericht"</string>
     <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"SMS Infodienstbericht"</string>
     <string name="cell_bc_sms_enable" msgid="6441688565738921084">"SMS Infodienstbericht ingeschakeld"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobiel netwerk is niet beschikbaar. Maak verbinding met een draadloos netwerk om te bellen."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Als je wilt bellen, moet je een geldig nummer invoeren."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Oproep mislukt."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Oproep kan momenteel niet worden toegevoegd."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Oproep kan op dit moment niet worden toegevoegd. Je kunt contact opnemen door een bericht te sturen."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Service wordt niet ondersteund"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kan niet overschakelen tussen oproepen."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kan oproep niet scheiden."</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 6aae4d8..bd4c305 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"ਵੌਇਸਮੇਲ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"ਸੂਚਨਾਵਾਂ"</string>
-    <string name="networks" msgid="8873030692174541976">"ਨੈਟਵਰਕ ਓਪਰੇਟਰ"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"ਐਮਰਜੈਂਸੀ ਪ੍ਰਸਾਰਨ"</string>
     <string name="call_settings" msgid="6112441768261754562">"ਕਾਲ ਸੈਟਿੰਗਾਂ"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"ਵਧੀਕ ਸੈਟਿੰਗਾਂ"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"ਕੋਈ ਨੈਟਵਰਕ ਨਹੀਂ ਮਿਲੇ।"</string>
-    <string name="search_networks" msgid="1601136049300882441">"ਖੋਜ ਨੈਟਵਰਕ"</string>
     <string name="network_query_error" msgid="6828516148953325006">"ਨੈਟਵਰਕਾਂ ਦੀ ਖੋਜ ਕਰਦੇ ਸਮੇਂ ਅਸ਼ੁੱਧੀ।"</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> ਤੇ ਰਜਿਸਟਰ ਕਰ ਰਿਹਾ ਹੈ…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"ਤੁਹਾਡਾ SIM ਇਸ ਨੈਟਵਰਕ ਲਈ ਇੱਕ ਕਨੈਕਸ਼ਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੰਦਾ।"</string>
     <string name="connect_later" msgid="2308119155752343975">"ਹੁਣ ਇਸ ਨੈਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
     <string name="registration_done" msgid="495135664535876612">"ਨੈਟਵਰਕ ਤੇ ਰਜਿਸਟਰ ਕੀਤਾ।"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"ਇੱਕ ਨੈਟਵਰਕ ਓਪਰੇਟਰ ਚੁਣੋ"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"ਸਾਰੇ ਉਪਲਬਧ ਨੈਟਵਰਕਾਂ ਦੀ ਖੋਜ"</string>
     <string name="select_automatically" msgid="1046727200631770962">"ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਨੈੱਟਵਰਕ ਚੁਣੋ"</string>
     <string name="network_select_title" msgid="7733107364757544558">"ਨੈੱਟਵਰਕ"</string>
     <string name="register_automatically" msgid="6017849844573519637">"ਸਵੈਚਲਿਤ ਰਜਿਸਟਰੇਸ਼ਨ…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਪ੍ਰਕਾਰ"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"ਨੈਟਵਰਕ ਓਪਰੇਟਿੰਗ ਮੋਡ ਬਦਲੋ"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਪ੍ਰਕਾਰ"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(ਵਰਜਿਤ)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA ਤਰਜੀਹੀ"</item>
     <item msgid="8442633436636425221">"ਸਿਰਫ਼ GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"ਤੁਹਾਨੂੰ ਵਾਧੂ ਖਰਚਾ ਦੇਣਾ ਪੈ ਸਕਦਾ ਹੈ"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"ਕੀ ਡਾਟਾ ਰੋਮਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ਡਾਟਾ ਵਰਤੋਂ"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> ਵਿਚਕਾਰ <xliff:g id="ID_1">%1$s</xliff:g> ਮੋਬਾਈਲ  ਡਾਟਾ  ਵਰਤਿਆ ਗਿਆ"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> ਤੱਕ <xliff:g id="ID_1">%1$s</xliff:g> ਮੋਬਾਈਲ  ਡਾਟਾ  ਵਰਤਿਆ ਗਿਆ"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"ਉੱਨਤ"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"ਕੈਰੀਅਰ"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"ਕੈਰੀਅਰ, ਈਸਿਮ, ਸਿਮ, ਈਯੂਆਈਸੀਸੀ"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"ਮੋਬਾਈਲ ਡਾਟਾ"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"ਮੋਬਾਈਲ ਡਾਟਾ"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਡਾਟਾ \'ਤੇ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"ਮੋਬਾਈਲ  ਡਾਟਾ  ਬੰਦ ਕਰਨਾ ਹੈ?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"ਚੋਣ ਲੋੜੀਂਦੀ ਹੈ"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">" ਡਾਟਾ  SIM ਬਦਲਣਾ ਹੈ?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"ਮੋਬਾਈਲ ਡਾਟੇ ਦੇ ਲਈ <xliff:g id="OLD_SIM">%2$s</xliff:g> ਦੀ ਬਜਾਏ <xliff:g id="NEW_SIM">%1$s</xliff:g> ਨੂੰ ਵਰਤਣਾ ਹੈ?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi‑Fi ਕਾਲਿੰਗ"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"ਕੈਰੀਅਰ ਵੀਡੀਓ ਕਾਲਿੰਗ"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS ਚੋਣਾਂ"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਕਾਲ ਕਰਨ ਲਈ ਕਿਸੇ ਵਾਇਰਲੈੱਸ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ।"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ਇੱਕ ਕਾਲ ਕਰਨ ਲਈ, ਇੱਕ ਪ੍ਰਮਾਣਿਕ ਨੰਬਰ ਦਰਜ ਕਰੋ।"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"ਕਾਲ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"ਇਸ ਵੇਲੇ ਕਾਲ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"ਇਸ ਸਮੇਂ ਕਾਲ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਤੁਸੀਂ ਇੱਕ ਸੁਨੇਹਾ ਭੇਜ ਕੇ ਸੰਪਰਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ।"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"ਸੇਵਾ ਸਮਰਥਿਤ ਨਹੀਂ"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ਕਾਲਾਂ ਸਵਿਚ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ਕਾਲ ਵੱਖ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 8739ebb..301943f 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Poczta głosowa (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"Poczta głosowa:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Powiadomienia"</string>
-    <string name="networks" msgid="8873030692174541976">"Operatorzy sieci"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Komunikaty alarmowe"</string>
     <string name="call_settings" msgid="6112441768261754562">"Ustawienia połączeń"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Ustawienia dodatkowe"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nie znaleziono sieci."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Wyszukaj sieci"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Podczas wyszukiwania sieci wystąpił błąd."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Rejestrowanie w <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Karta SIM nie pozwala na połączenia z tą siecią."</string>
     <string name="connect_later" msgid="2308119155752343975">"Nie można teraz połączyć się z tą siecią. Spróbuj ponownie później."</string>
     <string name="registration_done" msgid="495135664535876612">"Zarejestrowano w sieci."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Wybierz operatora sieci"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Wyszukaj wszystkie dostępne sieci"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Automatycznie wybieraj sieć"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Sieć"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatyczna rejestracja..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Preferowany typ sieci"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Zmień tryb działania sieci"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Preferowany typ sieci"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(dostęp zabroniony)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Preferowany GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Tylko GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Mogą się z tym wiązać wysokie opłaty."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Zezwolić na roaming danych?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Użycie danych"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Wykorzystano <xliff:g id="ID_1">%1$s</xliff:g> mobilnej transmisji danych w okresie <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Wykorzystano <xliff:g id="ID_1">%1$s</xliff:g> mobilnej transmisji danych w okresie <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Zaawansowane"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operator"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operator, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobilna transmisja danych"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobilna transmisja danych"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Korzystaj z danych przy użyciu sieci komórkowej"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Wyłączyć mobilną transmisję danych?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Musisz wybrać kartę"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Zmienić kartę SIM do danych?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Użyć karty <xliff:g id="NEW_SIM">%1$s</xliff:g> zamiast <xliff:g id="OLD_SIM">%2$s</xliff:g> do mobilnej transmisji danych?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Połączenia przez Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Rozmowy wideo w sieci operatora"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opcje GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Sieć komórkowa jest niedostępna. Połącz się z siecią bezprzewodową, by zadzwonić."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Aby zadzwonić, wybierz prawidłowy numer."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Nie udało się połączyć."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Nie można w tej chwili dodać połączenia."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"W tej chwili nie możesz zadzwonić. Zamiast tego możesz wysłać wiadomość."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Usługa nie jest obsługiwana"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nie można przełączyć połączeń."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nie można rozdzielić połączenia."</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index f1dda6b..fd52131 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Correio de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"Correio de voz:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notificações"</string>
-    <string name="networks" msgid="8873030692174541976">"Operadores de rede"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Transmissões de emergência"</string>
     <string name="call_settings" msgid="6112441768261754562">"Definições de chamada"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Definições adicionais"</string>
@@ -120,7 +119,7 @@
     <string name="sum_cfnrc_disabled" msgid="2684474391807469832">"Desativado"</string>
     <string name="disable_cfnrc_forbidden" msgid="5646361343094064333">"O seu operador não suporta a desativação do reencaminhamento de chamadas quando o telemóvel não está acessível."</string>
     <string name="updating_title" msgid="6146755386174019046">"Definições de chamadas"</string>
-    <string name="call_settings_admin_user_only" msgid="4526094783818216374">"As definições de chamadas só podem ser alteradas pelo utilizador administrador."</string>
+    <string name="call_settings_admin_user_only" msgid="4526094783818216374">"As definições de chamadas só podem ser alteradas pelo utilizador gestor."</string>
     <string name="call_settings_with_label" msgid="3401177261468593519">"Definições (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="7970259216988931777">"Erro nas definições de chamada"</string>
     <string name="reading_settings" msgid="1920291699287055284">"A ler as definições..."</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nenhuma rede encontrada."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Procurar redes"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Erro ao procurar redes."</string>
     <string name="register_on_network" msgid="9055203954040805084">"A registar em <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"O cartão SIM não permite uma ligação a esta rede."</string>
     <string name="connect_later" msgid="2308119155752343975">"De momento, não é possível estabelecer ligação com esta rede. Tente novamente mais tarde."</string>
     <string name="registration_done" msgid="495135664535876612">"Registado na rede."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Escolher um operador de rede"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Procurar todas as redes disponíveis"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Selecionar automaticamente a rede"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Rede"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Registo automático..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tipo de rede preferencial"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Alterar o modo de funcionamento em rede"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tipo de rede preferencial"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(proibida)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA preferido"</item>
     <item msgid="8442633436636425221">"Apenas GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Podem ser cobrados custos significativos."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Pretende permitir roaming de dados?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Utilização de dados"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> de dados móveis utilizados entre <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> de dados móveis utilizados entre <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avançadas"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operador"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operador, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Dados móveis"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Dados móveis"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Aceder aos dados através de rede móvel"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Pretende desativar os dados móveis?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"A seleção é necessária"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Pretende alterar o SIM de dados?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Pretende utilizar o <xliff:g id="NEW_SIM">%1$s</xliff:g> em vez do <xliff:g id="OLD_SIM">%2$s</xliff:g> para os dados móveis?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Chamadas Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videochamadas do operador"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opções GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"A rede móvel não está disponível. Ligue-se a uma rede sem fios para efetuar uma chamada."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para telefonar, introduza um número válido."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"A chamada falhou."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Não é possível adicionar a chamada neste momento."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Não é possível adicionar a chamada neste momento. Pode tentar entrar em contacto ao enviar uma mensagem."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Serviço não suportado"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Não é possível alternar chamadas."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Não é possível separar a chamada."</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index c0deea6..1793d2e 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Correio de voz (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notificações"</string>
-    <string name="networks" msgid="8873030692174541976">"Operadoras de rede"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Transmissões de emergência"</string>
     <string name="call_settings" msgid="6112441768261754562">"Configurações de chamadas"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Config. adicionais"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nenhuma rede encontrada."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Pesquisar redes"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Erro ao pesquisar redes."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registrando na <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Seu cartão SIM não permite uma conexão com esta rede."</string>
     <string name="connect_later" msgid="2308119155752343975">"Não é possível se conectar a esta rede agora. Tente novamente mais tarde."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrado na rede."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Selecione uma operadora de rede"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Pesquisar todas as redes disponíveis"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Selecionar a rede automaticamente"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Rede"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Registro automático..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tipo de rede preferencial"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Alterar o modo de operação de rede"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tipo de rede preferencial"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(proibido)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA preferencial"</item>
     <item msgid="8442633436636425221">"Somente GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Pode haver cobranças significativas."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Permitir roaming de dados?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Uso de dados"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> dados móveis usados entre <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> de dados móveis usados em <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avançadas"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operadora"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operadora, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>: <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Dados móveis"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Dados móveis"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Acessar os dados pela rede móvel"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Desativar os dados móveis?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"É necessário selecionar uma opção"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Alterar SIM para dados móveis?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Usar <xliff:g id="NEW_SIM">%1$s</xliff:g> em vez de <xliff:g id="OLD_SIM">%2$s</xliff:g> para dados móveis?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Chamadas por Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videochamadas via operadora"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opções GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"A rede móvel não está disponível. Conecte-se a uma rede sem fio para fazer uma chamada."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para realizar uma chamada, digite um número válido."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Falha na chamada."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"No momento, não é possível adicionar a chamada."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Não é possível ligar no momento. Entre em contato enviando uma mensagem."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Serviço não suportado"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Não é possível alternar as chamadas."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Não é possível separar a chamada."</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 5dde1ac..cc91c8c 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Mesagerie vocală (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"MV:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Notificări"</string>
-    <string name="networks" msgid="8873030692174541976">"Operatori de rețea"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Transmisiuni de urgență"</string>
     <string name="call_settings" msgid="6112441768261754562">"Setări pentru apeluri"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Setări suplimentare"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nicio rețea găsită."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Căutați rețele"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Eroare la căutarea rețelelor."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Se înregistrează pe <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Cardul dvs. SIM nu permite conexiunea la această rețea."</string>
     <string name="connect_later" msgid="2308119155752343975">"Nu se poate efectua conectarea la această rețea chiar acum. Încercați din nou mai târziu."</string>
     <string name="registration_done" msgid="495135664535876612">"Înregistrat în rețea."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Alegeți un operator de rețea"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Căutați toate rețelele disponibile"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Selectați automat rețeaua"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Rețea"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Înregistrare automată..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tipul de rețea preferat"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Schimbați modul de operare a rețelei"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tipul de rețea preferat"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(interzis)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA preferată"</item>
     <item msgid="8442633436636425221">"Numai GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Se pot acumula costuri mari."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Permiteți roamingul de date?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Utilizarea datelor"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> de date mobile utilizate în intervalul <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> de date mobile utilizate în intervalul <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avansate"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operator"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operator, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Date mobile"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Date mobile"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Accesați datele folosind rețeaua mobilă"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Dezactivați datele mobile?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Selectați o opțiune"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Schimbați cartela SIM de date?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Folosiți <xliff:g id="NEW_SIM">%1$s</xliff:g> în loc de <xliff:g id="OLD_SIM">%2$s</xliff:g> pentru datele mobile?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Apelare prin Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Apelare video prin operator"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opțiuni GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Rețeaua mobilă nu este disponibilă. Pentru a apela, conectați-vă la o rețea wireless."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Pentru a apela, introduceți un număr valid."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Apelul nu a fost inițiat."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Apelul nu poate fi adăugat în acest moment."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Apelul nu poate fi inițiat în acest moment. Puteți lua legătura cu persoana respectivă trimițându-i un mesaj."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Serviciul nu este compatibil"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Apelurile nu pot fi comutate."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Apelul nu poate fi separat."</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 673be69..66838cf 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Голосовая почта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ГП:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Уведомления"</string>
-    <string name="networks" msgid="8873030692174541976">"Операторы связи"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Оповещения о чрезвычайных ситуациях"</string>
     <string name="call_settings" msgid="6112441768261754562">"Вызовы"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Дополнительные настройки"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Сети не найдены."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Поиск сетей"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Ошибка поиска сетей."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Регистрация в сети <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Ваша SIM-карта не поддерживает подключение к этой сети."</string>
     <string name="connect_later" msgid="2308119155752343975">"Не удалось подключиться к сети. Повторите попытку позже."</string>
     <string name="registration_done" msgid="495135664535876612">"Регистрация в сети завершена."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Выберите оператора связи"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Поиск всех доступных сетей"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Выбирать сеть автоматически"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Сеть"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Автоматическая регистрация..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Тип сети"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Изменить режим работы сети"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Тип сети"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(доступ запрещен)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA (предпочтительный режим)"</item>
     <item msgid="8442633436636425221">"Только GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Возможны значительные расходы."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Разрешить интернет-роуминг?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Передача данных"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Объем мобильного трафика за период <xliff:g id="ID_2">%2$s</xliff:g>: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Объем мобильного трафика за период <xliff:g id="ID_2">%2$s</xliff:g>: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Дополнительные настройки"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Оператор"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"оператор, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Мобильный Интернет"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Мобильный Интернет"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Доступ к Интернету по мобильной сети"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Отключить мобильный Интернет?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Выберите SIM-карту"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Смена SIM-карты"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Использовать для передачи данных по мобильной сети SIM-карту \"<xliff:g id="NEW_SIM">%1$s</xliff:g>\" (вместо \"<xliff:g id="OLD_SIM">%2$s</xliff:g>\")?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Звонки по Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Видеозвонки"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Параметры GSM/UMTS"</string>
@@ -484,7 +485,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Мобильная сеть недоступна. Чтобы позвонить, подключитесь к Wi-Fi."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Недействительный номер."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Не удалось отправить вызов."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Невозможно позвонить в данный момент."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Не удается позвонить. Попробуйте отправить сообщение."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Сервис не поддерживается"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Не удалось переключить вызов."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Не удалось разделить вызов."</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 38865a7..dc5f92e 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"හඬ තැපෑල (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"දැනුම්දීම්"</string>
-    <string name="networks" msgid="8873030692174541976">"ජාල ක්‍රියාකරුවන්"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"හදිසි විකාශන"</string>
     <string name="call_settings" msgid="6112441768261754562">"ඇමතුම් සැකසුම්"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"අතිරේක සැකසීම්"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"කිසිඳු ජාලයක් සොයාගත නොහැකි විය."</string>
-    <string name="search_networks" msgid="1601136049300882441">"ජාල සොයන්න"</string>
     <string name="network_query_error" msgid="6828516148953325006">"ජාල සඳහා සොයන අතරතුර දෝෂය."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> මත ලියාපදිංචි වෙමින්…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"ඔබගේ SIM කාඩ් පත මෙම ජාලයට සම්බන්ධතාවයකට අවසර නොදේ."</string>
     <string name="connect_later" msgid="2308119155752343975">"මෙම අවස්ථාවේදී මෙම ජාලයට සම්බන්ධ විය නොහැක. පසුව යළි උත්සාහ කරන්න."</string>
     <string name="registration_done" msgid="495135664535876612">"ජාලය මත ලියාපදිංචි වෙමින්."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"ජාල ක්‍රියාකරවන්නෙකු තෝරන්න"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"සියලුම තිබෙන ජාල සොයන්න"</string>
     <string name="select_automatically" msgid="1046727200631770962">"ස්වයංක්‍රියව ජාලය තෝරන්න"</string>
     <string name="network_select_title" msgid="7733107364757544558">"ජාලය"</string>
     <string name="register_automatically" msgid="6017849844573519637">"ස්වයංක්‍රීය ලියාපදිංචිය..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ප්‍රියකරන ජාල වර්ගය"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"ජාල මෙහෙයුම් ආකාරය වෙනස් කරන්න"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ප්‍රියකරන ජාල වර්ගය"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(තහනම්)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA කැමතියි"</item>
     <item msgid="8442633436636425221">"GSM පමණි"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"ඔබ සැලකිය යුතු ගාස්තු ඇති විය හැකිය."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"දත්ත රෝමින් සඳහා අවසර දෙන්න ද?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"දත්ත භාවිතය"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> අතර ජංගම දත්ත <xliff:g id="ID_1">%1$s</xliff:g>ක් භාවිත කර ඇත"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> <xliff:g id="ID_1">%1$s</xliff:g>ක ජංගම දත්ත භාවිත කරන ලදී"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"උසස්"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"වාහකය"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"වාහකය, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"ජංගම දත්ත"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"ජංගම දත්ත"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"ජංගම ජාලය භාවිතයෙන් දත්ත වෙත ප්‍රවේශ වන්න"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"ජංගම දත්ත ක්‍රියාවිරහිත කරන්නද?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"තේරීම අවශ්‍යයි"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"දත්ත SIM වෙනස් කරන්නද?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"ජංගම දත්ත සඳහා <xliff:g id="NEW_SIM">%1$s</xliff:g> <xliff:g id="OLD_SIM">%2$s</xliff:g> වෙනුවට භාවිත කරන්නද?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi ඇමතීම"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"වාහක වීඩියෝ ඇමතීම"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS විකල්ප"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"ජංගම ජාලය ලබා ගැනීමට නොහැකිය. ඇමතුමක් කිරීමට රැහැන් රහිත ජාලයකට සම්බන්ධ කරන්න."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ඇමතුමක් ලබාගැනීමට, වලංගු අංකයක් ලබාගන්න."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"ඇමතුම අසාර්ථක විය."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"ඇමතුම මේ අවස්ථාවේදී එක් කළ නොහැකිය."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"ඇමතුම මෙම වේලාවේදී එක් කිරීමට නොහැකිය. ඔබට පණිවිඩයක් යැවීමෙන් ළඟා වීමට උත්සාහ කිරීමට හැකිය."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"සේවාවට සහාය දක්වන්නේ නැත"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ඇමතුම් මාරු කිරීම කළ නොහැක."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ඇමතුම වෙන් කිරීම කළ නොහැක."</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index d670c59..0e93513 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Hlasová schránka (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"HS:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Upozornenia"</string>
-    <string name="networks" msgid="8873030692174541976">"Sieťoví operátori"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Núdzové vysielania"</string>
     <string name="call_settings" msgid="6112441768261754562">"Nastavenia hovorov"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Ďalšie nastavenia"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nebola nájdená žiadna sieť."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Vyhľadávať siete"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Pri vyhľadávaní sietí došlo k chybe."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Prebieha registrácia v sieti <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Vaša SIM karta nepovoľuje pripojenie k tejto sieti."</string>
     <string name="connect_later" msgid="2308119155752343975">"V tejto chvíli sa nedá pripojiť k sieti. Skúste to znova neskôr."</string>
     <string name="registration_done" msgid="495135664535876612">"Prihlásenie k sieti prebehlo úspešne."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Zvoliť sieťového operátora"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Hľadať všetky dostupné siete"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Vybrať sieť automaticky"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Sieť"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatická registrácia..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Preferovaný typ siete"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Zmeniť prevádzkový režim siete"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Preferovaný typ siete"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(zakázané)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA – preferované"</item>
     <item msgid="8442633436636425221">"Iba GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Môžu sa vám účtovať vysoké poplatky."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Povoliť dátový roaming?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Spotreba dát"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Spotreba mobilných dát za obdobie <xliff:g id="ID_2">%2$s</xliff:g> je <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Spotreba mobilných dát za obdobie <xliff:g id="ID_2">%2$s</xliff:g> je <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Rozšírené"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operátor"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operátor, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobilné dáta"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobilné dáta"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Prístup k dátam pomocou mobilnej siete"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Vypnúť mobilné dáta?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Vyžaduje sa výber"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Zmeniť SIM kartu pre dáta?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Chcete na mobilné dáta používať SIM kartu <xliff:g id="NEW_SIM">%1$s</xliff:g> (namiesto <xliff:g id="OLD_SIM">%2$s</xliff:g>)?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Volanie cez Wi‑Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videohovory prostredníctvom operátora"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Možnosti GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobilná sieť nie je k dispozícii. Ak chcete volať, pripojte sa k bezdrôtovej sieti."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Ak chcete volať, zadajte platné číslo"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Hovor zlyhal."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Hovor momentálne nie je možné pridať."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Hovor sa momentálne nedá pridať. Môžete namiesto toho skúsiť poslať správu."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Služba nie je podporovaná"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nedajú sa prepínať hovory"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nedá sa rozdeliť hovor"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 80e0a6a..40573df 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Odzivnik (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Obvestila"</string>
-    <string name="networks" msgid="8873030692174541976">"Omrežni operaterji"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Oddaje v sili"</string>
     <string name="call_settings" msgid="6112441768261754562">"Nastavitve klicev"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Dodatne nastavitve"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Najdeno ni bilo nobeno omrežje."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Preišči omrežja"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Napaka pri iskanju omrežij."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registriranje v <xliff:g id="NETWORK">%s</xliff:g> ..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Kartica SIM ne dovoljuje povezave s tem omrežjem."</string>
     <string name="connect_later" msgid="2308119155752343975">"S tem omrežjem trenutno ni mogoče vzpostaviti povezave. Poskusite znova pozneje."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrirano v omrežju."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Izbira omrežnega operaterja"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Najdi vsa razpoložljiva omrežja"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Samodejno izberi omrežje"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Omrežje"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Samodejna registracija ..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Prednostna vrsta omrežja"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Sprememba načina delovanja omrežja"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Prednostna vrsta omrežja"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(prepovedano)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Prednostno GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Samo GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Stroški utegnejo biti veliki."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Želite dovoliti podatkovno gostovanje?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Prenesena količina podatkov"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"V obdobju <xliff:g id="ID_2">%2$s</xliff:g> je bilo v mobilnem omrežju prenesenih <xliff:g id="ID_1">%1$s</xliff:g> podatkov"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"V obdobju <xliff:g id="ID_2">%2$s</xliff:g> je bilo v mobilnem omrežju prenesenih <xliff:g id="ID_1">%1$s</xliff:g> podatkov"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Dodatno"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operater"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operater, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Prenos podatkov v mobilnem omrežju"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Prenos podatkov v mobilnem omrežju"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Dostop do podatkov prek mobilnega omrežja"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Želite izklopiti prenos podatkov v mobilnem omrežju?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Potrebna je izbira"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Druga kart. SIM za pren. pod.?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Želite za prenos podatkov v mobilnem omrežju namesto <xliff:g id="OLD_SIM">%2$s</xliff:g> uporabiti <xliff:g id="NEW_SIM">%1$s</xliff:g>?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Klicanje prek Wi-Fi-ja"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videoklicanje prek operaterja"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Možnosti GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobilno omrežje ni na voljo. Če želite opraviti klic, vzpostavite povezavo z brezžičnim omrežjem."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Če želite opraviti klic, vnesite veljavno številko."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Klic ni uspel."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Klica trenutno ni mogoče dodati."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Trenutno ni mogoče dodati klica. Poskusite poslati sporočilo."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Storitev ni podprta"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Preklop med klici ni mogoč."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Ločitev klica ni mogoča."</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 07159fa..de7e6f3 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Posta zanore (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Njoftimet"</string>
-    <string name="networks" msgid="8873030692174541976">"Operatorët e rrjetit"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Transmetimet e urgjencës"</string>
     <string name="call_settings" msgid="6112441768261754562">"Cilësimet e telefonatës"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Cilësimet shtesë"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Nuk u gjetën rrjete."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Kërko rrjetet"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Gabim gjatë kërkimit për rrjete."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Po regjistron në <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Karta SIM nuk lejon lidhje me këtë rrjet."</string>
     <string name="connect_later" msgid="2308119155752343975">"Nuk mund të lidhet me këtë rrjet tani. Provo sërish më vonë."</string>
     <string name="registration_done" msgid="495135664535876612">"Regjistruar në rrjet."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Zgjidh një operator rrjeti"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Kërko të gjitha rrjetet e arritshme"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Zgjidh automatikisht rrjetin"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Rrjeti"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Regjistrim automatik…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Lloji i preferuar i rrjetit"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Ndrysho modalitetin e operimit të rrjetit"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Lloji i preferuar i rrjetit"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(ndalohet)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA i preferuar"</item>
     <item msgid="8442633436636425221">"Vetëm GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Mund të shkaktohen tarifa të larta."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Të lejohet përdorimi i të dhënave kur je në roaming?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Përdorimi i të dhënave"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> të dhëna celulare të përdorura mes datave <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> të dhëna celulare të përdorura mes datave <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Të përparuara"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operatori celular"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operatori celular, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> - <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Të dhënat celulare"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Të dhënat celulare"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Qasu te të dhënat duke përdorur rrjetin celular"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Të çaktivizohen të dhënat celulare?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Kërkohet përzgjedhja"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Të ndryshohet SIM për të dhënat?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Të përdoret <xliff:g id="NEW_SIM">%1$s</xliff:g> në vend të <xliff:g id="OLD_SIM">%2$s</xliff:g> për të dhënat celulare?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Telefonata me Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Telefonata me video e operatorit celular"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Opsionet GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Rrjeti celular nuk ofrohet. Lidhu me një rrjet pa tel për të bërë një telefonatë."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Për të kryer një telefonatë, fut një numër të vlefshëm."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Thirrja dështoi."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Telefonata nuk mund të shtohet këtë herë."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Telefonata nuk mund të shtohet në këtë moment. Mund të provosh të kontaktosh duke dërguar një mesazh."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Shërbimi nuk mbështetet"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nuk mund të ndryshojë telefonatat."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nuk mund të ndajë telefonatën."</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 7f265c4..28cea4f 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Гласовна пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Обавештења"</string>
-    <string name="networks" msgid="8873030692174541976">"Мрежни оператери"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Хитни преноси"</string>
     <string name="call_settings" msgid="6112441768261754562">"Подешавања позива"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Додатна подешавања"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Нису пронађене мреже."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Претражи мреже"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Грешка током тражења мрежа."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Регистровање на <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM картица не дозвољава везу са овом мрежом."</string>
     <string name="connect_later" msgid="2308119155752343975">"Тренутно није могуће повезати се са овом мрежом. Пробајте поново касније."</string>
     <string name="registration_done" msgid="495135664535876612">"Регистровано на мрежи."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Изаберите мрежног оператера"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Потражи све доступне мреже"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Аутоматски изабери мрежу"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Мрежа"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Аутоматска регистрација..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Жељени тип мреже"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Промена режима рада мреже"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Жељени тип мреже"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(забрањено)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA има предност"</item>
     <item msgid="8442633436636425221">"Само GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Могу да настану значајни трошкови."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Дозвољавате пренос података у ромингу?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Употреба података"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Потрошили сте <xliff:g id="ID_1">%1$s</xliff:g> мобилних података у периоду <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Потрошили сте <xliff:g id="ID_1">%1$s</xliff:g> мобилних података у периоду <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Напредно"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Мобилни оператер"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"мобилни оператер, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Мобилни подаци"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Мобилни подаци"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Користи податке преко мобилне мреже"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Желите ли да искључите мобилне податке?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Потребно је да изаберете нешто"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Да променимо SIM за податке?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Желите ли да за мобилне податке користите <xliff:g id="NEW_SIM">%1$s</xliff:g> уместо <xliff:g id="OLD_SIM">%2$s</xliff:g>?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Позивање преко Wi-Fi-ја"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Видео позивање преко оператера"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Опције за GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Мобилна мрежа није доступна. Повежите се на бежичну да бисте упутили позив."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Да бисте упутили позив, унесите важећи број."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Позив није успео."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Тренутно није могуће додати позив."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Додавање позива тренутно није могуће. Можете да покушате да остварите контакт помоћу поруке."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Услуга није подржана"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Замена позива није успела."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Раздвајање позива није успело."</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 1eef910..e535456 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Röstbrevlåda (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"RB:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Aviseringar"</string>
-    <string name="networks" msgid="8873030692174541976">"Nätverksoperatörer"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Nödsändningar"</string>
     <string name="call_settings" msgid="6112441768261754562">"Samtalsinställningar"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Ytterligare inställningar"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Hittade inga nätverk."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Sök efter nätverk"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Ett fel uppstod när vi sökte efter nätverk."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Registrerar på <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Ditt SIM-kort tillåter inte anslutning till detta nätverk."</string>
     <string name="connect_later" msgid="2308119155752343975">"Det går inte att ansluta till det här nätverket just nu. Försök igen senare."</string>
     <string name="registration_done" msgid="495135664535876612">"Registrerad på nätverk."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Välj en nätverksoperatör"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Sök efter alla tillgängliga nätverk"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Välj nätverk automatiskt"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Nätverk"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Automatisk registrering ..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Önskad nätverkstyp"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Ändra nätverksläge"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Önskad nätverkstyp"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(förbjudet)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Föredrar GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Endast GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Detta kan leda till höga kostnader."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Vill du tillåta dataroaming?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Dataanvändning"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> mobildata använt mellan <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobildata använt mellan <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Avancerat"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operatör"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operatör, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobildata"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobildata"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Få åtkomst till data via mobilt nätverk"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Vill du inaktivera mobildata?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Du måste välja något"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Vill du ändra data-SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Vill du använda <xliff:g id="NEW_SIM">%1$s</xliff:g> i stället för <xliff:g id="OLD_SIM">%2$s</xliff:g> för mobildata?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi-samtal"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Videosamtal via operatören"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Alternativ för GSM/UMTS"</string>
@@ -488,7 +489,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Det finns inga tillgängliga mobilnätverk. Anslut till ett trådlöst nätverk om du vill ringa."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Ange ett giltigt nummer om du vill ringa ett samtal."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Det gick inte att koppla samtalet."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Det går inte att lägga till samtalet just nu."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Det går inte att lägga till samtalet just nu. Ta istället kontakt genom att skicka ett meddelande."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Tjänsten stöds inte"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Det gick inte att växla mellan samtal."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Det gick inte att koppla isär samtalen."</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 3f8fbd8..0a16e94 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Ujumbe wa sauti (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Arifa"</string>
-    <string name="networks" msgid="8873030692174541976">"Kampuni zinazotoa huduma"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Matangazo ya dharura"</string>
     <string name="call_settings" msgid="6112441768261754562">"Mipangilio ya simu"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Mipangilio ya ziada"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Hakuna mitandao iliyopatikana."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Tafuta mitandao"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Hitilafu wakati wa utafutaji wa mitandao."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Inasajili kwa <xliff:g id="NETWORK">%s</xliff:g>….."</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM kadi yako hairuhusu muunganisho wa mtandao huu."</string>
     <string name="connect_later" msgid="2308119155752343975">"Haiwezi kuunganisha na mtandao huu hivi sasa. Jaribu tena baadaye."</string>
     <string name="registration_done" msgid="495135664535876612">"Imesajiliwa katika mtandao"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Chagua mtoa huduma"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Tafuta mitandao yote inayopatikana"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Chagua mtandao kiotomatiki"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Mtandao"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Usajili otomatiki..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Aina ya mtandao unaoupendelea"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Badilisha gumzo ya utendaji wa mtandao"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Aina ya mtandao unaoupendelea"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(hairuhusiwi)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA inapendelewa"</item>
     <item msgid="8442633436636425221">"GSM pekee"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Huenda ukatozwa gharama kubwa."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Ungependa kutumia intaneti ukiwa kwenye mitandao mingine?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Matumizi ya data"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> za data ya simu zimetumika kati ya <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> za data ya mtandao wa simu zimetumika kuanzia <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Mipangilio ya Kina"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Mtoa huduma"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"mtoa huduma, mtandao wa simu, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Data ya Mtandao wa Simu"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Data ya mtandao wa simu"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Tumia data ya mtandao wa simu"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Je, unataka kuzima data ya mtandao wa simu?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Unahitaji kuchagua"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Unataka kubadilisha SIM ya data?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Je, unataka kutumia data ya mtandao wa simu wa <xliff:g id="NEW_SIM">%1$s</xliff:g> badala ya <xliff:g id="OLD_SIM">%2$s</xliff:g>?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Kupiga simu kupitia Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Kupiga simu kupitia kampuni ya simu"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Chaguo za GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mtandao wa simu za mkononi haupatikani. Unganisha kwenye mtandao pasiwaya ili upige simu."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Ili upige simu, weka nambari sahihi."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Imeshindwa kupiga simu."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Hangout haiwezi kuongezwa kwa wakati huu."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Simu haiwezi kuongezwa kwa sasa. Unaweza kujaribu kuwasiliana kwa kutuma ujumbe."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Huduma haiwezi kutumika."</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Haiwezi kubadili simu."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Haiwezi kutenganisha simu."</string>
@@ -596,7 +597,7 @@
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Zana za walio na matatizo ya kuona au kusikia"</string>
     <string name="status_hint_label_incoming_wifi_call" msgid="5932176406432044638">"Simu ya Wi-Fi kutoka kwa"</string>
     <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Simu ya Wi-Fi"</string>
-    <string name="emergency_action_launch_hint" msgid="4906759256275562674">"Gonga tena ili ufungue"</string>
+    <string name="emergency_action_launch_hint" msgid="4906759256275562674">"Gusa tena ili ufungue"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"Hitilafu imetokea wakati wa usimbuaji wa ujumbe."</string>
     <string name="callFailed_cdma_activation" msgid="2307989779233262164">"SIM kadi yako imeanzisha huduma yako na kusasisha uwezo wa simu yako wa kutumia mitandao mingine."</string>
     <string name="callFailed_cdma_call_limit" msgid="1556916577171457086">"Kuna simu nyingi mno zinazoendelea. Tafadhali kata au uunganishe simu zinazoendelea kabla hujapiga nyingine."</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 1f09709..6aceb73 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"குரலஞ்சல் (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"அறிவிப்புகள்"</string>
-    <string name="networks" msgid="8873030692174541976">"நெட்வொர்க் ஆபரேட்டர்கள்"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"அவசரகால அலைபரப்புகள்"</string>
     <string name="call_settings" msgid="6112441768261754562">"அழைப்பு அமைப்பு"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"கூடுதல் அமைப்பு"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"நெட்வொர்க்குகள் இல்லை."</string>
-    <string name="search_networks" msgid="1601136049300882441">"நெட்வொர்க்குகளைத் தேடுக"</string>
     <string name="network_query_error" msgid="6828516148953325006">"நெட்வொர்க்குகளைத் தேடும்போது பிழை."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> இல் பதிவுசெய்கிறது…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"சிம் கார்டு, நெட்வொர்க்கில் இணைப்பதை அனுமதிக்கவில்லை."</string>
     <string name="connect_later" msgid="2308119155752343975">"இப்போது இந்த நெட்வொர்க்குடன் இணைக்க முடியவில்லை. மீண்டும் முயற்சிக்கவும்."</string>
     <string name="registration_done" msgid="495135664535876612">"நெட்வொர்க்கில் பதிவுசெய்யப்பட்டது."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"நெட்வொர்க் ஆபரேட்டரைத் தேர்வுசெய்யவும்"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"கிடைக்கும் எல்லா நெட்வொர்க்குகளையும் தேடுக"</string>
     <string name="select_automatically" msgid="1046727200631770962">"நெட்வொர்க்கைத் தானாகத் தேர்ந்தெடு"</string>
     <string name="network_select_title" msgid="7733107364757544558">"நெட்வொர்க்"</string>
     <string name="register_automatically" msgid="6017849844573519637">"தானியங்கு பதிவு…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"தேர்ந்தெடுத்த நெட்வொர்க் வகை"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"நெட்வொர்க் செயல்பாட்டிற்கான பயன்முறையை மாற்று"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"தேர்ந்தெடுத்த நெட்வொர்க் வகை"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(தடுக்கப்பட்டது)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMAக்கு முன்னுரிமை"</item>
     <item msgid="8442633436636425221">"GSM மட்டும்"</item>
@@ -241,15 +237,20 @@
     <string name="roaming_enable" msgid="7331106985174381987">"ரோமிங்கின் போது தரவு சேவைகளுடன் இணை"</string>
     <string name="roaming_disable" msgid="1843417228755568110">"ரோமிங்கின் போது தரவு சேவைகளுடன் இணை"</string>
     <string name="roaming_reenable_message" msgid="8913735676127858115">"உள்ளூர் நெட்வொர்க்கில் தரவு ரோமிங்கை முடக்கிய நிலையில் வெளியேறியுள்ளதால், தரவு இணைப்பை இழந்துவிட்டீர்கள்."</string>
-    <string name="roaming_warning" msgid="1603164667540144353">"குறிப்பிடத்தக்க கட்டணங்கள் இருக்கலாம்."</string>
+    <string name="roaming_warning" msgid="1603164667540144353">"குறிப்பிடத்தக்க பேமெண்ட்கள் இருக்கலாம்."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"தரவு ரோமிங்கை அனுமதிக்கவா?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"டேட்டா பயன்பாடு"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g>: <xliff:g id="ID_1">%1$s</xliff:g> மொபைல் டேட்டா பயன்படுத்தப்பட்டது"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g>: <xliff:g id="ID_1">%1$s</xliff:g> மொபைல் டேட்டா பயன்படுத்தப்பட்டது"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"மேம்பட்டவை"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"தொலைத்தொடர்பு நிறுவனம்"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"தொலைத்தொடர்பு நிறுவனம், இ-சிம், சிம், euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"மொபைல் தரவு"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"மொபைல் தரவு"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"மொபைல் நெட்வொர்க்கைப் பயன்படுத்தி, தரவை அணுகு"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"மொபைல் தரவை முடக்கவா?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"தேர்ந்தெடுக்க வேண்டும்"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"தரவிற்கான சிம்மை மாற்றவா?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"<xliff:g id="OLD_SIM">%2$s</xliff:g>க்குப் பதிலாக <xliff:g id="NEW_SIM">%1$s</xliff:g> இன் மொபைல் தரவைப் பயன்படுத்தவா?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"வைஃபை அழைப்பு"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"தொலைத்தொடர்பு நிறுவன வீடியோ அழைப்பு"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS விருப்பங்கள்"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"மொபைல் நெட்வொர்க் கிடைக்கவில்லை. அழைக்க, வயர்லெஸ் நெட்வொர்க்குடன் இணைக்கவும்."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"அழைக்க, சரியான எண்ணை உள்ளிடவும்."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"அழைப்பு தோல்வியடைந்தது."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"இப்போது அழைப்பைச் சேர்க்க முடியாது."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"தற்போது அழைக்க முடியவில்லை. செய்தியை அனுப்பி, தொடர்புகொள்ள முயலவும்."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"சேவை ஆதரிக்கப்படவில்லை"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"அழைப்புகளில் மாற முடியாது."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"அழைப்பைப் பிரிக்க முடியாது."</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 36b2f94..4eecc2e 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"వాయిస్ మెయిల్ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"నోటిఫికేషన్‌లు"</string>
-    <string name="networks" msgid="8873030692174541976">"నెట్‌వర్క్ ఆపరేటర్‌లు"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"అత్యవసర ప్రసారాలు"</string>
     <string name="call_settings" msgid="6112441768261754562">"కాల్ సెట్టింగ్‌లు"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"అదనపు సెట్టింగ్‌లు"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"నెట్‌వర్క్‌లు కనుగొనబడలేదు."</string>
-    <string name="search_networks" msgid="1601136049300882441">"నెట్‌వర్క్‌లను శోధించు"</string>
     <string name="network_query_error" msgid="6828516148953325006">"నెట్‌వర్క్‌ల కోసం శోధిస్తున్నప్పుడు లోపం."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g>లో నమోదు అవుతోంది…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"మీ SIM కార్డు ఈ నెట్‌వర్క్‌కు కనెక్షన్‌ను అనుమతించదు."</string>
     <string name="connect_later" msgid="2308119155752343975">"ప్రస్తుతం ఈ నెట్‌వర్క్‌కు కనెక్ట్ చేయడం సాధ్యపడదు. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
     <string name="registration_done" msgid="495135664535876612">"నెట్‌వర్క్‌లో నమోదు అయింది."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"నెట్‌వర్క్ ఆపరేటర్‌ను ఎంచుకోండి"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"అందుబాటులో ఉన్న అన్ని నెట్‌వర్క్‌ల కోసం శోధించండి"</string>
     <string name="select_automatically" msgid="1046727200631770962">"నెట్‌వర్క్‌ను స్వయంచాలకంగా ఎంచుకోండి"</string>
     <string name="network_select_title" msgid="7733107364757544558">"నెట్‌వర్క్"</string>
     <string name="register_automatically" msgid="6017849844573519637">"స్వయంచాలక నమోదు…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ప్రాధాన్య నెట్‌వర్క్ రకం"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"నెట్‌వర్క్ ఆపరేటింగ్ మోడ్‌ను మార్చండి"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ప్రాధాన్య నెట్‌వర్క్ రకం"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(నిషేధించబడింది)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMAకు ప్రాధాన్యత"</item>
     <item msgid="8442633436636425221">"GSM మాత్రమే"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"మీకు గణనీయ ఛార్జీలు విధించబడవచ్చు."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"డేటా రోమింగ్‌ను అనుమతించాలా?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"డేటా వినియోగం"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> మధ్య కాలంలో <xliff:g id="ID_1">%1$s</xliff:g> మొబైల్ డేటా ఉపయోగించబడింది"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> మధ్య కాలంలో <xliff:g id="ID_1">%1$s</xliff:g> మొబైల్ డేటా ఉపయోగించబడింది"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"అధునాతనం"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"క్యారియర్"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"క్యారియర్, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"మొబైల్ డేటా"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"మొబైల్ డేటా"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"మొబైల్ నెట్‌వర్క్‌ను ఉపయోగించి డేటాను యాక్సెస్ చేయండి"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"మొబైల్ డేటాని ఆఫ్ చేయాలా?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"ఎంపిక అవసరం"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"డేటా SIMని మార్చాలా?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"మొబైల్ డేటా కోసం <xliff:g id="OLD_SIM">%2$s</xliff:g>కి బదులుగా <xliff:g id="NEW_SIM">%1$s</xliff:g>ని ఉపయోగించాలా?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi కాలింగ్"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"క్యారియర్ వీడియో కాలింగ్"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS ఎంపికలు"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"మొబైల్ నెట్‌వర్క్ అందుబాటులో లేదు. కాల్ చేయడానికి వైర్‌లెస్ నెట్‌వర్క్‌కు కనెక్ట్ చేయండి."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"కాల్ చేయడానికి, చెల్లుబాటు అయ్యే నంబర్‌ను నమోదు చేయండి."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"కాల్ విఫలమైంది."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"ఈ సమయంలో కాల్‌ను జోడించడం సాధ్యపడదు."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"ఈ సమయంలో కాల్ జోడించబడదు. మీరు సందేశాన్ని పంపడం ద్వారా సంప్రదించవచ్చు."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"సేవకు మద్దతు లేదు"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"కాల్‌లను మార్చలేరు."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"కాల్‌ను వేరు చేయలేరు."</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 76e32e1..7f3a3d3 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"ข้อความเสียง (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"การแจ้งเตือน"</string>
-    <string name="networks" msgid="8873030692174541976">"ผู้ให้บริการเครือข่าย"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"การเผยแพร่ข้อมูลฉุกเฉิน"</string>
     <string name="call_settings" msgid="6112441768261754562">"การตั้งค่าการโทร"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"การตั้งค่าเพิ่มเติม"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"ไม่พบเครือข่าย"</string>
-    <string name="search_networks" msgid="1601136049300882441">"ค้นหาเครือข่าย"</string>
     <string name="network_query_error" msgid="6828516148953325006">"พบข้อผิดพลาดขณะค้นหาเครือข่าย"</string>
     <string name="register_on_network" msgid="9055203954040805084">"กำลังลงทะเบียนบน <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"ซิมการ์ดของคุณไม่อนุญาตให้เชื่อมต่อกับเครือข่ายนี้"</string>
     <string name="connect_later" msgid="2308119155752343975">"ไม่สามารถเชื่อมต่อเครือข่ายนี้ได้ในขณะนี้ ลองอีกครั้งในภายหลัง"</string>
     <string name="registration_done" msgid="495135664535876612">"ลงทะเบียนบนเครือข่ายแล้ว"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"เลือกผู้ให้บริการเครือข่าย"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"ค้นหาเครือข่ายทั้งหมดที่ใช้ได้"</string>
     <string name="select_automatically" msgid="1046727200631770962">"เลือกเครือข่ายโดยอัตโนมัติ"</string>
     <string name="network_select_title" msgid="7733107364757544558">"เครือข่าย"</string>
     <string name="register_automatically" msgid="6017849844573519637">"การลงทะเบียนอัตโนมัติ..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ประเภทเครือข่ายที่ต้องการ"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"เปลี่ยนโหมดปฏิบัติการของเครือข่าย"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ประเภทเครือข่ายที่ต้องการ"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(ห้ามใช้)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"ต้องการ GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"GSM เท่านั้น"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"คุณอาจต้องเสียค่าใช้จ่ายมาก"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"อนุญาตการโรมมิ่งอินเทอร์เน็ตไหม"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ปริมาณการใช้อินเทอร์เน็ต"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"เน็ตมือถือ <xliff:g id="ID_1">%1$s</xliff:g> ที่ใช้ระหว่าง <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"เน็ตมือถือ <xliff:g id="ID_1">%1$s</xliff:g> ที่ใช้ระหว่าง <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"ขั้นสูง"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"ผู้ให้บริการ"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"ผู้ให้บริการ, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"เน็ตมือถือ"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"อินเทอร์เน็ตมือถือ"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"เข้าถึงข้อมูลโดยใช้เครือข่ายมือถือ"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"ปิดเน็ตมือถือไหม"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"ต้องเลือก"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"เปลี่ยนซิมอินเทอร์เน็ตไหม"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"ใช้ <xliff:g id="NEW_SIM">%1$s</xliff:g> แทน <xliff:g id="OLD_SIM">%2$s</xliff:g> เวลาใช้เน็ตมือถือใช่ไหม"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"การโทรผ่าน Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"การโทรวิดีโอผ่านผู้ให้บริการ"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"ตัวเลือก GSM//UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"เครือข่ายมือถือไม่พร้อมใช้งาน โปรดเชื่อมต่อเครือข่ายไร้สายเพื่อโทรออก"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"หากต้องการโทรออก โปรดป้อนหมายเลขที่ถูกต้อง"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"การโทรล้มเหลว"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"ไม่สามารถเพิ่มสายได้ในขณะนี้"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"เพิ่มการโทรไม่ได้ในขณะนี้ คุณสามารถพยายามติดต่อได้โดยการส่งข้อความ"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"บริการนี้ไม่ได้รับการสนับสนุน"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ไม่สามารถสลับสายได้"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ไม่สามารถแยกสายได้"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 00fd65a..66b0956 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Voicemail (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Mga Notification"</string>
-    <string name="networks" msgid="8873030692174541976">"Mga network operator"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Mga pang-emergency na broadcast"</string>
     <string name="call_settings" msgid="6112441768261754562">"Mga setting ng tawag"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Mga karagdagang setting"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Walang nakitang mga network."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Maghanap ng mga network"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Error habang naghahanap ng mga network."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Nirerehistro sa <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Hindi pinapayagan ng iyong SIM card ang koneksyon sa network na ito."</string>
     <string name="connect_later" msgid="2308119155752343975">"Hindi makakonekta sa network na ito sa ngayon. Subukang muli sa ibang pagkakataon."</string>
     <string name="registration_done" msgid="495135664535876612">"Nakarehistro sa network."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Pumili ng network operator"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Hanapin ang lahat ng mga available na network"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Awtomatikong piliin ang network"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Network"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Awtomatikong pagpaparehistro..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Gustong uri ng network"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Baguhin ang network operating mode"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Gustong uri ng network"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(pinagbabawal)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Mas gusto ang GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"GSM lang"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Maaari kang magkaroon ng malaking bayarin."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Payagan ang roaming ng data?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Paggamit ng data"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> na mobile data ang nagamit sa pagitan ng <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> na mobile data ang nagamit noong <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Advanced"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Carrier"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"carrier, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobile Data"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobile data"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"I-access ang data gamit ang mobile network"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"I-off ang mobile data?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Kinakailangang pumili"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Palitan ang data SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Gamitin ang <xliff:g id="NEW_SIM">%1$s</xliff:g> sa halip na <xliff:g id="OLD_SIM">%2$s</xliff:g> para sa mobile data?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Pagtawag gamit ang Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Pakikipag-video call gamit ang carrier"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Mga pagpipilian sa GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Hindi available ang mobile network. Kumonekta sa isang wireless network upang tumawag."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Upang tumawag, maglagay ng wastong numero."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Nabigo ang tawag."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Hindi maidaragdag ang tawag sa oras na ito."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Hindi maidaragdag ang tawag na ito sa ngayon. Maaari mong subukang makipag-ugnayan sa pamamagitan ng pagpapadala ng isang mensahe."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Hindi sinusuportahan ang serbisyo"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Hindi mailipat ang mga tawag."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Hindi mapaghiwalay ang tawag"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 638c79c..4097ad7 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Sesli mesaj (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Bildirimler"</string>
-    <string name="networks" msgid="8873030692174541976">"Ağ operatörleri"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Acil durum yayınları"</string>
     <string name="call_settings" msgid="6112441768261754562">"Çağrı ayarları"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Ek ayarlar"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Hiçbir ağ bulunamadı."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Ağları ara"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Ağlar aranırken hata oluştu."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> ağına kaydediliyor..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM kartınız bu ağa bağlanmaya izin vermiyor."</string>
     <string name="connect_later" msgid="2308119155752343975">"Şu an bu ağa bağlanılamıyor. Daha sonra tekrar deneyin."</string>
     <string name="registration_done" msgid="495135664535876612">"Ağa kaydedildi."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Bir ağ operatörü seçin"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Kullanılabilen tüm ağları ara"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Ağı otomatik seç"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Ağ"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Otomatik kayıt..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tercih edilen ağ türü"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Ağın çalışma modunu değiştir"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tercih edilen ağ türü"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(yasak)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA tercih edilen"</item>
     <item msgid="8442633436636425221">"Yalnızca GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Kayda değer ücretler ödeyebilirsiniz."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Veri dolaşımına izin verilsin mi?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Veri kullanımı"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> arasında <xliff:g id="ID_1">%1$s</xliff:g> mobil veri kullanıldı"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> arasında <xliff:g id="ID_1">%1$s</xliff:g> mobil veri kullanıldı"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Gelişmiş"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Operatör"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operatör, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> - <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobil Veri"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobil veri"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Verilere mobil ağ üzerinden erişim"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Mobil veri kapatılsın mı?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Seçim yapmanız gerekiyor"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Hücrsl için SIM değiştirl. mi?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Mobil veri için <xliff:g id="OLD_SIM">%2$s</xliff:g> yerine <xliff:g id="NEW_SIM">%1$s</xliff:g> kullanılsın mı?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Kablosuz çağrı"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Operatör görüntülü görüşmesi"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS Seçenekleri"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobil ağ kullanılamıyor. Telefon etmek için kablosuz ağa bağlanın."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Arama yapmak için geçerli bir numara girin."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Sesli arama başarısız oldu."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Çağrı şu anda eklenemiyor."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Çağrı şu anda eklenemiyor. Mesaj göndererek ulaşmayı deneyebilirsiniz."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Hizmet desteklenmiyor"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Çağrı geçişi yapılamıyor."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Çağrı ayrılamıyor."</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 3bca096..a430ee6 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Голосова пошта (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"ГП:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Сповіщення"</string>
-    <string name="networks" msgid="8873030692174541976">"Оператори мережі"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Повідомлення екстрених служб"</string>
     <string name="call_settings" msgid="6112441768261754562">"Виклики"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Додаткові налаштування"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Не знайд. жодних мереж."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Пошук мереж"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Помилка під час пошуку мереж."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Реєстрування у <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Ваша SIM-карта не дозволяє під’єднання до цієї мережі."</string>
     <string name="connect_later" msgid="2308119155752343975">"Зараз неможливо під’єднатися до цієї мережі. Повторіть спробу пізніше."</string>
     <string name="registration_done" msgid="495135664535876612">"Зареєстровано у мережі"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Виберіть оператора мережі"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Пошук усіх доступних мереж"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Автоматично вибирати мережу"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Мережа"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Автоматична реєстрація..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Тип мережі"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Змінити режим роботи мережі"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Тип мережі"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(заборонено)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Рекомендовано GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"Лише GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Може стягуватися значна плата."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Дозволити роумінг даних?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Використання трафіку"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> мобільного трафіку використано в період <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> мобільного трафіку використано в період <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Додатково"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Оператор"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"оператор, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>: <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Мобільний трафік"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Мобільний трафік"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Доступ до Інтернету в мобільній мережі"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Вимкнути мобільне передавання даних?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Виберіть варіант"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Змінити SIM-карту для даних?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Використовувати <xliff:g id="NEW_SIM">%1$s</xliff:g> замість <xliff:g id="OLD_SIM">%2$s</xliff:g> для мобільного передавання даних?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Дзвінки через Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Відеодзвінки в мережі оператора"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Параметри GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Мобільна мережа недоступна. Щоб зателефонувати, під’єднайтеся до бездротової мережі."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Щоб зателефонувати, введіть дійсний номер."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Не вдалося здійснити виклик."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Зараз не можна додати виклик."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Не вдається додати виклик. Спробуйте надіслати повідомлення."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Служба не підтримується"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Неможливо переключитися між викликами."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Неможливо розділити виклик."</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index dc2e031..2088b6b 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"صوتی میل (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"اطلاعات"</string>
-    <string name="networks" msgid="8873030692174541976">"نیٹ ورک آپریٹرز"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"ہنگامی براڈکاسٹس"</string>
     <string name="call_settings" msgid="6112441768261754562">"کال کی ترتیبات"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"اضافی ترتیبات"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"کوئی نیٹ ورکس نہیں ملے۔"</string>
-    <string name="search_networks" msgid="1601136049300882441">"نیٹ ورکس تلاش کریں"</string>
     <string name="network_query_error" msgid="6828516148953325006">"نیٹ ورکس کی تلاش کے دوران خرابی۔"</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> پر رجسٹر کر رہا ہے…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"‏آپ کا SIM کارڈ اس نیٹ ورک سے کنکشن کی اجازت نہیں دیتا ہے۔"</string>
     <string name="connect_later" msgid="2308119155752343975">"ابھی اس نیٹ ورک سے مربوط نہیں ہوسکتا۔ بعد میں دوبارہ کوشش کریں۔"</string>
     <string name="registration_done" msgid="495135664535876612">"نیٹ ورک پر رجسٹرڈ ہوگیا۔"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"ایک نیٹ ورک آپریٹر منتخب کریں"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"سبھی دستیاب نیٹ ورکس تلاش کریں"</string>
     <string name="select_automatically" msgid="1046727200631770962">"نیٹ ورک خودکار طور پر منتخب کریں"</string>
     <string name="network_select_title" msgid="7733107364757544558">"نیٹ ورک"</string>
     <string name="register_automatically" msgid="6017849844573519637">"خود کار رجسٹریشن…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"ترجیحی نیٹ ورک کی قسم"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"نیٹ ورک آپریٹنگ طرز تبدیل کریں"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"ترجیحی نیٹ ورک کی قسم"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(ممنوع)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"‏GSM/WCDMA ترجیحی"</item>
     <item msgid="8442633436636425221">"‏صرف GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"آپ پر خاطر خواہ چارجز لگ سکتے ہیں۔"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"ڈیٹا رومنگ کی اجازت دیں؟"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"ڈیٹا کا استعمال"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> موبائل ڈیٹا جو <xliff:g id="ID_2">%2$s</xliff:g> کے درمیان استعمال ہوا"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> موبائل ڈیٹا <xliff:g id="ID_2">%2$s</xliff:g> میں استعمال ہوا"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"جدید ترین"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"کیریئر"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"‏کیریئر، esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"موبائل ڈیٹا"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"موبائل ڈیٹا"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"موبائل نیٹ ورک استعمال کرکے ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"موبائل ڈیٹا آف کریں؟"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"انتخاب درکار ہے"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"‏ڈیٹا SIM تبدیل کریں؟"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"موبائل ڈیٹا کے لیے <xliff:g id="OLD_SIM">%2$s</xliff:g> کی بجائے <xliff:g id="NEW_SIM">%1$s</xliff:g> استعمال کریں؟"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"‏Wi-Fi کالنگ"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"کیرئیر ویڈیو کالنگ"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"‏GSM/UMTS کے اختیارات"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"موبائل نیٹ ورک دستیاب نہیں ہے۔ کال کرنے کیلئے کسی وائرلیس نیٹ ورک سے منسلک ہوں۔"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"کال کرنے کیلئے، ایک درست نمبر درج کریں۔"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"کال ناکام ہوگئی۔"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"اس وقت کال شامل نہیں ہو سکتی۔"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"اس وقت کال شامل نہیں کی جا سکتی۔ آپ ایک پیغام بھیج کر رابطہ کرنے کی کوشش کر سکتے ہیں۔"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"سروس تعاون یافتہ نہیں ہے"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"کالز سوئچ نہیں کر سکتے۔"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"کال کو الگ نہیں کر سکتے۔"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 2042638..d824f5f 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Ovozli pochta (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Bildirishnomalar"</string>
-    <string name="networks" msgid="8873030692174541976">"Tarmoq operatorlari"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Favqulodda tarqatma xabarlar"</string>
     <string name="call_settings" msgid="6112441768261754562">"Chaqiruv sozlamalari"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Qo‘shimcha sozlamalar"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Birorta ham tarmoq topilmadi."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Tarmoqlarni qidirish"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Tarmoqlar izlanayotganda xato."</string>
     <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g>da ro‘yxatdan o‘tmoqda…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"SIM kartangiz ushbu tarmoqqa ulanishga ruxsat bermaydi."</string>
     <string name="connect_later" msgid="2308119155752343975">"Ushbu tarmoqqa hozirgi vaqtda ulanib bo‘lmaydi. Keyinroq urinib ko‘ring."</string>
     <string name="registration_done" msgid="495135664535876612">"Tarmoqda ro‘yxatdan o‘tgan."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Tarmoq operatorini tanlang"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Barcha mavjud tarmoqlarni qidirish"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Tarmoqni avtomatik tanlash"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Tarmoq"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Avtomatik ro‘yxatdan o‘tish…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Tarmoq turi"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Tarmoq rejimini o‘zgartiring"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Tarmoq turi"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(taqiqlangan)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA (tavsiya qilinadi)"</item>
     <item msgid="8442633436636425221">"Faqat GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Xarajati ancha yuqori bo‘lishi mumkin."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Internet-roumingga ruxsat berilsinmi?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Trafik sarfi"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g> vaqt oralig‘ida sarflangan mobil trafik: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g> davomida sarflangan mobil trafik: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Kengaytirilgan sozlamalar"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Aloqa operatori"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"operator, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> – <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Mobil internet"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Mobil internet"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Mobil tarmoq orqali internetdan foydalanish"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Mobil internet o‘chirib qo‘yilsinmi?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"SIM kartani tanlang"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"SIM karta o‘zgartirilsinmi?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Mobil internet uchun <xliff:g id="OLD_SIM">%2$s</xliff:g> o‘rniga <xliff:g id="NEW_SIM">%1$s</xliff:g> SIM kartasidan foydalanilsinmi?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi chaqiruv"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Operator tarmog‘i orqali video suhbatlar"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS sozlamalari"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Mobil tarmoqdan foydalanib bo‘lmaydi. Qo‘ng‘iroq qilish uchun Wi-Fi tarmog‘iga ulaning."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Qo‘ng‘iroq qilish uchun raqamni to‘g‘ri kiriting."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Chaqiruv amalga oshmadi."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Hozirgi vaqtda qo‘ng‘iroq qo‘shib bo‘lmaydi."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Qo‘ng‘iroq qilib bo‘lmayapti. Xabar yuborib ko‘ring."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Bu xizmat qo‘llab-quvvatlanmaydi"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Qo‘ng‘iroqlarni almashtirib bo‘lmadi."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Qo‘ng‘iroqni ajratib bo‘lmadi."</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index af2a4e0..b4a16e7 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Thư thoại (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"Thư thoại:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Thông báo"</string>
-    <string name="networks" msgid="8873030692174541976">"Nhà cung cấp dịch vụ mạng"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Phát sóng trong tình huống khẩn cấp"</string>
     <string name="call_settings" msgid="6112441768261754562">"Cài đặt cuộc gọi"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Cài đặt bổ sung"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Không tìm thấy mạng nào."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Tìm kiếm trong mạng"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Lỗi khi tìm kiếm mạng."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Đang đăng ký trên <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"Thẻ SIM của bạn không cho phép kết nối với mạng này."</string>
     <string name="connect_later" msgid="2308119155752343975">"Không thể kết nối với mạng này ngay bây giờ. Hãy thử lại sau."</string>
     <string name="registration_done" msgid="495135664535876612">"Đã đăng ký trên mạng."</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Chọn nhà cung cấp dịch vụ mạng"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Tìm kiếm tất cả mạng khả dụng"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Tự động chọn mạng"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Mạng"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Đăng ký tự động..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Loại mạng ưu tiên"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Thay đổi chế độ hoạt động của mạng"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Loại mạng ưu tiên"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(cấm)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA được ưu tiên"</item>
     <item msgid="8442633436636425221">"Chỉ GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Bạn có thể phải chịu các khoản phí đáng kể."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Cho phép chuyển vùng dữ liệu?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Mức sử dụng dữ liệu"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"Đã sử dụng <xliff:g id="ID_1">%1$s</xliff:g> dữ liệu di động trong khoảng thời gian từ <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"Đã sử dụng <xliff:g id="ID_1">%1$s</xliff:g> dữ liệu di động <xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Nâng cao"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Nhà cung cấp dịch vụ"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"nhà cung cấp dịch vụ, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Dữ liệu di động"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Dữ liệu di động"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Truy cập dữ liệu bằng mạng di động"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Tắt dữ liệu di động?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Bắt buộc lựa chọn"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Thay đổi SIM cho dữ liệu di động?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Sử dụng <xliff:g id="NEW_SIM">%1$s</xliff:g> thay vì <xliff:g id="OLD_SIM">%2$s</xliff:g> cho dữ liệu di động?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Gọi qua Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Tính năng gọi điện video của nhà cung cấp dịch vụ"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Tùy chọn GSM/UMTS"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Hiện không có mạng di động. Hãy kết nối với mạng không dây để thực hiện cuộc gọi."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Để thực hiện cuộc gọi, hãy nhập một số hợp lệ."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Cuộc gọi không thành công."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Không thể thêm cuộc gọi tại thời điểm này."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Không thể thêm cuộc gọi tại thời điểm này. Bạn có thể cố gắng liên hệ bằng cách gửi tin nhắn."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Dịch vụ không được hỗ trợ"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Không chuyển đổi được cuộc gọi."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Không tách được cuộc gọi."</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 4944b78..f980a77 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"语音信箱(<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"语音信箱:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"通知"</string>
-    <string name="networks" msgid="8873030692174541976">"网络运营商"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"紧急广播"</string>
     <string name="call_settings" msgid="6112441768261754562">"通话设置"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"其他设置"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"未找到网络。"</string>
-    <string name="search_networks" msgid="1601136049300882441">"搜索网络"</string>
     <string name="network_query_error" msgid="6828516148953325006">"搜索网络时出错。"</string>
     <string name="register_on_network" msgid="9055203954040805084">"正在<xliff:g id="NETWORK">%s</xliff:g>上注册..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"您的SIM卡不允许连接到此网络。"</string>
     <string name="connect_later" msgid="2308119155752343975">"目前无法连接到此网络,请稍后重试。"</string>
     <string name="registration_done" msgid="495135664535876612">"已在网络上注册。"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"选择网络运营商"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"搜索所有可用网络"</string>
     <string name="select_automatically" msgid="1046727200631770962">"自动选择网络"</string>
     <string name="network_select_title" msgid="7733107364757544558">"网络"</string>
     <string name="register_automatically" msgid="6017849844573519637">"自动注册..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"首选网络类型"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"更改网络运行方式"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"首选网络类型"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(禁止)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"首选 GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"仅限 GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"这可能会产生高额费用。"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"要允许移动数据网络漫游吗?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"流量使用情况"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g>期间使用的移动数据流量为:<xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g>期间使用的移动数据流量为:<xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"高级"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"运营商"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"运营商, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> - <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"移动数据"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"移动数据"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"通过移动网络访问数据"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"要关闭移动数据网络吗?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"必须选择"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"要更改用于数据网络的 SIM 卡吗?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"要将用于移动数据网络的 SIM 卡从“<xliff:g id="OLD_SIM">%2$s</xliff:g>”改为“<xliff:g id="NEW_SIM">%1$s</xliff:g>”吗?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"WLAN 通话"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"运营商视频通话"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS 选项"</string>
@@ -482,7 +483,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"移动网络不可用。需连接至无线网络才能拨打电话。"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"要拨打电话,请输入有效的电话号码。"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"无法通话。"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"目前无法添加通话。"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"暂时无法拨打电话。您可以尝试通过发送信息来联系对方。"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"服务不受支持"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"无法切换通话。"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"无法单独通话。"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index addbb09..77accb0 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"留言信箱 (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"留言信箱:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"通知"</string>
-    <string name="networks" msgid="8873030692174541976">"網絡供應商"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"緊急廣播"</string>
     <string name="call_settings" msgid="6112441768261754562">"通話設定"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"其他設定"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"找不到網絡。"</string>
-    <string name="search_networks" msgid="1601136049300882441">"搜尋網絡"</string>
     <string name="network_query_error" msgid="6828516148953325006">"搜尋網絡時發生錯誤。"</string>
     <string name="register_on_network" msgid="9055203954040805084">"正在註冊 <xliff:g id="NETWORK">%s</xliff:g>..."</string>
     <string name="not_allowed" msgid="5613353860205691579">"您的 SIM 卡無法連接這個網絡。"</string>
     <string name="connect_later" msgid="2308119155752343975">"目前無法連接這個網絡,請稍後再試。"</string>
     <string name="registration_done" msgid="495135664535876612">"已在網絡上完成註冊。"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"選擇網絡供應商"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"搜尋所有可用的網絡"</string>
     <string name="select_automatically" msgid="1046727200631770962">"自動選取網絡"</string>
     <string name="network_select_title" msgid="7733107364757544558">"網絡"</string>
     <string name="register_automatically" msgid="6017849844573519637">"自動註冊..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"偏好的網絡類型"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"更改網絡操作模式"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"偏好的網絡類型"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(禁止)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"首選 GSM/WCDMA"</item>
     <item msgid="8442633436636425221">"只限 GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"您可能需要支付龐大的費用。"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"要允許數據漫遊嗎?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"數據用量"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g>期間使用了 <xliff:g id="ID_1">%1$s</xliff:g>流動數據"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g>期間使用了 <xliff:g id="ID_1">%1$s</xliff:g>流動數據"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"進階設定"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"流動網絡供應商"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"流動網絡供應商, esim, sim, euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"流動數據"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"流動數據"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"使用流動網絡數據"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"要關閉流動數據嗎?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"請選取偏好設定"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"要變更用於數據連線的 SIM 卡嗎?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"要改用「<xliff:g id="NEW_SIM">%1$s</xliff:g>」連接流動數據網絡 (而非「<xliff:g id="OLD_SIM">%2$s</xliff:g>」) 嗎?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi 通話"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"流動網絡供應商視像通話"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS 選項"</string>
@@ -488,7 +489,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"無法使用流動網絡。請連接無線網絡,以撥打電話。"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"要撥打電話,請輸入有效的號碼。"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"無法接通。"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"目前無法新增通話。"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"目前無法新增通話。您可以改以傳送短訊聯絡對方。"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"不支援的服務"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"無法切換通話。"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"無法分開通話。"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e4202b4..0d0f929 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"語音信箱 (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"語音信箱:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"通知"</string>
-    <string name="networks" msgid="8873030692174541976">"電信業者"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"緊急廣播"</string>
     <string name="call_settings" msgid="6112441768261754562">"通話設定"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"其他設定"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"找不到網路。"</string>
-    <string name="search_networks" msgid="1601136049300882441">"搜尋網路"</string>
     <string name="network_query_error" msgid="6828516148953325006">"搜尋網路時發生錯誤。"</string>
     <string name="register_on_network" msgid="9055203954040805084">"正在註冊 <xliff:g id="NETWORK">%s</xliff:g>…"</string>
     <string name="not_allowed" msgid="5613353860205691579">"您的 SIM 卡無法連上這個網路。"</string>
     <string name="connect_later" msgid="2308119155752343975">"目前無法連上這個網路,請稍後再試。"</string>
     <string name="registration_done" msgid="495135664535876612">"註冊網路成功。"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"選擇行動網路業者"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"搜尋所有可用的網路"</string>
     <string name="select_automatically" msgid="1046727200631770962">"自動選取網路"</string>
     <string name="network_select_title" msgid="7733107364757544558">"網路"</string>
     <string name="register_automatically" msgid="6017849844573519637">"自動註冊…"</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"偏好的網路類型"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"變更網路操作模式"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"偏好的網路類型"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(已禁止)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"GSM/WCDMA 優先"</item>
     <item msgid="8442633436636425221">"僅限 GSM"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"您可能需要支付可觀的費用。"</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"允許漫遊服務?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"數據用量"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_2">%2$s</xliff:g>這段期間已使用 <xliff:g id="ID_1">%1$s</xliff:g> 的行動數據"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_2">%2$s</xliff:g>期間使用了 <xliff:g id="ID_1">%1$s</xliff:g> 的行動數據"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"進階"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"電信業者"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"電信業者, eSIM 卡, SIM 卡, eUICC"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> - <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"行動數據"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"行動數據"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"使用行動網路存取數據"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"要關閉行動數據嗎?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"請選取偏好設定"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"要變更行動數據連線 SIM 卡嗎?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"要將用於行動數據連線的 SIM 卡從「<xliff:g id="OLD_SIM">%2$s</xliff:g>」改為「<xliff:g id="NEW_SIM">%1$s</xliff:g>」嗎?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Wi-Fi 通話"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"電信業者視訊通話"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS 選項"</string>
@@ -488,7 +489,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"無法使用行動網路。連上 Wi-Fi 網路即可撥打電話。"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"如要撥打電話,請輸入有效的號碼。"</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"無法通話。"</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"目前無法新增通話。"</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"目前無法新增通話,你可以試著傳送簡訊聯絡對方。"</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"不支援的服務"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"無法切換通話。"</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"無法分割通話。"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 89dc333..b44a903 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -78,7 +78,6 @@
     <string name="voicemail_settings_with_label" msgid="152724978380748296">"Ivoyisimeyili (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"Izaziso"</string>
-    <string name="networks" msgid="8873030692174541976">"Imisebenzi yenethiwekhi"</string>
     <string name="cell_broadcast_settings" msgid="8740238216690502563">"Ukusakazwa okuphuthumayo"</string>
     <string name="call_settings" msgid="6112441768261754562">"Izilungiselelo zekholi"</string>
     <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Izilungiselelo ezengeziwe"</string>
@@ -159,25 +158,22 @@
     <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>
     <string name="empty_networks_list" msgid="4249426905018815316">"Awekho amanethiwekhi atholakele."</string>
-    <string name="search_networks" msgid="1601136049300882441">"Sesha amanethiwekhi"</string>
     <string name="network_query_error" msgid="6828516148953325006">"Iphutha ngenkathi icinga amanethiwekhi."</string>
     <string name="register_on_network" msgid="9055203954040805084">"Ibhalisa kwi <xliff:g id="NETWORK">%s</xliff:g>"</string>
     <string name="not_allowed" msgid="5613353860205691579">"Ikhadi lakho le-SIM alivumeli uxhumano kulenethiwekhi."</string>
     <string name="connect_later" msgid="2308119155752343975">"Ayikwazi ukuxhuma kunethiwekhi okwamanje. Zama futhi ngemva kwesikhashana."</string>
     <string name="registration_done" msgid="495135664535876612">"Ibhalisiwe kwinethiwekhi"</string>
-    <string name="sum_carrier_select" msgid="3494252551249882718">"Khetha inkamapani yenethiwekhi"</string>
-    <string name="sum_search_networks" msgid="2921092249873272715">"Sesha wonke amanethiwekhi atholakalayo"</string>
     <string name="select_automatically" msgid="1046727200631770962">"Khetha ngokuzenzakalela inethiwekhi"</string>
     <string name="network_select_title" msgid="7733107364757544558">"Inethiwekhi"</string>
     <string name="register_automatically" msgid="6017849844573519637">"Ukubhalisa okuzenzakalelayo..."</string>
     <string name="preferred_network_mode_title" msgid="2336624679902659306">"Uhlobo lwenethiwekhi oluncamelayo"</string>
     <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Shintsha imodi esebenzayo yenethiwekhi"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="4048082093347807230">"Uhlobo lwenethiwekhi oluncamelayo"</string>
+    <string name="forbidden_network" msgid="4384929668343563440">"(kunqatshelwe)"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="3628460389382468528">"Okukhethwayo kwe-GSM / WCDMA"</item>
     <item msgid="8442633436636425221">"I-GSM kuphela"</item>
@@ -244,12 +240,17 @@
     <string name="roaming_warning" msgid="1603164667540144353">"Ingahle uthole izindleko ezincane."</string>
     <string name="roaming_alert_title" msgid="3654815360303826008">"Vumela ukuhamba kwedatha?"</string>
     <string name="data_usage_title" msgid="8759619109516889802">"Ukusebenzisa idatha"</string>
-    <string name="data_usage_template" msgid="8065650945732671045">"<xliff:g id="ID_1">%1$s</xliff:g> idatha yeselula esetshenziswe phakathi kwe-<xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> kusetshenziswe idatha yeselula engu-<xliff:g id="ID_2">%2$s</xliff:g>"</string>
+    <string name="advanced_options_title" msgid="8074895510265488035">"Okuthuthukisiwe"</string>
     <string name="carrier_settings_euicc" msgid="6714062862127226405">"Inkampani yenethiwekhi"</string>
     <string name="keywords_carrier_settings_euicc" msgid="783429609643157743">"inkampani yenethiwekhi, i-esim, i-sim, i-euicc"</string>
     <string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
-    <string name="mobile_data_settings_title" msgid="3273340917802377121">"Idatha yeselula"</string>
+    <string name="mobile_data_settings_title" msgid="4661165467914727157">"Idatha yeselula"</string>
     <string name="mobile_data_settings_summary" msgid="5087255915840576895">"Finyelela kudatha usebenzisa inethiwekhi yeselula"</string>
+    <string name="data_usage_disable_mobile" msgid="3577275288809667615">"Vala idatha yeselula?"</string>
+    <string name="sim_selection_required_pref" msgid="7049424902961844236">"Ukukhetha kuyadingeka"</string>
+    <string name="sim_change_data_title" msgid="5332425991853799280">"Shintsha idatha ye-SIM?"</string>
+    <string name="sim_change_data_message" msgid="2163963581444907496">"Sebenzisa i-<xliff:g id="NEW_SIM">%1$s</xliff:g> esikhundleni se-<xliff:g id="OLD_SIM">%2$s</xliff:g> kudatha yeselula?"</string>
     <string name="wifi_calling_settings_title" msgid="7741961465416430470">"Ukushaya kwe-Wi-Fi"</string>
     <string name="video_calling_settings_title" msgid="539714564273795574">"Ukushaya kwevidiyo kwenkampani yenethiwekhi"</string>
     <string name="gsm_umts_options" msgid="6538311689850981686">"Okukhethwa kukho kwe-GSM/UMTS"</string>
@@ -486,7 +487,7 @@
     <string name="incall_error_out_of_service_wfc" msgid="8741629779555132471">"Inethiwekhi yeselula ayitholakali. Xhumeka kunethiwekhi engenantambo ukuze wenze ikholi."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Ukuze wenze ikholi, faka inombolo evumelekile."</string>
     <string name="incall_error_call_failed" msgid="5891978320269774095">"Ikholi ihlulekile."</string>
-    <string name="incall_error_cannot_add_call" msgid="5206923515522412110">"Ikholi ayikwazi ukungezwa ngalesi sikhathi."</string>
+    <string name="incall_error_cannot_add_call" msgid="8878159278947023326">"Ikholi ayikwazi ukungezwa ngalesi sikhathi. Ungazama ukufinyelela ngokuthumela umlayezo."</string>
     <string name="incall_error_supp_service_unknown" msgid="655570339115407698">"Isevisi ayisekelwe"</string>
     <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Ayikwazi ukushintsha amakholi."</string>
     <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Ayikwazi ukuhlukanisa ikholi."</string>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 61c5f97..fca8acf 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -50,6 +50,21 @@
         </attr>
     </declare-styleable>
 
+    <declare-styleable name="CallBarringEditPreference">
+        <!-- AO: All outgoing, CommandsInterface.CB_FACILITY_BAOC. -->
+        <!-- OI: Outgoing international, CommandsInterface.CB_FACILITY_BAOIC. -->
+        <!-- OX: Outgoing international roaming, CommandsInterface.CB_FACILITY_BAOICxH. -->
+        <!-- AI: All incoming, CommandsInterface.CB_FACILITY_BAIC. -->
+        <!-- IR: Incoming international roaming, CommandsInterface.CB_FACILITY_BAICr. -->
+        <!-- BA: Disable all, CommandsInterface.CB_FACILITY_BA_ALL -->
+        <attr name="facility" format="string" />
+
+        <!-- Message when password is not in use, and call barring is enabled -->
+        <attr name="dialogMessageEnabledNoPwd" format="string" />
+        <!-- Message when password is not in use, and call barring is disabled -->
+        <attr name="dialogMessageDisabledNoPwd" format="string" />
+    </declare-styleable>
+
     <attr name="preferenceBackgroundColor" format="color" />
     <attr name="emergencyButtonBackgroundColor" format="color" />
     <attr name="dialpadTheme" format="reference" />
diff --git a/res/values/config.xml b/res/values/config.xml
index 0d0bd22..855fa92 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -153,10 +153,10 @@
     <!-- Class name for the default main Dialer activity [DO NOT TRANSLATE] -->
     <string name="dialer_default_class" translatable="false">com.android.dialer.DialtactsActivity</string>
 
-    <!-- Package name for the network operator settings [DO NOT TRANSLATE] -->
-    <string name="network_operator_settings_package" translatable="false">com.android.phone</string>
-    <!-- Class name for the network operator settings activity [DO NOT TRANSLATE] -->
-    <string name="network_operator_settings_class" translatable="false">com.android.phone.NetworkSetting</string>
+    <!-- Package name for the mobile network settings [DO NOT TRANSLATE] -->
+    <string name="mobile_network_settings_package" translatable="false">com.android.phone</string>
+    <!-- Class name for the mobile network settings activity [DO NOT TRANSLATE] -->
+    <string name="mobile_network_settings_class" translatable="false">com.android.phone.MobileNetworkSettings</string>
 
     <!-- CDMA activation goes through HFA -->
     <!-- DEPRECATED: Use CarrierConfigManager#KEY_USE_HFA_FOR_PROVISIONING_BOOL -->
@@ -232,10 +232,19 @@
          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>
+
+    <!-- Whether the device supports the AudioManager Telephony audio device and output onto this
+         device using {@link AudioDeviceInfo#TYPE_TELEPHONY}.
+         When this is true, the Telephony stack is able to add additional audio to the outgoing
+         audio stream which the remote party will be able to hear. -->
+    <bool name="config_support_telephony_audio_device">false</bool>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 5dc7279..42f9563 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -108,4 +108,9 @@
     <dimen name="floating_action_button_width">67dp</dimen>
     <dimen name="floating_action_button_height">67dp</dimen>
     <dimen name="floating_action_button_margin_bottom">32dp</dimen>
+
+    <dimen name="signal_strength_icon_size">24dp</dimen>
+
+    <!-- The size of the "emergency calling unavailable" message shown in the emergency dialer -->
+    <dimen name="emergency_call_warning_size">16sp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 14cd952..dec26fb 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -178,8 +178,6 @@
     <!-- Voicemail notifications title. The user clicks on this preference navigate to the system settings screen for that channel
     .[CHAR LIMIT=30] -->
     <string name="voicemail_notifications_preference_title">Notifications</string>
-    <!-- Mobile network settings screen, setting option name -->
-    <string name="networks">Network operators</string>
     <!-- Cell Broadcast settings title.  [CHAR LIMIT=50] -->
     <string name="cell_broadcast_settings">Emergency broadcasts</string>
     <!-- Call settings screen title -->
@@ -285,9 +283,10 @@
     <string name="exception_error">Network or SIM card error.</string>
     <!-- Status message displayed in the "Call settings error" dialog when
          current SS request is modified to a different request by STK CC -->
-    <string name="stk_cc_ss_to_dial_error">SS request modified to DIAL request.</string>
-    <string name="stk_cc_ss_to_ussd_error">SS request modified to USSD request.</string>
-    <string name="stk_cc_ss_to_ss_error">SS request modified to new SS request.</string>
+    <string name="stk_cc_ss_to_dial_error">SS request changed to regular call</string>
+    <string name="stk_cc_ss_to_ussd_error">SS request changed to USSD request</string>
+    <string name="stk_cc_ss_to_ss_error">Changed to new SS request</string>
+    <string name="stk_cc_ss_to_dial_video_error">SS request changed to video call</string>
 
     <!-- Status message displayed in the "Call settings error" dialog when operation fails due to FDN
          [CHAR LIMIT=NONE] -->
@@ -361,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 -->
@@ -371,10 +368,8 @@
     <string name="load_networks_progress">Searching\u2026</string>
     <!-- Available networks screen, text when no networks are found -->
     <string name="empty_networks_list">No networks found.</string>
-    <!-- Available networks screen, setting option name -->
-    <string name="search_networks">Search networks</string>
     <!-- Available networks screen, toast when an error is encountered when searching for networks -->
-    <string name="network_query_error">Error while searching for networks.</string>
+    <string name="network_query_error">Couldn\'t find networks. Try again.</string>
     <!-- Available networks screen, toast when registering on a specific network -->
     <string name="register_on_network">Registering on <xliff:g id="network">%s</xliff:g>\u2026</string>
     <!-- Available networks screen, toast when SIM card isn't allowed on a network -->
@@ -383,10 +378,8 @@
     <string name="connect_later">Can\'t connect to this network right now. Try again later.</string>
     <!-- Available networks screen, toast when registered on a specific network -->
     <string name="registration_done">Registered on network.</string>
-    <!-- Mobile network settings screen setting option summary text -->
-    <string name="sum_carrier_select">Choose a network operator</string>
-    <!-- Available networks screen, setting summary text -->
-    <string name="sum_search_networks">Search for all available networks</string>
+    <!-- Available networks, toast when user selects automatic selection  -->
+    <string name="already_auto">Already in automatic selection.</string>
     <!-- Available networks screen, name of switch button for whether to select network automatically -->
     <string name="select_automatically">Automatically select network</string>
     <!-- Available networks screen, name of button when user wants to select network manually  -->
@@ -395,6 +388,17 @@
     <string name="preferred_network_mode_title">Preferred network type</string>
     <string name="preferred_network_mode_summary">Change the network operating mode</string>
     <string name="preferred_network_mode_dialogtitle">Preferred network type</string>
+    <string name="forbidden_network">(forbidden)</string>
+    <!-- Available networks screen, name of button when user wants to select network manually  -->
+    <string name="choose_network_title">Choose network</string>
+    <!-- Available networks screen, text when no networks connected -->
+    <string name="network_disconnected">Disconnected</string>
+    <!-- Available networks screen, text when network connected -->
+    <string name="network_connected">Connected</string>
+    <!-- Available networks screen, text when a network is connecting -->
+    <string name="network_connecting">Connecting...</string>
+    <!-- Available networks screen, text when a network cannot be connected -->
+    <string name="network_could_not_connect">Couldn’t connect</string>
 
     <!-- The preferred network modes in Mobile network settings -->
     <string-array name="preferred_network_mode_choices">
@@ -532,7 +536,9 @@
     <!-- Mobile network settings UI: notification message shown when you
          lose data connectivity because you're roaming and you have the
          "data roaming" feature turned off. -->
-    <string name="roaming_reenable_message">You\'ve lost data connectivity because you left your home network with data roaming turned off.</string>
+    <string name="roaming_reenable_message">Data roaming is turned off. Tap to turn on.</string>
+    <!-- Roaming notification tile, notifying lost of roaming data connection -->
+    <string name="roaming_notification_title">Lost mobile data connection</string>
     <!-- Mobile network settings screen, dialog message when user selects the Data roaming check box -->
     <string name="roaming_warning">You may incur significant charges.</string>
     <!-- Mobile network settings screen, dialog message title when user selects the Data roaming check box -->
@@ -540,7 +546,9 @@
     <!-- Mobile network settings screen, data usage setting check box name -->
     <string name="data_usage_title">Data usage</string>
     <!-- Summary about how much data has been used in a date range [CHAR LIMIT=100] -->
-    <string name="data_usage_template"><xliff:g name="amount" example="200 MB">%1$s</xliff:g> mobile data used between <xliff:g name="date_range" example="Jan 1 -- Feb 2">%2$s</xliff:g></string>
+    <string name="data_usage_template"><xliff:g name="amount" example="200 MB">%1$s</xliff:g> mobile data used <xliff:g name="date_range" example="Jan 1 -- Feb 2">%2$s</xliff:g></string>
+    <!-- Mobile network settings screen, Advanced button to show more items when clicked [CHAR LIMIT=50] -->
+    <string name="advanced_options_title">Advanced</string>
     <!-- Mobile network settings screen, name of the option to manage carrier profiles on devices which support embedded carrier profiles -->
     <string name="carrier_settings_euicc">Carrier</string>
     <!-- Keywords used to search the carrier menu for managing carrier profiles on devices which support embedded carrier profiles. eSIM/eUICC is embedded SIM card used to store this data.  -->
@@ -548,9 +556,17 @@
     <!-- Mobile network settings screen, summary of the option to manage carrier profiles on devices which support embedded carrier profiles -->
     <string name="carrier_settings_euicc_summary"><xliff:g id="carrier_name">%1$s</xliff:g> &#8212; <xliff:g id="phone_number">%2$s</xliff:g></string>
     <!-- Mobile network settings screen, title of Mobile Data switch preference -->
-    <string name="mobile_data_settings_title">Mobile Data</string>
-    <!-- Mobile network settings screen, title of Mobile Data switch preference -->
+    <string name="mobile_data_settings_title">Mobile data</string>
+    <!-- Mobile network settings screen, title of Mobile data switch preference -->
     <string name="mobile_data_settings_summary">Access data using mobile network</string>
+    <!-- Message to show when user trying to turn off mobile data, in single sim mode [CHAR LIMIT=100]-->
+    <string name="data_usage_disable_mobile">Turn off mobile data?</string>
+    <!-- When a SIM preference hasn't been selected yet, this string is displayed as the pref summary until the user chooses a SIM subscription from the preference list [CHAR LIMIT=50] -->
+    <string name="sim_selection_required_pref">Selection required</string>
+    <!-- Title asking user if they wish to change the default sim for cellular data.  [CHAR LIMIT=30] -->
+    <string name="sim_change_data_title">Change data SIM?</string>
+    <!-- Message confirming the user wishes to change the default data SIM from one to another.  [CHAR LIMIT=NONE] -->
+    <string name="sim_change_data_message">Use <xliff:g id="new_sim">%1$s</xliff:g> instead of <xliff:g id="old_sim">%2$s</xliff:g> for mobile data?</string>
     <!-- Mobile network settings screen, title of Wi-Fi calling setting -->
     <string name="wifi_calling_settings_title">Wi-Fi calling</string>
     <!-- Mobile network settings screen, title of Video calling setting -->
@@ -917,7 +933,7 @@
     <!-- FDN settings: error message displayed in a popup (toast) -->
     <string name="pin2_invalid">FDN wasn\'t updated because you typed an incorrect PIN.</string>
     <!-- FDN settings: error message displayed in a popup (toast) -->
-    <string name="fdn_invalid_number">FDN wasn\'t updated because the number is empty or exceeds 20 digits.</string>
+    <string name="fdn_invalid_number">FDN wasn\'t updated because the number exceeds 20 digits.</string>
     <!-- FDN settings: error message displayed in a popup (toast), when the entered
          FDN number was inappropriate, OR, PIN2 the user entered was incorrect.
          Because of API restriction, there's no way to determine which is the exact
@@ -1084,6 +1100,9 @@
     <string name="incall_error_supp_service_unknown">Service not supported</string>
     <!-- In-call screen: message displayed in an error dialog -->
     <string name="incall_error_supp_service_switch">Can\'t switch calls.</string>
+    <!-- In-call screen: message displayed in an error dialog when the user attempts to resume a
+         call, and the system encountered an error which prevented the call from being resumed. -->
+    <string name="incall_error_supp_service_resume">Can\'t resume call.</string>
     <!-- In-call screen: message displayed in an error dialog -->
     <string name="incall_error_supp_service_separate">Can\'t separate call.</string>
     <!-- In-call screen: message displayed in an error dialog -->
@@ -1115,6 +1134,9 @@
     <string name="dial_emergency_error">Can\'t call. <xliff:g id="non_emergency_number">%s</xliff:g> is not an emergency number.</string>
     <!-- Emergency dialer: message displayed in an error dialog -->
     <string name="dial_emergency_empty_error">Can\'t call. Dial an emergency number.</string>
+    <!-- Message displayed over top of the emergency dialer dialpad indicating to the user that
+         emergency calling is not currently available. -->
+    <string name="dial_emergency_calling_not_available">Emergency calling not available</string>
 
     <!-- Displayed in the text entry box in the dialer when in landscape mode to guide the user
          to dial using the physical keyboard -->
@@ -1163,6 +1185,17 @@
     <string name="hac_mode_title">Hearing aids</string>
     <string name="hac_mode_summary">Turn on hearing aid compatibility</string>
 
+    <!-- RTT settings: used to turn on/off Real-Time Text, an accessibility feature similar to
+         TTY that allows users to send text over a phone call. -->
+    <string name="rtt_mode_title">Real-time text (RTT) call</string>
+    <string name="rtt_mode_summary">Allow messaging within a voice call</string>
+    <string name="rtt_mode_more_information">
+       RTT assists callers who are deaf, hard hearing, have a speech disability,
+       or need more than voice alone.&lt;br>
+       &lt;a href="<xliff:g example="http://www.google.com" id="url">http://support.google.com/mobile?p=telephony_rtt</xliff:g>">Learn more&lt;/a>
+       &lt;br>&lt;br> - RTT calls are saved as a message transcript
+       &lt;br> - RTT is not available for video calls</string>
+
     <!-- Service option entries.  -->
     <string-array name="tty_mode_entries">
         <item>TTY Off</item>
@@ -1487,4 +1520,233 @@
     <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">Airplane mode is on</string>
+    <!-- In-call screen: call failure reason (SIM error) -->
+    <string name="clh_callFailed_simError_txt">Can\'t access SIM card</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">Issue with phone number you are trying to dial. Error code 1.</string>
+    <!-- In-call screen: call failure reason (Cause Number 3) -->
+    <string name="clh_callFailed_no_route_to_destination_txt">Couldn\'t complete call. Error code 3.</string>
+    <!-- In-call screen: call failure reason (Cause Number 6) -->
+    <string name="clh_callFailed_channel_unacceptable_txt">Couldn\'t complete call. Error code 6.</string>
+    <!-- In-call screen: call failure reason (Cause Number 8) -->
+    <string name="clh_callFailed_operator_determined_barring_txt">Couldn\'t complete call. Error code 8.</string>
+    <!-- In-call screen: call failure reason (Cause Number 16) -->
+    <string name="clh_callFailed_normal_call_clearing_txt">Couldn\'t complete call. Error code 16.</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">User not responding</string>
+    <!-- In-call screen: call failure reason (Cause Number 19) -->
+    <string name="clh_callFailed_user_alerting_txt">Couldn\'t complete call. Error code 19.</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">Couldn\'t complete call. Error code 25.</string>
+    <!-- In-call screen: call failure reason (Cause Number 26) -->
+    <string name="clh_callFailed_non_selected_user_clearing_txt">Couldn\'t complete call. Error code 26.</string>
+    <!-- In-call screen: call failure reason (Cause Number 27) -->
+    <string name="clh_callFailed_destination_out_of_order_txt">Couldn\'t complete call. Error code 27.</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">Couldn\'t complete call. Error code 29.</string>
+    <!-- In-call screen: call failure reason (Cause Number 30) -->
+    <string name="clh_callFailed_response_to_STATUS_ENQUIRY_txt">Couldn\'t complete call. Error code 30.</string>
+    <!-- In-call screen: call failure reason (Cause Number 31) -->
+    <string name="clh_callFailed_normal_unspecified_txt">Couldn\'t complete call. Error code 31.</string>
+    <!-- In-call screen: call failure reason (Cause Number 34) -->
+    <string name="clh_callFailed_no_circuit_available_txt">Couldn\'t complete call. Error code 34.</string>
+    <!-- In-call screen: call failure reason (Cause Number 38) -->
+    <string name="clh_callFailed_network_out_of_order_txt">Couldn\'t complete call. Error code 38.</string>
+    <!-- In-call screen: call failure reason (Cause Number 41) -->
+    <string name="clh_callFailed_temporary_failure_txt">Couldn\'t complete call. Error code 41.</string>
+    <!-- In-call screen: call failure reason (Cause Number 42) -->
+    <string name="clh_callFailed_switching_equipment_congestion_txt">Couldn\'t complete call. Error code 42.</string>
+    <!-- In-call screen: call failure reason (Cause Number 43) -->
+    <string name="clh_callFailed_access_information_discarded_txt">Couldn\'t complete call. Error code 43.</string>
+    <!-- In-call screen: call failure reason (Cause Number 44) -->
+    <string name="clh_callFailed_requested_circuit_txt">Couldn\'t complete call. Error code 44.</string>
+    <!-- In-call screen: call failure reason (Cause Number 47) -->
+    <string name="clh_callFailed_resources_unavailable_unspecified_txt">Couldn\'t complete call. Error code 47.</string>
+    <!-- In-call screen: call failure reason (Cause Number 49) -->
+    <string name="clh_callFailed_quality_of_service_unavailable_txt">Couldn\'t complete call. Error code 49.</string>
+    <!-- In-call screen: call failure reason (Cause Number 50) -->
+    <string name="clh_callFailed_requested_facility_not_subscribed_txt">Couldn\'t complete call. Error code 50.</string>
+    <!-- In-call screen: call failure reason (Cause Number 55) -->
+    <string name="clh_callFailed_incoming_calls_barred_within_the_CUG_txt">Couldn\'t complete call. Error code 55.</string>
+    <!-- In-call screen: call failure reason (Cause Number 57) -->
+    <string name="clh_callFailed_bearer_capability_not_authorized_txt">Couldn\'t complete call. Error code 57.</string>
+    <!-- In-call screen: call failure reason (Cause Number 58) -->
+    <string name="clh_callFailed_bearer_capability_not_presently_available_txt">Couldn\'t complete call. Error code 58.</string>
+    <!-- In-call screen: call failure reason (Cause Number 63) -->
+    <string name="clh_callFailed_service_or_option_not_available_unspecified_txt">Couldn\'t complete call. Error code 63.</string>
+    <!-- In-call screen: call failure reason (Cause Number 65) -->
+    <string name="clh_callFailed_bearer_service_not_implemented_txt">Couldn\'t complete call. Error code 65.</string>
+    <!-- In-call screen: call failure reason (Cause Number 68) -->
+    <string name="clh_callFailed_ACM_equal_to_or_greater_than_ACMmax_txt">Couldn\'t complete call. Error code 68.</string>
+    <!-- In-call screen: call failure reason (Cause Number 69) -->
+    <string name="clh_callFailed_requested_facility_not_implemented_txt">Couldn\'t complete call. Error code 69.</string>
+    <!-- In-call screen: call failure reason (Cause Number 70) -->
+    <string name="clh_callFailed_only_restricted_digital_information_bearer_capability_is_available_txt">Couldn\'t complete call. Error code 70.</string>
+    <!-- In-call screen: call failure reason (Cause Number 79) -->
+    <string name="clh_callFailed_service_or_option_not_implemented_unspecified_txt">Couldn\'t complete call. Error code 79.</string>
+    <!-- In-call screen: call failure reason (Cause Number 81) -->
+    <string name="clh_callFailed_invalid_transaction_identifier_value_txt">Couldn\'t complete call. Error code 81.</string>
+    <!-- In-call screen: call failure reason (Cause Number 87) -->
+    <string name="clh_callFailed_user_not_member_of_CUG_txt">Couldn\'t complete call. Error code 87.</string>
+    <!-- In-call screen: call failure reason (Cause Number 88) -->
+    <string name="clh_callFailed_incompatible_destination_txt">Couldn\'t complete call. Error code 88.</string>
+    <!-- In-call screen: call failure reason (Cause Number 91) -->
+    <string name="clh_callFailed_invalid_transit_network_selection_txt">Couldn\'t complete call. Error code 91.</string>
+    <!-- In-call screen: call failure reason (Cause Number 95) -->
+    <string name="clh_callFailed_semantically_incorrect_message_txt">Couldn\'t complete call. Error code 95.</string>
+    <!-- In-call screen: call failure reason (Cause Number 96) -->
+    <string name="clh_callFailed_invalid_mandatory_information_txt">Couldn\'t complete call. Error code 96.</string>
+    <!-- In-call screen: call failure reason (Cause Number 97) -->
+    <string name="clh_callFailed_message_type_non_existent_or_not_implemented_txt">Couldn\'t complete call. Error code 97.</string>
+    <!-- In-call screen: call failure reason (Cause Number 98) -->
+    <string name="clh_callFailed_message_type_not_compatible_with_protocol_state_txt">Couldn\'t complete call. Error code 98.</string>
+    <!-- In-call screen: call failure reason (Cause Number 99) -->
+    <string name="clh_callFailed_information_element_non_existent_or_not_implemented_txt">Couldn\'t complete call. Error code 99.</string>
+    <!-- In-call screen: call failure reason (Cause Number 100) -->
+    <string name="clh_callFailed_conditional_IE_error_txt">Couldn\'t complete call. Error code 100.</string>
+    <!-- In-call screen: call failure reason (Cause Number 101) -->
+    <string name="clh_callFailed_message_not_compatible_with_protocol_state_txt">Couldn\'t complete call. Error code 101.</string>
+    <!-- In-call screen: call failure reason (Cause Number 102) -->
+    <string name="clh_callFailed_recovery_on_timer_expiry_txt">Couldn\'t complete call. Error code 102.</string>
+    <!-- In-call screen: call failure reason (Cause Number 111) -->
+    <string name="clh_callFailed_protocol_Error_unspecified_txt">Couldn\'t complete call. Error code 111.</string>
+    <!-- In-call screen: call failure reason (Cause Number 127) -->
+    <string name="clh_callFailed_interworking_unspecified_txt">Couldn\'t complete call. Error code 127.</string>
+    <!-- Call settings screen, setting option name -->
+    <string name="labelCallBarring">Call barring</string>
+    <!-- Call barring settings screen, setting summary text when a call barring option is activated -->
+    <string name="sum_call_barring_enabled">On</string>
+    <!-- Call barring settings screen, setting summary text when a call barring option is deactivated -->
+    <string name="sum_call_barring_disabled">Off</string>
+    <!-- Call barring settings screen, setting option name -->
+    <string name="call_barring_baoc">All outgoing</string>
+    <!-- Call barring settings screen, Disable blocking of all outgoing calls -->
+    <string name="call_barring_baoc_enabled">Disable blocking of all outgoing calls?</string>
+    <!-- Call barring settings screen, Block all outgoing calls -->
+    <string name="call_barring_baoc_disabled">Block all outgoing calls?</string>
+    <!-- Call barring settings screen, setting option name -->
+    <string name="call_barring_baoic">Outgoing international</string>
+    <!-- Call barring settings screen, Disable blocking of outgoing international calls -->
+    <string name="call_barring_baoic_enabled">Disable blocking of outgoing international calls?</string>
+    <!-- Call barring settings screen, Block outgoing international calls-->
+    <string name="call_barring_baoic_disabled">Block outgoing international calls?</string>
+    <!-- Call barring settings screen, setting option name -->
+    <string name="call_barring_baoicr">Outgoing international roaming</string>
+    <!-- Call barring settings screen, Disable blocking of outgoing international roaming -->
+    <string name="call_barring_baoicr_enabled">Disable blocking of outgoing international roaming?</string>
+    <!-- Call barring settings screen, Block outgoing international roaming -->
+    <string name="call_barring_baoicr_disabled">Block outgoing international roaming?</string>
+    <!-- Call barring settings screen, setting option name -->
+    <string name="call_barring_baic">All incoming</string>
+    <!-- Call barring settings screen, Disable blocking of all incoming calls -->
+    <string name="call_barring_baic_enabled">Disable blocking of all incoming calls?</string>
+    <!-- Call barring settings screen, Block all incoming calls -->
+    <string name="call_barring_baic_disabled">Block all incoming calls?</string>
+    <!-- Call barring settings screen, setting option name -->
+    <string name="call_barring_baicr">Incoming international roaming</string>
+    <!-- Call barring settings screen, Disable blocking of all incoming international roaming -->
+    <string name="call_barring_baicr_enabled">Disable blocking of all incoming international roaming?</string>
+    <!-- Call barring settings screen, Block incoming international roaming-->
+    <string name="call_barring_baicr_disabled">Block incoming international roaming?</string>
+    <!-- Call barring settings screen, setting option name -->
+    <string name="call_barring_deactivate_all">Deactivate all</string>
+    <!-- Call barring settings screen, setting summary text when BAAll check box is selected -->
+    <string name="call_barring_deactivate_all_description">Deactivate all call barring settings</string>
+    <!-- Call barring settings screen, deactivate all successfully -->
+    <string name="call_barring_deactivate_success">Call barring deactivated</string>
+    <!-- Call barring settings screen, change password -->
+    <string name="call_barring_change_pwd">Change password</string>
+    <!-- Call barring settings screen, change password -->
+    <string name="call_barring_change_pwd_description">Change call barring password</string>
+    <!-- Call barring settings screen, not possible to change call barring password -->
+    <string name="call_barring_change_pwd_description_disabled">Cannot change call barring password.</string>
+    <!-- Call barring settings screen, change password -->
+    <string name="call_barring_pwd_not_match">Passwords do not match</string>
+    <!-- Call barring settings screen, change password -->
+    <string name="call_barring_right_pwd_number">Enter a password with 4 numbers</string>
+    <!-- Call barring settings screen, change password -->
+    <string name="call_barring_change_pwd_success">Password changed</string>
+    <!-- Call barring settings screen, change password -->
+    <string name="call_barring_old_pwd">Old password</string>
+    <!-- Call barring settings screen, change password -->
+    <string name="call_barring_new_pwd">New password</string>
+    <!-- Call barring settings screen, change password -->
+    <string name="call_barring_confirm_pwd">Confirm password</string>
+    <!-- Call forwarding dialog box, text field label -->
+    <string name="messageCallBarring">Enter password</string>
+    <!-- Call barring settings screen, section heading -->
+    <string name="call_barring_settings">Call barring settings</string>
+    <!-- Call barring settings screen, deactivate all call barring settings -->
+    <string name="call_barring_deactivate_all_no_password">Deactivate all call barring settings?</string>
+    <!-- Message displayed to the user when an outgoing call is deflected.  This means that the
+         party the user is calling has chosen to send the call to another phone number. -->
+    <string name="supp_service_notification_call_deflected">Call deflected.</string>
+    <!-- Message displayed to the user when an outgoing call is forwarded to another number.
+         This happens because the party the user is calling has call forwarding active. -->
+    <string name="supp_service_notification_call_forwarded">Call forwarded.</string>
+    <!-- Message displayed to the user when an outgoing call is waiting.  This happens when the
+         party the user is calling is already in another call. -->
+    <string name="supp_service_notification_call_waiting">Call is waiting.</string>
+    <!-- Message displayed to the user when they have chosen to block their phone number for an
+         outgoing call, but the network has rejected that request. -->
+    <string name="supp_service_clir_suppression_rejected">Number blocking is rejected.</string>
+    <!-- Message displayed to the user to inform them that the call is to or from a number which is
+         part of a closed user group.  A closed user group is a network feature which restricts
+         calls on a device to members of the closed user group. -->
+    <string name="supp_service_closed_user_group_call">Closed user group call.</string>
+    <!-- Message displayed to the user when incoming call barring is active.  This means that the
+         user has enabled the network feature which prevents all incoming calls. -->
+    <string name="supp_service_incoming_calls_barred">Incoming calls barred.</string>
+    <!-- Message displayed to the user when outgoing call barring is active.  This means that the
+         user has enabled the network feature which prevents all outgoing calls. -->
+    <string name="supp_service_outgoing_calls_barred">Outgoing calls barred.</string>
+    <!-- Message displayed to the user to indicate that call forwarding is active. -->
+    <string name="supp_service_call_forwarding_active">Call forwarding active.</string>
+    <!-- Message displayed to the user when they receive multiple incoming calls at the same time
+         and one of them is forwarded to the network.  Phones can't handle multiple incoming calls
+         so the network will typically forward one of the calls to voicemail or another number
+         defined by the user. -->
+    <string name="supp_service_additional_call_forwarded">Additional call forwarded.</string>
+    <!-- Message displayed to the user to indicate that a call has been successfully transferred
+         to another phone number. -->
+    <string name="supp_service_additional_ect_connected">Explicit call transfer complete.</string>
+    <!-- Message displayed to the user to indicate that the call is in the process of being
+         transferred to another phone number.-->
+    <string name="supp_service_additional_ect_connecting">Explicit call transfer in progress.</string>
+    <!-- Message displayed to the user to indicate that the remote party has put the user
+         on hold. -->
+    <string name="supp_service_call_on_hold">Call on hold.</string>
+    <!-- Message displayed to the user to indicate that the remote party has taken the user
+         off hold. -->
+    <string name="supp_service_call_resumed">Call resumed.</string>
+    <!-- Message displayed to the user to indicate that an incoming call was deflected from another
+         number.  This means that the call originated as a result of the original caller choosing
+         to forward the call to the current user rather than answering it themselves. -->
+    <string name="supp_service_deflected_call">Call was deflected.</string>
+    <!-- Message displayed to the user to indicate that an incoming call was forwarded from another
+         number. -->
+    <string name="supp_service_forwarded_call">Forwarded call.</string>
+    <!-- Message displayed to the user to indicate that they are joining a conference call. -->
+    <string name="supp_service_conference_call">Joining conference call.</string>
+    <!-- Message displayed to the user to indicate that a held call has been released /
+         disconnected. -->
+    <string name="supp_service_held_call_released">Held call has been released.</string>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index f8cd9ec..d003aec 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -187,6 +187,12 @@
         <item name="android:preferenceScreenStyle">@style/SettingsPreferenceScreen</item>
     </style>
 
+    <style name="TrimmedHorizontalProgressBar" parent="android:Widget.Material.ProgressBar.Horizontal">
+        <item name="android:indeterminateDrawable">@drawable/progress_indeterminate_horizontal_material_trimmed</item>
+        <item name="android:minHeight">3dip</item>
+        <item name="android:maxHeight">3dip</item>
+    </style>
+
     <style name="Empty" parent="@android:style/Theme.Material.Light">
         <item name="android:windowIsTranslucent">true</item>
         <item name="android:windowBackground">@android:color/transparent</item>
@@ -304,4 +310,7 @@
         <item name="android:backgroundDimEnabled">false</item>
     </style>
 
+    <style name="CallSettingsWithoutDividerTheme" parent="SettingsLight">
+        <item name="android:listDivider">@null</item>
+    </style>
 </resources>
diff --git a/res/values/styles_preference.xml b/res/values/styles_preference.xml
index 02c5cb7..ceea4a6 100644
--- a/res/values/styles_preference.xml
+++ b/res/values/styles_preference.xml
@@ -30,7 +30,7 @@
     </style>
 
     <style name="SettingsPreferenceCategory" parent="@*android:style/Preference.DeviceDefault.Category">
-        <item name="android:layout">@layout/preference_category_material_settings</item>
+        <item name="android:layout">@layout/preference_category_material_settings_with_divider</item>
     </style>
 
     <style name="SettingsDialogPreference" parent="@*android:style/Preference.DeviceDefault.DialogPreference">
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index 2c007f6..ccc97c5 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -32,4 +32,14 @@
         android:persistent="true"
         android:summary="@string/hac_mode_summary"/>
 
+    <SwitchPreference
+        android:key="button_rtt_key"
+        android:title="@string/rtt_mode_title"
+        android:persistent="true"
+        android:summary="@string/rtt_mode_summary"/>
+
+    <com.android.phone.settings.TextViewPreference
+        android:key="button_rtt_more_information_key"
+        android:title="@string/rtt_mode_more_information"/>
+
 </PreferenceScreen>
diff --git a/res/xml/call_feature_setting.xml b/res/xml/call_feature_setting.xml
index 72be17c..5eb28fb 100644
--- a/res/xml/call_feature_setting.xml
+++ b/res/xml/call_feature_setting.xml
@@ -42,7 +42,9 @@
 
         <intent android:action="android.intent.action.MAIN"
             android:targetPackage="com.android.settings"
-            android:targetClass="com.android.settings.Settings$WifiCallingSettingsActivity"/>
+            android:targetClass="com.android.settings.Settings$WifiCallingSettingsActivity">
+                <extra android:name="show_drawer_menu" android:value="true" />
+        </intent>
 
     </PreferenceScreen>
 
diff --git a/res/xml/callbarring_options.xml b/res/xml/callbarring_options.xml
new file mode 100644
index 0000000..6f2c48a
--- /dev/null
+++ b/res/xml/callbarring_options.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+     xmlns:phone="http://schemas.android.com/apk/res/com.android.phone"
+     android:title="@string/call_barring_settings">
+
+    <!-- Note for all com.android.phone.EditPinPreference objects
+
+         The last several attributes are for use with the EditText field
+         in the dialog. These attributes are forwarded to that field
+         when the edittext is created. The attributes include:
+           1. android:singleLine
+           2. android:autoText -->
+
+    <!-- All outgoing -->
+    <com.android.phone.CallBarringEditPreference
+        android:key="button_baoc_key"
+        android:title="@string/call_barring_baoc"
+        android:persistent="false"
+        android:summaryOn="@string/sum_call_barring_enabled"
+        android:summaryOff="@string/sum_call_barring_disabled"
+        android:dialogTitle="@string/call_barring_baoc"
+        phone:dialogMessageEnabledNoPwd="@string/call_barring_baoc_enabled"
+        phone:dialogMessageDisabledNoPwd="@string/call_barring_baoc_disabled"
+        phone:facility="AO"
+        android:singleLine="true"
+        android:autoText="false"/>
+
+    <!-- Outgoing international -->
+    <com.android.phone.CallBarringEditPreference
+        android:key="button_baoic_key"
+        android:title="@string/call_barring_baoic"
+        android:persistent="false"
+        android:summaryOn="@string/sum_call_barring_enabled"
+        android:summaryOff="@string/sum_call_barring_disabled"
+        android:dialogTitle="@string/call_barring_baoic"
+        phone:dialogMessageEnabledNoPwd="@string/call_barring_baoic_enabled"
+        phone:dialogMessageDisabledNoPwd="@string/call_barring_baoic_disabled"
+        phone:facility="OI"
+        android:dependency="button_baoc_key"
+        android:singleLine="true"
+        android:autoText="false"/>
+
+    <!-- Outgoing international roaming -->
+    <com.android.phone.CallBarringEditPreference
+        android:key="button_baoicxh_key"
+        android:title="@string/call_barring_baoicr"
+        android:persistent="false"
+        android:summaryOn="@string/sum_call_barring_enabled"
+        android:summaryOff="@string/sum_call_barring_disabled"
+        android:dialogTitle="@string/call_barring_baoicr"
+        phone:dialogMessageEnabledNoPwd="@string/call_barring_baoicr_enabled"
+        phone:dialogMessageDisabledNoPwd="@string/call_barring_baoicr_disabled"
+        phone:facility="OX"
+        android:dependency="button_baoc_key"
+        android:singleLine="true"
+        android:autoText="false"/>
+
+    <!-- All incoming -->
+    <com.android.phone.CallBarringEditPreference
+        android:key="button_baic_key"
+        android:title="@string/call_barring_baic"
+        android:persistent="false"
+        android:summaryOn="@string/sum_call_barring_enabled"
+        android:summaryOff="@string/sum_call_barring_disabled"
+        android:dialogTitle="@string/call_barring_baic"
+        phone:dialogMessageEnabledNoPwd="@string/call_barring_baic_enabled"
+        phone:dialogMessageDisabledNoPwd="@string/call_barring_baic_disabled"
+        phone:facility="AI"
+        android:singleLine="true"
+        android:autoText="false"/>
+
+    <!-- Incoming international roaming -->
+    <com.android.phone.CallBarringEditPreference
+        android:key="button_baicr_key"
+        android:title="@string/call_barring_baicr"
+        android:persistent="false"
+        android:summaryOn="@string/sum_call_barring_enabled"
+        android:summaryOff="@string/sum_call_barring_disabled"
+        android:dialogTitle="@string/call_barring_baicr"
+        phone:dialogMessageEnabledNoPwd="@string/call_barring_baicr_enabled"
+        phone:dialogMessageDisabledNoPwd="@string/call_barring_baicr_disabled"
+        phone:facility="IR"
+        android:dependency="button_baic_key"
+        android:singleLine="true"
+        android:autoText="false"/>
+
+    <!-- Disable all -->
+    <com.android.phone.CallBarringDeselectAllPreference
+        android:key="button_ba_all_key"
+        android:title="@string/call_barring_deactivate_all"
+        android:persistent="false"
+        android:dialogTitle="@string/call_barring_deactivate_all"
+        android:summary="@string/call_barring_deactivate_all_description"/>
+
+    <!-- Change password -->
+    <com.android.phone.settings.fdn.EditPinPreference
+        android:key="button_change_pw_key"
+        android:title="@string/call_barring_change_pwd"
+        android:dialogTitle="@string/call_barring_change_pwd"
+        android:summary="@string/call_barring_change_pwd_description"
+        android:persistent="false"/>
+</PreferenceScreen>
diff --git a/res/xml/carrier_select.xml b/res/xml/carrier_select.xml
deleted file mode 100644
index 1e04285..0000000
--- a/res/xml/carrier_select.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        android:key="list_networks_key" 
-        android:title="@string/label_available">
-    <Preference 
-        android:key="button_srch_netwrks_key" 
-        android:title="@string/search_networks"
-        android:summary="@string/sum_search_networks"
-        android:persistent="false"/>
-    <Preference 
-        android:key="button_auto_select_key" 
-        android:title="@string/select_automatically"
-        android:persistent="false"/>
-</PreferenceScreen>
diff --git a/res/xml/cdma_options.xml b/res/xml/cdma_options.xml
index c86787b..6ac5dae 100644
--- a/res/xml/cdma_options.xml
+++ b/res/xml/cdma_options.xml
@@ -33,21 +33,23 @@
         android:entryValues="@array/cdma_subscription_values"
         android:dialogTitle="@string/cdma_subscription_dialogtitle" />
 
-    <PreferenceScreen
-        android:key="button_apn_key_cdma"
-        android:title="@string/apn_settings"
-        android:persistent="false">
-
+    <!--We want separate APN setting from reset of settings because-->
+    <!--we want user to change it with caution.-->
+    <PreferenceCategory
+        android:key="category_cdma_apn_key">
         <!-- The launching Intent will be defined thru code as we need to pass some Extra -->
+        <com.android.phone.RestrictedPreference
+            android:key="button_cdma_apn_key"
+            android:title="@string/apn_settings"
+            android:persistent="false"/>
+    </PreferenceCategory>
 
-    </PreferenceScreen>
-
-    <PreferenceScreen
+    <Preference
         android:key="carrier_settings_key"
         android:title="@string/carrier_settings_title">
         <intent android:action="android.intent.action.MAIN"
                 android:targetPackage="@string/carrier_settings"
                 android:targetClass="@string/carrier_settings_menu" />
-    </PreferenceScreen>
+    </Preference>
 
 </PreferenceScreen>
diff --git a/res/xml/choose_network.xml b/res/xml/choose_network.xml
new file mode 100644
index 0000000..fdf2aae
--- /dev/null
+++ b/res/xml/choose_network.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+    android:title="@string/choose_network_title">
+
+    <PreferenceCategory
+        android:key="connected_network_operator_preference"/>
+
+    <PreferenceCategory
+        android:key="network_operators_preference"/>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/gsm_umts_call_options.xml b/res/xml/gsm_umts_call_options.xml
index 5f3dfe4..774aec8 100644
--- a/res/xml/gsm_umts_call_options.xml
+++ b/res/xml/gsm_umts_call_options.xml
@@ -10,6 +10,11 @@
         android:persistent="false" />
 
     <PreferenceScreen
+         android:key="call_barring_key"
+         android:title="@string/labelCallBarring"
+         android:persistent="false" />
+
+    <PreferenceScreen
         android:key="additional_gsm_call_settings_key"
         android:title="@string/additional_gsm_call_settings"
         android:persistent="false" />
diff --git a/res/xml/gsm_umts_options.xml b/res/xml/gsm_umts_options.xml
index 86fe41d..1df4c84 100644
--- a/res/xml/gsm_umts_options.xml
+++ b/res/xml/gsm_umts_options.xml
@@ -17,21 +17,36 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:settings="http://schemas.android.com/apk/res/com.android.phone">
 
-    <PreferenceScreen
-        android:key="button_apn_key"
-        android:title="@string/apn_settings"
+    <com.android.phone.NetworkOperators
+        android:key="network_operators_category_key"
+        android:title="@string/network_operator_category"
         android:persistent="false">
 
-        <!-- The launching Intent will be defined thru code as we need to pass some Extra -->
+        <SwitchPreference
+            android:key="button_auto_select_key"
+            android:title="@string/select_automatically"
+            android:persistent="false"/>
 
-    </PreferenceScreen>
+        <com.android.phone.NetworkSelectListPreference
+            android:key="button_network_select_key"
+            android:title="@string/network_select_title"
+            android:persistent="false"/>
 
-    <PreferenceScreen
-        android:key="button_carrier_sel_key"
-        android:title="@string/networks"
-        android:summary="@string/sum_carrier_select"
-        android:persistent="false">
-    </PreferenceScreen>
+        <Preference
+            android:key="button_choose_network_key"
+            android:title="@string/choose_network_title"
+            android:fragment="com.android.phone.NetworkSelectSetting" />
+    </com.android.phone.NetworkOperators>
+
+    <!--We want separate APN setting from reset of settings because-->
+    <!--we want user to change it with caution.-->
+    <PreferenceCategory
+        android:key="category_gsm_apn_key">
+        <com.android.phone.RestrictedPreference
+            android:key="button_gsm_apn_key"
+            android:title="@string/apn_settings"
+            android:persistent="false" />
+    </PreferenceCategory>
 
     <PreferenceScreen
         android:key="carrier_settings_key"
diff --git a/res/xml/network_setting_fragment.xml b/res/xml/network_setting_fragment.xml
index 42a8e47..d334861 100644
--- a/res/xml/network_setting_fragment.xml
+++ b/res/xml/network_setting_fragment.xml
@@ -13,14 +13,18 @@
      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"
         android:title="@string/cdma_lte_data_service">
     </PreferenceScreen>
 
+    <com.android.phone.MobileDataPreference
+        android:key="mobile_data_enable"
+        android:title="@string/mobile_data_settings_title"
+        android:summary="@string/mobile_data_settings_summary"/>
+
     <com.android.phone.RestrictedSwitchPreference
         android:key="button_roaming_key"
         android:title="@string/roaming"
@@ -28,6 +32,19 @@
         android:summaryOn="@string/roaming_enable"
         android:summaryOff="@string/roaming_disable"/>
 
+    <com.android.phone.DataUsagePreference
+        android:key="data_usage_summary"
+        android:title="@string/data_usage_title" />
+
+    <com.android.phone.AdvancedOptionsPreference
+        android:key="advanced_options"/>
+
+    <SwitchPreference
+        android:key="enhanced_4g_lte"
+        android:title="@string/enhanced_4g_lte_mode_title"
+        android:persistent="false"
+        android:summary="@string/enhanced_4g_lte_mode_summary"/>
+
     <ListPreference
         android:key="preferred_network_mode_key"
         android:title="@string/preferred_network_mode_title"
@@ -44,11 +61,9 @@
         android:entryValues="@array/enabled_networks_values"
         android:dialogTitle="@string/preferred_network_mode_dialogtitle" />
 
-    <SwitchPreference
-        android:key="enhanced_4g_lte"
-        android:title="@string/enhanced_4g_lte_mode_title"
-        android:persistent="false"
-        android:summary="@string/enhanced_4g_lte_mode_summary"/>
+    <Preference
+        android:key="carrier_settings_euicc_key"
+        android:title="@string/carrier_settings_euicc" />
 
     <PreferenceCategory
         android:key="calling"
@@ -60,7 +75,9 @@
 
             <intent android:action="android.intent.action.MAIN"
                     android:targetPackage="com.android.settings"
-                    android:targetClass="com.android.settings.Settings$WifiCallingSettingsActivity"/>
+                    android:targetClass="com.android.settings.Settings$WifiCallingSettingsActivity">
+                        <extra android:name="show_drawer_menu" android:value="true" />
+            </intent>
 
         </PreferenceScreen>
 
@@ -71,9 +88,4 @@
 
     </PreferenceCategory>
 
-
-    <PreferenceScreen
-        android:key="carrier_settings_euicc_key"
-        android:title="@string/carrier_settings_euicc" />
-
 </PreferenceScreen>
diff --git a/sip/res/values-hi/strings.xml b/sip/res/values-hi/strings.xml
index db63b01..8341cf9 100644
--- a/sip/res/values-hi/strings.xml
+++ b/sip/res/values-hi/strings.xml
@@ -36,7 +36,7 @@
     <string name="alert_dialog_close" msgid="1326011828713435134">"प्रोफ़ाइल बंद करें"</string>
     <string name="alert_dialog_ok" msgid="4752048404605388940">"ठीक"</string>
     <string name="close_profile" msgid="3122414058856309881">"बंद करें"</string>
-    <string name="registration_status_checking_status" msgid="6136793741862200337">"स्थिति की जांच हो रही है..."</string>
+    <string name="registration_status_checking_status" msgid="6136793741862200337">"स्थिति की जाँच हो रही है..."</string>
     <string name="registration_status_registering" msgid="2677183977796278749">"पंजीकरण जारी है..."</string>
     <string name="registration_status_still_trying" msgid="7648151061205513458">"अब भी प्रयास कर रहा है..."</string>
     <string name="registration_status_not_receiving" msgid="7620333886153361090">"कॉल प्राप्त नहीं हो रहे हैं."</string>
@@ -46,7 +46,7 @@
     <string name="registration_status_done" msgid="3264961069247314253">"कॉल प्राप्त हो रहे हैं"</string>
     <string name="registration_status_failed_try_later" msgid="2199970021756384317">"खाता पंजीकरण विफल: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); बाद में फिर से प्रयास करें"</string>
     <string name="registration_status_invalid_credentials" msgid="8406872554323334182">"खाता पंजीकरण विफल: गलत उपयोगकर्ता नाम या पासवर्ड."</string>
-    <string name="registration_status_server_unreachable" msgid="7710275557045148634">"खाता पंजीकरण विफल: सर्वर नाम जांचें."</string>
+    <string name="registration_status_server_unreachable" msgid="7710275557045148634">"खाता पंजीकरण विफल: सर्वर नाम जाँचें."</string>
     <string name="third_party_account_summary" msgid="9041060473615403041">"वर्तमान में <xliff:g id="ACCOUNT_OWNER">%s</xliff:g> ऐप्स के द्वारा इस खाते का उपयोग किया जा रहा है."</string>
     <string name="sip_edit_title" msgid="1967247832635750410">"SIP खाता विवरण"</string>
     <string name="sip_edit_new_title" msgid="266414118302574305">"SIP खाता विवरण"</string>
@@ -71,7 +71,7 @@
     <string name="all_empty_alert" msgid="4087734950375192387">"नए SIP खाते के विवरण डालें."</string>
     <string name="empty_alert" msgid="6659484914371384024">"<xliff:g id="INPUT_FIELD_NAME">%s</xliff:g> आवश्यक है और इसे खाली नहीं छोड़ा जा सकता."</string>
     <string name="not_a_valid_port" msgid="7931422555587011830">"पोर्ट नंबर 1000 और 65534 के बीच होना चाहिए."</string>
-    <string name="no_internet_available" msgid="5523747991760017298">"SIP कॉल करने के लिए, पहले अपना इंटरनेट कनेक्‍शन जांचें."</string>
+    <string name="no_internet_available" msgid="5523747991760017298">"SIP कॉल करने के लिए, पहले अपना इंटरनेट कनेक्‍शन जाँचें."</string>
     <string name="no_wifi_available" msgid="1955023904229673488">"SIP कॉल के लिए आपको किसी वाई-फ़ाई नेटवर्क से कनेक्‍ट रहना होगा (वायरलेस और नेटवर्क सेटिंग का उपयोग करें)."</string>
     <string name="no_voip" msgid="3038021971231952704">"SIP कॉलिंग समर्थित नहीं है"</string>
     <string name="sip_system_decide" msgid="5577696249416700671">"स्वचालित"</string>
diff --git a/sip/res/values-mr/strings.xml b/sip/res/values-mr/strings.xml
index 49f158c..b90c155 100644
--- a/sip/res/values-mr/strings.xml
+++ b/sip/res/values-mr/strings.xml
@@ -29,21 +29,21 @@
     <string name="add_sip_account" msgid="800843669753980091">"खाते जोडा"</string>
     <string name="remove_sip_account" msgid="1367664438506503690">"खाते काढा"</string>
     <string name="sip_account_list" msgid="5610858485304821480">"SIP खाती"</string>
-    <string name="saving_account" msgid="5336529880235177448">"खाते जतन करीत आहे..."</string>
+    <string name="saving_account" msgid="5336529880235177448">"खाते जतन करत आहे..."</string>
     <string name="removing_account" msgid="5537351356808985756">"खाते काढत आहे..."</string>
-    <string name="sip_menu_save" msgid="7882219814563869225">"जतन करा"</string>
+    <string name="sip_menu_save" msgid="7882219814563869225">"सेव्ह करा"</string>
     <string name="sip_menu_discard" msgid="2350421645423888438">"टाकून द्या"</string>
     <string name="alert_dialog_close" msgid="1326011828713435134">"प्रोफाईल बंद करा"</string>
     <string name="alert_dialog_ok" msgid="4752048404605388940">"ठीक आहे"</string>
     <string name="close_profile" msgid="3122414058856309881">"बंद करा"</string>
     <string name="registration_status_checking_status" msgid="6136793741862200337">"स्‍थिती तपासत आहे..."</string>
-    <string name="registration_status_registering" msgid="2677183977796278749">"नोंदणी करीत आहे..."</string>
-    <string name="registration_status_still_trying" msgid="7648151061205513458">"अद्याप प्रयत्न करीत आहे..."</string>
+    <string name="registration_status_registering" msgid="2677183977796278749">"नोंदणी करत आहे..."</string>
+    <string name="registration_status_still_trying" msgid="7648151061205513458">"अद्याप प्रयत्न करत आहे..."</string>
     <string name="registration_status_not_receiving" msgid="7620333886153361090">"कॉल प्राप्त होत नाहीत."</string>
     <string name="registration_status_no_data" msgid="2541999976218192413">"इंटरनेट कनेक्‍शन नसल्‍याने खाते नोंदणी थांबली."</string>
     <string name="registration_status_no_wifi_data" msgid="9154717387473039546">"वाय-फाय कनेक्‍शन नसल्‍याने खाते नोंदणी थांबली."</string>
     <string name="registration_status_not_running" msgid="514205414303796800">"खाते नोंदणी अयशस्वी."</string>
-    <string name="registration_status_done" msgid="3264961069247314253">"कॉल प्राप्त करीत आहे."</string>
+    <string name="registration_status_done" msgid="3264961069247314253">"कॉल प्राप्त करत आहे."</string>
     <string name="registration_status_failed_try_later" msgid="2199970021756384317">"खाते नोंदणी अयशस्‍वी: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); नंतर प्रयत्‍न करू"</string>
     <string name="registration_status_invalid_credentials" msgid="8406872554323334182">"खाते नोंदणी अयशस्‍वी: चुकीचे वापरकर्तानाव किंवा संकेतशब्‍द."</string>
     <string name="registration_status_server_unreachable" msgid="7710275557045148634">"खाते नोंदणी अयशस्वी: सर्व्हर नाव तपासा."</string>
@@ -52,7 +52,7 @@
     <string name="sip_edit_new_title" msgid="266414118302574305">"SIP खाते तपशील"</string>
     <string name="domain_address_title" msgid="1968479941328225423">"सर्व्हर"</string>
     <string name="username_title" msgid="6770064611005663470">"वापरकर्तानाव"</string>
-    <string name="password_title" msgid="5289013731515564295">"संकेतशब्द"</string>
+    <string name="password_title" msgid="5289013731515564295">"पासवर्ड"</string>
     <string name="display_name_title" msgid="579241787583079773">"प्रदर्शन नाव"</string>
     <string name="proxy_address_title" msgid="6890163365640631841">"आउटबाउंड प्रॉक्सी पत्ता"</string>
     <string name="port_title" msgid="6693965912656593862">"पोर्ट नंबर"</string>
@@ -68,7 +68,7 @@
     <string name="optional_summary" msgid="2363105560396317624">"&lt;पर्यायी&gt;"</string>
     <string name="advanced_settings_show" msgid="7838761602853998622">"▷ सर्व दर्शविण्‍यासाठी स्‍पर्श करा"</string>
     <string name="advanced_settings_hide" msgid="3480554978705290228">"▽ सर्व लपविण्‍यासाठी स्‍पर्श करा"</string>
-    <string name="all_empty_alert" msgid="4087734950375192387">"नवीन SIP खात्याचा तपशील प्रविष्ट करा."</string>
+    <string name="all_empty_alert" msgid="4087734950375192387">"नवीन SIP खात्याचा तपशील एंटर करा."</string>
     <string name="empty_alert" msgid="6659484914371384024">"<xliff:g id="INPUT_FIELD_NAME">%s</xliff:g> आवश्‍यक आहे आणि रिक्त सोडले जाऊ शकत नाही."</string>
     <string name="not_a_valid_port" msgid="7931422555587011830">"पोर्ट नंबर 1000 आणि 65534 मध्‍ये असावा."</string>
     <string name="no_internet_available" msgid="5523747991760017298">"एक SIP कॉल करण्‍यासाठी, प्रथम आपले इंटरनेट कनेक्‍शन तपासा."</string>
diff --git a/sip/src/com/android/services/telephony/sip/SipConnectionService.java b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
index a5f48d3..27be9b4 100644
--- a/sip/src/com/android/services/telephony/sip/SipConnectionService.java
+++ b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
@@ -37,6 +37,7 @@
 
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.PhoneInternalInterface;
 import com.android.internal.telephony.sip.SipPhone;
 import com.android.services.telephony.DisconnectCauseUtil;
 
@@ -258,7 +259,9 @@
 
         try {
             com.android.internal.telephony.Connection originalConnection =
-                    phone.dial(number, request.getVideoState());
+                    phone.dial(number, new PhoneInternalInterface.DialArgs.Builder<>()
+                            .setVideoState(request.getVideoState())
+                            .build());
             return originalConnection;
         } catch (CallStateException e) {
             log("startCallWithPhone, exception: " + e);
diff --git a/src/com/android/phone/AdvancedOptionsPreference.java b/src/com/android/phone/AdvancedOptionsPreference.java
new file mode 100644
index 0000000..1987395
--- /dev/null
+++ b/src/com/android/phone/AdvancedOptionsPreference.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.phone;
+
+import android.content.Context;
+import android.preference.Preference;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * Customized preference class representing the "Advanced" button that expands to fields that
+ * are hidden by default.
+ */
+public class AdvancedOptionsPreference extends Preference {
+    public AdvancedOptionsPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+
+        setIcon(R.drawable.ic_expand_more);
+        setTitle(R.string.advanced_options_title);
+        TextView summary = view.findViewById(android.R.id.summary);
+        summary.setMaxLines(1);
+    }
+}
diff --git a/src/com/android/phone/CLIRListPreference.java b/src/com/android/phone/CLIRListPreference.java
index 939caf0..f5d14b8 100644
--- a/src/com/android/phone/CLIRListPreference.java
+++ b/src/com/android/phone/CLIRListPreference.java
@@ -52,6 +52,7 @@
         mPhone = phone;
         mTcpListener = listener;
         if (!skipReading) {
+            Log.i(LOG_TAG, "init: requesting CLIR");
             mPhone.getOutgoingCallerIdDisplay(mHandler.obtainMessage(MyHandler.MESSAGE_GET_CLIR,
                     MyHandler.MESSAGE_GET_CLIR, MyHandler.MESSAGE_GET_CLIR));
             if (mTcpListener != null) {
@@ -135,20 +136,19 @@
             }
             clirArray = null;
             if (ar.exception != null) {
-                if (DBG) Log.d(LOG_TAG, "handleGetCLIRResponse: ar.exception="+ar.exception);
+                Log.i(LOG_TAG, "handleGetCLIRResponse: ar.exception=" + ar.exception);
                 mTcpListener.onException(CLIRListPreference.this, (CommandException) ar.exception);
             } else if (ar.userObj instanceof Throwable) {
+                Log.i(LOG_TAG, "handleGetCLIRResponse: ar.throwable=" + ar.userObj);
                 mTcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR);
             } else {
                 int clirArray[] = (int[]) ar.result;
                 if (clirArray.length != 2) {
                     mTcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR);
                 } else {
-                    if (DBG) {
-                        Log.d(LOG_TAG, "handleGetCLIRResponse: CLIR successfully queried,"
+                    Log.i(LOG_TAG, "handleGetCLIRResponse: CLIR successfully queried,"
                                 + " clirArray[0]=" + clirArray[0]
                                 + ", clirArray[1]=" + clirArray[1]);
-                    }
                     handleGetCLIRResult(clirArray);
                 }
             }
diff --git a/src/com/android/phone/CallBarringDeselectAllPreference.java b/src/com/android/phone/CallBarringDeselectAllPreference.java
new file mode 100644
index 0000000..153bc0c
--- /dev/null
+++ b/src/com/android/phone/CallBarringDeselectAllPreference.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.telephony.ServiceState;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.imsphone.ImsPhone;
+import com.android.phone.settings.fdn.EditPinPreference;
+
+/**
+ * This preference represents the status of disable all barring option.
+ */
+public class CallBarringDeselectAllPreference extends EditPinPreference {
+    private static final String LOG_TAG = "CallBarringDeselectAllPreference";
+    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
+
+    private boolean mShowPassword;
+    private Phone mPhone;
+
+    /**
+     * CallBarringDeselectAllPreference constructor.
+     *
+     * @param context The context of view.
+     * @param attrs The attributes of the XML tag that is inflating EditTextPreference.
+     */
+    public CallBarringDeselectAllPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void showDialog(Bundle state) {
+        // Finds out if the password field should be shown or not.
+        ImsPhone imsPhone = mPhone != null ? (ImsPhone) mPhone.getImsPhone() : null;
+        mShowPassword = !(imsPhone != null
+                && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)
+                        || imsPhone.isUtEnabled()));
+
+        // Selects dialog message depending on if the password field is shown or not.
+        setDialogMessage(getContext().getString(mShowPassword
+                ? R.string.messageCallBarring : R.string.call_barring_deactivate_all_no_password));
+
+        if (DBG) {
+            Log.d(LOG_TAG, "showDialog: mShowPassword: " + mShowPassword);
+        }
+
+        super.showDialog(state);
+    }
+
+    void init(Phone phone) {
+        if (DBG) {
+            Log.d(LOG_TAG, "init: phoneId = " + phone.getPhoneId());
+        }
+        mPhone = phone;
+    }
+
+    @Override
+    protected void onBindDialogView(View view) {
+        super.onBindDialogView(view);
+
+        final EditText editText = (EditText) view.findViewById(android.R.id.edit);
+        if (editText != null) {
+            // Hide the input-text-line if the password is not shown.
+            editText.setVisibility(mShowPassword ? View.VISIBLE : View.GONE);
+        }
+    }
+
+    @Override
+    protected boolean needInputMethod() {
+        // Input method should only be displayed if the password-field is shown.
+        return mShowPassword;
+    }
+
+    /**
+     * Returns whether the password field is shown.
+     */
+    boolean isPasswordShown() {
+        return mShowPassword;
+    }
+}
diff --git a/src/com/android/phone/CallBarringEditPreference.java b/src/com/android/phone/CallBarringEditPreference.java
new file mode 100644
index 0000000..72b3ea5
--- /dev/null
+++ b/src/com/android/phone/CallBarringEditPreference.java
@@ -0,0 +1,383 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import static com.android.phone.TimeConsumingPreferenceActivity.RESPONSE_ERROR;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.TypedArray;
+import android.os.AsyncResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.telephony.ServiceState;
+import android.text.method.DigitsKeyListener;
+import android.text.method.PasswordTransformationMethod;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.android.internal.telephony.CommandException;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.imsphone.ImsPhone;
+import com.android.phone.settings.fdn.EditPinPreference;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * This preference represents the status of call barring options, enabling/disabling
+ * the call barring option will prompt the user for the current password.
+ */
+public class CallBarringEditPreference extends EditPinPreference {
+    private static final String LOG_TAG = "CallBarringEditPreference";
+    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
+
+    private String mFacility;
+    boolean mIsActivated = false;
+    private CharSequence mEnableText;
+    private CharSequence mDisableText;
+    private CharSequence mSummaryOn;
+    private CharSequence mSummaryOff;
+    private CharSequence mDialogMessageEnabled;
+    private CharSequence mDialogMessageDisabled;
+    private int mButtonClicked;
+    private boolean mShowPassword;
+    private final MyHandler mHandler = new MyHandler(this);
+    private Phone mPhone;
+    private TimeConsumingPreferenceListener mTcpListener;
+
+    private static final int PW_LENGTH = 4;
+
+    /**
+     * CallBarringEditPreference constructor.
+     *
+     * @param context The context of view.
+     * @param attrs The attributes of the XML tag that is inflating EditTextPreference.
+     */
+    public CallBarringEditPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        // Get the summary settings, use CheckBoxPreference as the standard.
+        TypedArray typedArray = context.obtainStyledAttributes(attrs,
+                android.R.styleable.CheckBoxPreference, 0, 0);
+        mSummaryOn = typedArray.getString(android.R.styleable.CheckBoxPreference_summaryOn);
+        mSummaryOff = typedArray.getString(android.R.styleable.CheckBoxPreference_summaryOff);
+        mDisableText = context.getText(R.string.disable);
+        mEnableText = context.getText(R.string.enable);
+        typedArray.recycle();
+
+        // Get default phone
+        mPhone = PhoneFactory.getDefaultPhone();
+
+        typedArray = context.obtainStyledAttributes(attrs,
+                R.styleable.CallBarringEditPreference, 0, R.style.EditPhoneNumberPreference);
+        mFacility = typedArray.getString(R.styleable.CallBarringEditPreference_facility);
+        mDialogMessageEnabled = typedArray.getString(
+                R.styleable.CallBarringEditPreference_dialogMessageEnabledNoPwd);
+        mDialogMessageDisabled = typedArray.getString(
+                R.styleable.CallBarringEditPreference_dialogMessageDisabledNoPwd);
+        typedArray.recycle();
+    }
+
+    /**
+     * CallBarringEditPreference constructor.
+     *
+     * @param context The context of view.
+     */
+    public CallBarringEditPreference(Context context) {
+        this(context, null);
+    }
+
+    void init(TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) {
+        if (DBG) {
+            Log.d(LOG_TAG, "init: phone id = " + phone.getPhoneId());
+        }
+        mPhone = phone;
+
+        mTcpListener = listener;
+        if (!skipReading) {
+            // Query call barring status
+            mPhone.getCallBarring(mFacility, "", mHandler.obtainMessage(
+                    MyHandler.MESSAGE_GET_CALL_BARRING), 0);
+            if (mTcpListener != null) {
+                mTcpListener.onStarted(this, true);
+            }
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        super.onClick(dialog, which);
+        mButtonClicked = which;
+    }
+
+    @Override
+    protected boolean needInputMethod() {
+        // Input method should only be displayed if the password-field is shown.
+        return mShowPassword;
+    }
+
+    void setInputMethodNeeded(boolean needed) {
+        mShowPassword = needed;
+    }
+
+    @Override
+    protected void showDialog(Bundle state) {
+        setShowPassword();
+        if (mShowPassword) {
+            setDialogMessage(getContext().getString(R.string.messageCallBarring));
+        } else {
+            setDialogMessage(mIsActivated ? mDialogMessageEnabled : mDialogMessageDisabled);
+        }
+
+        if (DBG) {
+            Log.d(LOG_TAG, "showDialog: mShowPassword: " + mShowPassword
+                    + ", mIsActivated: " + mIsActivated);
+        }
+
+        super.showDialog(state);
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+
+        // Sync the summary view
+        TextView summaryView = (TextView) view.findViewById(android.R.id.summary);
+        if (summaryView != null) {
+            CharSequence sum;
+            int vis;
+
+            // Set summary depending upon mode
+            if (mIsActivated) {
+                sum = (mSummaryOn == null) ? getSummary() : mSummaryOn;
+            } else {
+                sum = (mSummaryOff == null) ? getSummary() : mSummaryOff;
+            }
+
+            if (sum != null) {
+                summaryView.setText(sum);
+                vis = View.VISIBLE;
+            } else {
+                vis = View.GONE;
+            }
+
+            if (vis != summaryView.getVisibility()) {
+                summaryView.setVisibility(vis);
+            }
+        }
+    }
+
+    @Override
+    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+        builder.setPositiveButton(null, null);
+        builder.setNeutralButton(mIsActivated ? mDisableText : mEnableText, this);
+    }
+
+    @Override
+    protected void onBindDialogView(View view) {
+        super.onBindDialogView(view);
+        // Default the button clicked to be the cancel button.
+        mButtonClicked = DialogInterface.BUTTON_NEGATIVE;
+
+        final EditText editText = (EditText) view.findViewById(android.R.id.edit);
+        if (editText != null) {
+            editText.setSingleLine(true);
+            editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
+            editText.setKeyListener(DigitsKeyListener.getInstance());
+
+            // Hide the input-text-line if the password is not shown.
+            editText.setVisibility(mShowPassword ? View.VISIBLE : View.GONE);
+        }
+    }
+
+    @Override
+    protected void onDialogClosed(boolean positiveResult) {
+        super.onDialogClosed(positiveResult);
+        if (DBG) {
+            Log.d(LOG_TAG, "onDialogClosed: mButtonClicked=" + mButtonClicked + ", positiveResult="
+                    + positiveResult);
+        }
+        if (mButtonClicked != DialogInterface.BUTTON_NEGATIVE) {
+            String password = null;
+            if (mShowPassword) {
+                password = getEditText().getText().toString();
+
+                // Check if the password is valid.
+                if (password == null || password.length() != PW_LENGTH) {
+                    Toast.makeText(getContext(),
+                            getContext().getString(R.string.call_barring_right_pwd_number),
+                            Toast.LENGTH_SHORT).show();
+                    return;
+                }
+            }
+
+            if (DBG) {
+                Log.d(LOG_TAG, "onDialogClosed: password=" + password);
+            }
+            // Send set call barring message to RIL layer.
+            mPhone.setCallBarring(mFacility, !mIsActivated, password,
+                    mHandler.obtainMessage(MyHandler.MESSAGE_SET_CALL_BARRING), 0);
+            if (mTcpListener != null) {
+                mTcpListener.onStarted(this, false);
+            }
+        }
+    }
+
+    void handleCallBarringResult(boolean status) {
+        mIsActivated = status;
+        if (DBG) {
+            Log.d(LOG_TAG, "handleCallBarringResult: mIsActivated=" + mIsActivated);
+        }
+    }
+
+    void updateSummaryText() {
+        notifyChanged();
+        notifyDependencyChange(shouldDisableDependents());
+    }
+
+    private void setShowPassword() {
+        ImsPhone imsPhone = mPhone != null ? (ImsPhone) mPhone.getImsPhone() : null;
+        mShowPassword = !(imsPhone != null
+                && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)
+                        || imsPhone.isUtEnabled()));
+    }
+
+    @Override
+    public boolean shouldDisableDependents() {
+        return mIsActivated;
+    }
+
+    // Message protocol:
+    // what: get vs. set
+    // arg1: action -- register vs. disable
+    // arg2: get vs. set for the preceding request
+    private static class MyHandler extends Handler {
+        private static final int MESSAGE_GET_CALL_BARRING = 0;
+        private static final int MESSAGE_SET_CALL_BARRING = 1;
+
+        private final WeakReference<CallBarringEditPreference> mCallBarringEditPreference;
+
+        private MyHandler(CallBarringEditPreference callBarringEditPreference) {
+            mCallBarringEditPreference =
+                    new WeakReference<CallBarringEditPreference>(callBarringEditPreference);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MESSAGE_GET_CALL_BARRING:
+                    handleGetCallBarringResponse(msg);
+                    break;
+                case MESSAGE_SET_CALL_BARRING:
+                    handleSetCallBarringResponse(msg);
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        // Handle the response message for query CB status.
+        private void handleGetCallBarringResponse(Message msg) {
+            final CallBarringEditPreference pref = mCallBarringEditPreference.get();
+            if (pref == null) {
+                return;
+            }
+
+            if (DBG) {
+                Log.d(LOG_TAG, "handleGetCallBarringResponse: done");
+            }
+
+            AsyncResult ar = (AsyncResult) msg.obj;
+
+            if (msg.arg2 == MESSAGE_SET_CALL_BARRING) {
+                pref.mTcpListener.onFinished(pref, false);
+            } else {
+                pref.mTcpListener.onFinished(pref, true);
+                ImsPhone imsPhone = pref.mPhone != null
+                        ? (ImsPhone) pref.mPhone.getImsPhone() : null;
+                if (!pref.mShowPassword && (imsPhone == null || !imsPhone.isUtEnabled())) {
+                    // Re-enable password when rejected from NW and modem would perform CSFB
+                    pref.mShowPassword = true;
+                    if (DBG) {
+                        Log.d(LOG_TAG,
+                                "handleGetCallBarringResponse: mShowPassword changed for CSFB");
+                    }
+                }
+            }
+
+            // Unsuccessful query for call barring.
+            if (ar.exception != null) {
+                if (DBG) {
+                    Log.d(LOG_TAG, "handleGetCallBarringResponse: ar.exception=" + ar.exception);
+                }
+                pref.mTcpListener.onException(pref, (CommandException) ar.exception);
+            } else {
+                if (ar.userObj instanceof Throwable) {
+                    pref.mTcpListener.onError(pref, RESPONSE_ERROR);
+                }
+                int[] ints = (int[]) ar.result;
+                if (ints.length == 0) {
+                    if (DBG) {
+                        Log.d(LOG_TAG, "handleGetCallBarringResponse: ar.result.length==0");
+                    }
+                    pref.setEnabled(false);
+                    pref.mTcpListener.onError(pref, RESPONSE_ERROR);
+                } else {
+                    pref.handleCallBarringResult(ints[0] != 0);
+                    if (DBG) {
+                        Log.d(LOG_TAG,
+                                "handleGetCallBarringResponse: CB state successfully queried: "
+                                        + ints[0]);
+                    }
+                }
+            }
+            // Update call barring status.
+            pref.updateSummaryText();
+        }
+
+        // Handle the response message for CB settings.
+        private void handleSetCallBarringResponse(Message msg) {
+            final CallBarringEditPreference pref = mCallBarringEditPreference.get();
+            if (pref == null) {
+                return;
+            }
+
+            AsyncResult ar = (AsyncResult) msg.obj;
+
+            if (ar.exception != null || ar.userObj instanceof Throwable) {
+                if (DBG) {
+                    Log.d(LOG_TAG, "handleSetCallBarringResponse: ar.exception=" + ar.exception);
+                }
+            }
+            if (DBG) {
+                Log.d(LOG_TAG, "handleSetCallBarringResponse: re-get call barring option");
+            }
+            pref.mPhone.getCallBarring(
+                    pref.mFacility,
+                    "",
+                    obtainMessage(MESSAGE_GET_CALL_BARRING, 0, MESSAGE_SET_CALL_BARRING,
+                            ar.exception),
+                    0);
+        }
+    }
+}
diff --git a/src/com/android/phone/CallController.java b/src/com/android/phone/CallController.java
deleted file mode 100644
index a5d340c..0000000
--- a/src/com/android/phone/CallController.java
+++ /dev/null
@@ -1,671 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone;
-
-import com.android.internal.telephony.CallManager;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-import com.android.phone.CallGatewayManager.RawGatewayInfo;
-import com.android.phone.Constants.CallStatusCode;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemProperties;
-import android.provider.CallLog.Calls;
-import android.telecom.PhoneAccount;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.ServiceState;
-import android.util.Log;
-
-/**
- * Phone app module in charge of "call control".
- *
- * This is a singleton object which acts as the interface to the telephony layer
- * (and other parts of the Android framework) for all user-initiated telephony
- * functionality, like making outgoing calls.
- *
- * This functionality includes things like:
- *   - actually running the placeCall() method and handling errors or retries
- *   - running the whole "emergency call in airplane mode" sequence
- *   - running the state machine of MMI sequences
- *   - restoring/resetting mute and speaker state when a new call starts
- *   - updating the prox sensor wake lock state
- *   - resolving what the voicemail: intent should mean (and making the call)
- *
- * The single CallController instance stays around forever; it's not tied
- * to the lifecycle of any particular Activity (like the InCallScreen).
- * There's also no implementation of onscreen UI here (that's all in InCallScreen).
- *
- * Note that this class does not handle asynchronous events from the telephony
- * layer, like reacting to an incoming call; see CallNotifier for that.  This
- * class purely handles actions initiated by the user, like outgoing calls.
- */
-public class CallController extends Handler {
-    private static final String TAG = "CallController";
-    private static final boolean DBG =
-            (PhoneGlobals.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
-    // Do not check in with VDBG = true, since that may write PII to the system log.
-    private static final boolean VDBG = false;
-
-    /** The singleton CallController instance. */
-    private static CallController sInstance;
-
-    final private PhoneGlobals mApp;
-    final private CallManager mCM;
-    final private CallLogger mCallLogger;
-    final private CallGatewayManager mCallGatewayManager;
-
-    /** Helper object for emergency calls in some rare use cases.  Created lazily. */
-    private EmergencyCallHelper mEmergencyCallHelper;
-
-
-    //
-    // Message codes; see handleMessage().
-    //
-
-    private static final int THREEWAY_CALLERINFO_DISPLAY_DONE = 1;
-
-
-    //
-    // Misc constants.
-    //
-
-    // Amount of time the UI should display "Dialing" when initiating a CDMA
-    // 3way call.  (See comments on the THRWAY_ACTIVE case in
-    // placeCallInternal() for more info.)
-    private static final int THREEWAY_CALLERINFO_DISPLAY_TIME = 3000; // msec
-
-
-    /**
-     * Initialize the singleton CallController instance.
-     *
-     * This is only done once, at startup, from PhoneApp.onCreate().
-     * From then on, the CallController instance is available via the
-     * PhoneApp's public "callController" field, which is why there's no
-     * getInstance() method here.
-     */
-    /* package */ static CallController init(PhoneGlobals app, CallLogger callLogger,
-            CallGatewayManager callGatewayManager) {
-        synchronized (CallController.class) {
-            if (sInstance == null) {
-                sInstance = new CallController(app, callLogger, callGatewayManager);
-            } else {
-                Log.wtf(TAG, "init() called multiple times!  sInstance = " + sInstance);
-            }
-            return sInstance;
-        }
-    }
-
-    /**
-     * Private constructor (this is a singleton).
-     * @see init()
-     */
-    private CallController(PhoneGlobals app, CallLogger callLogger,
-            CallGatewayManager callGatewayManager) {
-        if (DBG) log("CallController constructor: app = " + app);
-        mApp = app;
-        mCM = app.mCM;
-        mCallLogger = callLogger;
-        mCallGatewayManager = callGatewayManager;
-    }
-
-    @Override
-    public void handleMessage(Message msg) {
-        if (VDBG) log("handleMessage: " + msg);
-        switch (msg.what) {
-
-            case THREEWAY_CALLERINFO_DISPLAY_DONE:
-                if (DBG) log("THREEWAY_CALLERINFO_DISPLAY_DONE...");
-
-                if (mApp.cdmaPhoneCallState.getCurrentCallState()
-                    == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
-                    // Reset the mThreeWayCallOrigStateDialing state
-                    mApp.cdmaPhoneCallState.setThreeWayCallOrigState(false);
-
-                    // TODO: Remove this code.
-                    //mApp.getCallModeler().setCdmaOutgoing3WayCall(null);
-                }
-                break;
-
-            default:
-                Log.wtf(TAG, "handleMessage: unexpected code: " + msg);
-                break;
-        }
-    }
-
-    //
-    // Outgoing call sequence
-    //
-
-    /**
-     * Initiate an outgoing call.
-     *
-     * Here's the most typical outgoing call sequence:
-     *
-     *  (1) OutgoingCallBroadcaster receives a CALL intent and sends the
-     *      NEW_OUTGOING_CALL broadcast
-     *
-     *  (2) The broadcast finally reaches OutgoingCallReceiver, which stashes
-     *      away a copy of the original CALL intent and launches
-     *      SipCallOptionHandler
-     *
-     *  (3) SipCallOptionHandler decides whether this is a PSTN or SIP call (and
-     *      in some cases brings up a dialog to let the user choose), and
-     *      ultimately calls CallController.placeCall() (from the
-     *      setResultAndFinish() method) with the stashed-away intent from step
-     *      (2) as the "intent" parameter.
-     *
-     *  (4) Here in CallController.placeCall() we read the phone number or SIP
-     *      address out of the intent and actually initiate the call, and
-     *      simultaneously launch the InCallScreen to display the in-call UI.
-     *
-     *  (5) We handle various errors by directing the InCallScreen to
-     *      display error messages or dialogs (via the InCallUiState
-     *      "pending call status code" flag), and in some cases we also
-     *      sometimes continue working in the background to resolve the
-     *      problem (like in the case of an emergency call while in
-     *      airplane mode).  Any time that some onscreen indication to the
-     *      user needs to change, we update the "status dialog" info in
-     *      the inCallUiState and (re)launch the InCallScreen to make sure
-     *      it's visible.
-     */
-    public void placeCall(Intent intent) {
-        log("placeCall()...  intent = " + intent);
-        if (VDBG) log("                extras = " + intent.getExtras());
-
-        // TODO: Do we need to hold a wake lock while this method runs?
-        //       Or did we already acquire one somewhere earlier
-        //       in this sequence (like when we first received the CALL intent?)
-
-        if (intent == null) {
-            Log.wtf(TAG, "placeCall: called with null intent");
-            throw new IllegalArgumentException("placeCall: called with null intent");
-        }
-
-        String action = intent.getAction();
-        Uri uri = intent.getData();
-        if (uri == null) {
-            Log.wtf(TAG, "placeCall: intent had no data");
-            throw new IllegalArgumentException("placeCall: intent had no data");
-        }
-
-        String scheme = uri.getScheme();
-        String number = PhoneNumberUtils.getNumberFromIntent(intent, mApp);
-        if (VDBG) {
-            log("- action: " + action);
-            log("- uri: " + uri);
-            log("- scheme: " + scheme);
-            log("- number: " + number);
-        }
-
-        // This method should only be used with the various flavors of CALL
-        // intents.  (It doesn't make sense for any other action to trigger an
-        // outgoing call!)
-        if (!(Intent.ACTION_CALL.equals(action)
-              || Intent.ACTION_CALL_EMERGENCY.equals(action)
-              || Intent.ACTION_CALL_PRIVILEGED.equals(action))) {
-            Log.wtf(TAG, "placeCall: unexpected intent action " + action);
-            throw new IllegalArgumentException("Unexpected action: " + action);
-        }
-
-        CallStatusCode status = placeCallInternal(intent);
-
-        switch (status) {
-            // Call was placed successfully:
-            case SUCCESS:
-            case EXITED_ECM:
-                if (DBG) log("==> placeCall(): success from placeCallInternal(): " + status);
-                break;
-
-            default:
-                // Any other status code is a failure.
-                log("==> placeCall(): failure code from placeCallInternal(): " + status);
-                // Handle the various error conditions that can occur when
-                // initiating an outgoing call, typically by directing the
-                // InCallScreen to display a diagnostic message (via the
-                // "pending call status code" flag.)
-                handleOutgoingCallError(status);
-                break;
-        }
-
-        // Finally, regardless of whether we successfully initiated the
-        // outgoing call or not, force the InCallScreen to come to the
-        // foreground.
-        //
-        // (For successful calls the the user will just see the normal
-        // in-call UI.  Or if there was an error, the InCallScreen will
-        // notice the InCallUiState pending call status code flag and display an
-        // error indication instead.)
-    }
-
-    /**
-     * Actually make a call to whomever the intent tells us to.
-     *
-     * Note that there's no need to explicitly update (or refresh) the
-     * in-call UI at any point in this method, since a fresh InCallScreen
-     * instance will be launched automatically after we return (see
-     * placeCall() above.)
-     *
-     * @param intent the CALL intent describing whom to call
-     * @return CallStatusCode.SUCCESS if we successfully initiated an
-     *    outgoing call.  If there was some kind of failure, return one of
-     *    the other CallStatusCode codes indicating what went wrong.
-     */
-    private CallStatusCode placeCallInternal(Intent intent) {
-        if (DBG) log("placeCallInternal()...  intent = " + intent);
-
-        // TODO: This method is too long.  Break it down into more
-        // manageable chunks.
-
-        final Uri uri = intent.getData();
-        final String scheme = (uri != null) ? uri.getScheme() : null;
-        String number;
-        Phone phone = null;
-
-        // Check the current ServiceState to make sure it's OK
-        // to even try making a call.
-        CallStatusCode okToCallStatus = checkIfOkToInitiateOutgoingCall(
-                mCM.getServiceState());
-
-        // TODO: Streamline the logic here.  Currently, the code is
-        // unchanged from its original form in InCallScreen.java.  But we
-        // should fix a couple of things:
-        // - Don't call checkIfOkToInitiateOutgoingCall() more than once
-        // - Wrap the try/catch for VoiceMailNumberMissingException
-        //   around *only* the call that can throw that exception.
-
-        try {
-            number = PhoneUtils.getInitialNumber(intent);
-            if (VDBG) log("- actual number to dial: '" + number + "'");
-
-            // find the phone first
-            // TODO Need a way to determine which phone to place the call
-            // It could be determined by SIP setting, i.e. always,
-            // or by number, i.e. for international,
-            // or by user selection, i.e., dialog query,
-            // or any of combinations
-            String sipPhoneUri = intent.getStringExtra(
-                    OutgoingCallBroadcaster.EXTRA_SIP_PHONE_URI);
-            ComponentName thirdPartyCallComponent = (ComponentName) intent.getParcelableExtra(
-                    OutgoingCallBroadcaster.EXTRA_THIRD_PARTY_CALL_COMPONENT);
-            phone = PhoneUtils.pickPhoneBasedOnNumber(mCM, scheme, number, sipPhoneUri,
-                    thirdPartyCallComponent);
-            if (VDBG) log("- got Phone instance: " + phone + ", class = " + phone.getClass());
-
-            // update okToCallStatus based on new phone
-            okToCallStatus = checkIfOkToInitiateOutgoingCall(
-                    phone.getServiceState().getState());
-
-        } catch (PhoneUtils.VoiceMailNumberMissingException ex) {
-            // If the call status is NOT in an acceptable state, it
-            // may effect the way the voicemail number is being
-            // retrieved.  Mask the VoiceMailNumberMissingException
-            // with the underlying issue of the phone state.
-            if (okToCallStatus != CallStatusCode.SUCCESS) {
-                if (DBG) log("Voicemail number not reachable in current SIM card state.");
-                return okToCallStatus;
-            }
-            if (DBG) log("VoiceMailNumberMissingException from getInitialNumber()");
-            return CallStatusCode.VOICEMAIL_NUMBER_MISSING;
-        }
-
-        if (number == null) {
-            Log.w(TAG, "placeCall: couldn't get a phone number from Intent " + intent);
-            return CallStatusCode.NO_PHONE_NUMBER_SUPPLIED;
-        }
-
-
-        // Sanity-check that ACTION_CALL_EMERGENCY is used if and only if
-        // this is a call to an emergency number
-        // (This is just a sanity-check; this policy *should* really be
-        // enforced in OutgoingCallBroadcaster.onCreate(), which is the
-        // main entry point for the CALL and CALL_* intents.)
-        boolean isEmergencyNumber = PhoneNumberUtils.isLocalEmergencyNumber(mApp, number);
-        boolean isPotentialEmergencyNumber =
-                PhoneNumberUtils.isPotentialLocalEmergencyNumber(mApp, number);
-        boolean isEmergencyIntent = Intent.ACTION_CALL_EMERGENCY.equals(intent.getAction());
-
-        if (isPotentialEmergencyNumber && !isEmergencyIntent) {
-            Log.e(TAG, "Non-CALL_EMERGENCY Intent " + intent
-                    + " attempted to call potential emergency number " + number
-                    + ".");
-            return CallStatusCode.CALL_FAILED;
-        } else if (!isPotentialEmergencyNumber && isEmergencyIntent) {
-            Log.e(TAG, "Received CALL_EMERGENCY Intent " + intent
-                    + " with non-potential-emergency number " + number
-                    + " -- failing call.");
-            return CallStatusCode.CALL_FAILED;
-        }
-
-        // If we're trying to call an emergency number, then it's OK to
-        // proceed in certain states where we'd otherwise bring up
-        // an error dialog:
-        // - If we're in EMERGENCY_ONLY mode, then (obviously) you're allowed
-        //   to dial emergency numbers.
-        // - If we're OUT_OF_SERVICE, we still attempt to make a call,
-        //   since the radio will register to any available network.
-
-        if (isEmergencyNumber
-            && ((okToCallStatus == CallStatusCode.EMERGENCY_ONLY)
-                || (okToCallStatus == CallStatusCode.OUT_OF_SERVICE))) {
-            if (DBG) log("placeCall: Emergency number detected with status = " + okToCallStatus);
-            okToCallStatus = CallStatusCode.SUCCESS;
-            if (DBG) log("==> UPDATING status to: " + okToCallStatus);
-        }
-
-        if (okToCallStatus != CallStatusCode.SUCCESS) {
-            // If this is an emergency call, launch the EmergencyCallHelperService
-            // to turn on the radio and retry the call.
-            if (isEmergencyNumber && (okToCallStatus == CallStatusCode.POWER_OFF)) {
-                Log.i(TAG, "placeCall: Trying to make emergency call while POWER_OFF!");
-
-                // If needed, lazily instantiate an EmergencyCallHelper instance.
-                synchronized (this) {
-                    if (mEmergencyCallHelper == null) {
-                        mEmergencyCallHelper = new EmergencyCallHelper(this);
-                    }
-                }
-
-                // ...and kick off the "emergency call from airplane mode" sequence.
-                mEmergencyCallHelper.startEmergencyCallFromAirplaneModeSequence(number);
-
-                // Finally, return CallStatusCode.SUCCESS right now so
-                // that the in-call UI will remain visible (in order to
-                // display the progress indication.)
-                // TODO: or maybe it would be more clear to return a whole
-                // new CallStatusCode called "TURNING_ON_RADIO" here.
-                // That way, we'd update inCallUiState.progressIndication from
-                // the handleOutgoingCallError() method, rather than here.
-                return CallStatusCode.SUCCESS;
-            } else {
-                // Otherwise, just return the (non-SUCCESS) status code
-                // back to our caller.
-                if (DBG) log("==> placeCallInternal(): non-success status: " + okToCallStatus);
-
-                // Log failed call.
-                // Note: Normally, many of these values we gather from the Connection object but
-                // since no such object is created for unconnected calls, we have to build them
-                // manually.
-                // TODO: Try to restructure code so that we can handle failure-
-                // condition call logging in a single place (placeCall()) that also has access to
-                // the number we attempted to dial (not placeCall()).
-                mCallLogger.logCall(null /* callerInfo */, number, 0 /* presentation */,
-                        Calls.OUTGOING_TYPE, System.currentTimeMillis(), 0 /* duration */);
-
-                return okToCallStatus;
-            }
-        }
-
-        // We have a valid number, so try to actually place a call:
-        // make sure we pass along the intent's URI which is a
-        // reference to the contact. We may have a provider gateway
-        // phone number to use for the outgoing call.
-        Uri contactUri = intent.getData();
-
-        // If a gateway is used, extract the data here and pass that into placeCall.
-        final RawGatewayInfo rawGatewayInfo = mCallGatewayManager.getRawGatewayInfo(intent, number);
-
-        // Watch out: PhoneUtils.placeCall() returns one of the
-        // CALL_STATUS_* constants, not a CallStatusCode enum value.
-        int callStatus = PhoneUtils.placeCall(mApp,
-                                              phone,
-                                              number,
-                                              contactUri,
-                                              (isEmergencyNumber || isEmergencyIntent),
-                                              rawGatewayInfo,
-                                              mCallGatewayManager);
-
-        switch (callStatus) {
-            case PhoneUtils.CALL_STATUS_DIALED:
-                if (VDBG) log("placeCall: PhoneUtils.placeCall() succeeded for regular call '"
-                             + number + "'.");
-
-
-                // TODO(OTASP): still need more cleanup to simplify the mApp.cdma*State objects:
-                // - Rather than checking inCallUiState.inCallScreenMode, the
-                //   code here could also check for
-                //   app.getCdmaOtaInCallScreenUiState() returning NORMAL.
-                // - But overall, app.inCallUiState.inCallScreenMode and
-                //   app.cdmaOtaInCallScreenUiState.state are redundant.
-                //   Combine them.
-
-                boolean voicemailUriSpecified = scheme != null &&
-                    scheme.equals(PhoneAccount.SCHEME_VOICEMAIL);
-                // Check for an obscure ECM-related scenario: If the phone
-                // is currently in ECM (Emergency callback mode) and we
-                // dial a non-emergency number, that automatically
-                // *cancels* ECM.  So warn the user about it.
-                // (See InCallScreen.showExitingECMDialog() for more info.)
-                boolean exitedEcm = false;
-                if (PhoneUtils.isPhoneInEcm(phone) && !isEmergencyNumber) {
-                    Log.i(TAG, "About to exit ECM because of an outgoing non-emergency call");
-                    exitedEcm = true;  // this will cause us to return EXITED_ECM from this method
-                }
-
-                if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
-                    // Start the timer for 3 Way CallerInfo
-                    if (mApp.cdmaPhoneCallState.getCurrentCallState()
-                            == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
-
-                        // This is a "CDMA 3-way call", which means that you're dialing a
-                        // 2nd outgoing call while a previous call is already in progress.
-                        //
-                        // Due to the limitations of CDMA this call doesn't actually go
-                        // through the DIALING/ALERTING states, so we can't tell for sure
-                        // when (or if) it's actually answered.  But we want to show
-                        // *some* indication of what's going on in the UI, so we "fake it"
-                        // by displaying the "Dialing" state for 3 seconds.
-
-                        // Set the mThreeWayCallOrigStateDialing state to true
-                        mApp.cdmaPhoneCallState.setThreeWayCallOrigState(true);
-
-                        // Schedule the "Dialing" indication to be taken down in 3 seconds:
-                        sendEmptyMessageDelayed(THREEWAY_CALLERINFO_DISPLAY_DONE,
-                                                THREEWAY_CALLERINFO_DISPLAY_TIME);
-                    }
-                }
-
-                // Success!
-                if (exitedEcm) {
-                    return CallStatusCode.EXITED_ECM;
-                } else {
-                    return CallStatusCode.SUCCESS;
-                }
-
-            case PhoneUtils.CALL_STATUS_DIALED_MMI:
-                if (DBG) log("placeCall: specified number was an MMI code: '" + number + "'.");
-                // The passed-in number was an MMI code, not a regular phone number!
-                // This isn't really a failure; the Dialer may have deliberately
-                // fired an ACTION_CALL intent to dial an MMI code, like for a
-                // USSD call.
-                //
-                // Presumably an MMI_INITIATE message will come in shortly
-                // (and we'll bring up the "MMI Started" dialog), or else
-                // an MMI_COMPLETE will come in (which will take us to a
-                // different Activity; see PhoneUtils.displayMMIComplete()).
-                return CallStatusCode.DIALED_MMI;
-
-            case PhoneUtils.CALL_STATUS_FAILED:
-                Log.w(TAG, "placeCall: PhoneUtils.placeCall() FAILED for number '"
-                      + number + "'.");
-                // We couldn't successfully place the call; there was some
-                // failure in the telephony layer.
-
-                // Log failed call.
-                mCallLogger.logCall(null /* callerInfo */, number, 0 /* presentation */,
-                        Calls.OUTGOING_TYPE, System.currentTimeMillis(), 0 /* duration */);
-
-                return CallStatusCode.CALL_FAILED;
-
-            default:
-                Log.wtf(TAG, "placeCall: unknown callStatus " + callStatus
-                        + " from PhoneUtils.placeCall() for number '" + number + "'.");
-                return CallStatusCode.SUCCESS;  // Try to continue anyway...
-        }
-    }
-
-    /**
-     * Checks the current ServiceState to make sure it's OK
-     * to try making an outgoing call to the specified number.
-     *
-     * @return CallStatusCode.SUCCESS if it's OK to try calling the specified
-     *    number.  If not, like if the radio is powered off or we have no
-     *    signal, return one of the other CallStatusCode codes indicating what
-     *    the problem is.
-     */
-    private CallStatusCode checkIfOkToInitiateOutgoingCall(int state) {
-        if (VDBG) log("checkIfOkToInitiateOutgoingCall: ServiceState = " + state);
-
-        switch (state) {
-            case ServiceState.STATE_IN_SERVICE:
-                // Normal operation.  It's OK to make outgoing calls.
-                return CallStatusCode.SUCCESS;
-
-            case ServiceState.STATE_POWER_OFF:
-                // Radio is explictly powered off.
-                return CallStatusCode.POWER_OFF;
-
-            case ServiceState.STATE_EMERGENCY_ONLY:
-                // The phone is registered, but locked. Only emergency
-                // numbers are allowed.
-                // Note that as of Android 2.0 at least, the telephony layer
-                // does not actually use ServiceState.STATE_EMERGENCY_ONLY,
-                // mainly since there's no guarantee that the radio/RIL can
-                // make this distinction.  So in practice the
-                // CallStatusCode.EMERGENCY_ONLY state and the string
-                // "incall_error_emergency_only" are totally unused.
-                return CallStatusCode.EMERGENCY_ONLY;
-
-            case ServiceState.STATE_OUT_OF_SERVICE:
-                // No network connection.
-                return CallStatusCode.OUT_OF_SERVICE;
-
-            default:
-                throw new IllegalStateException("Unexpected ServiceState: " + state);
-        }
-    }
-
-
-
-    /**
-     * Handles the various error conditions that can occur when initiating
-     * an outgoing call.
-     *
-     * Most error conditions are "handled" by simply displaying an error
-     * message to the user.
-     *
-     * @param status one of the CallStatusCode error codes.
-     */
-    private void handleOutgoingCallError(CallStatusCode status) {
-        if (DBG) log("handleOutgoingCallError(): status = " + status);
-        final Intent intent = new Intent(mApp, ErrorDialogActivity.class);
-        int errorMessageId = -1;
-        switch (status) {
-            case SUCCESS:
-                // This case shouldn't happen; you're only supposed to call
-                // handleOutgoingCallError() if there was actually an error!
-                Log.wtf(TAG, "handleOutgoingCallError: SUCCESS isn't an error");
-                break;
-
-            case CALL_FAILED:
-                // We couldn't successfully place the call; there was some
-                // failure in the telephony layer.
-                // TODO: Need UI spec for this failure case; for now just
-                // show a generic error.
-                errorMessageId = R.string.incall_error_call_failed;
-                break;
-            case POWER_OFF:
-                // Radio is explictly powered off, presumably because the
-                // device is in airplane mode.
-                //
-                // TODO: For now this UI is ultra-simple: we simply display
-                // a message telling the user to turn off airplane mode.
-                // But it might be nicer for the dialog to offer the option
-                // to turn the radio on right there (and automatically retry
-                // the call once network registration is complete.)
-                errorMessageId = R.string.incall_error_power_off;
-                break;
-            case EMERGENCY_ONLY:
-                // Only emergency numbers are allowed, but we tried to dial
-                // a non-emergency number.
-                // (This state is currently unused; see comments above.)
-                errorMessageId = R.string.incall_error_emergency_only;
-                break;
-            case OUT_OF_SERVICE:
-                // No network connection.
-                errorMessageId = R.string.incall_error_out_of_service;
-                break;
-            case NO_PHONE_NUMBER_SUPPLIED:
-                // The supplied Intent didn't contain a valid phone number.
-                // (This is rare and should only ever happen with broken
-                // 3rd-party apps.) For now just show a generic error.
-                errorMessageId = R.string.incall_error_no_phone_number_supplied;
-                break;
-
-            case VOICEMAIL_NUMBER_MISSING:
-                // Bring up the "Missing Voicemail Number" dialog, which
-                // will ultimately take us to some other Activity (or else
-                // just bail out of this activity.)
-
-                // Send a request to the InCallScreen to display the
-                // "voicemail missing" dialog when it (the InCallScreen)
-                // comes to the foreground.
-                intent.putExtra(ErrorDialogActivity.SHOW_MISSING_VOICEMAIL_NO_DIALOG_EXTRA, true);
-                break;
-
-            case DIALED_MMI:
-                // Our initial phone number was actually an MMI sequence.
-                // There's no real "error" here, but we do bring up the
-                // a Toast (as requested of the New UI paradigm).
-                //
-                // In-call MMIs do not trigger the normal MMI Initiate
-                // Notifications, so we should notify the user here.
-                // Otherwise, the code in PhoneUtils.java should handle
-                // user notifications in the form of Toasts or Dialogs.
-                //
-                // TODO: Rather than launching a toast from here, it would
-                // be cleaner to just set a pending call status code here,
-                // and then let the InCallScreen display the toast...
-                final Intent mmiIntent = new Intent(mApp, MMIDialogActivity.class);
-                mmiIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
-                        Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-                mApp.startActivity(mmiIntent);
-                return;
-            default:
-                Log.wtf(TAG, "handleOutgoingCallError: unexpected status code " + status);
-                // Show a generic "call failed" error.
-                errorMessageId = R.string.incall_error_call_failed;
-                break;
-        }
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-        if (errorMessageId != -1) {
-            intent.putExtra(ErrorDialogActivity.ERROR_MESSAGE_ID_EXTRA, errorMessageId);
-        }
-        mApp.startActivity(intent);
-    }
-
-    //
-    // Debugging
-    //
-
-    private static void log(String msg) {
-        Log.d(TAG, msg);
-    }
-}
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 1d264fb..fd85585 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;
@@ -44,25 +38,20 @@
 import android.telephony.CarrierConfigManager;
 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;
 
 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;
 
 /**
@@ -105,12 +94,14 @@
     private static final String ENABLE_VIDEO_CALLING_KEY = "button_enable_video_calling";
 
     private Phone mPhone;
+    private ImsManager mImsMgr;
     private SubscriptionInfoHelper mSubscriptionInfoHelper;
     private TelecomManager mTelecomManager;
 
     private SwitchPreference mButtonAutoRetry;
     private PreferenceScreen mVoicemailSettingsScreen;
     private SwitchPreference mEnableVideoCalling;
+    private Preference mButtonWifiCalling;
 
     /*
      * Click Listeners, handle click based on objects attached to UI.
@@ -141,7 +132,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);
@@ -188,12 +179,30 @@
         mTelecomManager = TelecomManager.from(this);
     }
 
+    private void updateImsManager(Phone phone) {
+        log("updateImsManager :: phone.getContext()=" + phone.getContext()
+                + " phone.getPhoneId()=" + phone.getPhoneId());
+        mImsMgr = ImsManager.getInstance(phone.getContext(), phone.getPhoneId());
+        if (mImsMgr == null) {
+            log("updateImsManager :: Could not get ImsManager instance!");
+        } else {
+            log("updateImsManager :: mImsMgr=" + mImsMgr);
+        }
+    }
+
     private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
         @Override
         public void onCallStateChanged(int state, String incomingNumber) {
             if (DBG) log("PhoneStateListener onCallStateChanged: state is " + state);
             if (mEnableVideoCalling != null) {
-                mEnableVideoCalling.setEnabled(state == TelephonyManager.CALL_STATE_IDLE);
+                // Use TelephonyManager#getCallStete instead of 'state' parameter because it needs
+                // to check the current state of all phone calls.
+                TelephonyManager telephonyManager =
+                        (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+                mEnableVideoCalling.setEnabled(
+                        telephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE);
+                mButtonWifiCalling.setEnabled(
+                        telephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE);
             }
         }
     };
@@ -210,6 +219,7 @@
     protected void onResume() {
         super.onResume();
 
+        updateImsManager(mPhone);
         PreferenceScreen preferenceScreen = getPreferenceScreen();
         if (preferenceScreen != null) {
             preferenceScreen.removeAll();
@@ -232,6 +242,8 @@
         mButtonAutoRetry = (SwitchPreference) findPreference(BUTTON_RETRY_KEY);
 
         mEnableVideoCalling = (SwitchPreference) findPreference(ENABLE_VIDEO_CALLING_KEY);
+        mButtonWifiCalling = findPreference(getResources().getString(
+                R.string.wifi_calling_settings_key));
 
         PersistableBundle carrierConfig =
                 PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
@@ -269,7 +281,9 @@
                         addPreferencesFromResource(R.xml.cdma_call_privacy);
                     }
                 } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
-
+                    if (mPhone.getIccCard() == null || !mPhone.getIccCard().getIccFdnAvailable()) {
+                        prefSet.removePreference(fdnButton);
+                    }
                     if (carrierConfig.getBoolean(
                             CarrierConfigManager.KEY_ADDITIONAL_CALL_SETTING_BOOL)) {
                         addPreferencesFromResource(R.xml.gsm_umts_call_options);
@@ -281,13 +295,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);
@@ -296,16 +309,13 @@
             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); */
         }
 
-        Preference wifiCallingSettings = findPreference(
-                getResources().getString(R.string.wifi_calling_settings_key));
-
         final PhoneAccountHandle simCallManager = mTelecomManager.getSimCallManager();
         if (simCallManager != null) {
             Intent intent = PhoneAccountSettingsFragment.buildPhoneAccountConfigureIntent(
@@ -314,23 +324,22 @@
                 PackageManager pm = mPhone.getContext().getPackageManager();
                 List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0);
                 if (!resolutions.isEmpty()) {
-                    wifiCallingSettings.setTitle(resolutions.get(0).loadLabel(pm));
-                    wifiCallingSettings.setSummary(null);
-                    wifiCallingSettings.setIntent(intent);
+                    mButtonWifiCalling.setTitle(resolutions.get(0).loadLabel(pm));
+                    mButtonWifiCalling.setSummary(null);
+                    mButtonWifiCalling.setIntent(intent);
                 } else {
-                    prefSet.removePreference(wifiCallingSettings);
+                    prefSet.removePreference(mButtonWifiCalling);
                 }
             } else {
-                prefSet.removePreference(wifiCallingSettings);
+                prefSet.removePreference(mButtonWifiCalling);
             }
-        } else if (!ImsManager.isWfcEnabledByPlatform(mPhone.getContext()) ||
-                !ImsManager.isWfcProvisionedOnDevice(mPhone.getContext())) {
-            prefSet.removePreference(wifiCallingSettings);
+        } else if (!mImsMgr.isWfcEnabledByPlatform() || !mImsMgr.isWfcProvisionedOnDevice()) {
+            prefSet.removePreference(mButtonWifiCalling);
         } 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;
@@ -345,7 +354,20 @@
                         if (DBG) log("Unexpected WFC mode value: " + wfcMode);
                 }
             }
-            wifiCallingSettings.setSummary(resId);
+            mButtonWifiCalling.setSummary(resId);
+        }
+
+        try {
+            if (mImsMgr.getImsServiceState() != ImsFeature.STATE_READY) {
+                log("Feature state not ready so remove vt and wfc settings for "
+                        + " phone =" + mPhone.getPhoneId());
+                prefSet.removePreference(mButtonWifiCalling);
+                prefSet.removePreference(mEnableVideoCalling);
+            }
+        } catch (ImsException ex) {
+            log("Exception when trying to get ImsServiceStatus: " + ex);
+            prefSet.removePreference(mButtonWifiCalling);
+            prefSet.removePreference(mEnableVideoCalling);
         }
     }
 
diff --git a/src/com/android/phone/CallForwardEditPreference.java b/src/com/android/phone/CallForwardEditPreference.java
index 5243b8d..8a82e05 100644
--- a/src/com/android/phone/CallForwardEditPreference.java
+++ b/src/com/android/phone/CallForwardEditPreference.java
@@ -15,6 +15,7 @@
 import android.os.PersistableBundle;
 import android.telephony.CarrierConfigManager;
 import android.telephony.PhoneNumberUtils;
+import android.telephony.TelephonyManager;
 import android.text.BidiFormatter;
 import android.text.SpannableString;
 import android.text.TextDirectionHeuristics;
@@ -28,7 +29,6 @@
 
 public class CallForwardEditPreference extends EditPhoneNumberPreference {
     private static final String LOG_TAG = "CallForwardEditPreference";
-    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
 
     private static final String SRC_TAGS[]       = {"{0}"};
     private CharSequence mSummaryOnTemplate;
@@ -46,6 +46,8 @@
     private Phone mPhone;
     CallForwardInfo callForwardInfo;
     private TimeConsumingPreferenceListener mTcpListener;
+    // Should we replace CF queries containing an invalid number with "Voicemail"
+    private boolean mReplaceInvalidCFNumber = false;
 
     public CallForwardEditPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -60,16 +62,18 @@
                 CommandsInterface.CF_REASON_UNCONDITIONAL);
         a.recycle();
 
-        if (DBG) Log.d(LOG_TAG, "mServiceClass=" + mServiceClass + ", reason=" + reason);
+        Log.d(LOG_TAG, "mServiceClass=" + mServiceClass + ", reason=" + reason);
     }
 
     public CallForwardEditPreference(Context context) {
         this(context, null);
     }
 
-    void init(TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) {
+    void init(TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone,
+            boolean replaceInvalidCFNumber) {
         mPhone = phone;
         mTcpListener = listener;
+        mReplaceInvalidCFNumber = replaceInvalidCFNumber;
 
         if (!skipReading) {
             mPhone.getCallForwardingOption(reason,
@@ -100,8 +104,7 @@
     protected void onDialogClosed(boolean positiveResult) {
         super.onDialogClosed(positiveResult);
 
-        if (DBG) Log.d(LOG_TAG, "mButtonClicked=" + mButtonClicked
-                + ", positiveResult=" + positiveResult);
+        Log.d(LOG_TAG, "mButtonClicked=" + mButtonClicked + ", positiveResult=" + positiveResult);
         // Ignore this event if the user clicked the cancel button, or if the dialog is dismissed
         // without any button being pressed (back button press or click event outside the dialog).
         if (this.mButtonClicked != DialogInterface.BUTTON_NEGATIVE) {
@@ -111,17 +114,17 @@
             int time = (reason != CommandsInterface.CF_REASON_NO_REPLY) ? 0 : 20;
             final String number = getPhoneNumber();
 
-            if (DBG) Log.d(LOG_TAG, "callForwardInfo=" + callForwardInfo);
+            Log.d(LOG_TAG, "callForwardInfo=" + callForwardInfo);
 
             if (action == CommandsInterface.CF_ACTION_REGISTRATION
                     && callForwardInfo != null
                     && callForwardInfo.status == 1
                     && number.equals(callForwardInfo.number)) {
                 // no change, do nothing
-                if (DBG) Log.d(LOG_TAG, "no change, do nothing");
+                Log.d(LOG_TAG, "no change, do nothing");
             } else {
                 // set to network
-                if (DBG) Log.d(LOG_TAG, "reason=" + reason + ", action=" + action
+                Log.d(LOG_TAG, "reason=" + reason + ", action=" + action
                         + ", number=" + number);
 
                 // Display no forwarding number while we're waiting for
@@ -147,7 +150,16 @@
 
     void handleCallForwardResult(CallForwardInfo cf) {
         callForwardInfo = cf;
-        if (DBG) Log.d(LOG_TAG, "handleGetCFResponse done, callForwardInfo=" + callForwardInfo);
+        Log.d(LOG_TAG, "handleGetCFResponse done, callForwardInfo=" + callForwardInfo);
+        // In some cases, the network can send call forwarding URIs for voicemail that violate the
+        // 3gpp spec. This can cause us to receive "numbers" that are sequences of letters. In this
+        // case, we must detect these series of characters and replace them with "Voicemail".
+        // PhoneNumberUtils#formatNumber returns null if the number is not valid.
+        if (mReplaceInvalidCFNumber && (PhoneNumberUtils.formatNumber(callForwardInfo.number,
+                getCurrentCountryIso()) == null)) {
+            callForwardInfo.number = getContext().getString(R.string.voicemail);
+            Log.i(LOG_TAG, "handleGetCFResponse: Overridding CF number");
+        }
 
         setToggled(callForwardInfo.status == 1);
         boolean displayVoicemailNumber = false;
@@ -187,6 +199,19 @@
 
     }
 
+    /**
+     * @return The ISO 3166-1 two letters country code of the country the user is in based on the
+     *      network location.
+     */
+    private String getCurrentCountryIso() {
+        final TelephonyManager telephonyManager =
+                (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
+        if (telephonyManager == null) {
+            return "";
+        }
+        return telephonyManager.getNetworkCountryIso().toUpperCase();
+    }
+
     // Message protocol:
     // what: get vs. set
     // arg1: action -- register vs. disable
@@ -208,7 +233,7 @@
         }
 
         private void handleGetCFResponse(Message msg) {
-            if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: done");
+            Log.d(LOG_TAG, "handleGetCFResponse: done");
 
             mTcpListener.onFinished(CallForwardEditPreference.this, msg.arg2 != MESSAGE_SET_CF);
 
@@ -216,7 +241,7 @@
 
             callForwardInfo = null;
             if (ar.exception != null) {
-                if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: ar.exception=" + ar.exception);
+                Log.d(LOG_TAG, "handleGetCFResponse: ar.exception=" + ar.exception);
                 if (ar.exception instanceof CommandException) {
                     mTcpListener.onException(CallForwardEditPreference.this,
                             (CommandException) ar.exception);
@@ -233,12 +258,12 @@
                 }
                 CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
                 if (cfInfoArray.length == 0) {
-                    if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: cfInfoArray.length==0");
+                    Log.d(LOG_TAG, "handleGetCFResponse: cfInfoArray.length==0");
                     setEnabled(false);
                     mTcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
                 } else {
                     for (int i = 0, length = cfInfoArray.length; i < length; i++) {
-                        if (DBG) Log.d(LOG_TAG, "handleGetCFResponse, cfInfoArray[" + i + "]="
+                        Log.d(LOG_TAG, "handleGetCFResponse, cfInfoArray[" + i + "]="
                                 + cfInfoArray[i]);
                         if ((mServiceClass & cfInfoArray[i].serviceClass) != 0) {
                             // corresponding class
@@ -292,10 +317,10 @@
             AsyncResult ar = (AsyncResult) msg.obj;
 
             if (ar.exception != null) {
-                if (DBG) Log.d(LOG_TAG, "handleSetCFResponse: ar.exception=" + ar.exception);
+                Log.d(LOG_TAG, "handleSetCFResponse: ar.exception=" + ar.exception);
                 // setEnabled(false);
             }
-            if (DBG) Log.d(LOG_TAG, "handleSetCFResponse: re get");
+            Log.d(LOG_TAG, "handleSetCFResponse: re get");
             mPhone.getCallForwardingOption(reason,
                     obtainMessage(MESSAGE_GET_CF, msg.arg1, MESSAGE_SET_CF, ar.exception));
         }
diff --git a/src/com/android/phone/CallNotifier.java b/src/com/android/phone/CallNotifier.java
index d084e92..ec670f5 100644
--- a/src/com/android/phone/CallNotifier.java
+++ b/src/com/android/phone/CallNotifier.java
@@ -105,6 +105,10 @@
     // they don't step on each others' toes.
     public static final int INTERNAL_SHOW_MESSAGE_NOTIFICATION_DONE = 22;
 
+    public static final int UPDATE_TYPE_MWI = 0;
+    public static final int UPDATE_TYPE_CFI = 1;
+    public static final int UPDATE_TYPE_MWI_CFI = 2;
+
     /**
      * Initialize the singleton CallNotifier instance.
      * This is only done once, at startup, from PhoneApp.onCreate().
@@ -542,9 +546,9 @@
             mergeFailedString = mApplication.getResources().getString(
                     R.string.incall_error_supp_service_conference);
         } else if (r.result == Phone.SuppService.RESUME) {
-            if (DBG) log("onSuppServiceFailed: displaying merge failure message");
+            if (DBG) log("onSuppServiceFailed: displaying resume failure message");
             mergeFailedString = mApplication.getResources().getString(
-                    R.string.incall_error_supp_service_switch);
+                    R.string.incall_error_supp_service_resume);
         } else if (r.result == Phone.SuppService.HOLD) {
             if (DBG) log("onSuppServiceFailed: displaying hold failure message");
             mergeFailedString = mApplication.getResources().getString(
@@ -578,6 +582,11 @@
     }
 
     public void updatePhoneStateListeners(boolean isRefresh) {
+        updatePhoneStateListeners(isRefresh, UPDATE_TYPE_MWI_CFI,
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+    }
+
+    public void updatePhoneStateListeners(boolean isRefresh, int updateType, int subIdToUpdate) {
         List<SubscriptionInfo> subInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
 
         // Sort sub id list based on slot id, so that CFI/MWI notifications will be updated for
@@ -609,10 +618,20 @@
                 Log.d(LOG_TAG, "updatePhoneStateListeners: update CF notifications.");
 
                 if (mCFIStatus.containsKey(subId)) {
-                    mApplication.notificationMgr.updateCfi(subId, mCFIStatus.get(subId));
+                    if ((updateType == UPDATE_TYPE_CFI) && (subId == subIdToUpdate)) {
+                        mApplication.notificationMgr.updateCfi(subId, mCFIStatus.get(subId),
+                                isRefresh);
+                    } else {
+                        mApplication.notificationMgr.updateCfi(subId, mCFIStatus.get(subId), true);
+                    }
                 }
                 if (mMWIStatus.containsKey(subId)) {
-                    mApplication.notificationMgr.updateMwi(subId, mMWIStatus.get(subId), isRefresh);
+                    if ((updateType == UPDATE_TYPE_MWI) && (subId == subIdToUpdate)) {
+                        mApplication.notificationMgr.updateMwi(subId, mMWIStatus.get(subId),
+                            isRefresh);
+                    } else {
+                        mApplication.notificationMgr.updateMwi(subId, mMWIStatus.get(subId), true);
+                    }
                 }
             }
         }
@@ -785,7 +804,7 @@
         public void onMessageWaitingIndicatorChanged(boolean visible) {
             if (VDBG) log("onMessageWaitingIndicatorChanged(): " + this.mSubId + " " + visible);
             mMWIStatus.put(this.mSubId, visible);
-            updatePhoneStateListeners(false);
+            updatePhoneStateListeners(false, UPDATE_TYPE_MWI, this.mSubId);
         }
 
         @Override
@@ -793,7 +812,7 @@
             Log.i(LOG_TAG, "onCallForwardingIndicatorChanged(): subId=" + this.mSubId
                     + ", visible=" + (visible ? "Y" : "N"));
             mCFIStatus.put(this.mSubId, visible);
-            updatePhoneStateListeners(false);
+            updatePhoneStateListeners(false, UPDATE_TYPE_CFI, this.mSubId);
         }
     };
 
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index 51ca424..86f0aa4 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -18,6 +18,8 @@
 
 import static android.Manifest.permission.READ_PHONE_STATE;
 import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
+import static android.service.carrier.CarrierService.ICarrierServiceWrapper.KEY_CONFIG_BUNDLE;
+import static android.service.carrier.CarrierService.ICarrierServiceWrapper.RESULT_ERROR;
 
 import android.annotation.NonNull;
 import android.app.ActivityManager;
@@ -30,16 +32,15 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.os.AsyncResult;
 import android.os.Binder;
 import android.os.Build;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.PersistableBundle;
 import android.os.RemoteException;
+import android.os.ResultReceiver;
 import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.preference.PreferenceManager;
@@ -54,9 +55,8 @@
 import com.android.internal.telephony.ICarrierConfigLoader;
 import com.android.internal.telephony.IccCardConstants;
 import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
-import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.TelephonyPermissions;
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.IndentingPrintWriter;
 
@@ -112,14 +112,14 @@
     private static final int EVENT_CONNECTED_TO_DEFAULT = 3;
     // Has connected to carrier app.
     private static final int EVENT_CONNECTED_TO_CARRIER = 4;
-    // Config has been loaded from default app.
-    private static final int EVENT_LOADED_FROM_DEFAULT = 5;
-    // Config has been loaded from carrier app.
-    private static final int EVENT_LOADED_FROM_CARRIER = 6;
+    // Config has been loaded from default app (or cache).
+    private static final int EVENT_FETCH_DEFAULT_DONE = 5;
+    // Config has been loaded from carrier app (or cache).
+    private static final int EVENT_FETCH_CARRIER_DONE = 6;
     // Attempt to fetch from default app or read from XML.
-    private static final int EVENT_FETCH_DEFAULT = 7;
+    private static final int EVENT_DO_FETCH_DEFAULT = 7;
     // Attempt to fetch from carrier app or read from XML.
-    private static final int EVENT_FETCH_CARRIER = 8;
+    private static final int EVENT_DO_FETCH_CARRIER = 8;
     // A package has been installed, uninstalled, or updated.
     private static final int EVENT_PACKAGE_CHANGED = 9;
     // Bind timed out for the default app.
@@ -130,6 +130,10 @@
     private static final int EVENT_CHECK_SYSTEM_UPDATE = 12;
     // Rerun carrier config binding after system is unlocked.
     private static final int EVENT_SYSTEM_UNLOCKED = 13;
+    // Fetching config timed out from the default app.
+    private static final int EVENT_FETCH_DEFAULT_TIMEOUT = 14;
+    // Fetching config timed out from a carrier app.
+    private static final int EVENT_FETCH_CARRIER_TIMEOUT = 15;
 
     private static final int BIND_TIMEOUT_MILLIS = 30000;
 
@@ -144,8 +148,8 @@
     // Handler to process various events.
     //
     // For each phoneId, the event sequence should be:
-    //     fetch default, connected to default, loaded from default,
-    //     fetch carrier, connected to carrier, loaded from carrier.
+    //     fetch default, connected to default, fetch default (async), fetch default done,
+    //     fetch carrier, connected to carrier, fetch carrier (async), fetch carrier done.
     //
     // If there is a saved config file for either the default app or the carrier app, we skip
     // binding to the app and go straight from fetch to loaded.
@@ -158,42 +162,41 @@
     // 2. loading from default app if there is no carrier app (even if read from a file)
     // 3. clearing config (e.g. due to sim removal)
     // 4. encountering bind or IPC error
-    private Handler mHandler = new Handler() {
-            @Override
+    private class ConfigHandler extends Handler {
+        @Override
         public void handleMessage(Message msg) {
-            int phoneId = msg.arg1;
+            final int phoneId = msg.arg1;
             log("mHandler: " + msg.what + " phoneId: " + phoneId);
-            String iccid;
-            CarrierIdentifier carrierId;
-            String carrierPackageName;
-            CarrierServiceConnection conn;
-            PersistableBundle config;
             switch (msg.what) {
                 case EVENT_CLEAR_CONFIG:
-                    if (mConfigFromDefaultApp[phoneId] == null &&
-                        mConfigFromCarrierApp[phoneId] == null)
-                        break;
+                {
+                    if (mConfigFromDefaultApp[phoneId] == null
+                            && mConfigFromCarrierApp[phoneId] == null) break;
                     mConfigFromDefaultApp[phoneId] = null;
                     mConfigFromCarrierApp[phoneId] = null;
                     mServiceConnection[phoneId] = null;
-                    broadcastConfigChangedIntent(phoneId);
+                    broadcastConfigChangedIntent(phoneId, false);
                     break;
+                }
 
                 case EVENT_SYSTEM_UNLOCKED:
+                {
                     for (int i = 0; i < TelephonyManager.from(mContext).getPhoneCount(); ++i) {
-                        // When user unlock device, we should only try to send broadcast again if
-                        // we have sent it before unlock. This will avoid we try to load carrier
-                        // config when SIM is still loading when unlock happens.
+                        // When user unlock device, we should only try to send broadcast again if we
+                        // have sent it before unlock. This will avoid we try to load carrier config
+                        // when SIM is still loading when unlock happens.
                         if (mHasSentConfigChange[i]) {
                             updateConfigForPhoneId(i);
                         }
                     }
                     break;
+                }
 
                 case EVENT_PACKAGE_CHANGED:
-                    carrierPackageName = (String) msg.obj;
-                    // Only update if there are cached config removed to avoid updating config
-                    // for unrelated packages.
+                {
+                    final String carrierPackageName = (String) msg.obj;
+                    // Only update if there are cached config removed to avoid updating config for
+                    // unrelated packages.
                     if (clearCachedConfigForPackage(carrierPackageName)) {
                         int numPhones = TelephonyManager.from(mContext).getPhoneCount();
                         for (int i = 0; i < numPhones; ++i) {
@@ -201,132 +204,228 @@
                         }
                     }
                     break;
+                }
 
-                case EVENT_FETCH_DEFAULT:
-                    iccid = getIccIdForPhoneId(phoneId);
-                    config = restoreConfigFromXml(mPlatformCarrierConfigPackage, iccid);
+                case EVENT_DO_FETCH_DEFAULT:
+                {
+                    final String iccid = getIccIdForPhoneId(phoneId);
+                    final PersistableBundle config =
+                            restoreConfigFromXml(mPlatformCarrierConfigPackage, iccid);
                     if (config != null) {
-                        log("Loaded config from XML. package=" + mPlatformCarrierConfigPackage
-                                + " phoneId=" + phoneId);
+                        log(
+                                "Loaded config from XML. package="
+                                        + mPlatformCarrierConfigPackage
+                                        + " phoneId="
+                                        + phoneId);
                         mConfigFromDefaultApp[phoneId] = config;
-                        Message newMsg = obtainMessage(EVENT_LOADED_FROM_DEFAULT, phoneId, -1);
+                        Message newMsg = obtainMessage(EVENT_FETCH_DEFAULT_DONE, phoneId, -1);
                         newMsg.getData().putBoolean("loaded_from_xml", true);
                         mHandler.sendMessage(newMsg);
                     } else {
-                        if (bindToConfigPackage(mPlatformCarrierConfigPackage,
-                                phoneId, EVENT_CONNECTED_TO_DEFAULT)) {
-                            sendMessageDelayed(obtainMessage(EVENT_BIND_DEFAULT_TIMEOUT, phoneId, -1),
+                        // No cached config, so fetch it from the default app.
+                        if (bindToConfigPackage(
+                                mPlatformCarrierConfigPackage,
+                                phoneId,
+                                EVENT_CONNECTED_TO_DEFAULT)) {
+                            sendMessageDelayed(
+                                    obtainMessage(EVENT_BIND_DEFAULT_TIMEOUT, phoneId, -1),
                                     BIND_TIMEOUT_MILLIS);
                         } else {
-                            // Send bcast if bind fails
+                            // Send broadcast if bind fails.
                             broadcastConfigChangedIntent(phoneId);
+                            // TODO: We *must* call unbindService even if bindService returns false.
+                            // (And possibly if SecurityException was thrown.)
                         }
                     }
                     break;
+                }
 
                 case EVENT_CONNECTED_TO_DEFAULT:
+                {
                     removeMessages(EVENT_BIND_DEFAULT_TIMEOUT);
-                    carrierId = getCarrierIdForPhoneId(phoneId);
-                    conn = (CarrierServiceConnection) msg.obj;
+                    final CarrierServiceConnection conn = (CarrierServiceConnection) msg.obj;
                     // If new service connection has been created, unbind.
                     if (mServiceConnection[phoneId] != conn || conn.service == null) {
                         mContext.unbindService(conn);
                         break;
                     }
+                    final CarrierIdentifier carrierId = getCarrierIdForPhoneId(phoneId);
+                    final String iccid = getIccIdForPhoneId(phoneId);
+                    // ResultReceiver callback will execute in this Handler's thread.
+                    final ResultReceiver resultReceiver =
+                            new ResultReceiver(this) {
+                                @Override
+                                public void onReceiveResult(int resultCode, Bundle resultData) {
+                                    mContext.unbindService(conn);
+                                    // If new service connection has been created, this is stale.
+                                    if (mServiceConnection[phoneId] != conn) {
+                                        loge("Received response for stale request.");
+                                        return;
+                                    }
+                                    removeMessages(EVENT_FETCH_DEFAULT_TIMEOUT);
+                                    if (resultCode == RESULT_ERROR || resultData == null) {
+                                        // On error, abort config fetching.
+                                        loge("Failed to get carrier config");
+                                        broadcastConfigChangedIntent(phoneId);
+                                        return;
+                                    }
+                                    PersistableBundle config =
+                                            resultData.getParcelable(KEY_CONFIG_BUNDLE);
+                                    saveConfigToXml(
+                                            mPlatformCarrierConfigPackage, iccid, config);
+                                    mConfigFromDefaultApp[phoneId] = config;
+                                    sendMessage(
+                                            obtainMessage(
+                                                    EVENT_FETCH_DEFAULT_DONE, phoneId, -1));
+                                }
+                            };
+                    // Now fetch the config asynchronously from the ICarrierService.
                     try {
-                        ICarrierService carrierService = ICarrierService.Stub
-                                .asInterface(conn.service);
-                        config = carrierService.getCarrierConfig(carrierId);
-                        iccid = getIccIdForPhoneId(phoneId);
-                        saveConfigToXml(mPlatformCarrierConfigPackage, iccid, config);
-                        mConfigFromDefaultApp[phoneId] = config;
-                        sendMessage(obtainMessage(EVENT_LOADED_FROM_DEFAULT, phoneId, -1));
-                    } catch (Exception ex) {
-                        // The bound app could throw exceptions that binder will pass to us.
-                        loge("Failed to get carrier config: " + ex.toString());
-                    } finally {
-                        mContext.unbindService(mServiceConnection[phoneId]);
+                        ICarrierService carrierService =
+                                ICarrierService.Stub.asInterface(conn.service);
+                        carrierService.getCarrierConfig(carrierId, resultReceiver);
+                    } catch (RemoteException e) {
+                        loge("Failed to get carrier config: " + e.toString());
+                        mContext.unbindService(conn);
+                        break; // So we don't set a timeout.
                     }
+                    sendMessageDelayed(
+                            obtainMessage(EVENT_FETCH_DEFAULT_TIMEOUT, phoneId, -1),
+                            BIND_TIMEOUT_MILLIS);
                     break;
+                }
 
                 case EVENT_BIND_DEFAULT_TIMEOUT:
+                case EVENT_FETCH_DEFAULT_TIMEOUT:
+                {
+                    // If a ResponseReceiver callback is in the queue when this happens, we will
+                    // unbind twice and throw an exception.
                     mContext.unbindService(mServiceConnection[phoneId]);
+                    removeMessages(EVENT_FETCH_DEFAULT_TIMEOUT);
                     broadcastConfigChangedIntent(phoneId);
                     break;
+                }
 
-                case EVENT_LOADED_FROM_DEFAULT:
+                case EVENT_FETCH_DEFAULT_DONE:
+                {
                     // If we attempted to bind to the app, but the service connection is null, then
                     // config was cleared while we were waiting and we should not continue.
                     if (!msg.getData().getBoolean("loaded_from_xml", false)
                             && mServiceConnection[phoneId] == null) {
                         break;
                     }
-                    carrierPackageName = getCarrierPackageForPhoneId(phoneId);
+                    final String carrierPackageName = getCarrierPackageForPhoneId(phoneId);
                     if (carrierPackageName != null) {
                         log("Found carrier config app: " + carrierPackageName);
-                        sendMessage(obtainMessage(EVENT_FETCH_CARRIER, phoneId));
+                        sendMessage(obtainMessage(EVENT_DO_FETCH_CARRIER, phoneId));
                     } else {
                         broadcastConfigChangedIntent(phoneId);
                     }
                     break;
+                }
 
-                case EVENT_FETCH_CARRIER:
-                    carrierPackageName = getCarrierPackageForPhoneId(phoneId);
-                    iccid = getIccIdForPhoneId(phoneId);
-                    config = restoreConfigFromXml(carrierPackageName, iccid);
+                case EVENT_DO_FETCH_CARRIER:
+                {
+                    final String carrierPackageName = getCarrierPackageForPhoneId(phoneId);
+                    final String iccid = getIccIdForPhoneId(phoneId);
+                    final PersistableBundle config =
+                            restoreConfigFromXml(carrierPackageName, iccid);
                     if (config != null) {
-                        log("Loaded config from XML. package=" + carrierPackageName + " phoneId="
-                                + phoneId);
+                        log(
+                                "Loaded config from XML. package="
+                                        + carrierPackageName
+                                        + " phoneId="
+                                        + phoneId);
                         mConfigFromCarrierApp[phoneId] = config;
-                        Message newMsg = obtainMessage(EVENT_LOADED_FROM_CARRIER, phoneId, -1);
+                        Message newMsg = obtainMessage(EVENT_FETCH_CARRIER_DONE, phoneId, -1);
                         newMsg.getData().putBoolean("loaded_from_xml", true);
                         sendMessage(newMsg);
                     } else {
+                        // No cached config, so fetch it from a carrier app.
                         if (carrierPackageName != null
-                            && bindToConfigPackage(carrierPackageName, phoneId,
-                                    EVENT_CONNECTED_TO_CARRIER)) {
-                            sendMessageDelayed(obtainMessage(EVENT_BIND_CARRIER_TIMEOUT, phoneId, -1),
+                                && bindToConfigPackage(
+                                        carrierPackageName,
+                                        phoneId,
+                                        EVENT_CONNECTED_TO_CARRIER)) {
+                            sendMessageDelayed(
+                                    obtainMessage(EVENT_BIND_CARRIER_TIMEOUT, phoneId, -1),
                                     BIND_TIMEOUT_MILLIS);
                         } else {
-                            // Send bcast if bind fails
+                            // Send broadcast if bind fails.
                             broadcastConfigChangedIntent(phoneId);
                         }
                     }
                     break;
+                }
 
                 case EVENT_CONNECTED_TO_CARRIER:
+                {
                     removeMessages(EVENT_BIND_CARRIER_TIMEOUT);
-                    carrierId = getCarrierIdForPhoneId(phoneId);
-                    conn = (CarrierServiceConnection) msg.obj;
+                    final CarrierServiceConnection conn = (CarrierServiceConnection) msg.obj;
                     // If new service connection has been created, unbind.
-                    if (mServiceConnection[phoneId] != conn ||
-                            conn.service == null) {
+                    if (mServiceConnection[phoneId] != conn || conn.service == null) {
                         mContext.unbindService(conn);
                         break;
                     }
+                    final CarrierIdentifier carrierId = getCarrierIdForPhoneId(phoneId);
+                    final String iccid = getIccIdForPhoneId(phoneId);
+                    // ResultReceiver callback will execute in this Handler's thread.
+                    final ResultReceiver resultReceiver =
+                            new ResultReceiver(this) {
+                                @Override
+                                public void onReceiveResult(int resultCode, Bundle resultData) {
+                                    mContext.unbindService(conn);
+                                    // If new service connection has been created, this is stale.
+                                    if (mServiceConnection[phoneId] != conn) {
+                                        loge("Received response for stale request.");
+                                        return;
+                                    }
+                                    removeMessages(EVENT_FETCH_CARRIER_TIMEOUT);
+                                    if (resultCode == RESULT_ERROR || resultData == null) {
+                                        // On error, abort config fetching.
+                                        loge("Failed to get carrier config");
+                                        broadcastConfigChangedIntent(phoneId);
+                                        return;
+                                    }
+                                    PersistableBundle config =
+                                            resultData.getParcelable(KEY_CONFIG_BUNDLE);
+                                    saveConfigToXml(
+                                            mPlatformCarrierConfigPackage, iccid, config);
+                                    mConfigFromCarrierApp[phoneId] = config;
+                                    sendMessage(
+                                            obtainMessage(
+                                                    EVENT_FETCH_CARRIER_DONE, phoneId, -1));
+                                }
+                            };
+                    // Now fetch the config asynchronously from the ICarrierService.
                     try {
-                        ICarrierService carrierService = ICarrierService.Stub
-                                .asInterface(conn.service);
-                        config = carrierService.getCarrierConfig(carrierId);
-                        carrierPackageName = getCarrierPackageForPhoneId(phoneId);
-                        iccid = getIccIdForPhoneId(phoneId);
-                        saveConfigToXml(carrierPackageName, iccid, config);
-                        mConfigFromCarrierApp[phoneId] = config;
-                        sendMessage(obtainMessage(EVENT_LOADED_FROM_CARRIER, phoneId, -1));
-                    } catch (Exception ex) {
-                        // The bound app could throw exceptions that binder will pass to us.
-                        loge("Failed to get carrier config: " + ex.toString());
-                    } finally {
-                        mContext.unbindService(mServiceConnection[phoneId]);
+                        ICarrierService carrierService =
+                                ICarrierService.Stub.asInterface(conn.service);
+                        carrierService.getCarrierConfig(carrierId, resultReceiver);
+                    } catch (RemoteException e) {
+                        loge("Failed to get carrier config: " + e.toString());
+                        mContext.unbindService(conn);
+                        break; // So we don't set a timeout.
                     }
+                    sendMessageDelayed(
+                            obtainMessage(EVENT_FETCH_CARRIER_TIMEOUT, phoneId, -1),
+                            BIND_TIMEOUT_MILLIS);
                     break;
+                }
 
                 case EVENT_BIND_CARRIER_TIMEOUT:
+                case EVENT_FETCH_CARRIER_TIMEOUT:
+                {
+                    // If a ResponseReceiver callback is in the queue when this happens, we will
+                    // unbind twice and throw an exception.
                     mContext.unbindService(mServiceConnection[phoneId]);
+                    removeMessages(EVENT_FETCH_CARRIER_TIMEOUT);
                     broadcastConfigChangedIntent(phoneId);
                     break;
+                }
 
-                case EVENT_LOADED_FROM_CARRIER:
+                case EVENT_FETCH_CARRIER_DONE:
+                {
                     // If we attempted to bind to the app, but the service connection is null, then
                     // config was cleared while we were waiting and we should not continue.
                     if (!msg.getData().getBoolean("loaded_from_xml", false)
@@ -335,21 +434,32 @@
                     }
                     broadcastConfigChangedIntent(phoneId);
                     break;
+                }
 
                 case EVENT_CHECK_SYSTEM_UPDATE:
+                {
                     SharedPreferences sharedPrefs =
                             PreferenceManager.getDefaultSharedPreferences(mContext);
                     final String lastFingerprint = sharedPrefs.getString(KEY_FINGERPRINT, null);
                     if (!Build.FINGERPRINT.equals(lastFingerprint)) {
-                        log("Build fingerprint changed. old: "
-                                + lastFingerprint + " new: " + Build.FINGERPRINT);
+                        log(
+                                "Build fingerprint changed. old: "
+                                        + lastFingerprint
+                                        + " new: "
+                                        + Build.FINGERPRINT);
                         clearCachedConfigForPackage(null);
-                        sharedPrefs.edit().putString(KEY_FINGERPRINT, Build.FINGERPRINT).apply();
+                        sharedPrefs
+                                .edit()
+                                .putString(KEY_FINGERPRINT, Build.FINGERPRINT)
+                                .apply();
                     }
                     break;
+                }
             }
         }
-    };
+    }
+
+    private final Handler mHandler;
 
     /**
      * Constructs a CarrierConfigLoader, registers it as a service, and registers a broadcast
@@ -359,6 +469,7 @@
         mContext = context;
         mPlatformCarrierConfigPackage =
                 mContext.getString(R.string.platform_carrier_config_package);
+        mHandler = new ConfigHandler();
 
         IntentFilter bootFilter = new IntentFilter();
         bootFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
@@ -402,10 +513,21 @@
     }
 
     private void broadcastConfigChangedIntent(int phoneId) {
+        broadcastConfigChangedIntent(phoneId, true);
+    }
+
+    private void broadcastConfigChangedIntent(int phoneId, boolean addSubIdExtra) {
         Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
         intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT |
                 Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
-        SubscriptionManager.putPhoneIdAndSubIdExtra(intent, phoneId);
+        // Include subId extra only if SIM records are loaded
+        TelephonyManager telephonyManager = TelephonyManager.from(mContext);
+        int simApplicationState = telephonyManager.getSimApplicationState();
+        if (addSubIdExtra && (simApplicationState != TelephonyManager.SIM_STATE_UNKNOWN
+                && simApplicationState != TelephonyManager.SIM_STATE_NOT_READY)) {
+            SubscriptionManager.putPhoneIdAndSubIdExtra(intent, phoneId);
+        }
+        intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, phoneId);
         ActivityManager.broadcastStickyIntent(intent, UserHandle.USER_ALL);
         mHasSentConfigChange[phoneId] = true;
     }
@@ -636,7 +758,8 @@
         }
     }
 
-    /** Read up to date config.
+    /**
+     * Read up to date config.
      *
      * This reads config bundles for the given phoneId. That means getting the latest bundle from
      * the default app and a privileged carrier app, if present. This will not bind to an app if we
@@ -649,27 +772,42 @@
                 getCarrierPackageForPhoneId(phoneId) == null) {
             mConfigFromCarrierApp[phoneId] = null;
         }
-        mHandler.sendMessage(mHandler.obtainMessage(EVENT_FETCH_DEFAULT, phoneId, -1));
+        mHandler.sendMessage(mHandler.obtainMessage(EVENT_DO_FETCH_DEFAULT, phoneId, -1));
     }
 
     @Override public
     @NonNull
     PersistableBundle getConfigForSubId(int subId) {
+        // TODO(b/73136824): Migrate to TelephonyPermissions#checkCallingOrSelfReadPhoneState.
         try {
             mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, null);
             // SKIP checking run-time READ_PHONE_STATE since using PRIVILEGED
         } catch (SecurityException e) {
-            mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, null);
+            try {
+                mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, null);
+            } catch (SecurityException securityException) {
+                // If we don't have the runtime permission, but do have carrier privileges, that
+                // suffices for reading phone state.
+                if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+                    throw securityException;
+                }
+                TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(subId, null);
+            }
         }
+
         int phoneId = SubscriptionManager.getPhoneId(subId);
         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;
     }
@@ -724,6 +862,11 @@
     }
 
     @Override
+    public String getDefaultCarrierServicePackageName() {
+        return mPlatformCarrierConfigPackage;
+    }
+
+    @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
                 != PackageManager.PERMISSION_GRANTED) {
diff --git a/src/com/android/phone/CdmaOptions.java b/src/com/android/phone/CdmaOptions.java
index a760cda..ff37c70 100644
--- a/src/com/android/phone/CdmaOptions.java
+++ b/src/com/android/phone/CdmaOptions.java
@@ -26,8 +26,10 @@
 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;
-import com.android.internal.telephony.TelephonyProperties;
+import com.android.settingslib.RestrictedLockUtils;
 
 /**
  * List of Phone-specific settings screens.
@@ -37,12 +39,15 @@
 
     private CdmaSystemSelectListPreference mButtonCdmaSystemSelect;
     private CdmaSubscriptionListPreference mButtonCdmaSubscription;
-    private PreferenceScreen mButtonAPNExpand;
+    private RestrictedPreference mButtonAPNExpand;
+    private Preference mCategoryAPNExpand;
+    private Preference mButtonCarrierSettings;
 
     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_KEY = "carrier_settings_key";
-    private static final String BUTTON_APN_EXPAND_KEY = "button_apn_key_cdma";
+    private static final String BUTTON_APN_EXPAND_KEY = "button_cdma_apn_key";
+    private static final String CATEGORY_APN_EXPAND_KEY = "category_cdma_apn_key";
 
     private PreferenceFragment mPrefFragment;
     private PreferenceScreen mPrefScreen;
@@ -51,28 +56,54 @@
     public CdmaOptions(PreferenceFragment prefFragment, PreferenceScreen prefScreen, Phone phone) {
         mPrefFragment = prefFragment;
         mPrefScreen = prefScreen;
-        mPhone = phone;
-        create();
-    }
-
-    protected void create() {
         mPrefFragment.addPreferencesFromResource(R.xml.cdma_options);
 
-        mButtonAPNExpand = (PreferenceScreen) mPrefScreen.findPreference(BUTTON_APN_EXPAND_KEY);
-        boolean removedAPNExpand = false;
+        // Initialize preferences.
+        mButtonCdmaSystemSelect = (CdmaSystemSelectListPreference) mPrefScreen
+                .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY);
+        mButtonCdmaSubscription = (CdmaSubscriptionListPreference) mPrefScreen
+                .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY);
+        mButtonCarrierSettings = mPrefScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
+        mButtonAPNExpand = (RestrictedPreference) mPrefScreen.findPreference(BUTTON_APN_EXPAND_KEY);
+        mCategoryAPNExpand = mPrefScreen.findPreference(CATEGORY_APN_EXPAND_KEY);
+
+        update(phone);
+    }
+
+    // Unlike mPrefFragment or mPrefScreen, mPhone may change during lifecycle of CdmaOptions.
+    // For example, a new sim card is inserted. When that happens, we update CdmaOptions with new
+    // phone.
+    protected void update(Phone phone) {
+        mPhone = phone;
+
         PersistableBundle carrierConfig =
                 PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
         // Some CDMA carriers want the APN settings.
-        if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_APN_SETTING_CDMA_BOOL)
-                && mButtonAPNExpand != null) {
-            mPrefScreen.removePreference(mButtonAPNExpand);
-            removedAPNExpand = true;
-        }
-        if (!removedAPNExpand) {
+        boolean addAPNExpand =
+                carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_APN_SETTING_CDMA_BOOL);
+        boolean addCdmaSubscription =
+                deviceSupportsNvAndRuim();
+        // Read platform settings for carrier settings
+        boolean addCarrierSettings =
+                carrierConfig.getBoolean(CarrierConfigManager.KEY_CARRIER_SETTINGS_ENABLE_BOOL);
+
+        mPrefScreen.addPreference(mButtonCdmaSystemSelect);
+        mButtonCdmaSystemSelect.setEnabled(true);
+
+        // Making no assumptions of whether they are added or removed at this point.
+        // Calling add or remove explicitly to make sure they are updated.
+
+        if (addAPNExpand) {
+            mButtonAPNExpand.setDisabledByAdmin(
+                    MobileNetworkSettings.isDpcApnEnforced(mButtonAPNExpand.getContext())
+                            ? RestrictedLockUtils.getDeviceOwner(mButtonAPNExpand.getContext())
+                            : null);
             mButtonAPNExpand.setOnPreferenceClickListener(
                     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
@@ -83,33 +114,25 @@
                             mPrefFragment.startActivity(intent);
                             return true;
                         }
-            });
+                    });
+            mPrefScreen.addPreference(mCategoryAPNExpand);
+        } else {
+            mPrefScreen.removePreference(mCategoryAPNExpand);
         }
 
-        mButtonCdmaSystemSelect = (CdmaSystemSelectListPreference)mPrefScreen
-                .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY);
-
-        mButtonCdmaSubscription = (CdmaSubscriptionListPreference)mPrefScreen
-                .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY);
-
-        mButtonCdmaSystemSelect.setEnabled(true);
-        if(deviceSupportsNvAndRuim()) {
+        if (addCdmaSubscription) {
             log("Both NV and Ruim supported, ENABLE subscription type selection");
+            mPrefScreen.addPreference(mButtonCdmaSubscription);
             mButtonCdmaSubscription.setEnabled(true);
         } else {
             log("Both NV and Ruim NOT supported, REMOVE subscription type selection");
-            mPrefScreen.removePreference(mPrefScreen
-                                .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY));
+            mPrefScreen.removePreference(mButtonCdmaSubscription);
         }
 
-        // Read platform settings for carrier settings
-        final boolean isCarrierSettingsEnabled = carrierConfig.getBoolean(
-                CarrierConfigManager.KEY_CARRIER_SETTINGS_ENABLE_BOOL);
-        if (!isCarrierSettingsEnabled) {
-            Preference pref = mPrefScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
-            if (pref != null) {
-                mPrefScreen.removePreference(pref);
-            }
+        if (addCarrierSettings) {
+            mPrefScreen.addPreference(mButtonCarrierSettings);
+        } else {
+            mPrefScreen.removePreference(mButtonCarrierSettings);
         }
     }
 
diff --git a/src/com/android/phone/CellInfoUtil.java b/src/com/android/phone/CellInfoUtil.java
new file mode 100644
index 0000000..c0409d8
--- /dev/null
+++ b/src/com/android/phone/CellInfoUtil.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.telephony.CellIdentity;
+import android.telephony.CellIdentityCdma;
+import android.telephony.CellIdentityGsm;
+import android.telephony.CellIdentityLte;
+import android.telephony.CellIdentityWcdma;
+import android.telephony.CellInfo;
+import android.telephony.CellInfoCdma;
+import android.telephony.CellInfoGsm;
+import android.telephony.CellInfoLte;
+import android.telephony.CellInfoWcdma;
+import android.telephony.TelephonyManager;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.telephony.OperatorInfo;
+
+/**
+ * Add static Utility functions to get information from the CellInfo object.
+ * TODO: Modify {@link CellInfo} for simplify those functions
+ */
+public final class CellInfoUtil {
+    private static final String TAG = "NetworkSelectSetting";
+
+    private CellInfoUtil() {
+    }
+
+    /**
+     * Get the network type from a CellInfo. Network types include
+     * {@link TelephonyManager#NETWORK_TYPE_LTE}, {@link TelephonyManager#NETWORK_TYPE_UMTS},
+     * {@link TelephonyManager#NETWORK_TYPE_GSM}, {@link TelephonyManager#NETWORK_TYPE_CDMA} and
+     * {@link TelephonyManager#NETWORK_TYPE_UNKNOWN}
+     * @return network types
+     */
+    public static int getNetworkType(CellInfo cellInfo) {
+        if (cellInfo instanceof CellInfoLte) {
+            return TelephonyManager.NETWORK_TYPE_LTE;
+        } else if (cellInfo instanceof CellInfoWcdma) {
+            return TelephonyManager.NETWORK_TYPE_UMTS;
+        } else if (cellInfo instanceof CellInfoGsm) {
+            return TelephonyManager.NETWORK_TYPE_GSM;
+        } else if (cellInfo instanceof CellInfoCdma) {
+            return TelephonyManager.NETWORK_TYPE_CDMA;
+        } else {
+            Log.e(TAG, "Invalid CellInfo type");
+            return TelephonyManager.NETWORK_TYPE_UNKNOWN;
+        }
+    }
+
+    /**
+     * Get signal level as an int from 0..4.
+     * @return Signal strength level
+     */
+    public static int getLevel(CellInfo cellInfo) {
+        if (cellInfo instanceof CellInfoLte) {
+            return ((CellInfoLte) cellInfo).getCellSignalStrength().getLevel();
+        } else if (cellInfo instanceof CellInfoWcdma) {
+            return ((CellInfoWcdma) cellInfo).getCellSignalStrength().getLevel();
+        } else if (cellInfo instanceof CellInfoGsm) {
+            return ((CellInfoGsm) cellInfo).getCellSignalStrength().getLevel();
+        } else if (cellInfo instanceof CellInfoCdma) {
+            return ((CellInfoCdma) cellInfo).getCellSignalStrength().getLevel();
+        } else {
+            Log.e(TAG, "Invalid CellInfo type");
+            return 0;
+        }
+    }
+
+    /**
+     * Wrap a CellIdentity into a CellInfo.
+     */
+    public static CellInfo wrapCellInfoWithCellIdentity(CellIdentity cellIdentity) {
+        if (cellIdentity instanceof CellIdentityLte) {
+            CellInfoLte cellInfo = new CellInfoLte();
+            cellInfo.setCellIdentity((CellIdentityLte) cellIdentity);
+            return cellInfo;
+        } else if (cellIdentity instanceof CellIdentityCdma) {
+            CellInfoCdma cellInfo = new CellInfoCdma();
+            cellInfo.setCellIdentity((CellIdentityCdma) cellIdentity);
+            return cellInfo;
+        }  else if (cellIdentity instanceof CellIdentityWcdma) {
+            CellInfoWcdma cellInfo = new CellInfoWcdma();
+            cellInfo.setCellIdentity((CellIdentityWcdma) cellIdentity);
+            return cellInfo;
+        } else if (cellIdentity instanceof CellIdentityGsm) {
+            CellInfoGsm cellInfo = new CellInfoGsm();
+            cellInfo.setCellIdentity((CellIdentityGsm) cellIdentity);
+            return cellInfo;
+        } else {
+            Log.e(TAG, "Invalid CellInfo type");
+            return null;
+        }
+    }
+
+    /**
+     * Returns the title of the network obtained in the manual search.
+     *
+     * @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.
+     */
+    public static String getNetworkTitle(CellInfo cellInfo) {
+        OperatorInfo oi = getOperatorInfoFromCellInfo(cellInfo);
+
+        if (!TextUtils.isEmpty(oi.getOperatorAlphaLong())) {
+            return oi.getOperatorAlphaLong();
+        } else if (!TextUtils.isEmpty(oi.getOperatorAlphaShort())) {
+            return oi.getOperatorAlphaShort();
+        } else {
+            BidiFormatter bidiFormatter = BidiFormatter.getInstance();
+            return bidiFormatter.unicodeWrap(oi.getOperatorNumeric(), TextDirectionHeuristics.LTR);
+        }
+    }
+
+    /**
+     * Wrap a cell info into an operator info.
+     */
+    public static 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 {
+            Log.e(TAG, "Invalid CellInfo type");
+            oi = new OperatorInfo("", "", "");
+        }
+        return oi;
+    }
+}
diff --git a/src/com/android/phone/DataUsagePreference.java b/src/com/android/phone/DataUsagePreference.java
new file mode 100644
index 0000000..85e7700
--- /dev/null
+++ b/src/com/android/phone/DataUsagePreference.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.net.NetworkTemplate;
+import android.preference.Preference;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+import android.text.format.Formatter;
+import android.util.AttributeSet;
+
+import com.android.settingslib.drawer.SettingsDrawerActivity;
+import com.android.settingslib.net.DataUsageController;
+
+/**
+ * The preference that shows mobile data usage summary and
+ * leads to mobile data usage list page.
+ */
+public class DataUsagePreference extends Preference {
+
+    private NetworkTemplate mTemplate;
+    private int mSubId;
+
+    public DataUsagePreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    /**
+     * After creating this preference, this functions needs to be called to
+     * initialize which subID it connects to.
+     */
+    public void initialize(int subId) {
+        Activity activity = (Activity) getContext();
+
+        mSubId = subId;
+        mTemplate = getNetworkTemplate(activity, subId);
+
+        DataUsageController controller = new DataUsageController(activity);
+
+        DataUsageController.DataUsageInfo usageInfo = controller.getDataUsageInfo(mTemplate);
+        setSummary(activity.getString(R.string.data_usage_template,
+                Formatter.formatFileSize(activity, usageInfo.usageLevel), usageInfo.period));
+        setIntent(getIntent());
+    }
+
+    @Override
+    public Intent getIntent() {
+        Intent intent = new Intent(Settings.ACTION_MOBILE_DATA_USAGE);
+        intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
+
+        intent.putExtra(Settings.EXTRA_NETWORK_TEMPLATE, mTemplate);
+        intent.putExtra(Settings.EXTRA_SUB_ID, mSubId);
+
+        return intent;
+    }
+
+    private NetworkTemplate getNetworkTemplate(Activity activity, int subId) {
+        TelephonyManager tm = (TelephonyManager) activity
+                .getSystemService(Context.TELEPHONY_SERVICE);
+        NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll(
+                tm.getSubscriberId(subId));
+        return NetworkTemplate.normalize(mobileAll,
+                tm.getMergedSubscriberIds());
+    }
+}
diff --git a/src/com/android/phone/EditPhoneNumberPreference.java b/src/com/android/phone/EditPhoneNumberPreference.java
index 78e8439..74b8a45 100644
--- a/src/com/android/phone/EditPhoneNumberPreference.java
+++ b/src/com/android/phone/EditPhoneNumberPreference.java
@@ -123,8 +123,8 @@
         setDialogLayoutResource(R.layout.pref_dialog_editphonenumber);
 
         //create intent to bring up contact list
-        mContactListIntent = new Intent(Intent.ACTION_GET_CONTENT);
-        mContactListIntent.setType(Phone.CONTENT_ITEM_TYPE);
+        mContactListIntent = new Intent(Intent.ACTION_PICK);
+        mContactListIntent.setType(Phone.CONTENT_TYPE);
 
         //get the edit phone number default settings
         TypedArray a = context.obtainStyledAttributes(attrs,
@@ -258,8 +258,8 @@
                 builder.setPositiveButton(mChangeNumberText, this);
                 builder.setNeutralButton(mDisableText, this);
             } else {
-                builder.setPositiveButton(null, null);
-                builder.setNeutralButton(mEnableText, this);
+                builder.setPositiveButton(mEnableText, this);
+                builder.setNeutralButton(null, null);
             }
         }
         // set the call icon on the title.
diff --git a/src/com/android/phone/EmergencyCallHelper.java b/src/com/android/phone/EmergencyCallHelper.java
deleted file mode 100644
index 74ce088..0000000
--- a/src/com/android/phone/EmergencyCallHelper.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone;
-
-import com.android.internal.telephony.CallManager;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.telephony.DisconnectCause;
-import android.telephony.ServiceState;
-import android.util.Log;
-
-
-/**
- * Helper class for the {@link CallController} that implements special
- * behavior related to emergency calls.  Specifically, this class handles
- * the case of the user trying to dial an emergency number while the radio
- * is off (i.e. the device is in airplane mode), by forcibly turning the
- * radio back on, waiting for it to come up, and then retrying the
- * emergency call.
- *
- * This class is instantiated lazily (the first time the user attempts to
- * make an emergency call from airplane mode) by the the
- * {@link CallController} singleton.
- */
-public class EmergencyCallHelper extends Handler {
-    private static final String TAG = "EmergencyCallHelper";
-    private static final boolean DBG = false;
-
-    // Number of times to retry the call, and time between retry attempts.
-    public static final int MAX_NUM_RETRIES = 6;
-    public static final long TIME_BETWEEN_RETRIES = 5000;  // msec
-
-    // Timeout used with our wake lock (just as a safety valve to make
-    // sure we don't hold it forever).
-    public static final long WAKE_LOCK_TIMEOUT = 5 * 60 * 1000;  // 5 minutes in msec
-
-    // Handler message codes; see handleMessage()
-    private static final int START_SEQUENCE = 1;
-    private static final int SERVICE_STATE_CHANGED = 2;
-    private static final int DISCONNECT = 3;
-    private static final int RETRY_TIMEOUT = 4;
-
-    private CallController mCallController;
-    private PhoneGlobals mApp;
-    private CallManager mCM;
-    private String mNumber;  // The emergency number we're trying to dial
-    private int mNumRetriesSoFar;
-
-    // Wake lock we hold while running the whole sequence
-    private PowerManager.WakeLock mPartialWakeLock;
-
-    public EmergencyCallHelper(CallController callController) {
-        if (DBG) log("EmergencyCallHelper constructor...");
-        mCallController = callController;
-        mApp = PhoneGlobals.getInstance();
-        mCM =  mApp.mCM;
-    }
-
-    @Override
-    public void handleMessage(Message msg) {
-        switch (msg.what) {
-            case START_SEQUENCE:
-                startSequenceInternal(msg);
-                break;
-            case SERVICE_STATE_CHANGED:
-                onServiceStateChanged(msg);
-                break;
-            case DISCONNECT:
-                onDisconnect(msg);
-                break;
-            case RETRY_TIMEOUT:
-                onRetryTimeout();
-                break;
-            default:
-                Log.wtf(TAG, "handleMessage: unexpected message: " + msg);
-                break;
-        }
-    }
-
-    /**
-     * Starts the "emergency call from airplane mode" sequence.
-     *
-     * This is the (single) external API of the EmergencyCallHelper class.
-     * This method is called from the CallController placeCall() sequence
-     * if the user dials a valid emergency number, but the radio is
-     * powered-off (presumably due to airplane mode.)
-     *
-     * This method kicks off the following sequence:
-     * - Power on the radio
-     * - Listen for the service state change event telling us the radio has come up
-     * - Then launch the emergency call
-     * - Retry if the call fails with an OUT_OF_SERVICE error
-     * - Retry if we've gone 5 seconds without any response from the radio
-     * - Finally, clean up any leftover state (progress UI, wake locks, etc.)
-     *
-     * This method is safe to call from any thread, since it simply posts
-     * a message to the EmergencyCallHelper's handler (thus ensuring that
-     * the rest of the sequence is entirely serialized, and runs only on
-     * the handler thread.)
-     *
-     * This method does *not* force the in-call UI to come up; our caller
-     * is responsible for doing that (presumably by calling
-     * PhoneApp.displayCallScreen().)
-     */
-    public void startEmergencyCallFromAirplaneModeSequence(String number) {
-        if (DBG) log("startEmergencyCallFromAirplaneModeSequence('" + number + "')...");
-        Message msg = obtainMessage(START_SEQUENCE, number);
-        sendMessage(msg);
-    }
-
-    /**
-     * Actual implementation of startEmergencyCallFromAirplaneModeSequence(),
-     * guaranteed to run on the handler thread.
-     * @see #startEmergencyCallFromAirplaneModeSequence
-     */
-    private void startSequenceInternal(Message msg) {
-        if (DBG) log("startSequenceInternal(): msg = " + msg);
-
-        // First of all, clean up any state (including mPartialWakeLock!)
-        // left over from a prior emergency call sequence.
-        // This ensures that we'll behave sanely if another
-        // startEmergencyCallFromAirplaneModeSequence() comes in while
-        // we're already in the middle of the sequence.
-        cleanup();
-
-        mNumber = (String) msg.obj;
-        if (DBG) log("- startSequenceInternal: Got mNumber: '" + mNumber + "'");
-
-        mNumRetriesSoFar = 0;
-
-        // Wake lock to make sure the processor doesn't go to sleep midway
-        // through the emergency call sequence.
-        PowerManager pm = (PowerManager) mApp.getSystemService(Context.POWER_SERVICE);
-        mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
-        // Acquire with a timeout, just to be sure we won't hold the wake
-        // lock forever even if a logic bug (in this class) causes us to
-        // somehow never call cleanup().
-        if (DBG) log("- startSequenceInternal: acquiring wake lock");
-        mPartialWakeLock.acquire(WAKE_LOCK_TIMEOUT);
-
-        // No need to check the current service state here, since the only
-        // reason the CallController would call this method in the first
-        // place is if the radio is powered-off.
-        //
-        // So just go ahead and turn the radio on.
-
-        powerOnRadio();  // We'll get an onServiceStateChanged() callback
-                         // when the radio successfully comes up.
-
-        // Next step: when the SERVICE_STATE_CHANGED event comes in,
-        // we'll retry the call; see placeEmergencyCall();
-        // But also, just in case, start a timer to make sure we'll retry
-        // the call even if the SERVICE_STATE_CHANGED event never comes in
-        // for some reason.
-        startRetryTimer();
-
-        // (Our caller is responsible for calling mApp.displayCallScreen().)
-    }
-
-    /**
-     * Handles the SERVICE_STATE_CHANGED event.
-     *
-     * (Normally this event tells us that the radio has finally come
-     * up.  In that case, it's now safe to actually place the
-     * emergency call.)
-     */
-    private void onServiceStateChanged(Message msg) {
-        ServiceState state = (ServiceState) ((AsyncResult) msg.obj).result;
-        if (DBG) log("onServiceStateChanged()...  new state = " + state);
-
-        // Possible service states:
-        // - STATE_IN_SERVICE        // Normal operation
-        // - STATE_OUT_OF_SERVICE    // Still searching for an operator to register to,
-        //                           // or no radio signal
-        // - STATE_EMERGENCY_ONLY    // Phone is locked; only emergency numbers are allowed
-        // - STATE_POWER_OFF         // Radio is explicitly powered off (airplane mode)
-
-        // Once we reach either STATE_IN_SERVICE or STATE_EMERGENCY_ONLY,
-        // it's finally OK to place the emergency call.
-        boolean okToCall = (state.getState() == ServiceState.STATE_IN_SERVICE)
-                || (state.getState() == ServiceState.STATE_EMERGENCY_ONLY);
-
-        if (okToCall) {
-            // Woo hoo!  It's OK to actually place the call.
-            if (DBG) log("onServiceStateChanged: ok to call!");
-
-            // Deregister for the service state change events.
-            unregisterForServiceStateChanged();
-
-            placeEmergencyCall();
-        } else {
-            // The service state changed, but we're still not ready to call yet.
-            // (This probably was the transition from STATE_POWER_OFF to
-            // STATE_OUT_OF_SERVICE, which happens immediately after powering-on
-            // the radio.)
-            //
-            // So just keep waiting; we'll probably get to either
-            // STATE_IN_SERVICE or STATE_EMERGENCY_ONLY very shortly.
-            // (Or even if that doesn't happen, we'll at least do another retry
-            // when the RETRY_TIMEOUT event fires.)
-            if (DBG) log("onServiceStateChanged: not ready to call yet, keep waiting...");
-        }
-    }
-
-    /**
-     * Handles a DISCONNECT event from the telephony layer.
-     *
-     * Even after we successfully place an emergency call (after powering
-     * on the radio), it's still possible for the call to fail with the
-     * disconnect cause OUT_OF_SERVICE.  If so, schedule a retry.
-     */
-    private void onDisconnect(Message msg) {
-        Connection conn = (Connection) ((AsyncResult) msg.obj).result;
-        int cause = conn.getDisconnectCause();
-        if (DBG) log("onDisconnect: connection '" + conn
-                     + "', addr '" + conn.getAddress()
-                     + "', cause = " + DisconnectCause.toString(cause));
-
-        if (cause == DisconnectCause.OUT_OF_SERVICE) {
-            // Wait a bit more and try again (or just bail out totally if
-            // we've had too many failures.)
-            if (DBG) log("- onDisconnect: OUT_OF_SERVICE, need to retry...");
-            scheduleRetryOrBailOut();
-        } else {
-            // Any other disconnect cause means we're done.
-            // Either the emergency call succeeded *and* ended normally,
-            // or else there was some error that we can't retry.  In either
-            // case, just clean up our internal state.)
-
-            if (DBG) log("==> Disconnect event; clean up...");
-            cleanup();
-
-            // Nothing else to do here.  If the InCallScreen was visible,
-            // it would have received this disconnect event too (so it'll
-            // show the "Call ended" state and finish itself without any
-            // help from us.)
-        }
-    }
-
-    /**
-     * Handles the retry timer expiring.
-     */
-    private void onRetryTimeout() {
-        PhoneConstants.State phoneState = mCM.getState();
-        int serviceState = mCM.getDefaultPhone().getServiceState().getState();
-        if (DBG) log("onRetryTimeout():  phone state " + phoneState
-                     + ", service state " + serviceState
-                     + ", mNumRetriesSoFar = " + mNumRetriesSoFar);
-
-        // - If we're actually in a call, we've succeeded.
-        //
-        // - Otherwise, if the radio is now on, that means we successfully got
-        //   out of airplane mode but somehow didn't get the service state
-        //   change event.  In that case, try to place the call.
-        //
-        // - If the radio is still powered off, try powering it on again.
-
-        if (phoneState == PhoneConstants.State.OFFHOOK) {
-            if (DBG) log("- onRetryTimeout: Call is active!  Cleaning up...");
-            cleanup();
-            return;
-        }
-
-        if (serviceState != ServiceState.STATE_POWER_OFF) {
-            // Woo hoo -- we successfully got out of airplane mode.
-
-            // Deregister for the service state change events; we don't need
-            // these any more now that the radio is powered-on.
-            unregisterForServiceStateChanged();
-
-            placeEmergencyCall();  // If the call fails, placeEmergencyCall()
-                                   // will schedule a retry.
-        } else {
-            // Uh oh; we've waited the full TIME_BETWEEN_RETRIES and the
-            // radio is still not powered-on.  Try again...
-
-            if (DBG) log("- Trying (again) to turn on the radio...");
-            powerOnRadio();  // Again, we'll (hopefully) get an onServiceStateChanged()
-                             // callback when the radio successfully comes up.
-
-            // ...and also set a fresh retry timer (or just bail out
-            // totally if we've had too many failures.)
-            scheduleRetryOrBailOut();
-        }
-    }
-
-    /**
-     * Attempt to power on the radio (i.e. take the device out
-     * of airplane mode.)
-     *
-     * Additionally, start listening for service state changes;
-     * we'll eventually get an onServiceStateChanged() callback
-     * when the radio successfully comes up.
-     */
-    private void powerOnRadio() {
-        if (DBG) log("- powerOnRadio()...");
-
-        // We're about to turn on the radio, so arrange to be notified
-        // when the sequence is complete.
-        registerForServiceStateChanged();
-
-        // If airplane mode is on, we turn it off the same way that the
-        // Settings activity turns it off.
-        if (Settings.Global.getInt(mApp.getContentResolver(),
-                                   Settings.Global.AIRPLANE_MODE_ON, 0) > 0) {
-            if (DBG) log("==> Turning off airplane mode...");
-
-            // Change the system setting
-            Settings.Global.putInt(mApp.getContentResolver(),
-                                   Settings.Global.AIRPLANE_MODE_ON, 0);
-
-            // Post the intent
-            Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-            intent.putExtra("state", false);
-            mApp.sendBroadcastAsUser(intent, UserHandle.ALL);
-        } else {
-            // Otherwise, for some strange reason the radio is off
-            // (even though the Settings database doesn't think we're
-            // in airplane mode.)  In this case just turn the radio
-            // back on.
-            if (DBG) log("==> (Apparently) not in airplane mode; manually powering radio on...");
-            mCM.getDefaultPhone().setRadioPower(true);
-        }
-    }
-
-    /**
-     * Actually initiate the outgoing emergency call.
-     * (We do this once the radio has successfully been powered-up.)
-     *
-     * If the call succeeds, we're done.
-     * If the call fails, schedule a retry of the whole sequence.
-     */
-    private void placeEmergencyCall() {
-        if (DBG) log("placeEmergencyCall()...");
-
-        // Place an outgoing call to mNumber.
-        // Note we call PhoneUtils.placeCall() directly; we don't want any
-        // of the behavior from CallController.placeCallInternal() here.
-        // (Specifically, we don't want to start the "emergency call from
-        // airplane mode" sequence from the beginning again!)
-
-        registerForDisconnect();  // Get notified when this call disconnects
-
-        if (DBG) log("- placing call to '" + mNumber + "'...");
-        int callStatus = PhoneUtils.placeCall(mApp,
-                                              mCM.getDefaultPhone(),
-                                              mNumber,
-                                              null,  // contactUri
-                                              true); // isEmergencyCall
-        if (DBG) log("- PhoneUtils.placeCall() returned status = " + callStatus);
-
-        boolean success;
-        // Note PhoneUtils.placeCall() returns one of the CALL_STATUS_*
-        // constants, not a CallStatusCode enum value.
-        switch (callStatus) {
-            case PhoneUtils.CALL_STATUS_DIALED:
-                success = true;
-                break;
-
-            case PhoneUtils.CALL_STATUS_DIALED_MMI:
-            case PhoneUtils.CALL_STATUS_FAILED:
-            default:
-                // Anything else is a failure, and we'll need to retry.
-                Log.w(TAG, "placeEmergencyCall(): placeCall() failed: callStatus = " + callStatus);
-                success = false;
-                break;
-        }
-
-        if (success) {
-            if (DBG) log("==> Success from PhoneUtils.placeCall()!");
-            // Ok, the emergency call is (hopefully) under way.
-
-            // We're not done yet, though, so don't call cleanup() here.
-            // (It's still possible that this call will fail, and disconnect
-            // with cause==OUT_OF_SERVICE.  If so, that will trigger a retry
-            // from the onDisconnect() method.)
-        } else {
-            if (DBG) log("==> Failure.");
-            // Wait a bit more and try again (or just bail out totally if
-            // we've had too many failures.)
-            scheduleRetryOrBailOut();
-        }
-    }
-
-    /**
-     * Schedules a retry in response to some failure (either the radio
-     * failing to power on, or a failure when trying to place the call.)
-     * Or, if we've hit the retry limit, bail out of this whole sequence
-     * and display a failure message to the user.
-     */
-    private void scheduleRetryOrBailOut() {
-        mNumRetriesSoFar++;
-        if (DBG) log("scheduleRetryOrBailOut()...  mNumRetriesSoFar is now " + mNumRetriesSoFar);
-
-        if (mNumRetriesSoFar > MAX_NUM_RETRIES) {
-            Log.w(TAG, "scheduleRetryOrBailOut: hit MAX_NUM_RETRIES; giving up...");
-            cleanup();
-        } else {
-            if (DBG) log("- Scheduling another retry...");
-            startRetryTimer();
-        }
-    }
-
-    /**
-     * Clean up when done with the whole sequence: either after
-     * successfully placing *and* ending the emergency call, or after
-     * bailing out because of too many failures.
-     *
-     * The exact cleanup steps are:
-     * - Take down any progress UI (and also ask the in-call UI to refresh itself,
-     *   if it's still visible)
-     * - Double-check that we're not still registered for any telephony events
-     * - Clean up any extraneous handler messages (like retry timeouts) still in the queue
-     * - Make sure we're not still holding any wake locks
-     *
-     * Basically this method guarantees that there will be no more
-     * activity from the EmergencyCallHelper until the CallController
-     * kicks off the whole sequence again with another call to
-     * startEmergencyCallFromAirplaneModeSequence().
-     *
-     * Note we don't call this method simply after a successful call to
-     * placeCall(), since it's still possible the call will disconnect
-     * very quickly with an OUT_OF_SERVICE error.
-     */
-    private void cleanup() {
-        if (DBG) log("cleanup()...");
-
-        unregisterForServiceStateChanged();
-        unregisterForDisconnect();
-        cancelRetryTimer();
-
-        // Release / clean up the wake lock
-        if (mPartialWakeLock != null) {
-            if (mPartialWakeLock.isHeld()) {
-                if (DBG) log("- releasing wake lock");
-                mPartialWakeLock.release();
-            }
-            mPartialWakeLock = null;
-        }
-    }
-
-    private void startRetryTimer() {
-        removeMessages(RETRY_TIMEOUT);
-        sendEmptyMessageDelayed(RETRY_TIMEOUT, TIME_BETWEEN_RETRIES);
-    }
-
-    private void cancelRetryTimer() {
-        removeMessages(RETRY_TIMEOUT);
-    }
-
-    private void registerForServiceStateChanged() {
-        // Unregister first, just to make sure we never register ourselves
-        // twice.  (We need this because Phone.registerForServiceStateChanged()
-        // does not prevent multiple registration of the same handler.)
-        Phone phone = mCM.getDefaultPhone();
-        phone.unregisterForServiceStateChanged(this);  // Safe even if not currently registered
-        phone.registerForServiceStateChanged(this, SERVICE_STATE_CHANGED, null);
-    }
-
-    private void unregisterForServiceStateChanged() {
-        // This method is safe to call even if we haven't set mPhone yet.
-        Phone phone = mCM.getDefaultPhone();
-        if (phone != null) {
-            phone.unregisterForServiceStateChanged(this);  // Safe even if unnecessary
-        }
-        removeMessages(SERVICE_STATE_CHANGED);  // Clean up any pending messages too
-    }
-
-    private void registerForDisconnect() {
-        // Note: no need to unregister first, since
-        // CallManager.registerForDisconnect() automatically prevents
-        // multiple registration of the same handler.
-        mCM.registerForDisconnect(this, DISCONNECT, null);
-    }
-
-    private void unregisterForDisconnect() {
-        mCM.unregisterForDisconnect(this);  // Safe even if not currently registered
-        removeMessages(DISCONNECT);  // Clean up any pending messages too
-    }
-
-
-    //
-    // Debugging
-    //
-
-    private static void log(String msg) {
-        Log.d(TAG, msg);
-    }
-}
diff --git a/src/com/android/phone/EmergencyCallbackModeExitDialog.java b/src/com/android/phone/EmergencyCallbackModeExitDialog.java
index 765c52d..9d43d60 100644
--- a/src/com/android/phone/EmergencyCallbackModeExitDialog.java
+++ b/src/com/android/phone/EmergencyCallbackModeExitDialog.java
@@ -17,9 +17,9 @@
 package com.android.phone;
 
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.ProgressDialog;
-import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -28,7 +28,6 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
-import android.content.res.Resources;
 import android.os.AsyncResult;
 import android.os.Bundle;
 import android.os.CountDownTimer;
@@ -36,12 +35,10 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
-import android.os.SystemProperties;
 import android.util.Log;
 
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.telephony.TelephonyProperties;
 
 /**
  * Displays dialog that enables users to exit Emergency Callback Mode
@@ -80,12 +77,12 @@
 
         mPhone = PhoneGlobals.getInstance().getPhoneInEcm();
         // Check if phone is in Emergency Callback Mode. If not, exit.
-        final boolean isInEcm = mPhone.isInEcm();
-        Log.i(TAG, "ECMModeExitDialog launched - isInEcm: " + isInEcm + " phone:" + mPhone);
-        if (mPhone == null || !isInEcm) {
+        if (mPhone == null || !mPhone.isInEcm()) {
+            Log.i(TAG, "ECMModeExitDialog launched - isInEcm: false" + " phone:" + mPhone);
             finish();
             return;
         }
+        Log.i(TAG, "ECMModeExitDialog launched - isInEcm: true" + " phone:" + mPhone);
 
         mHandler = new Handler();
 
diff --git a/src/com/android/phone/EmergencyDialer.java b/src/com/android/phone/EmergencyDialer.java
index 4cbfb38..31e1958 100644
--- a/src/com/android/phone/EmergencyDialer.java
+++ b/src/com/android/phone/EmergencyDialer.java
@@ -16,10 +16,11 @@
 
 package com.android.phone;
 
+import static android.telephony.ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN;
+
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.StatusBarManager;
 import android.app.WallpaperManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -29,13 +30,17 @@
 import android.media.AudioManager;
 import android.media.ToneGenerator;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.provider.Settings;
 import android.telecom.PhoneAccount;
+import android.telecom.TelecomManager;
 import android.telephony.CarrierConfigManager;
 import android.telephony.PhoneNumberUtils;
+import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
 import android.text.Editable;
 import android.text.InputType;
 import android.text.Spannable;
@@ -45,19 +50,20 @@
 import android.text.method.DialerKeyListener;
 import android.text.style.TtsSpan;
 import android.util.Log;
+import android.util.TypedValue;
 import android.view.HapticFeedbackConstants;
 import android.view.KeyEvent;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.WindowManager;
-import android.widget.EditText;
 
 import com.android.internal.colorextraction.ColorExtractor;
 import com.android.internal.colorextraction.ColorExtractor.GradientColors;
 import com.android.internal.colorextraction.drawable.GradientDrawable;
 import com.android.phone.common.dialpad.DialpadKeyButton;
 import com.android.phone.common.util.ViewUtil;
+import com.android.phone.common.widget.ResizingTextEditText;
 
 /**
  * EmergencyDialer is a special dialer that is used ONLY for dialing emergency calls.
@@ -110,7 +116,7 @@
     /** 90% opacity, different from other gradients **/
     private static final int BACKGROUND_GRADIENT_ALPHA = 230;
 
-    EditText mDigits;
+    ResizingTextEditText mDigits;
     private View mDialButton;
     private View mDelete;
 
@@ -139,6 +145,9 @@
     private GradientDrawable mBackgroundGradient;
     private boolean mSupportsDarkText;
 
+    private boolean mIsWfcEmergencyCallingWarningEnabled;
+    private float mDefaultDigitsTextSize;
+
     @Override
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         // Do nothing
@@ -146,7 +155,7 @@
 
     @Override
     public void onTextChanged(CharSequence input, int start, int before, int changeCount) {
-        // Do nothing
+        maybeChangeHintSize();
     }
 
     @Override
@@ -190,12 +199,13 @@
 
         setContentView(R.layout.emergency_dialer);
 
-        mDigits = (EditText) findViewById(R.id.digits);
+        mDigits = (ResizingTextEditText) findViewById(R.id.digits);
         mDigits.setKeyListener(DialerKeyListener.getInstance());
         mDigits.setOnClickListener(this);
         mDigits.setOnKeyListener(this);
         mDigits.setLongClickable(false);
         mDigits.setInputType(InputType.TYPE_NULL);
+        mDefaultDigitsTextSize = mDigits.getScaledTextSize();
         maybeAddNumberFormatting();
 
         mBackgroundGradient = new GradientDrawable(this);
@@ -225,11 +235,16 @@
                 (CarrierConfigManager) getSystemService(Context.CARRIER_CONFIG_SERVICE);
         PersistableBundle carrierConfig =
                 configMgr.getConfigForSubId(SubscriptionManager.getDefaultVoiceSubscriptionId());
+
         if (carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL)) {
             mDialButton.setOnClickListener(this);
         } else {
             mDialButton.setVisibility(View.GONE);
         }
+        mIsWfcEmergencyCallingWarningEnabled = carrierConfig.getInt(
+                CarrierConfigManager.KEY_EMERGENCY_NOTIFICATION_DELAY_INT) > -1;
+        maybeShowWfcEmergencyCallingWarning();
+
         ViewUtil.setupFloatingActionButton(mDialButton, getResources());
 
         if (icicle != null) {
@@ -521,13 +536,6 @@
     @Override
     public void onPause() {
         super.onPause();
-
-        synchronized (mToneGeneratorLock) {
-            if (mToneGenerator != null) {
-                mToneGenerator.release();
-                mToneGenerator = null;
-            }
-        }
     }
 
     @Override
@@ -587,10 +595,8 @@
                 playTone(ToneGenerator.TONE_PROP_NACK);
                 return;
             }
-            Intent intent = new Intent(Intent.ACTION_CALL_EMERGENCY);
-            intent.setData(Uri.fromParts(PhoneAccount.SCHEME_TEL, mLastNumber, null));
-            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            startActivity(intent);
+            TelecomManager tm = (TelecomManager) getSystemService(TELECOM_SERVICE);
+            tm.placeCall(Uri.fromParts(PhoneAccount.SCHEME_TEL, mLastNumber, null), null);
         } else {
             if (DBG) Log.d(LOG_TAG, "rejecting bad requested number " + mLastNumber);
 
@@ -663,7 +669,7 @@
 
             // blur stuff behind the dialog
             dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
-            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+            setShowWhenLocked(true);
         }
         return dialog;
     }
@@ -727,4 +733,68 @@
             updateTheme(colors.supportsDarkText());
         }
     }
+
+    /**
+     * Where a carrier requires a warning that emergency calling is not available while on WFC,
+     * add hint text above the dial pad which warns the user of this case.
+     */
+    private void maybeShowWfcEmergencyCallingWarning() {
+        if (!mIsWfcEmergencyCallingWarningEnabled) {
+            Log.i(LOG_TAG, "maybeShowWfcEmergencyCallingWarning: warning disabled by carrier.");
+            return;
+        }
+
+        // Use an async task rather than calling into Telephony on UI thread.
+        AsyncTask<Void, Void, Boolean> showWfcWarningTask = new AsyncTask<Void, Void, Boolean>() {
+            @Override
+            protected Boolean doInBackground(Void... voids) {
+                TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
+                boolean isWfcAvailable = tm.isWifiCallingAvailable();
+                ServiceState ss = tm.getServiceState();
+                boolean isCellAvailable =
+                        ss.getRilVoiceRadioTechnology() != RIL_RADIO_TECHNOLOGY_UNKNOWN;
+                Log.i(LOG_TAG, "showWfcWarningTask: isWfcAvailable=" + isWfcAvailable
+                                + " isCellAvailable=" + isCellAvailable
+                                + "(rat=" + ss.getRilVoiceRadioTechnology() + ")");
+                return isWfcAvailable && !isCellAvailable;
+            }
+
+            @Override
+            protected void onPostExecute(Boolean result) {
+                if (result.booleanValue()) {
+                    Log.i(LOG_TAG, "showWfcWarningTask: showing ecall warning");
+                    mDigits.setHint(R.string.dial_emergency_calling_not_available);
+                } else {
+                    Log.i(LOG_TAG, "showWfcWarningTask: hiding ecall warning");
+                    mDigits.setHint("");
+                }
+                maybeChangeHintSize();
+            }
+        };
+        showWfcWarningTask.execute((Void) null);
+    }
+
+    /**
+     * Where a hint is applied and there are no digits dialed, disable autoresize of the dial digits
+     * edit view and set the font size to a smaller size appropriate for the emergency calling
+     * warning.
+     */
+    private void maybeChangeHintSize() {
+        if (TextUtils.isEmpty(mDigits.getHint())
+                || !TextUtils.isEmpty(mDigits.getText().toString())) {
+            // No hint or there are dialed digits, so use default size.
+            mDigits.setTextSize(TypedValue.COMPLEX_UNIT_SP, mDefaultDigitsTextSize);
+            // By default, the digits view auto-resizes to fit the text it contains, so
+            // enable that now.
+            mDigits.setResizeEnabled(true);
+            Log.i(LOG_TAG, "no hint - setting to " + mDigits.getScaledTextSize());
+        } else {
+            // Hint present and no dialed digits, set custom font size appropriate for the warning.
+            mDigits.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(
+                    R.dimen.emergency_call_warning_size));
+            // Since we're populating this with a static text string, disable auto-resize.
+            mDigits.setResizeEnabled(false);
+            Log.i(LOG_TAG, "hint - setting to " + mDigits.getScaledTextSize());
+        }
+    }
 }
diff --git a/src/com/android/phone/ErrorDialogActivity.java b/src/com/android/phone/ErrorDialogActivity.java
deleted file mode 100644
index bf09376..0000000
--- a/src/com/android/phone/ErrorDialogActivity.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.phone.settings.VoicemailSettingsActivity;
-
-/**
- * Used to display an error dialog from within the Telephony service when an outgoing call fails
- */
-public class ErrorDialogActivity extends Activity {
-    private static final String TAG = ErrorDialogActivity.class.getSimpleName();
-
-    public static final String SHOW_MISSING_VOICEMAIL_NO_DIALOG_EXTRA = "show_missing_voicemail";
-    public static final String ERROR_MESSAGE_ID_EXTRA = "error_message_id";
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        final boolean showVoicemailDialog = getIntent().getBooleanExtra(
-                SHOW_MISSING_VOICEMAIL_NO_DIALOG_EXTRA, false);
-
-        if (showVoicemailDialog) {
-            showMissingVoicemailErrorDialog();
-        } else {
-            final int error = getIntent().getIntExtra(ERROR_MESSAGE_ID_EXTRA, -1);
-            if (error == -1) {
-                Log.e(TAG, "ErrorDialogActivity called with no error type extra.");
-                finish();
-            }
-            showGenericErrorDialog(error);
-        }
-    }
-
-    private void showGenericErrorDialog(int resid) {
-        final CharSequence msg = getResources().getText(resid);
-
-        final DialogInterface.OnClickListener clickListener;
-
-        final DialogInterface.OnCancelListener cancelListener;
-        clickListener = new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int which) {
-                finish();
-            }
-        };
-        cancelListener = new DialogInterface.OnCancelListener() {
-            @Override
-            public void onCancel(DialogInterface dialog) {
-                finish();
-            }
-        };
-
-        final AlertDialog errorDialog = new AlertDialog.Builder(this)
-                .setMessage(msg).setPositiveButton(R.string.ok, clickListener)
-                        .setOnCancelListener(cancelListener).create();
-
-        errorDialog.show();
-    }
-
-    private void showMissingVoicemailErrorDialog() {
-        final AlertDialog missingVoicemailDialog = new AlertDialog.Builder(this)
-        .setTitle(R.string.no_vm_number)
-        .setMessage(R.string.no_vm_number_msg)
-        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialog, int which) {
-                    dontAddVoiceMailNumber();
-                }})
-        .setNegativeButton(R.string.add_vm_number_str, new DialogInterface.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialog, int which) {
-                    addVoiceMailNumberPanel(dialog);
-                }})
-        .setOnCancelListener(new DialogInterface.OnCancelListener() {
-                @Override
-                public void onCancel(DialogInterface dialog) {
-                    dontAddVoiceMailNumber();
-                }}).show();
-    }
-
-
-    private void addVoiceMailNumberPanel(DialogInterface dialog) {
-        if (dialog != null) {
-            dialog.dismiss();
-        }
-
-        // navigate to the Voicemail setting in the Call Settings activity.
-        Intent intent = new Intent(VoicemailSettingsActivity.ACTION_ADD_VOICEMAIL);
-        intent.setClass(this, VoicemailSettingsActivity.class);
-        startActivity(intent);
-        finish();
-    }
-
-    private void dontAddVoiceMailNumber() {
-        finish();
-    }
-}
diff --git a/src/com/android/phone/GsmUmtsCallBarringOptions.java b/src/com/android/phone/GsmUmtsCallBarringOptions.java
new file mode 100644
index 0000000..4b875ee
--- /dev/null
+++ b/src/com/android/phone/GsmUmtsCallBarringOptions.java
@@ -0,0 +1,536 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.app.ActionBar;
+import android.app.Dialog;
+import android.os.AsyncResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.Preference;
+import android.preference.PreferenceScreen;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+import com.android.internal.telephony.CommandException;
+import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.GsmCdmaPhone;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.imsphone.ImsPhone;
+import com.android.phone.settings.fdn.EditPinPreference;
+
+import java.util.ArrayList;
+
+/**
+ * Implements the preference to enable/disable calling barring options and
+ * the dialogs to change the passward.
+ */
+public class GsmUmtsCallBarringOptions extends TimeConsumingPreferenceActivity
+        implements EditPinPreference.OnPinEnteredListener {
+    private static final String LOG_TAG = "GsmUmtsCallBarringOptions";
+    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
+
+    // String keys for preference lookup
+    // Preference is handled solely in xml.
+    // Block all outgoing calls
+    private static final String BUTTON_BAOC_KEY = "button_baoc_key";
+    // Block all outgoing international calls
+    private static final String BUTTON_BAOIC_KEY = "button_baoic_key";
+    // Block all outgoing international roaming calls
+    private static final String BUTTON_BAOICxH_KEY = "button_baoicxh_key";
+    // Block all incoming calls
+    private static final String BUTTON_BAIC_KEY = "button_baic_key";
+    // Block all incoming international roaming calls
+    private static final String BUTTON_BAICr_KEY = "button_baicr_key";
+    // Disable all barring
+    private static final String BUTTON_BA_ALL_KEY = "button_ba_all_key";
+    // Change passward
+    private static final String BUTTON_BA_CHANGE_PW_KEY = "button_change_pw_key";
+
+    private static final String PW_CHANGE_STATE_KEY = "pin_change_state_key";
+    private static final String OLD_PW_KEY = "old_pw_key";
+    private static final String NEW_PW_KEY = "new_pw_key";
+    private static final String DIALOG_MESSAGE_KEY = "dialog_message_key";
+    private static final String DIALOG_PW_ENTRY_KEY = "dialog_pw_enter_key";
+    private static final String KEY_STATUS = "toggle";
+    private static final String PREFERENCE_ENABLED_KEY = "PREFERENCE_ENABLED";
+    private static final String PREFERENCE_SHOW_PASSWORD_KEY = "PREFERENCE_SHOW_PASSWORD";
+    private static final String SAVED_BEFORE_LOAD_COMPLETED_KEY = "PROGRESS_SHOWING";
+
+    private CallBarringEditPreference mButtonBAOC;
+    private CallBarringEditPreference mButtonBAOIC;
+    private CallBarringEditPreference mButtonBAOICxH;
+    private CallBarringEditPreference mButtonBAIC;
+    private CallBarringEditPreference mButtonBAICr;
+    private CallBarringDeselectAllPreference mButtonDisableAll;
+    private EditPinPreference mButtonChangePW;
+
+    // State variables
+    private int mPwChangeState;
+    private String mOldPassword;
+    private String mNewPassword;
+    private int mPwChangeDialogStrId;
+
+    private static final int PW_CHANGE_OLD = 0;
+    private static final int PW_CHANGE_NEW = 1;
+    private static final int PW_CHANGE_REENTER = 2;
+
+    private static final int BUSY_READING_DIALOG = 100;
+    private static final int BUSY_SAVING_DIALOG = 200;
+
+    // Password change complete event
+    private static final int EVENT_PW_CHANGE_COMPLETE = 100;
+    // Disable all complete event
+    private static final int EVENT_DISABLE_ALL_COMPLETE = 200;
+
+    private static final int PW_LENGTH = 4;
+
+    private Phone mPhone;
+    private ArrayList<CallBarringEditPreference> mPreferences =
+            new ArrayList<CallBarringEditPreference>();
+    private int mInitIndex = 0;
+    private boolean mFirstResume;
+    private Bundle mIcicle;
+
+    private SubscriptionInfoHelper mSubscriptionInfoHelper;
+    private Dialog mProgressDialog;
+
+    @Override
+    public void onPinEntered(EditPinPreference preference, boolean positiveResult) {
+        if (preference == mButtonChangePW) {
+            updatePWChangeState(positiveResult);
+        } else if (preference == mButtonDisableAll) {
+            disableAllBarring(positiveResult);
+        }
+    }
+
+    /**
+     * Display a toast for message.
+     */
+    private void displayMessage(int strId) {
+        Toast.makeText(this, getString(strId), Toast.LENGTH_SHORT).show();
+    }
+
+    /**
+     * Attempt to disable all for call barring settings.
+     */
+    private void disableAllBarring(boolean positiveResult) {
+        if (!positiveResult) {
+            // Return on cancel
+            return;
+        }
+
+        String password = null;
+        if (mButtonDisableAll.isPasswordShown()) {
+            password = mButtonDisableAll.getText();
+            // Validate the length of password first, before submitting it to the
+            // RIL for CB disable.
+            if (!validatePassword(password)) {
+                mButtonDisableAll.setText("");
+                displayMessage(R.string.call_barring_right_pwd_number);
+                return;
+            }
+        }
+
+        // Submit the disable all request
+        mButtonDisableAll.setText("");
+        Message onComplete = mHandler.obtainMessage(EVENT_DISABLE_ALL_COMPLETE);
+        mPhone.setCallBarring(CommandsInterface.CB_FACILITY_BA_ALL, false, password, onComplete, 0);
+        this.onStarted(mButtonDisableAll, false);
+    }
+
+    /**
+     * Attempt to change the password for call barring settings.
+     */
+    private void updatePWChangeState(boolean positiveResult) {
+        if (!positiveResult) {
+            // Reset the state on cancel
+            resetPwChangeState();
+            return;
+        }
+
+        // Progress through the dialog states, generally in this order:
+        // 1. Enter old password
+        // 2. Enter new password
+        // 3. Re-Enter new password
+        // In general, if any invalid entries are made, the dialog re-
+        // appears with text to indicate what the issue is.
+        switch (mPwChangeState) {
+            case PW_CHANGE_OLD:
+                mOldPassword = mButtonChangePW.getText();
+                mButtonChangePW.setText("");
+                if (validatePassword(mOldPassword)) {
+                    mPwChangeState = PW_CHANGE_NEW;
+                    displayPwChangeDialog();
+                } else {
+                    displayPwChangeDialog(R.string.call_barring_right_pwd_number, true);
+                }
+                break;
+            case PW_CHANGE_NEW:
+                mNewPassword = mButtonChangePW.getText();
+                mButtonChangePW.setText("");
+                if (validatePassword(mNewPassword)) {
+                    mPwChangeState = PW_CHANGE_REENTER;
+                    displayPwChangeDialog();
+                } else {
+                    displayPwChangeDialog(R.string.call_barring_right_pwd_number, true);
+                }
+                break;
+            case PW_CHANGE_REENTER:
+                // If the re-entered password is not valid, display a message
+                // and reset the state.
+                if (!mNewPassword.equals(mButtonChangePW.getText())) {
+                    mPwChangeState = PW_CHANGE_NEW;
+                    mButtonChangePW.setText("");
+                    displayPwChangeDialog(R.string.call_barring_pwd_not_match, true);
+                } else {
+                    // If the password is valid, then submit the change password request
+                    mButtonChangePW.setText("");
+                    Message onComplete = mHandler.obtainMessage(EVENT_PW_CHANGE_COMPLETE);
+                    ((GsmCdmaPhone) mPhone).changeCallBarringPassword(
+                            CommandsInterface.CB_FACILITY_BA_ALL,
+                            mOldPassword, mNewPassword, onComplete);
+                    this.onStarted(mButtonChangePW, false);
+                }
+                break;
+            default:
+                if (DBG) {
+                    Log.d(LOG_TAG, "updatePWChangeState: Unknown password change state: "
+                            + mPwChangeState);
+                }
+                break;
+        }
+    }
+
+    /**
+     * Handler for asynchronous replies from the framework layer.
+     */
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            AsyncResult ar = (AsyncResult) msg.obj;
+            switch (msg.what) {
+                // Handle the response message for password change from the framework layer.
+                case EVENT_PW_CHANGE_COMPLETE: {
+                    onFinished(mButtonChangePW, false);
+                    // Unsuccessful change, display a toast to user with failure reason.
+                    if (ar.exception != null) {
+                        if (DBG) {
+                            Log.d(LOG_TAG,
+                                    "change password for call barring failed with exception: "
+                                            + ar.exception);
+                        }
+                        onException(mButtonChangePW, (CommandException) ar.exception);
+                        mButtonChangePW.setEnabled(true);
+                    } else if (ar.userObj instanceof Throwable) {
+                        onError(mButtonChangePW, RESPONSE_ERROR);
+                    } else {
+                        // Successful change.
+                        displayMessage(R.string.call_barring_change_pwd_success);
+                    }
+                    resetPwChangeState();
+                    break;
+                }
+                // When disabling all call barring, either fail and display a toast,
+                // or just update the UI.
+                case EVENT_DISABLE_ALL_COMPLETE: {
+                    onFinished(mButtonDisableAll, false);
+                    if (ar.exception != null) {
+                        if (DBG) {
+                            Log.d(LOG_TAG, "can not disable all call barring with exception: "
+                                    + ar.exception);
+                        }
+                        onException(mButtonDisableAll, (CommandException) ar.exception);
+                        mButtonDisableAll.setEnabled(true);
+                    } else if (ar.userObj instanceof Throwable) {
+                        onError(mButtonDisableAll, RESPONSE_ERROR);
+                    } else {
+                        // Reset to normal behaviour on successful change.
+                        displayMessage(R.string.call_barring_deactivate_success);
+                        resetCallBarringPrefState(false);
+                    }
+                    break;
+                }
+                default: {
+                    if (DBG) {
+                        Log.d(LOG_TAG, "Unknown message id: " + msg.what);
+                    }
+                    break;
+                }
+            }
+        }
+    };
+
+    /**
+     * The next two functions are for updating the message field on the dialog.
+     */
+    private void displayPwChangeDialog() {
+        displayPwChangeDialog(0, true);
+    }
+
+    private void displayPwChangeDialog(int strId, boolean shouldDisplay) {
+        int msgId = 0;
+        switch (mPwChangeState) {
+            case PW_CHANGE_OLD:
+                msgId = R.string.call_barring_old_pwd;
+                break;
+            case PW_CHANGE_NEW:
+                msgId = R.string.call_barring_new_pwd;
+                break;
+            case PW_CHANGE_REENTER:
+                msgId = R.string.call_barring_confirm_pwd;
+                break;
+            default:
+                break;
+        }
+
+        // Append the note/additional message, if needed.
+        if (strId != 0) {
+            mButtonChangePW.setDialogMessage(getText(msgId) + "\n" + getText(strId));
+        } else {
+            mButtonChangePW.setDialogMessage(msgId);
+        }
+
+        // Only display if requested.
+        if (shouldDisplay) {
+            mButtonChangePW.showPinDialog();
+        }
+        mPwChangeDialogStrId = strId;
+    }
+
+    /**
+     * Reset the state of the password change dialog.
+     */
+    private void resetPwChangeState() {
+        mPwChangeState = PW_CHANGE_OLD;
+        displayPwChangeDialog(0, false);
+        mOldPassword = "";
+        mNewPassword = "";
+    }
+
+    /**
+     * Reset the state of the all call barring setting to disable.
+     */
+    private void resetCallBarringPrefState(boolean enable) {
+        for (CallBarringEditPreference pref : mPreferences) {
+            pref.mIsActivated = enable;
+            pref.updateSummaryText();
+        }
+    }
+
+    /**
+     * Validate the password entry.
+     *
+     * @param password This is the password to validate
+     */
+    private boolean validatePassword(String password) {
+        return password != null && password.length() == PW_LENGTH;
+    }
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        if (DBG) {
+            Log.d(LOG_TAG, "onCreate, reading callbarring_options.xml file");
+        }
+        addPreferencesFromResource(R.xml.callbarring_options);
+
+        mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent());
+        mPhone = mSubscriptionInfoHelper.getPhone();
+        if (DBG) {
+            Log.d(LOG_TAG, "onCreate, reading callbarring_options.xml file finished!");
+        }
+
+        // Get UI object references
+        PreferenceScreen prefSet = getPreferenceScreen();
+        mButtonBAOC = (CallBarringEditPreference) prefSet.findPreference(BUTTON_BAOC_KEY);
+        mButtonBAOIC = (CallBarringEditPreference) prefSet.findPreference(BUTTON_BAOIC_KEY);
+        mButtonBAOICxH = (CallBarringEditPreference) prefSet.findPreference(BUTTON_BAOICxH_KEY);
+        mButtonBAIC = (CallBarringEditPreference) prefSet.findPreference(BUTTON_BAIC_KEY);
+        mButtonBAICr = (CallBarringEditPreference) prefSet.findPreference(BUTTON_BAICr_KEY);
+        mButtonDisableAll = (CallBarringDeselectAllPreference)
+                prefSet.findPreference(BUTTON_BA_ALL_KEY);
+        mButtonChangePW = (EditPinPreference) prefSet.findPreference(BUTTON_BA_CHANGE_PW_KEY);
+
+        // Assign click listener and update state
+        mButtonBAOC.setOnPinEnteredListener(this);
+        mButtonBAOIC.setOnPinEnteredListener(this);
+        mButtonBAOICxH.setOnPinEnteredListener(this);
+        mButtonBAIC.setOnPinEnteredListener(this);
+        mButtonBAICr.setOnPinEnteredListener(this);
+        mButtonDisableAll.setOnPinEnteredListener(this);
+        mButtonChangePW.setOnPinEnteredListener(this);
+
+        // Store CallBarringEditPreferencence objects in array list.
+        mPreferences.add(mButtonBAOC);
+        mPreferences.add(mButtonBAOIC);
+        mPreferences.add(mButtonBAOICxH);
+        mPreferences.add(mButtonBAIC);
+        mPreferences.add(mButtonBAICr);
+
+        // Find out if password is currently used.
+        boolean usePassword = true;
+        boolean useDisableaAll = true;
+
+        ImsPhone imsPhone = mPhone != null ? (ImsPhone) mPhone.getImsPhone() : null;
+        if (imsPhone != null
+                && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)
+                        || imsPhone.isUtEnabled())) {
+            usePassword = false;
+            useDisableaAll = false;
+        }
+
+        // Find out if the sim card is ready.
+        boolean isSimReady = TelephonyManager.from(this).getSimState(
+                SubscriptionManager.getSlotIndex(mPhone.getSubId()))
+                        == TelephonyManager.SIM_STATE_READY;
+
+        // Deactivate all option is unavailable when sim card is not ready or Ut is enabled.
+        if (isSimReady && useDisableaAll) {
+            mButtonDisableAll.setEnabled(true);
+            mButtonDisableAll.init(mPhone);
+        } else {
+            mButtonDisableAll.setEnabled(false);
+        }
+
+        // Change password option is unavailable when sim card is not ready or when the password is
+        // not used.
+        if (isSimReady && usePassword) {
+            mButtonChangePW.setEnabled(true);
+        } else {
+            mButtonChangePW.setEnabled(false);
+            mButtonChangePW.setSummary(R.string.call_barring_change_pwd_description_disabled);
+        }
+
+        // Wait to do the initialization until onResume so that the TimeConsumingPreferenceActivity
+        // dialog can display as it relies on onResume / onPause to maintain its foreground state.
+        mFirstResume = true;
+        mIcicle = icicle;
+
+        ActionBar actionBar = getActionBar();
+        if (actionBar != null) {
+            // android.R.id.home will be triggered in onOptionsItemSelected()
+            actionBar.setDisplayHomeAsUpEnabled(true);
+        }
+
+        if (mIcicle != null && !mIcicle.getBoolean(SAVED_BEFORE_LOAD_COMPLETED_KEY)) {
+            if (DBG) {
+                Log.d(LOG_TAG, "restore stored states");
+            }
+            mInitIndex = mPreferences.size();
+
+            for (CallBarringEditPreference pref : mPreferences) {
+                Bundle bundle = mIcicle.getParcelable(pref.getKey());
+                if (bundle != null) {
+                    pref.handleCallBarringResult(bundle.getBoolean(KEY_STATUS));
+                    pref.init(this, true, mPhone);
+                    pref.setEnabled(bundle.getBoolean(PREFERENCE_ENABLED_KEY, pref.isEnabled()));
+                    pref.setInputMethodNeeded(bundle.getBoolean(PREFERENCE_SHOW_PASSWORD_KEY,
+                            pref.needInputMethod()));
+                }
+            }
+            mPwChangeState = mIcicle.getInt(PW_CHANGE_STATE_KEY);
+            mOldPassword = mIcicle.getString(OLD_PW_KEY);
+            mNewPassword = mIcicle.getString(NEW_PW_KEY);
+            displayPwChangeDialog(mIcicle.getInt(DIALOG_MESSAGE_KEY, mPwChangeDialogStrId), false);
+            mButtonChangePW.setText(mIcicle.getString(DIALOG_PW_ENTRY_KEY));
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        if (mFirstResume) {
+            if (mIcicle == null || mIcicle.getBoolean(SAVED_BEFORE_LOAD_COMPLETED_KEY)) {
+                if (DBG) {
+                    Log.d(LOG_TAG, "onResume: start to init ");
+                }
+                resetPwChangeState();
+                mPreferences.get(mInitIndex).init(this, false, mPhone);
+
+                // Request removing BUSY_SAVING_DIALOG because reading is restarted.
+                // (If it doesn't exist, nothing happen.)
+                removeDialog(BUSY_SAVING_DIALOG);
+            }
+            mFirstResume = false;
+            mIcicle = null;
+        }
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+
+        for (CallBarringEditPreference pref : mPreferences) {
+            Bundle bundle = new Bundle();
+            bundle.putBoolean(KEY_STATUS, pref.mIsActivated);
+            bundle.putBoolean(PREFERENCE_ENABLED_KEY, pref.isEnabled());
+            bundle.putBoolean(PREFERENCE_SHOW_PASSWORD_KEY, pref.needInputMethod());
+            outState.putParcelable(pref.getKey(), bundle);
+        }
+        outState.putInt(PW_CHANGE_STATE_KEY, mPwChangeState);
+        outState.putString(OLD_PW_KEY, mOldPassword);
+        outState.putString(NEW_PW_KEY, mNewPassword);
+        outState.putInt(DIALOG_MESSAGE_KEY, mPwChangeDialogStrId);
+        outState.putString(DIALOG_PW_ENTRY_KEY, mButtonChangePW.getText());
+
+        outState.putBoolean(SAVED_BEFORE_LOAD_COMPLETED_KEY,
+                mProgressDialog != null && mProgressDialog.isShowing());
+    }
+
+    /**
+     * Finish initialization of this preference and start next.
+     *
+     * @param preference The preference.
+     * @param reading If true to dismiss the busy reading dialog,
+     *                false to dismiss the busy saving dialog.
+     */
+    public void onFinished(Preference preference, boolean reading) {
+        if (mInitIndex < mPreferences.size() - 1 && !isFinishing()) {
+            mInitIndex++;
+            mPreferences.get(mInitIndex).init(this, false, mPhone);
+        }
+        super.onFinished(preference, reading);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        final int itemId = item.getItemId();
+        if (itemId == android.R.id.home) {
+            CallFeaturesSetting.goUpToTopLevelSetting(this, mSubscriptionInfoHelper);
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
+        super.onPrepareDialog(id, dialog, args);
+        if (id == BUSY_READING_DIALOG || id == BUSY_SAVING_DIALOG) {
+            // For onSaveInstanceState, treat the SAVING dialog as the same as the READING. As
+            // the result, if the activity is recreated while waiting for SAVING, it starts reading
+            // all the newest data.
+            mProgressDialog = dialog;
+        }
+    }
+}
diff --git a/src/com/android/phone/GsmUmtsCallForwardOptions.java b/src/com/android/phone/GsmUmtsCallForwardOptions.java
index 5a16edc..77cc6cc 100644
--- a/src/com/android/phone/GsmUmtsCallForwardOptions.java
+++ b/src/com/android/phone/GsmUmtsCallForwardOptions.java
@@ -10,6 +10,7 @@
 import android.os.Bundle;
 import android.preference.Preference;
 import android.preference.PreferenceScreen;
+import android.telephony.CarrierConfigManager;
 import android.util.Log;
 import android.view.MenuItem;
 
@@ -18,7 +19,6 @@
 
 public class GsmUmtsCallForwardOptions extends TimeConsumingPreferenceActivity {
     private static final String LOG_TAG = "GsmUmtsCallForwardOptions";
-    private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
 
     private static final String NUM_PROJECTION[] = {
         android.provider.ContactsContract.CommonDataKinds.Phone.NUMBER
@@ -46,6 +46,7 @@
     private Bundle mIcicle;
     private Phone mPhone;
     private SubscriptionInfoHelper mSubscriptionInfoHelper;
+    private boolean mReplaceInvalidCFNumbers;
 
     @Override
     protected void onCreate(Bundle icicle) {
@@ -58,6 +59,13 @@
                 getActionBar(), getResources(), R.string.call_forwarding_settings_with_label);
         mPhone = mSubscriptionInfoHelper.getPhone();
 
+        CarrierConfigManager carrierConfig = (CarrierConfigManager)
+                getSystemService(CARRIER_CONFIG_SERVICE);
+        if (carrierConfig != null) {
+            mReplaceInvalidCFNumbers = carrierConfig.getConfig().getBoolean(
+                    CarrierConfigManager.KEY_CALL_FORWARDING_MAP_NON_NUMBER_TO_VOICEMAIL_BOOL);
+        }
+
         PreferenceScreen prefSet = getPreferenceScreen();
         mButtonCFU = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFU_KEY);
         mButtonCFB = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFB_KEY);
@@ -94,8 +102,8 @@
 
         if (mFirstResume) {
             if (mIcicle == null) {
-                if (DBG) Log.d(LOG_TAG, "start to init ");
-                mPreferences.get(mInitIndex).init(this, false, mPhone);
+                Log.d(LOG_TAG, "start to init ");
+                mPreferences.get(mInitIndex).init(this, false, mPhone, mReplaceInvalidCFNumbers);
             } else {
                 mInitIndex = mPreferences.size();
 
@@ -106,7 +114,7 @@
                     cf.number = bundle.getString(KEY_NUMBER);
                     cf.status = bundle.getInt(KEY_STATUS);
                     pref.handleCallForwardResult(cf);
-                    pref.init(this, true, mPhone);
+                    pref.init(this, true, mPhone, mReplaceInvalidCFNumbers);
                 }
             }
             mFirstResume = false;
@@ -133,7 +141,7 @@
     public void onFinished(Preference preference, boolean reading) {
         if (mInitIndex < mPreferences.size()-1 && !isFinishing()) {
             mInitIndex++;
-            mPreferences.get(mInitIndex).init(this, false, mPhone);
+            mPreferences.get(mInitIndex).init(this, false, mPhone, mReplaceInvalidCFNumbers);
         }
 
         super.onFinished(preference, reading);
@@ -141,9 +149,9 @@
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (DBG) Log.d(LOG_TAG, "onActivityResult: done");
+        Log.d(LOG_TAG, "onActivityResult: done");
         if (resultCode != RESULT_OK) {
-            if (DBG) Log.d(LOG_TAG, "onActivityResult: contact picker result not OK.");
+            Log.d(LOG_TAG, "onActivityResult: contact picker result not OK.");
             return;
         }
         Cursor cursor = null;
@@ -151,7 +159,7 @@
             cursor = getContentResolver().query(data.getData(),
                 NUM_PROJECTION, null, null, null);
             if ((cursor == null) || (!cursor.moveToFirst())) {
-                if (DBG) Log.d(LOG_TAG, "onActivityResult: bad contact data, no results found.");
+                Log.d(LOG_TAG, "onActivityResult: bad contact data, no results found.");
                 return;
             }
 
diff --git a/src/com/android/phone/GsmUmtsCallOptions.java b/src/com/android/phone/GsmUmtsCallOptions.java
index 419e72c..3b27d28 100644
--- a/src/com/android/phone/GsmUmtsCallOptions.java
+++ b/src/com/android/phone/GsmUmtsCallOptions.java
@@ -17,10 +17,12 @@
 package com.android.phone;
 
 import android.os.Bundle;
+import android.os.PersistableBundle;
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
+import android.telephony.CarrierConfigManager;
 import android.view.MenuItem;
 
 import com.android.internal.telephony.Phone;
@@ -31,6 +33,7 @@
     private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
 
     private static final String CALL_FORWARDING_KEY = "call_forwarding_key";
+    private static final String CALL_BARRING_KEY = "call_barring_key";
     private static final String ADDITIONAL_GSM_SETTINGS_KEY = "additional_gsm_call_settings_key";
 
     @Override
@@ -68,5 +71,18 @@
                 prefScreen.findPreference(ADDITIONAL_GSM_SETTINGS_KEY);
         additionalGsmSettingsPref.setIntent(
                 subInfoHelper.getIntent(GsmUmtsAdditionalCallOptions.class));
+
+        Preference callBarringPref = prefScreen.findPreference(CALL_BARRING_KEY);
+        PersistableBundle b = null;
+        if (subInfoHelper.hasSubId()) {
+            b = PhoneGlobals.getInstance().getCarrierConfigForSubId(subInfoHelper.getSubId());
+        } else {
+            b = PhoneGlobals.getInstance().getCarrierConfig();
+        }
+        if (b != null && b.getBoolean(CarrierConfigManager.KEY_CALL_BARRING_VISIBILITY_BOOL)) {
+            callBarringPref.setIntent(subInfoHelper.getIntent(GsmUmtsCallBarringOptions.class));
+        } else {
+            prefScreen.removePreference(callBarringPref);
+        }
     }
 }
diff --git a/src/com/android/phone/GsmUmtsOptions.java b/src/com/android/phone/GsmUmtsOptions.java
index 70ba4af..220cf34 100644
--- a/src/com/android/phone/GsmUmtsOptions.java
+++ b/src/com/android/phone/GsmUmtsOptions.java
@@ -17,17 +17,18 @@
 package com.android.phone;
 
 import android.content.Intent;
-import android.content.res.Resources;
 import android.os.PersistableBundle;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceScreen;
 import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
-import android.content.ComponentName;
 
+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;
+import com.android.settingslib.RestrictedLockUtils;
 
 /**
  * List of Network-specific settings screens.
@@ -35,40 +36,50 @@
 public class GsmUmtsOptions {
     private static final String LOG_TAG = "GsmUmtsOptions";
 
-    private PreferenceScreen mButtonAPNExpand;
-    private PreferenceScreen mButtonOperatorSelectionExpand;
+    private RestrictedPreference mButtonAPNExpand;
+    private Preference mCategoryAPNExpand;
+    Preference mCarrierSettingPref;
 
-    private static final String BUTTON_APN_EXPAND_KEY = "button_apn_key";
-    private static final String BUTTON_OPERATOR_SELECTION_EXPAND_KEY = "button_carrier_sel_key";
+    private NetworkOperators mNetworkOperator;
+
+    private static final String BUTTON_APN_EXPAND_KEY = "button_gsm_apn_key";
+    private static final String CATEGORY_APN_EXPAND_KEY = "category_gsm_apn_key";
     private static final String BUTTON_CARRIER_SETTINGS_KEY = "carrier_settings_key";
+
     public static final String EXTRA_SUB_ID = "sub_id";
     private PreferenceFragment mPrefFragment;
     private PreferenceScreen mPrefScreen;
-    private int mSubId;
 
     public GsmUmtsOptions(PreferenceFragment prefFragment, PreferenceScreen prefScreen,
-            final int subId) {
+            final int subId, INetworkQueryService queryService) {
         mPrefFragment = prefFragment;
         mPrefScreen = prefScreen;
-        mSubId = subId;
-        create();
+        mPrefFragment.addPreferencesFromResource(R.xml.gsm_umts_options);
+        mButtonAPNExpand = (RestrictedPreference) mPrefScreen.findPreference(BUTTON_APN_EXPAND_KEY);
+        mCategoryAPNExpand = mPrefScreen.findPreference(CATEGORY_APN_EXPAND_KEY);
+        mNetworkOperator = (NetworkOperators) mPrefScreen
+                .findPreference(NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY);
+        mCarrierSettingPref = mPrefScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
+
+        mNetworkOperator.initialize();
+
+        update(subId, queryService);
     }
 
-    protected void create() {
-        mPrefFragment.addPreferencesFromResource(R.xml.gsm_umts_options);
-        mButtonAPNExpand = (PreferenceScreen) mPrefScreen.findPreference(BUTTON_APN_EXPAND_KEY);
-        boolean removedAPNExpand = false;
-        mButtonOperatorSelectionExpand =
-                (PreferenceScreen) mPrefScreen.findPreference(BUTTON_OPERATOR_SELECTION_EXPAND_KEY);
+    // Unlike mPrefFragment or mPrefScreen, subId or queryService may change during lifecycle of
+    // GsmUmtsOptions. When that happens, we update GsmUmtsOptions with new parameters.
+    protected void update(final int subId, INetworkQueryService queryService) {
+        boolean addAPNExpand = true;
+        boolean addNetworkOperatorsCategory = true;
+        boolean addCarrierSettings = true;
         if (PhoneFactory.getDefaultPhone().getPhoneType() != PhoneConstants.PHONE_TYPE_GSM) {
             log("Not a GSM phone");
-            mButtonAPNExpand.setEnabled(false);
-            mButtonOperatorSelectionExpand.setEnabled(false);
+            mCategoryAPNExpand.setEnabled(false);
+            mNetworkOperator.setEnabled(false);
         } else {
             log("Not a CDMA phone");
-            Resources res = mPrefFragment.getResources();
             PersistableBundle carrierConfig =
-                    PhoneGlobals.getInstance().getCarrierConfigForSubId(mSubId);
+                    PhoneGlobals.getInstance().getCarrierConfigForSubId(subId);
 
             // Determine which options to display. For GSM these are defaulted to true in
             // CarrierConfigManager, but they maybe overriden by DefaultCarrierConfigService or a
@@ -76,73 +87,76 @@
             // Note: these settings used to be controlled with overlays in
             // Telephony/res/values/config.xml
             if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_APN_EXPAND_BOOL)
-                    && mButtonAPNExpand != null) {
-                mPrefScreen.removePreference(mButtonAPNExpand);
-                removedAPNExpand = true;
+                    && mCategoryAPNExpand != null) {
+                addAPNExpand = false;
             }
             if (!carrierConfig.getBoolean(
                     CarrierConfigManager.KEY_OPERATOR_SELECTION_EXPAND_BOOL)) {
-                mPrefScreen.removePreference(mPrefScreen
-                        .findPreference(BUTTON_OPERATOR_SELECTION_EXPAND_KEY));
+                addNetworkOperatorsCategory = false;
             }
 
             if (carrierConfig.getBoolean(CarrierConfigManager.KEY_CSP_ENABLED_BOOL)) {
                 if (PhoneFactory.getDefaultPhone().isCspPlmnEnabled()) {
                     log("[CSP] Enabling Operator Selection menu.");
-                    mButtonOperatorSelectionExpand.setEnabled(true);
+                    mNetworkOperator.setEnabled(true);
                 } else {
                     log("[CSP] Disabling Operator Selection menu.");
-                    mPrefScreen.removePreference(mPrefScreen
-                          .findPreference(BUTTON_OPERATOR_SELECTION_EXPAND_KEY));
+                    addNetworkOperatorsCategory = false;
                 }
             }
 
             // Read platform settings for carrier settings
-            final boolean isCarrierSettingsEnabled = carrierConfig.getBoolean(
-                CarrierConfigManager.KEY_CARRIER_SETTINGS_ENABLE_BOOL);
-            if (!isCarrierSettingsEnabled) {
-                Preference pref = mPrefScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
-                if (pref != null) {
-                    mPrefScreen.removePreference(pref);
-                }
-            }
+            addCarrierSettings = carrierConfig.getBoolean(
+                    CarrierConfigManager.KEY_CARRIER_SETTINGS_ENABLE_BOOL);
         }
-        if (!removedAPNExpand) {
+
+        // Making no assumptions of whether they are added or removed at this point.
+        // Calling add or remove explicitly to make sure they are updated.
+
+        if (addAPNExpand) {
+            mButtonAPNExpand.setDisabledByAdmin(
+                    MobileNetworkSettings.isDpcApnEnforced(mButtonAPNExpand.getContext())
+                            ? RestrictedLockUtils.getDeviceOwner(mButtonAPNExpand.getContext())
+                            : null);
             mButtonAPNExpand.setOnPreferenceClickListener(
                     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
                             final Intent intent = new Intent(Settings.ACTION_APN_SETTINGS);
                             // This will setup the Home and Search affordance
                             intent.putExtra(":settings:show_fragment_as_subsetting", true);
-                            intent.putExtra(EXTRA_SUB_ID, mSubId);
+                            intent.putExtra(EXTRA_SUB_ID, subId);
                             mPrefFragment.startActivity(intent);
                             return true;
                         }
-            });
+                    });
+            mPrefScreen.addPreference(mCategoryAPNExpand);
+        } else {
+            mPrefScreen.removePreference(mCategoryAPNExpand);
         }
-        if (mPrefScreen.findPreference(BUTTON_OPERATOR_SELECTION_EXPAND_KEY) != null) {
-            mButtonOperatorSelectionExpand.setOnPreferenceClickListener(
-                    new Preference.OnPreferenceClickListener() {
-                        @Override
-                        public boolean onPreferenceClick(Preference preference) {
-                            final Intent intent = new Intent(Intent.ACTION_MAIN);
-                            intent.setComponent(new ComponentName("com.android.phone",
-                                    "com.android.phone.NetworkSetting"));
-                            intent.putExtra(EXTRA_SUB_ID, mSubId);
-                            mPrefFragment.startActivity(intent);
-                            return true;
-                        }
-            });
+
+        if (addNetworkOperatorsCategory) {
+            mPrefScreen.addPreference(mNetworkOperator);
+            mNetworkOperator.update(subId, queryService);
+        } else {
+            mPrefScreen.removePreference(mNetworkOperator);
         }
+
+        if (addCarrierSettings) {
+            mPrefScreen.addPreference(mCarrierSettingPref);
+        } else {
+            mPrefScreen.removePreference(mCarrierSettingPref);
+        }
+
     }
 
-    public boolean preferenceTreeClick(Preference preference) {
-        log("preferenceTreeClick: return false");
-        return false;
+    protected boolean preferenceTreeClick(Preference preference) {
+        return mNetworkOperator.preferenceTreeClick(preference);
     }
 
     protected void log(String s) {
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/IccNetworkDepersonalizationPanel.java b/src/com/android/phone/IccNetworkDepersonalizationPanel.java
index 9dff461..8bd10a2 100644
--- a/src/com/android/phone/IccNetworkDepersonalizationPanel.java
+++ b/src/com/android/phone/IccNetworkDepersonalizationPanel.java
@@ -74,7 +74,7 @@
     /**
      * Shows the network depersonalization dialog, but only if it is not already visible.
      */
-    public static void showDialog() {
+    public static void showDialog(Phone phone) {
         if (sShowingDialog) {
             Log.i(TAG, "[IccNetworkDepersonalizationPanel] - showDialog; skipped already shown.");
             return;
@@ -82,7 +82,7 @@
         Log.i(TAG, "[IccNetworkDepersonalizationPanel] - showDialog; showing dialog.");
         sShowingDialog = true;
         IccNetworkDepersonalizationPanel ndpPanel =
-                new IccNetworkDepersonalizationPanel(PhoneGlobals.getInstance());
+                new IccNetworkDepersonalizationPanel(PhoneGlobals.getInstance(), phone);
         ndpPanel.show();
     }
 
@@ -133,6 +133,13 @@
     //constructor
     public IccNetworkDepersonalizationPanel(Context context) {
         super(context);
+        mPhone = PhoneGlobals.getPhone();
+    }
+
+    //constructor
+    public IccNetworkDepersonalizationPanel(Context context, Phone phone) {
+        super(context);
+        mPhone = phone == null ? PhoneGlobals.getPhone() : phone;
     }
 
     @Override
@@ -172,8 +179,6 @@
         //status panel is used since we're having problems with the alert dialog.
         mStatusPanel = (LinearLayout) findViewById(R.id.status_panel);
         mStatusText = (TextView) findViewById(R.id.status_text);
-
-        mPhone = PhoneGlobals.getPhone();
     }
 
     @Override
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/MMIDialogActivity.java b/src/com/android/phone/MMIDialogActivity.java
index 4afa6be..c9be2ac 100644
--- a/src/com/android/phone/MMIDialogActivity.java
+++ b/src/com/android/phone/MMIDialogActivity.java
@@ -25,7 +25,6 @@
 import android.os.Message;
 import android.telephony.SubscriptionManager;
 import android.util.Log;
-import android.widget.Toast;
 
 import com.android.internal.telephony.CallManager;
 import com.android.internal.telephony.MmiCode;
@@ -56,6 +55,11 @@
         int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
                 SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
         mPhone = PhoneGlobals.getPhone(subId);
+        if (mPhone == null) {
+            Log.w(TAG, "onCreate: invalid subscription id (" + subId + ") lead to null"
+                    + " Phone.");
+            finish();
+        }
         mHandler = new Handler() {
                 @Override
                 public void handleMessage(Message msg) {
diff --git a/src/com/android/phone/MobileDataPreference.java b/src/com/android/phone/MobileDataPreference.java
new file mode 100644
index 0000000..38d700e
--- /dev/null
+++ b/src/com/android/phone/MobileDataPreference.java
@@ -0,0 +1,314 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.preference.DialogPreference;
+import android.preference.PreferenceScreen;
+import android.provider.Settings.Global;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.AttributeSet;
+import android.util.Log;
+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;
+
+/**
+ * Customized Preference to enable / disable mobile data.
+ * Basically copy of with com.android.settings.CellDataPreference.
+ */
+public class MobileDataPreference extends DialogPreference {
+
+    private static final boolean DBG = false;
+    private static final String TAG = "MobileDataPreference";
+
+    public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+    public boolean mChecked;
+    public boolean mMultiSimDialog;
+    private TelephonyManager mTelephonyManager;
+    private SubscriptionManager mSubscriptionManager;
+
+    public MobileDataPreference(Context context, AttributeSet attrs) {
+        super(context, attrs, com.android.internal.R.attr.switchPreferenceStyle);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Parcelable s) {
+        CellDataState state = (CellDataState) s;
+        super.onRestoreInstanceState(state.getSuperState());
+        mTelephonyManager = TelephonyManager.from(getContext());
+        mChecked = state.mChecked;
+        mMultiSimDialog = state.mMultiSimDialog;
+        if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            mSubId = state.mSubId;
+            setKey(getKey() + mSubId);
+        }
+        notifyChanged();
+    }
+
+    @Override
+    protected Parcelable onSaveInstanceState() {
+        CellDataState state = new CellDataState(super.onSaveInstanceState());
+        state.mChecked = mChecked;
+        state.mMultiSimDialog = mMultiSimDialog;
+        state.mSubId = mSubId;
+        return state;
+    }
+
+    @Override
+    protected void onAttachedToActivity() {
+        super.onAttachedToActivity();
+        mListener.setListener(true, mSubId, getContext());
+    }
+
+    @Override
+    protected void onPrepareForRemoval() {
+        mListener.setListener(false, mSubId, getContext());
+        super.onPrepareForRemoval();
+    }
+
+    /**
+     * Initialize this preference with subId.
+     */
+    public void initialize(int subId) {
+        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            throw new IllegalArgumentException("MobileDataPreference needs a SubscriptionInfo");
+        }
+        mSubscriptionManager = SubscriptionManager.from(getContext());
+        mTelephonyManager = TelephonyManager.from(getContext());
+        if (mSubId != subId) {
+            mSubId = subId;
+            setKey(getKey() + subId);
+        }
+        updateChecked();
+    }
+
+    private void updateChecked() {
+        setChecked(mTelephonyManager.getDataEnabled(mSubId));
+    }
+
+    @Override
+    public void performClick(PreferenceScreen preferenceScreen) {
+        if (!isEnabled() || !SubscriptionManager.isValidSubscriptionId(mSubId)) {
+            return;
+        }
+        final SubscriptionInfo currentSir = mSubscriptionManager.getActiveSubscriptionInfo(
+                mSubId);
+        final SubscriptionInfo nextSir = mSubscriptionManager.getDefaultDataSubscriptionInfo();
+        boolean isMultiSim = (mTelephonyManager.getSimCount() > 1);
+        if (mChecked) {
+            // If the device is single SIM or is enabling data on the active data SIM then forgo
+            // the pop-up.
+            if (isMultiSim || (nextSir != null && currentSir != null
+                    && currentSir.getSubscriptionId() == nextSir.getSubscriptionId())) {
+                setMobileDataEnabled(false);
+                if (nextSir != null && currentSir != null
+                        && currentSir.getSubscriptionId() == nextSir.getSubscriptionId()) {
+                    disableDataForOtherSubscriptions(mSubId);
+                }
+                return;
+            }
+            // disabling data; show confirmation dialog which eventually
+            // calls setMobileDataEnabled() once user confirms.
+            mMultiSimDialog = false;
+            super.performClick(preferenceScreen);
+        } else {
+            // If we are showing the Sim Card tile then we are a Multi-Sim device.
+            if (isMultiSim) {
+                mMultiSimDialog = true;
+                if (nextSir != null && currentSir != null
+                        && currentSir.getSubscriptionId() == nextSir.getSubscriptionId()) {
+                    setMobileDataEnabled(true);
+                    disableDataForOtherSubscriptions(mSubId);
+                    return;
+                }
+                super.performClick(preferenceScreen);
+            } else {
+                setMobileDataEnabled(true);
+            }
+        }
+    }
+
+    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);
+    }
+
+    private void setChecked(boolean checked) {
+        if (mChecked == checked) return;
+        mChecked = checked;
+        notifyChanged();
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+        View checkableView = view.findViewById(com.android.internal.R.id.switch_widget);
+        checkableView.setClickable(false);
+        ((Checkable) checkableView).setChecked(mChecked);
+    }
+
+    @Override
+    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+        if (mMultiSimDialog) {
+            showMultiSimDialog(builder);
+        } else {
+            showDisableDialog(builder);
+        }
+    }
+
+    private void showDisableDialog(AlertDialog.Builder builder) {
+        builder.setTitle(null)
+                .setMessage(R.string.data_usage_disable_mobile)
+                .setPositiveButton(android.R.string.ok, this)
+                .setNegativeButton(android.R.string.cancel, null);
+    }
+
+    private void showMultiSimDialog(AlertDialog.Builder builder) {
+        final SubscriptionInfo currentSir = mSubscriptionManager.getActiveSubscriptionInfo(mSubId);
+        final SubscriptionInfo nextSir = mSubscriptionManager.getDefaultDataSubscriptionInfo();
+
+        final String previousName = (nextSir == null)
+                ? getContext().getResources().getString(R.string.sim_selection_required_pref)
+                : nextSir.getDisplayName().toString();
+
+        builder.setTitle(R.string.sim_change_data_title);
+        builder.setMessage(getContext().getString(R.string.sim_change_data_message,
+                String.valueOf(currentSir != null ? currentSir.getDisplayName() : null),
+                previousName));
+
+        builder.setPositiveButton(R.string.ok, this);
+        builder.setNegativeButton(R.string.cancel, null);
+    }
+
+    private void disableDataForOtherSubscriptions(int subId) {
+        List<SubscriptionInfo> subInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();
+        if (subInfoList != null) {
+            for (SubscriptionInfo subInfo : subInfoList) {
+                if (subInfo.getSubscriptionId() != subId) {
+                    mTelephonyManager.setDataEnabled(subInfo.getSubscriptionId(), false);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        if (which != DialogInterface.BUTTON_POSITIVE) {
+            return;
+        }
+        if (mMultiSimDialog) {
+            mSubscriptionManager.setDefaultDataSubId(mSubId);
+            setMobileDataEnabled(true);
+            disableDataForOtherSubscriptions(mSubId);
+        } else {
+            // TODO: extend to modify policy enabled flag.
+            setMobileDataEnabled(false);
+        }
+    }
+
+    private final DataStateListener mListener = new DataStateListener() {
+        @Override
+        public void onChange(boolean selfChange) {
+            updateChecked();
+        }
+    };
+
+    /**
+     * Listener that listens mobile data state change.
+     */
+    public abstract static class DataStateListener extends ContentObserver {
+        public DataStateListener() {
+            super(new Handler(Looper.getMainLooper()));
+        }
+
+        /**
+         * Set / Unset data state listening, specifying subId.
+         */
+        public void setListener(boolean listening, int subId, Context context) {
+            if (listening) {
+                Uri uri = Global.getUriFor(Global.MOBILE_DATA);
+                if (TelephonyManager.getDefault().getSimCount() != 1) {
+                    uri = Global.getUriFor(Global.MOBILE_DATA + subId);
+                }
+                context.getContentResolver().registerContentObserver(uri, false, this);
+            } else {
+                context.getContentResolver().unregisterContentObserver(this);
+            }
+        }
+    }
+
+    /**
+     * Class that represents state of mobile data state.
+     * Used by onSaveInstanceState and onRestoreInstanceState.
+     */
+    public static class CellDataState extends BaseSavedState {
+        public int mSubId;
+        public boolean mChecked;
+        public boolean mMultiSimDialog;
+
+        public CellDataState(Parcelable base) {
+            super(base);
+        }
+
+        public CellDataState(Parcel source) {
+            super(source);
+            mChecked = source.readByte() != 0;
+            mMultiSimDialog = source.readByte() != 0;
+            mSubId = source.readInt();
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            super.writeToParcel(dest, flags);
+            dest.writeByte((byte) (mChecked ? 1 : 0));
+            dest.writeByte((byte) (mMultiSimDialog ? 1 : 0));
+            dest.writeInt(mSubId);
+        }
+
+        public static final Creator<CellDataState> CREATOR = new Creator<CellDataState>() {
+            @Override
+            public CellDataState createFromParcel(Parcel source) {
+                return new CellDataState(source);
+            }
+
+            @Override
+            public CellDataState[] newArray(int size) {
+                return new CellDataState[size];
+            }
+        };
+    }
+}
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index 03865fe..99950a8 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -16,22 +16,29 @@
 
 package com.android.phone;
 
+import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI;
+
 import android.app.ActionBar;
 import android.app.Activity;
 import android.app.DialogFragment;
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.ServiceConnection;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.database.ContentObserver;
+import android.database.Cursor;
 import android.net.Uri;
 import android.os.AsyncResult;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.IBinder;
 import android.os.Message;
 import android.os.PersistableBundle;
 import android.os.UserHandle;
@@ -52,6 +59,7 @@
 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;
@@ -61,7 +69,10 @@
 import android.widget.TabHost;
 
 import com.android.ims.ImsConfig;
+import com.android.ims.ImsException;
 import com.android.ims.ImsManager;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
@@ -138,18 +149,45 @@
     }
 
     /**
-     * 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;
+    }
+
+    /**
+     * Returns if DPC APNs are enforced.
+     */
+    public static boolean isDpcApnEnforced(Context context) {
+        try (Cursor enforceCursor = context.getContentResolver().query(ENFORCE_MANAGED_URI,
+                null, null, null, null)) {
+            if (enforceCursor == null || enforceCursor.getCount() != 1) {
+                return false;
+            }
+            enforceCursor.moveToFirst();
+            return enforceCursor.getInt(0) > 0;
+        }
     }
 
     public static class MobileNetworkFragment extends PreferenceFragment implements
@@ -176,17 +214,24 @@
         private static final String BUTTON_ENABLED_NETWORKS_KEY = "enabled_networks_key";
         private static final String BUTTON_4G_LTE_KEY = "enhanced_4g_lte";
         private static final String BUTTON_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
-        private static final String BUTTON_APN_EXPAND_KEY = "button_apn_key";
-        private static final String BUTTON_OPERATOR_SELECTION_EXPAND_KEY = "button_carrier_sel_key";
         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";
         private static final String BUTTON_VIDEO_CALLING_KEY = "video_calling_key";
+        private static final String BUTTON_MOBILE_DATA_ENABLE_KEY = "mobile_data_enable";
+        private static final String BUTTON_DATA_USAGE_KEY = "data_usage_summary";
+        private static final String BUTTON_ADVANCED_OPTIONS_KEY = "advanced_options";
         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();
+        private final ContentObserver mDpcEnforcedContentObserver = new DpcApnEnforcedObserver();
 
         static final int preferredNetworkMode = Phone.PREFERRED_NT_MODE;
 
@@ -195,10 +240,16 @@
         private static final String UP_ACTIVITY_CLASS =
                 "com.android.settings.Settings$WirelessSettingsActivity";
 
+        //Information that needs to save into Bundle.
+        private static final String EXPAND_ADVANCED_FIELDS = "expand_advanced_fields";
+        //Intent extra to indicate expand all fields.
+        private static final String EXPAND_EXTRA = "expandable";
+
         private SubscriptionManager mSubscriptionManager;
         private TelephonyManager mTelephonyManager;
 
         //UI objects
+        private AdvancedOptionsPreference mAdvancedOptions;
         private ListPreference mButtonPreferredNetworkMode;
         private ListPreference mButtonEnabledNetworks;
         private RestrictedSwitchPreference mButtonDataRoam;
@@ -208,14 +259,19 @@
         private PreferenceCategory mCallingCategory;
         private Preference mWiFiCallingPref;
         private SwitchPreference mVideoCallingPref;
+        private NetworkSelectListPreference mButtonNetworkSelect;
+        private MobileDataPreference mMobileDataPref;
+        private DataUsagePreference mDataUsagePref;
 
         private static final String iface = "rmnet0"; //TODO: this will go away
         private List<SubscriptionInfo> mActiveSubInfos;
 
         private UserManager mUm;
         private Phone mPhone;
+        private ImsManager mImsMgr;
         private MyHandler mHandler;
         private boolean mOkClicked;
+        private boolean mExpandAdvancedFields;
 
         // We assume the the value returned by mTabHost.getCurrentTab() == slotId
         private TabHost mTabHost;
@@ -229,7 +285,7 @@
         private boolean mIsGlobalCdma;
         private boolean mUnavailable;
 
-        private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+        private class PhoneCallStateListener extends PhoneStateListener {
             /*
              * Enable/disable the 'Enhanced 4G LTE Mode' when in/out of a call
              * and depending on TTY mode and TTY support over VoLTE.
@@ -239,19 +295,87 @@
             @Override
             public void onCallStateChanged(int state, String incomingNumber) {
                 if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
-                boolean enabled = (state == TelephonyManager.CALL_STATE_IDLE) &&
-                        ImsManager.isNonTtyOrTtyOnVolteEnabled
-                                (getActivity().getApplicationContext());
-                Preference pref = getPreferenceScreen().findPreference(BUTTON_4G_LTE_KEY);
-                if (pref != null) pref.setEnabled(enabled && hasActiveSubscriptions());
 
+                updateEnhanced4gLteState();
+                updateWiFiCallState();
+                updateVideoCallState();
+            }
+
+            /*
+             * Listen to different subId if mPhone is updated.
+             */
+            protected void updatePhone() {
+                int newSubId = (mPhone != null
+                        && SubscriptionManager.isValidSubscriptionId(mPhone.getSubId()))
+                        ? mPhone.getSubId()
+                        : SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+                // Now, listen to new subId if it's valid.
+                mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE);
+
+                mSubId = newSubId;
+                if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
+                    mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE);
+                }
+            }
+        }
+
+        private final PhoneCallStateListener mPhoneStateListener = new PhoneCallStateListener();
+
+        /**
+         * Service connection code for the NetworkQueryService.
+         * Handles the work of binding to a local object so that we can make
+         * the appropriate service calls.
+         */
+
+        /** Local service interface */
+        private INetworkQueryService mNetworkQueryService = null;
+
+        private void setNetworkQueryService() {
+            mButtonNetworkSelect = (NetworkSelectListPreference) getPreferenceScreen()
+                    .findPreference(NetworkOperators.BUTTON_NETWORK_SELECT_KEY);
+            if (mButtonNetworkSelect != null) {
+                mButtonNetworkSelect.setNetworkQueryService(mNetworkQueryService);
+            }
+
+        }
+        /** Service connection */
+        private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() {
+
+            /** Handle the task of binding the local object to the service */
+            public void onServiceConnected(ComponentName className, IBinder service) {
+                if (DBG) log("connection created, binding local service.");
+                mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService();
+                setNetworkQueryService();
+            }
+
+            /** Handle the task of cleaning up the local binding */
+            public void onServiceDisconnected(ComponentName className) {
+                if (DBG) log("connection disconnected, cleaning local binding.");
+                mNetworkQueryService = null;
+                setNetworkQueryService();
             }
         };
 
+        private void bindNetworkQueryService() {
+            getContext().startService(new Intent(getContext(), NetworkQueryService.class));
+            getContext().bindService(new Intent(getContext(), NetworkQueryService.class).setAction(
+                        NetworkQueryService.ACTION_LOCAL_BINDER),
+                        mNetworkQueryServiceConnection, Context.BIND_AUTO_CREATE);
+        }
+
+        private void unbindNetworkQueryService() {
+            // unbind the service.
+            getContext().unbindService(mNetworkQueryServiceConnection);
+        }
+
         @Override
         public void onPositiveButtonClick(DialogFragment dialog) {
             mPhone.setDataRoamingEnabled(true);
             mButtonDataRoam.setChecked(true);
+            MetricsLogger.action(getContext(),
+                    getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam),
+                    true);
         }
 
         @Override
@@ -269,6 +393,8 @@
         @Override
         public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
                                              Preference preference) {
+            sendMetricsEventPreferenceClicked(preferenceScreen, preference);
+
             /** TODO: Refactor and get rid of the if's using subclasses */
             final int phoneSubId = mPhone.getSubId();
             if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) {
@@ -327,8 +453,13 @@
                 Intent intent = new Intent(EuiccManager.ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS);
                 startActivity(intent);
                 return true;
-            } else if (preference == mWiFiCallingPref || preference == mVideoCallingPref) {
+            } else if (preference == mWiFiCallingPref || preference == mVideoCallingPref
+                    || preference == mMobileDataPref || preference == mDataUsagePref) {
                 return false;
+            } else if (preference == mAdvancedOptions) {
+                mExpandAdvancedFields = true;
+                updateBody();
+                return true;
             } else {
                 // if the button is anything but the simple toggle preference,
                 // we'll need to disable all preferences to reject all click
@@ -478,14 +609,26 @@
             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);
+                }
             }
             if (mPhone == null) {
                 // Do the best we can
                 mPhone = PhoneGlobals.getPhone();
             }
             Log.i(LOG_TAG, "updatePhone:- slotId=" + slotId + " sir=" + sir);
+
+            mImsMgr = ImsManager.getInstance(mPhone.getContext(), mPhone.getPhoneId());
+            mTelephonyManager = new TelephonyManager(mPhone.getContext(), mPhone.getSubId());
+            if (mImsMgr == null) {
+                log("updatePhone :: Could not get ImsManager instance!");
+            } else if (DBG) {
+                log("updatePhone :: mImsMgr=" + mImsMgr);
+            }
+
+            mPhoneStateListener.updatePhone();
         }
 
         private TabHost.TabContentFactory mEmptyTabContent = new TabHost.TabContentFactory() {
@@ -501,6 +644,15 @@
         }
 
         @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+
+            // If advanced fields are already expanded, we save it and expand it
+            // when it's re-created.
+            outState.putBoolean(EXPAND_ADVANCED_FIELDS, mExpandAdvancedFields);
+        }
+
+        @Override
         public void onCreate(Bundle icicle) {
             Log.i(LOG_TAG, "onCreate:+");
             super.onCreate(icicle);
@@ -517,12 +669,14 @@
             mTelephonyManager = (TelephonyManager) activity.getSystemService(
                             Context.TELEPHONY_SERVICE);
 
-            if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
-                mUnavailable = true;
-                activity.setContentView(R.layout.telephony_disallowed_preference_screen);
-                return;
+            if (icicle != null) {
+                mExpandAdvancedFields = icicle.getBoolean(EXPAND_ADVANCED_FIELDS, false);
+            } else if (getActivity().getIntent().getBooleanExtra(EXPAND_EXTRA, false)) {
+                mExpandAdvancedFields = true;
             }
 
+            bindNetworkQueryService();
+
             addPreferencesFromResource(R.xml.network_setting_fragment);
 
             mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY);
@@ -531,6 +685,8 @@
             mCallingCategory = (PreferenceCategory) findPreference(CATEGORY_CALLING_KEY);
             mWiFiCallingPref = findPreference(BUTTON_WIFI_CALLING_KEY);
             mVideoCallingPref = (SwitchPreference) findPreference(BUTTON_VIDEO_CALLING_KEY);
+            mMobileDataPref = (MobileDataPreference) findPreference(BUTTON_MOBILE_DATA_ENABLE_KEY);
+            mDataUsagePref = (DataUsagePreference) findPreference(BUTTON_DATA_USAGE_KEY);
 
             try {
                 Context con = activity.createPackageContext("com.android.systemui", 0);
@@ -551,6 +707,8 @@
                     BUTTON_PREFERED_NETWORK_MODE);
             mButtonEnabledNetworks = (ListPreference) prefSet.findPreference(
                     BUTTON_ENABLED_NETWORKS_KEY);
+            mAdvancedOptions = (AdvancedOptionsPreference) prefSet.findPreference(
+                    BUTTON_ADVANCED_OPTIONS_KEY);
             mButtonDataRoam.setOnPreferenceChangeListener(this);
 
             mLteDataServicePref = prefSet.findPreference(BUTTON_CDMA_LTE_DATA_SERVICE_KEY);
@@ -566,6 +724,9 @@
                     TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
             activity.registerReceiver(mPhoneChangeReceiver, intentFilter);
 
+            activity.getContentResolver().registerContentObserver(ENFORCE_MANAGED_URI, false,
+                    mDpcEnforcedContentObserver);
+
             Log.i(LOG_TAG, "onCreate:-");
         }
 
@@ -579,7 +740,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 {
@@ -587,17 +754,30 @@
             public void onReceive(Context context, Intent intent) {
                 Log.i(LOG_TAG, "onReceive:");
                 // When the radio changes (ex: CDMA->GSM), refresh all options.
-                mGsmUmtsOptions = null;
-                mCdmaOptions = null;
+                updateBody();
+            }
+        }
+
+        private class DpcApnEnforcedObserver extends ContentObserver {
+            DpcApnEnforcedObserver() {
+                super(null);
+            }
+
+            @Override
+            public void onChange(boolean selfChange) {
+                Log.i(LOG_TAG, "DPC enforced onChange:");
                 updateBody();
             }
         }
 
         @Override
         public void onDestroy() {
+            unbindNetworkQueryService();
             super.onDestroy();
-            if (getActivity() != null && !getActivity().isDestroyed()) {
+            if (getActivity() != null) {
                 getActivity().unregisterReceiver(mPhoneChangeReceiver);
+                getActivity().getContentResolver().unregisterContentObserver(
+                        mDpcEnforcedContentObserver);
             }
         }
 
@@ -611,11 +791,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);
@@ -630,15 +805,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();
@@ -653,35 +823,88 @@
             return mActiveSubInfos.size() > 0;
         }
 
+        private void updateBodyBasicFields(Activity activity, PreferenceScreen prefSet,
+                int phoneSubId, boolean hasActiveSubscriptions) {
+            Context context = activity.getApplicationContext();
+
+            ActionBar actionBar = activity.getActionBar();
+            if (actionBar != null) {
+                // android.R.id.home will be triggered in onOptionsItemSelected()
+                actionBar.setDisplayHomeAsUpEnabled(true);
+            }
+
+            prefSet.addPreference(mMobileDataPref);
+            prefSet.addPreference(mButtonDataRoam);
+            prefSet.addPreference(mDataUsagePref);
+
+            // Customized preferences needs to be initialized with subId.
+            mMobileDataPref.initialize(phoneSubId);
+            mDataUsagePref.initialize(phoneSubId);
+
+            mMobileDataPref.setEnabled(hasActiveSubscriptions);
+            mButtonDataRoam.setEnabled(hasActiveSubscriptions);
+            mDataUsagePref.setEnabled(hasActiveSubscriptions);
+
+            // Initialize states of mButtonDataRoam.
+            mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled());
+            mButtonDataRoam.setDisabledByAdmin(false);
+            if (mButtonDataRoam.isEnabled()) {
+                if (RestrictedLockUtils.hasBaseUserRestriction(context,
+                        UserManager.DISALLOW_DATA_ROAMING, UserHandle.myUserId())) {
+                    mButtonDataRoam.setEnabled(false);
+                } else {
+                    mButtonDataRoam.checkRestrictionAndSetDisabled(
+                            UserManager.DISALLOW_DATA_ROAMING);
+                }
+            }
+        }
+
         private void updateBody() {
             final Activity activity = getActivity();
+            final PreferenceScreen prefSet = getPreferenceScreen();
+            final int phoneSubId = mPhone.getSubId();
+            final boolean hasActiveSubscriptions = hasActiveSubscriptions();
+
             if (activity == null || activity.isDestroyed()) {
                 Log.e(LOG_TAG, "updateBody with no valid activity.");
                 return;
             }
-            Context context = activity.getApplicationContext();
-            PreferenceScreen prefSet = getPreferenceScreen();
+
+            if (prefSet == null) {
+                Log.e(LOG_TAG, "updateBody with no null prefSet.");
+                return;
+            }
+
+            prefSet.removeAll();
+
+            updateBodyBasicFields(activity, prefSet, phoneSubId, hasActiveSubscriptions);
+
+            if (mExpandAdvancedFields) {
+                updateBodyAdvancedFields(activity, prefSet, phoneSubId, hasActiveSubscriptions);
+            } else {
+                prefSet.addPreference(mAdvancedOptions);
+            }
+        }
+
+        private void updateBodyAdvancedFields(Activity activity, PreferenceScreen prefSet,
+                int phoneSubId, boolean hasActiveSubscriptions) {
             boolean isLteOnCdma = mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE;
-            final int phoneSubId = mPhone.getSubId();
 
             if (DBG) {
                 log("updateBody: isLteOnCdma=" + isLteOnCdma + " phoneSubId=" + phoneSubId);
             }
 
-            if (prefSet != null) {
-                prefSet.removeAll();
-                prefSet.addPreference(mButtonDataRoam);
-                prefSet.addPreference(mButtonPreferredNetworkMode);
-                prefSet.addPreference(mButtonEnabledNetworks);
-                prefSet.addPreference(mButton4glte);
-                if (showEuiccSettings(getActivity())) {
-                    prefSet.addPreference(mEuiccSettingsPref);
-                    String spn = mTelephonyManager.getSimOperatorName();
-                    if (TextUtils.isEmpty(spn)) {
-                        mEuiccSettingsPref.setSummary(null);
-                    } else {
-                        mEuiccSettingsPref.setSummary(spn);
-                    }
+            prefSet.addPreference(mButtonPreferredNetworkMode);
+            prefSet.addPreference(mButtonEnabledNetworks);
+            prefSet.addPreference(mButton4glte);
+
+            if (showEuiccSettings(getActivity())) {
+                prefSet.addPreference(mEuiccSettingsPref);
+                String spn = mTelephonyManager.getSimOperatorName();
+                if (TextUtils.isEmpty(spn)) {
+                    mEuiccSettingsPref.setSummary(null);
+                } else {
+                    mEuiccSettingsPref.setSummary(spn);
                 }
             }
 
@@ -709,13 +932,9 @@
 
                 final int phoneType = mPhone.getPhoneType();
                 if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
-                    mCdmaOptions = new CdmaOptions(this, prefSet, mPhone);
-                    // In World mode force a refresh of GSM Options.
-                    if (isWorldMode()) {
-                        mGsmUmtsOptions = null;
-                    }
+                    updateCdmaOptions(this, prefSet, mPhone);
                 } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
-                    mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet, phoneSubId);
+                    updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService);
                 } else {
                     throw new IllegalStateException("Unexpected phone type: " + phoneType);
                 }
@@ -730,8 +949,8 @@
                 // change Preferred Network Mode.
                 mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this);
 
-                mCdmaOptions = new CdmaOptions(this, prefSet, mPhone);
-                mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet, phoneSubId);
+                updateCdmaOptions(this, prefSet, mPhone);
+                updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService);
             } else {
                 prefSet.removePreference(mButtonPreferredNetworkMode);
                 final int phoneType = mPhone.getPhoneType();
@@ -775,12 +994,8 @@
                             }
                         }
                     }
-                    mCdmaOptions = new CdmaOptions(this, prefSet, mPhone);
+                    updateCdmaOptions(this, prefSet, mPhone);
 
-                    // In World mode force a refresh of GSM Options.
-                    if (isWorldMode()) {
-                        mGsmUmtsOptions = null;
-                    }
                 } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
                     if (isSupportTdscdma()) {
                         mButtonEnabledNetworks.setEntries(
@@ -817,7 +1032,7 @@
                         mButtonEnabledNetworks.setEntryValues(
                                 R.array.enabled_networks_values);
                     }
-                    mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet, phoneSubId);
+                    updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService);
                 } else {
                     throw new IllegalStateException("Unexpected phone type: " + phoneType);
                 }
@@ -840,21 +1055,9 @@
                 android.util.Log.d(LOG_TAG, "keep ltePref");
             }
 
-            if (hideEnhanced4gLteSettings(getActivity(), carrierConfig)) {
-                Preference pref = prefSet.findPreference(BUTTON_4G_LTE_KEY);
-                if (pref != null) {
-                    prefSet.removePreference(pref);
-                }
-            }
-
+            updateEnhanced4gLteState();
             updateCallingCategory();
 
-            ActionBar actionBar = activity.getActionBar();
-            if (actionBar != null) {
-                // android.R.id.home will be triggered in onOptionsItemSelected()
-                actionBar.setDisplayHomeAsUpEnabled(true);
-            }
-
             // Enable link to CMAS app settings depending on the value in config.xml.
             final boolean isCellBroadcastAppLinkEnabled = activity.getResources().getBoolean(
                     com.android.internal.R.bool.config_cellBroadcastAppLinks);
@@ -867,8 +1070,20 @@
                 }
             }
 
+            /**
+             * 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
-            mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled());
             mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
             mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
             UpdatePreferredNetworkModeSummary(settingsNetworkMode);
@@ -886,45 +1101,30 @@
              * but you do need to remember that this all needs to work when subscriptions
              * change dynamically such as when hot swapping sims.
              */
-            boolean hasActiveSubscriptions = hasActiveSubscriptions();
-            boolean canChange4glte =
-                    (mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE)
-                            && ImsManager.isNonTtyOrTtyOnVolteEnabled(
-                                    activity.getApplicationContext())
-                            && carrierConfig.getBoolean(
-                            CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL);
             boolean useVariant4glteTitle = carrierConfig.getBoolean(
                     CarrierConfigManager.KEY_ENHANCED_4G_LTE_TITLE_VARIANT_BOOL);
             int enhanced4glteModeTitleId = useVariant4glteTitle ?
                     R.string.enhanced_4g_lte_mode_title_variant :
                     R.string.enhanced_4g_lte_mode_title;
-            mButtonDataRoam.setDisabledByAdmin(false);
-            mButtonDataRoam.setEnabled(hasActiveSubscriptions);
-            if (mButtonDataRoam.isEnabled()) {
-                if (RestrictedLockUtils.hasBaseUserRestriction(context,
-                        UserManager.DISALLOW_DATA_ROAMING, UserHandle.myUserId())) {
-                    mButtonDataRoam.setEnabled(false);
-                } else {
-                    mButtonDataRoam.checkRestrictionAndSetDisabled(
-                            UserManager.DISALLOW_DATA_ROAMING);
-                }
-            }
+
             mButtonPreferredNetworkMode.setEnabled(hasActiveSubscriptions);
             mButtonEnabledNetworks.setEnabled(hasActiveSubscriptions);
             mButton4glte.setTitle(enhanced4glteModeTitleId);
-            mButton4glte.setEnabled(hasActiveSubscriptions && canChange4glte);
             mLteDataServicePref.setEnabled(hasActiveSubscriptions);
             Preference ps;
-            PreferenceScreen root = getPreferenceScreen();
             ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS);
             if (ps != null) {
                 ps.setEnabled(hasActiveSubscriptions);
             }
-            ps = findPreference(BUTTON_APN_EXPAND_KEY);
+            ps = findPreference(CATEGORY_GSM_APN_EXPAND_KEY);
             if (ps != null) {
                 ps.setEnabled(hasActiveSubscriptions);
             }
-            ps = findPreference(BUTTON_OPERATOR_SELECTION_EXPAND_KEY);
+            ps = findPreference(CATEGORY_CDMA_APN_EXPAND_KEY);
+            if (ps != null) {
+                ps.setEnabled(hasActiveSubscriptions);
+            }
+            ps = findPreference(NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY);
             if (ps != null) {
                 ps.setEnabled(hasActiveSubscriptions);
             }
@@ -963,6 +1163,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
@@ -1066,11 +1268,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.");
 
@@ -1082,6 +1282,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();
@@ -1091,19 +1294,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();
@@ -1111,6 +1322,15 @@
             return true;
         }
 
+        private boolean is4gLtePrefEnabled(PersistableBundle carrierConfig) {
+            return (mTelephonyManager.getCallState(mPhone.getSubId())
+                    == TelephonyManager.CALL_STATE_IDLE)
+                    && mImsMgr != null
+                    && mImsMgr.isNonTtyOrTtyOnVolteEnabled()
+                    && carrierConfig.getBoolean(
+                            CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL);
+        }
+
         private class MyHandler extends Handler {
 
             static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 0;
@@ -1463,14 +1683,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;
@@ -1493,6 +1714,37 @@
                 mCallingCategory.removePreference(mWiFiCallingPref);
             } else {
                 mCallingCategory.addPreference(mWiFiCallingPref);
+                mWiFiCallingPref.setEnabled(mTelephonyManager.getCallState(mPhone.getSubId())
+                        == TelephonyManager.CALL_STATE_IDLE && hasActiveSubscriptions());
+            }
+        }
+
+        private void updateEnhanced4gLteState() {
+            if (mButton4glte == null) {
+                return;
+            }
+
+            PersistableBundle carrierConfig = PhoneGlobals.getInstance()
+                    .getCarrierConfigForSubId(mPhone.getSubId());
+
+            try {
+                if ((mImsMgr == null
+                        || mImsMgr.getImsServiceState() != ImsFeature.STATE_READY
+                        || !mImsMgr.isVolteEnabledByPlatform()
+                        || !mImsMgr.isVolteProvisionedOnDevice()
+                        || carrierConfig.getBoolean(
+                        CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL))) {
+                    getPreferenceScreen().removePreference(mButton4glte);
+                } else {
+                    mButton4glte.setEnabled(is4gLtePrefEnabled(carrierConfig)
+                            && hasActiveSubscriptions());
+                    boolean enh4glteMode = mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()
+                            && mImsMgr.isNonTtyOrTtyOnVolteEnabled();
+                    mButton4glte.setChecked(enh4glteMode);
+                }
+            } catch (ImsException ex) {
+                log("Exception when trying to get ImsServiceStatus: " + ex);
+                getPreferenceScreen().removePreference(mButton4glte);
             }
         }
 
@@ -1504,30 +1756,24 @@
             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(mTelephonyManager.getCallState(mPhone.getSubId())
+                            == TelephonyManager.CALL_STATE_IDLE && hasActiveSubscriptions());
+                    mVideoCallingPref.setChecked(mImsMgr.isVtEnabledByUser());
                     mVideoCallingPref.setOnPreferenceChangeListener(this);
                 }
             } else {
-                removePref = true;
-            }
-
-            if (removePref) {
                 mCallingCategory.removePreference(mVideoCallingPref);
-            } else {
-                mCallingCategory.addPreference(mVideoCallingPref);
             }
         }
 
@@ -1607,23 +1853,22 @@
                 return;
             }
 
-            if (mGsmUmtsOptions == null) {
-                mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet, mPhone.getSubId());
-            }
-            PreferenceScreen apnExpand =
-                    (PreferenceScreen) prefSet.findPreference(BUTTON_APN_EXPAND_KEY);
-            PreferenceScreen operatorSelectionExpand =
-                    (PreferenceScreen) prefSet.findPreference(BUTTON_OPERATOR_SELECTION_EXPAND_KEY);
-            PreferenceScreen carrierSettings =
-                    (PreferenceScreen) prefSet.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
+            updateGsmUmtsOptions(this, prefSet, mPhone.getSubId(), mNetworkQueryService);
+
+            PreferenceCategory apnExpand =
+                    (PreferenceCategory) prefSet.findPreference(CATEGORY_GSM_APN_EXPAND_KEY);
+            PreferenceCategory networkOperatorCategory =
+                    (PreferenceCategory) prefSet.findPreference(
+                            NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY);
+            Preference carrierSettings = prefSet.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
             if (apnExpand != null) {
                 apnExpand.setEnabled(isWorldMode() || enable);
             }
-            if (operatorSelectionExpand != null) {
+            if (networkOperatorCategory != null) {
                 if (enable) {
-                    operatorSelectionExpand.setEnabled(true);
+                    networkOperatorCategory.setEnabled(true);
                 } else {
-                    prefSet.removePreference(operatorSelectionExpand);
+                    prefSet.removePreference(networkOperatorCategory);
                 }
             }
             if (carrierSettings != null) {
@@ -1636,9 +1881,7 @@
             if (prefSet == null) {
                 return;
             }
-            if (enable && mCdmaOptions == null) {
-                mCdmaOptions = new CdmaOptions(this, prefSet, mPhone);
-            }
+            updateCdmaOptions(this, prefSet, mPhone);
             CdmaSystemSelectListPreference systemSelect =
                     (CdmaSystemSelectListPreference)prefSet.findPreference
                             (BUTTON_CDMA_SYSTEM_SELECT_KEY);
@@ -1665,6 +1908,130 @@
             }
             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) {
+            final int category = getMetricsEventCategory(preferenceScreen, preference);
+            if (category == MetricsEvent.VIEW_UNKNOWN) {
+                return;
+            }
+
+            // 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,
+                PreferenceScreen prefScreen, final int subId, INetworkQueryService queryService) {
+            // We don't want to re-create GsmUmtsOptions if already exists. Otherwise, the
+            // preferences inside it will also be re-created which causes unexpected behavior.
+            // For example, the open dialog gets dismissed or detached after pause / resume.
+            if (mGsmUmtsOptions == null) {
+                mGsmUmtsOptions = new GsmUmtsOptions(prefFragment, prefScreen, subId, queryService);
+            } else {
+                mGsmUmtsOptions.update(subId, queryService);
+            }
+        }
+
+        private void updateCdmaOptions(PreferenceFragment prefFragment, PreferenceScreen prefScreen,
+                Phone phone) {
+            // We don't want to re-create CdmaOptions if already exists. Otherwise, the preferences
+            // inside it will also be re-created which causes unexpected behavior. For example,
+            // the open dialog gets dismissed or detached after pause / resume.
+            if (mCdmaOptions == null) {
+                mCdmaOptions = new CdmaOptions(prefFragment, prefScreen, phone);
+            } else {
+                mCdmaOptions.update(phone);
+            }
+        }
     }
 }
 
diff --git a/src/com/android/phone/NetworkOperatorPreference.java b/src/com/android/phone/NetworkOperatorPreference.java
new file mode 100644
index 0000000..f29c038
--- /dev/null
+++ b/src/com/android/phone/NetworkOperatorPreference.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.preference.Preference;
+import android.telephony.CellInfo;
+import android.telephony.SignalStrength;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+import android.view.Gravity;
+
+import com.android.settingslib.graph.SignalDrawable;
+
+/**
+ * A Preference represents a network operator in the NetworkSelectSetting fragment.
+ */
+public class NetworkOperatorPreference extends Preference {
+
+    private static final String TAG = "NetworkOperatorPref";
+    private static final boolean DBG = true;
+    // number of signal strength level
+    public static final int NUMBER_OF_LEVELS = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
+    private CellInfo mCellInfo;
+    private int mLevel = -1;
+
+    // The following constants are used to draw signal icon.
+    private static final Drawable EMPTY_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);
+    private static final int NO_CELL_DATA_CONNECTED_ICON = 0;
+
+    public NetworkOperatorPreference(CellInfo cellinfo, Context context) {
+        super(context);
+        mCellInfo = cellinfo;
+        refresh();
+    }
+
+    public CellInfo getCellInfo() {
+        return mCellInfo;
+    }
+
+    /**
+     * Refresh the NetworkOperatorPreference by updating the title and the icon.
+     */
+    public void refresh() {
+        if (DBG) Log.d(TAG, "refresh the network: " + CellInfoUtil.getNetworkTitle(mCellInfo));
+        setTitle(CellInfoUtil.getNetworkTitle(mCellInfo));
+        int level = CellInfoUtil.getLevel(mCellInfo);
+        if (DBG) Log.d(TAG, "refresh level: " + String.valueOf(level));
+        if (mLevel != level) {
+            mLevel = level;
+            updateIcon(mLevel);
+        }
+    }
+
+    /**
+     * Update the icon according to the input signal strength level.
+     */
+    public void setIcon(int level) {
+        updateIcon(level);
+    }
+
+    private int getIconId(int networkType) {
+        if (networkType == TelephonyManager.NETWORK_TYPE_CDMA) {
+            return R.drawable.signal_strength_1x;
+        } else if (networkType == TelephonyManager.NETWORK_TYPE_LTE) {
+            return R.drawable.signal_strength_lte;
+        } else if (networkType == TelephonyManager.NETWORK_TYPE_UMTS) {
+            return R.drawable.signal_strength_3g;
+        } else if (networkType == TelephonyManager.NETWORK_TYPE_GSM) {
+            return R.drawable.signal_strength_g;
+        } else {
+            return 0;
+        }
+    }
+
+    private void updateIcon(int level) {
+        if (level < 0 || level >= NUMBER_OF_LEVELS) return;
+        Context context = getContext();
+        // Make the signal strength drawable
+        int iconId = 0;
+        if (DBG) Log.d(TAG, "updateIcon level: " + String.valueOf(level));
+        iconId = SignalDrawable.getState(level, NUMBER_OF_LEVELS, false /* cutOut */);
+
+        SignalDrawable signalDrawable = new SignalDrawable(getContext());
+        signalDrawable.setLevel(iconId);
+        signalDrawable.setDarkIntensity(0);
+
+        // Make the network type drawable
+        int iconType = getIconId(CellInfoUtil.getNetworkType(mCellInfo));
+        Drawable networkDrawable =
+                iconType == NO_CELL_DATA_CONNECTED_ICON
+                        ? EMPTY_DRAWABLE
+                        : getContext()
+                        .getResources().getDrawable(iconType, getContext().getTheme());
+
+        // Overlay the two drawables
+        Drawable[] layers = {networkDrawable, signalDrawable};
+        final int iconSize =
+                context.getResources().getDimensionPixelSize(R.dimen.signal_strength_icon_size);
+
+        LayerDrawable icons = new LayerDrawable(layers);
+        // Set the network type icon at the top left
+        icons.setLayerGravity(0 /* index of networkDrawable */, Gravity.TOP | Gravity.LEFT);
+        // Set the signal strength icon at the bottom right
+        icons.setLayerGravity(1 /* index of SignalDrawable */, Gravity.BOTTOM | Gravity.RIGHT);
+        icons.setLayerSize(1 /* index of SignalDrawable */, iconSize, iconSize);
+        setIcon(icons);
+    }
+}
diff --git a/src/com/android/phone/NetworkOperators.java b/src/com/android/phone/NetworkOperators.java
new file mode 100644
index 0000000..44af267
--- /dev/null
+++ b/src/com/android/phone/NetworkOperators.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncResult;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.TwoStatePreference;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+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;
+
+/**
+ * "Networks" settings UI for the Phone app.
+ */
+public class NetworkOperators extends PreferenceCategory
+        implements Preference.OnPreferenceChangeListener {
+
+    private static final String LOG_TAG = "NetworkOperators";
+    private static final boolean DBG = true;
+
+    private static final int EVENT_AUTO_SELECT_DONE = 100;
+    private static final int EVENT_GET_NETWORK_SELECTION_MODE_DONE = 200;
+
+    //String keys for preference lookup
+    public static final String BUTTON_NETWORK_SELECT_KEY = "button_network_select_key";
+    public static final String BUTTON_AUTO_SELECT_KEY = "button_auto_select_key";
+    public static final String BUTTON_CHOOSE_NETWORK_KEY = "button_choose_network_key";
+    public static final String CATEGORY_NETWORK_OPERATORS_KEY = "network_operators_category_key";
+
+    int mPhoneId = SubscriptionManager.INVALID_PHONE_INDEX;
+    private static final int ALREADY_IN_AUTO_SELECTION = 1;
+
+    //preference objects
+    private NetworkSelectListPreference mNetworkSelect;
+    private TwoStatePreference mAutoSelect;
+    private Preference mChooseNetwork;
+
+    private int mSubId;
+    private ProgressDialog mProgressDialog;
+
+    // There's two sets of Auto-Select UI in this class. {@link mNetworkSelect} is used for all
+    // pre-Pixel 3 devices, while {@link mChooseNetwork} is used for all devices after Pixel3.
+    boolean mEnableNewManualSelectNetworkUI;
+
+    public NetworkOperators(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public NetworkOperators(Context context) {
+        super(context);
+    }
+
+    /**
+     * Initialize NetworkOperators instance.
+     */
+    public void initialize() {
+        mEnableNewManualSelectNetworkUI = getContext().getResources().getBoolean(
+                com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
+        mAutoSelect = (TwoStatePreference) findPreference(BUTTON_AUTO_SELECT_KEY);
+        mChooseNetwork = findPreference(BUTTON_CHOOSE_NETWORK_KEY);
+        mNetworkSelect = (NetworkSelectListPreference) findPreference(BUTTON_NETWORK_SELECT_KEY);
+        if (mEnableNewManualSelectNetworkUI) {
+            removePreference(mNetworkSelect);
+        } else {
+            removePreference(mChooseNetwork);
+        }
+        mProgressDialog = new ProgressDialog(getContext());
+    }
+
+    /**
+     * Update NetworkOperators instance if like subId or queryService are updated.
+     *
+     * @param subId Corresponding subscription ID of this network.
+     * @param queryService The service to do network queries.
+     */
+    protected void update(final int subId, INetworkQueryService queryService) {
+        mSubId = subId;
+        mPhoneId = SubscriptionManager.getPhoneId(mSubId);
+
+        if (mAutoSelect != null) {
+            mAutoSelect.setOnPreferenceChangeListener(this);
+        }
+
+        if (mEnableNewManualSelectNetworkUI) {
+            if (mChooseNetwork != null) {
+                TelephonyManager telephonyManager = (TelephonyManager)
+                        getContext().getSystemService(Context.TELEPHONY_SERVICE);
+                if (DBG) logd("data connection status " + telephonyManager.getDataState());
+                if (telephonyManager.getDataState() == telephonyManager.DATA_CONNECTED) {
+                    mChooseNetwork.setSummary(telephonyManager.getNetworkOperatorName());
+                } else {
+                    mChooseNetwork.setSummary(R.string.network_disconnected);
+                }
+            }
+        } else {
+            if (mNetworkSelect != null) {
+                mNetworkSelect.initialize(mSubId, queryService, this, mProgressDialog);
+            }
+        }
+        getNetworkSelectionMode();
+    }
+
+    /**
+     * Implemented to support onPreferenceChangeListener to look for preference
+     * changes specifically on auto select button.
+     *
+     * @param preference is the preference to be changed, should be auto select button.
+     * @param newValue should be the value of whether autoSelect is checked.
+     */
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        if (preference == mAutoSelect) {
+            boolean autoSelect = (Boolean) newValue;
+            if (DBG) logd("onPreferenceChange autoSelect: " + String.valueOf(autoSelect));
+            selectNetworkAutomatic(autoSelect);
+            MetricsLogger.action(getContext(),
+                    MetricsEvent.ACTION_MOBILE_NETWORK_AUTO_SELECT_NETWORK_TOGGLE, autoSelect);
+            return true;
+        }
+        return false;
+    }
+
+    private final Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            AsyncResult ar;
+            switch (msg.what) {
+                case EVENT_AUTO_SELECT_DONE:
+                    mAutoSelect.setEnabled(true);
+                    dismissProgressBar();
+
+                    ar = (AsyncResult) msg.obj;
+                    if (ar.exception != null) {
+                        if (DBG) logd("automatic network selection: failed!");
+                        displayNetworkSelectionFailed(ar.exception);
+                    } else {
+                        if (DBG) logd("automatic network selection: succeeded!");
+                        displayNetworkSelectionSucceeded(msg.arg1);
+                    }
+
+                    break;
+                case EVENT_GET_NETWORK_SELECTION_MODE_DONE:
+                    ar = (AsyncResult) msg.obj;
+                    if (ar.exception != null) {
+                        if (DBG) logd("get network selection mode: failed!");
+                    } else if (ar.result != null) {
+                        try {
+                            int[] modes = (int[]) ar.result;
+                            boolean autoSelect = (modes[0] == 0);
+                            if (DBG) {
+                                logd("get network selection mode: "
+                                        + (autoSelect ? "auto" : "manual") + " selection");
+                            }
+                            if (mAutoSelect != null) {
+                                mAutoSelect.setChecked(autoSelect);
+                            }
+                            if (mEnableNewManualSelectNetworkUI) {
+                                if (mChooseNetwork != null) {
+                                    mChooseNetwork.setEnabled(!autoSelect);
+                                }
+                            } else {
+                                if (mNetworkSelect != null) {
+                                    mNetworkSelect.setEnabled(!autoSelect);
+                                }
+                            }
+                        } catch (Exception e) {
+                            if (DBG) loge("get network selection mode: unable to parse result.");
+                        }
+                    }
+            }
+            return;
+        }
+    };
+
+    // Used by both mAutoSelect and mNetworkSelect buttons.
+    protected void displayNetworkSelectionFailed(Throwable ex) {
+        String status;
+        if ((ex != null && ex instanceof CommandException)
+                && ((CommandException) ex).getCommandError()
+                == CommandException.Error.ILLEGAL_SIM_OR_ME) {
+            status = getContext().getResources().getString(R.string.not_allowed);
+        } else {
+            status = getContext().getResources().getString(R.string.connect_later);
+        }
+
+        final PhoneGlobals app = PhoneGlobals.getInstance();
+        app.notificationMgr.postTransientNotification(
+                NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
+
+        TelephonyManager tm = (TelephonyManager) app.getSystemService(Context.TELEPHONY_SERVICE);
+        Phone phone = PhoneFactory.getPhone(mPhoneId);
+        if (phone != null) {
+            ServiceState ss = tm.getServiceStateForSubscriber(phone.getSubId());
+            if (ss != null) {
+                app.notificationMgr.updateNetworkSelection(ss.getState(), phone.getSubId());
+            }
+        }
+    }
+
+    // Used by both mAutoSelect and mNetworkSelect buttons.
+    protected void displayNetworkSelectionSucceeded(int msgArg1) {
+        String status = null;
+        if (msgArg1 == ALREADY_IN_AUTO_SELECTION) {
+            status = getContext().getResources().getString(R.string.already_auto);
+        } else {
+            status = getContext().getResources().getString(R.string.registration_done);
+        }
+
+        final PhoneGlobals app = PhoneGlobals.getInstance();
+        app.notificationMgr.postTransientNotification(
+                NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
+    }
+
+    private void selectNetworkAutomatic(boolean autoSelect) {
+        if (DBG) logd("selectNetworkAutomatic: " + String.valueOf(autoSelect));
+        if (mEnableNewManualSelectNetworkUI) {
+            if (mChooseNetwork != null) {
+                mChooseNetwork.setEnabled(!autoSelect);
+            }
+        } else {
+            if (mNetworkSelect != null) {
+                mNetworkSelect.setEnabled(!autoSelect);
+            }
+        }
+
+        if (autoSelect) {
+            if (DBG) logd("select network automatically...");
+            showAutoSelectProgressBar();
+            mAutoSelect.setEnabled(false);
+            Message msg = mHandler.obtainMessage(EVENT_AUTO_SELECT_DONE);
+            Phone phone = PhoneFactory.getPhone(mPhoneId);
+            if (phone != null) {
+                phone.setNetworkSelectionModeAutomatic(msg);
+            }
+        } else {
+            if (mEnableNewManualSelectNetworkUI) {
+                if (mChooseNetwork != null) {
+                    // Open the choose Network page automatically when user turn off the auto-select
+                    openChooseNetworkPage();
+                }
+            } else {
+                if (mNetworkSelect != null) {
+                    mNetworkSelect.onClick();
+                }
+            }
+        }
+    }
+
+    protected void getNetworkSelectionMode() {
+        if (DBG) logd("getting network selection mode...");
+        Message msg = mHandler.obtainMessage(EVENT_GET_NETWORK_SELECTION_MODE_DONE);
+        Phone phone = PhoneFactory.getPhone(mPhoneId);
+        if (phone != null) {
+            phone.getNetworkSelectionMode(msg);
+        }
+    }
+
+    private void dismissProgressBar() {
+        if (mProgressDialog != null && mProgressDialog.isShowing()) {
+            mProgressDialog.dismiss();
+        }
+    }
+
+    private void showAutoSelectProgressBar() {
+        mProgressDialog.setMessage(
+                getContext().getResources().getString(R.string.register_automatically));
+        mProgressDialog.setCanceledOnTouchOutside(false);
+        mProgressDialog.setCancelable(false);
+        mProgressDialog.setIndeterminate(true);
+        mProgressDialog.show();
+    }
+
+    /**
+     * Open the Choose netwotk page via {@alink NetworkSelectSettingActivity}
+     */
+    public void openChooseNetworkPage() {
+        Intent intent = NetworkSelectSettingActivity.getIntent(getContext(), mPhoneId);
+        getContext().startActivity(intent);
+    }
+
+    protected boolean preferenceTreeClick(Preference preference) {
+        if (mEnableNewManualSelectNetworkUI) {
+            if (DBG) logd("enable New AutoSelectNetwork UI");
+            if (preference == mChooseNetwork) {
+                openChooseNetworkPage();
+            }
+            return (preference == mAutoSelect || preference == mChooseNetwork);
+        } else {
+            return (preference == mAutoSelect || preference == mNetworkSelect);
+        }
+    }
+
+    private void logd(String msg) {
+        Log.d(LOG_TAG, "[NetworksList] " + msg);
+    }
+
+    private void loge(String msg) {
+        Log.e(LOG_TAG, "[NetworksList] " + msg);
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/phone/NetworkQueryService.java b/src/com/android/phone/NetworkQueryService.java
index 84fde87..22b5509 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 = 300;
+    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
new file mode 100644
index 0000000..4bb03b0
--- /dev/null
+++ b/src/com/android/phone/NetworkSelectListPreference.java
@@ -0,0 +1,579 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.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;
+import android.os.Parcel;
+import android.os.Parcelable;
+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.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
+import android.text.TextUtils;
+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;
+
+
+/**
+ * "Networks" preference in "Mobile network" settings UI for the Phone app.
+ * It's used to manually search and choose mobile network. Enabled only when
+ * autoSelect preference is turned off.
+ */
+public class NetworkSelectListPreference extends ListPreference
+        implements DialogInterface.OnCancelListener,
+        Preference.OnPreferenceChangeListener{
+
+    private static final String LOG_TAG = "networkSelect";
+    private static final boolean DBG = true;
+
+    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_COMPLETED = 3;
+
+    //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<CellInfo> mCellInfoList;
+    private CellInfo mCellInfo;
+
+    private int mSubId;
+    private NetworkOperators mNetworkOperators;
+
+    private ProgressDialog mProgressDialog;
+    public NetworkSelectListPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public NetworkSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr,
+                                       int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    @Override
+    protected void onClick() {
+        sendMetricsEvent(null);
+        // Start the one-time network scan via {@link Phone#getAvailableNetworks()}.
+        // {@link NetworkQueryService will return a {@link onResults()} callback first with a list
+        // of CellInfo, and then will return a {@link onComplete} indicating the scan completed.
+        loadNetworksList();
+    }
+
+    private final Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            AsyncResult ar;
+            switch (msg.what) {
+                case EVENT_NETWORK_SELECTION_DONE:
+                    if (DBG) logd("hideProgressPanel");
+                    try {
+                        dismissProgressBar();
+                    } catch (IllegalArgumentException e) {
+                    }
+                    setEnabled(true);
+
+                    ar = (AsyncResult) msg.obj;
+                    if (ar.exception != null) {
+                        if (DBG) logd("manual network selection: failed!");
+                        mNetworkOperators.displayNetworkSelectionFailed(ar.exception);
+                    } else {
+                        if (DBG) {
+                            logd("manual network selection: succeeded! "
+                                    + getNetworkTitle(mCellInfo));
+                        }
+                        mNetworkOperators.displayNetworkSelectionSucceeded(msg.arg1);
+                    }
+                    mNetworkOperators.getNetworkSelectionMode();
+                    break;
+
+                case EVENT_NETWORK_SCAN_RESULTS:
+                    List<CellInfo> results = (List<CellInfo>) msg.obj;
+                    results.removeIf(cellInfo -> cellInfo == null);
+                    mCellInfoList = new ArrayList<>(results);
+                    if (DBG) logd("CALLBACK_SCAN_RESULTS" + mCellInfoList.toString());
+
+                    break;
+
+                case EVENT_NETWORK_SCAN_COMPLETED:
+                    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();
+            }
+            return;
+        }
+    };
+
+    INetworkQueryService mNetworkQueryService = null;
+    /**
+     * This implementation of INetworkQueryServiceCallback is used to receive
+     * callback notifications from the network query service.
+     */
+    private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() {
+
+        /** Returns the scan results to the user, this callback will be called only 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();
+        }
+
+        /**
+         * This callback will not be called, since the old Scan API won't send this callback.
+         */
+        public void onError(int error) {}
+    };
+
+    @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();
+                mNetworkQueryService.unregisterCallback(mCallback);
+            }
+            // If cancelled, we query NetworkSelectMode and update states of AutoSelect button.
+            mNetworkOperators.getNetworkSelectionMode();
+        } catch (RemoteException e) {
+            loge("onCancel: exception from stopNetworkQuery " + e);
+        }
+    }
+
+    @Override
+    protected void onDialogClosed(boolean positiveResult) {
+        super.onDialogClosed(positiveResult);
+
+        // If dismissed, we query NetworkSelectMode and update states of AutoSelect button.
+        if (!positiveResult) {
+            mNetworkOperators.getNetworkSelectionMode();
+        }
+    }
+
+    // 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.
+    public void setNetworkQueryService(INetworkQueryService queryService) {
+        mNetworkQueryService = queryService;
+    }
+
+    // This initialize method needs to be called for this preference to work properly.
+    protected void initialize(int subId, INetworkQueryService queryService,
+                              NetworkOperators networkOperators, ProgressDialog progressDialog) {
+        mSubId = subId;
+        mNetworkQueryService = queryService;
+        mNetworkOperators = networkOperators;
+        // This preference should share the same progressDialog with networkOperators category.
+        mProgressDialog = progressDialog;
+
+        if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
+            mPhoneId = SubscriptionManager.getPhoneId(mSubId);
+        }
+
+        TelephonyManager telephonyManager = (TelephonyManager)
+                getContext().getSystemService(Context.TELEPHONY_SERVICE);
+
+        setSummary(telephonyManager.getNetworkOperatorName());
+
+        setOnPreferenceChangeListener(this);
+    }
+
+    @Override
+    protected void onPrepareForRemoval() {
+        destroy();
+        super.onPrepareForRemoval();
+    }
+
+    private void destroy() {
+        try {
+            dismissProgressBar();
+        } catch (IllegalArgumentException e) {
+            loge("onDestroy: exception from dismissProgressBar " + e);
+        }
+
+        try {
+            if (mNetworkQueryService != null) {
+                // used to un-register callback
+                mNetworkQueryService.unregisterCallback(mCallback);
+            }
+        } catch (RemoteException e) {
+            loge("onDestroy: exception from unregisterCallback " + e);
+        }
+    }
+
+    private void displayEmptyNetworkList() {
+        String status = getContext().getResources().getString(R.string.empty_networks_list);
+
+        final PhoneGlobals app = PhoneGlobals.getInstance();
+        app.notificationMgr.postTransientNotification(
+                NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
+    }
+
+    private void displayNetworkSelectionInProgress() {
+        showProgressDialog(DIALOG_NETWORK_SELECTION);
+    }
+
+    private void displayNetworkQueryFailed(int error) {
+        String status = getContext().getResources().getString(R.string.network_query_error);
+
+        try {
+            dismissProgressBar();
+        } catch (IllegalArgumentException e1) {
+            // do nothing
+        }
+
+        final PhoneGlobals app = PhoneGlobals.getInstance();
+        app.notificationMgr.postTransientNotification(
+                NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
+    }
+
+    private void loadNetworksList() {
+        if (DBG) logd("load networks list...");
+
+        showProgressDialog(DIALOG_NETWORK_LIST_LOAD);
+
+        try {
+            if (mNetworkQueryService != null) {
+                mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId, false);
+            } else {
+                displayNetworkQueryFailed(NetworkQueryService.QUERY_EXCEPTION);
+            }
+        } catch (RemoteException e) {
+            loge("loadNetworksList: exception from startNetworkQuery " + e);
+            displayNetworkQueryFailed(NetworkQueryService.QUERY_EXCEPTION);
+        }
+    }
+
+    private void networksListLoaded() {
+        if (DBG) logd("networks list loaded");
+
+        // update the state of the preferences.
+        if (DBG) logd("hideProgressPanel");
+
+        // Always try to dismiss the dialog because activity may
+        // be moved to background after dialog is shown.
+        try {
+            dismissProgressBar();
+        } catch (IllegalArgumentException e) {
+            // It's not a error in following scenario, we just ignore it.
+            // "Load list" dialog will not show, if NetworkQueryService is
+            // connected after this activity is moved to background.
+            loge("Fail to dismiss network load list dialog " + e);
+        }
+
+        setEnabled(true);
+        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(getOperatorNumeric(cellInfo));
+                }
+            }
+            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 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(CellInfo cellInfo) {
+        OperatorInfo ni = getOperatorInfoFromCellInfo(cellInfo);
+
+        if (!TextUtils.isEmpty(ni.getOperatorAlphaLong())) {
+            return ni.getOperatorAlphaLong();
+        } else if (!TextUtils.isEmpty(ni.getOperatorAlphaShort())) {
+            return ni.getOperatorAlphaShort();
+        } else {
+            BidiFormatter bidiFormatter = BidiFormatter.getInstance();
+            return bidiFormatter.unicodeWrap(ni.getOperatorNumeric(), TextDirectionHeuristics.LTR);
+        }
+    }
+
+    /**
+     * Returns the operator numeric (MCCMNC) obtained in the manual search.
+     *
+     * @param cellInfo contains the information of the network.
+     * @return MCCMNC string.
+     */
+    private String getOperatorNumeric(CellInfo cellInfo) {
+        return getOperatorInfoFromCellInfo(cellInfo).getOperatorNumeric();
+    }
+
+    /**
+     * 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 {
+            oi = new OperatorInfo("", "", "");
+        }
+        return oi;
+    }
+
+    @Override
+    protected Parcelable onSaveInstanceState() {
+        final Parcelable superState = super.onSaveInstanceState();
+        if (isPersistent()) {
+            // No need to save instance state since it's persistent
+            return superState;
+        }
+
+        final SavedState myState = new SavedState(superState);
+        myState.mDialogListEntries = getEntries();
+        myState.mDialogListEntryValues = getEntryValues();
+        myState.mCellInfoList = mCellInfoList;
+        return myState;
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Parcelable state) {
+        if (state == null || !state.getClass().equals(SavedState.class)) {
+            // Didn't save state for us in onSaveInstanceState
+            super.onRestoreInstanceState(state);
+            return;
+        }
+
+        SavedState myState = (SavedState) state;
+
+        if (getEntries() == null && myState.mDialogListEntries != null) {
+            setEntries(myState.mDialogListEntries);
+        }
+        if (getEntryValues() == null && myState.mDialogListEntryValues != null) {
+            setEntryValues(myState.mDialogListEntryValues);
+        }
+        if (mCellInfoList == null && myState.mCellInfoList != null) {
+            mCellInfoList = myState.mCellInfoList;
+        }
+
+        super.onRestoreInstanceState(myState.getSuperState());
+    }
+
+    /**
+     *  We save entries, entryValues and operatorInfoList into bundle.
+     *  At onCreate of fragment, dialog will be restored if it was open. In this case,
+     *  we need to restore entries, entryValues and operatorInfoList. Without those information,
+     *  onPreferenceChange will fail if user select network from the dialog.
+     */
+    private static class SavedState extends BaseSavedState {
+        CharSequence[] mDialogListEntries;
+        CharSequence[] mDialogListEntryValues;
+        List<CellInfo> mCellInfoList;
+
+        SavedState(Parcel source) {
+            super(source);
+            final ClassLoader boot = Object.class.getClassLoader();
+            mDialogListEntries = source.readCharSequenceArray();
+            mDialogListEntryValues = source.readCharSequenceArray();
+            mCellInfoList = source.readParcelableList(mCellInfoList, boot);
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            super.writeToParcel(dest, flags);
+            dest.writeCharSequenceArray(mDialogListEntries);
+            dest.writeCharSequenceArray(mDialogListEntryValues);
+            dest.writeParcelableList(mCellInfoList, flags);
+        }
+
+        SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        public static final Parcelable.Creator<SavedState> CREATOR =
+                new Parcelable.Creator<SavedState>() {
+                    public SavedState createFromParcel(Parcel in) {
+                        return new SavedState(in);
+                    }
+
+                    public SavedState[] newArray(int size) {
+                        return new SavedState[size];
+                    }
+                };
+    }
+
+    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);
+    }
+
+    private void loge(String msg) {
+        Log.e(LOG_TAG, "[NetworksList] " + msg);
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/phone/NetworkSelectSetting.java b/src/com/android/phone/NetworkSelectSetting.java
new file mode 100644
index 0000000..ff918e2
--- /dev/null
+++ b/src/com/android/phone/NetworkSelectSetting.java
@@ -0,0 +1,656 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.phone;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.metrics.LogMaker;
+import android.os.AsyncResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.RemoteException;
+import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+import android.telephony.AccessNetworkConstants;
+import android.telephony.CellIdentity;
+import android.telephony.CellInfo;
+import android.telephony.NetworkRegistrationState;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto;
+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.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * "Choose network" settings UI for the Phone app.
+ */
+public class NetworkSelectSetting extends PreferenceFragment {
+
+    private static final String TAG = "NetworkSelectSetting";
+    private static final boolean DBG = false;
+
+    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;
+
+    private static final String PREF_KEY_CONNECTED_NETWORK_OPERATOR =
+            "connected_network_operator_preference";
+    private static final String PREF_KEY_NETWORK_OPERATORS = "network_operators_preference";
+
+    // used to add/remove NetworkOperatorsPreference.
+    private PreferenceCategory mNetworkOperatorsPreferences;
+    // used to add/remove connected NetworkOperatorPreference.
+    private PreferenceCategory mConnectedNetworkOperatorsPreference;
+    // manage the progress bar on the top of the page.
+    private View mProgressHeader;
+    private Preference mStatusMessagePreference;
+    private List<CellInfo> mCellInfoList;
+    private int mPhoneId = SubscriptionManager.INVALID_PHONE_INDEX;
+    private ViewGroup mFrameLayout;
+    private NetworkOperatorPreference mSelectedNetworkOperatorPreference;
+    private TelephonyManager mTelephonyManager;
+    private NetworkOperators mNetworkOperators;
+
+    private final Runnable mUpdateNetworkOperatorsRunnable = () -> {
+        updateNetworkOperatorsPreferenceCategory();
+    };
+
+    /**
+     * Create a new instance of this fragment.
+     */
+    public static NetworkSelectSetting newInstance(int phoneId) {
+        Bundle args = new Bundle();
+        args.putInt(NetworkSelectSettingActivity.KEY_PHONE_ID, phoneId);
+        NetworkSelectSetting fragment = new NetworkSelectSetting();
+        fragment.setArguments(args);
+
+        return fragment;
+    }
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        logd("onCreate");
+        super.onCreate(icicle);
+
+        mPhoneId = getArguments().getInt(NetworkSelectSettingActivity.KEY_PHONE_ID);
+
+        addPreferencesFromResource(R.xml.choose_network);
+        mConnectedNetworkOperatorsPreference =
+                (PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR);
+        mNetworkOperatorsPreferences =
+                (PreferenceCategory) findPreference(PREF_KEY_NETWORK_OPERATORS);
+        mStatusMessagePreference = new Preference(getContext());
+        mSelectedNetworkOperatorPreference = null;
+        mTelephonyManager = (TelephonyManager)
+                getContext().getSystemService(Context.TELEPHONY_SERVICE);
+        mNetworkOperators = new NetworkOperators(getContext());
+        setRetainInstance(true);
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        logd("onViewCreated");
+        super.onViewCreated(view, savedInstanceState);
+
+        if (getListView() != null) {
+            getListView().setDivider(null);
+        }
+        // Inflate progress bar
+        final Activity activity = getActivity();
+        if (activity != null) {
+            ActionBar actionBar = activity.getActionBar();
+            if (actionBar != null) {
+                // android.R.id.home will be triggered in
+                // {@link NetworkSelectSettingAcitivity#onOptionsItemSelected()}
+                actionBar.setDisplayHomeAsUpEnabled(true);
+            }
+            mFrameLayout = activity.findViewById(R.id.choose_network_content);
+            final LayoutInflater inflater = activity.getLayoutInflater();
+            final View pinnedHeader =
+                    inflater.inflate(R.layout.choose_network_progress_header, mFrameLayout, false);
+            mFrameLayout.addView(pinnedHeader);
+            mFrameLayout.setVisibility(View.VISIBLE);
+            mProgressHeader = pinnedHeader.findViewById(R.id.progress_bar_animation);
+            setProgressBarVisible(false);
+        }
+        forceConfigConnectedNetworkOperatorsPreferenceCategory();
+    }
+
+    @Override
+    public void onStart() {
+        if (DBG) logd("onStart");
+        super.onStart();
+
+        // Bind the NetworkQueryService
+        bindNetworkQueryService();
+    }
+
+    /**
+     * Invoked on each preference click in this hierarchy, overrides
+     * PreferenceActivity's implementation.  Used to make sure we track the
+     * preference click events.
+     * Since the connected network operator is either faked (when no data connection) or already
+     * connected, we do not allow user to click the connected network operator.
+     */
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+                                         Preference preference) {
+        if (DBG) logd("User clicked the screen");
+        stopNetworkQuery();
+        setProgressBarVisible(false);
+        if (preference instanceof  NetworkOperatorPreference) {
+            // Refresh the last selected item in case users reselect network.
+            if (mSelectedNetworkOperatorPreference != null) {
+                mSelectedNetworkOperatorPreference.setSummary("");
+            }
+
+            mSelectedNetworkOperatorPreference = (NetworkOperatorPreference) preference;
+            CellInfo cellInfo = mSelectedNetworkOperatorPreference.getCellInfo();
+            if (DBG) logd("User click a NetworkOperatorPreference: " + cellInfo.toString());
+
+            // Send metrics event
+            final LogMaker logMaker = new LogMaker(
+                    MetricsProto.MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK)
+                    .setType(MetricsProto.MetricsEvent.TYPE_ACTION);
+            if (CellInfoUtil.getNetworkTitle(cellInfo) != 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(MetricsProto.MetricsEvent.FIELD_MOBILE_NETWORK,
+                        CellInfoUtil.getNetworkTitle(cellInfo));
+            }
+            MetricsLogger.action(logMaker);
+
+            // Connect to the network
+            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SELECTION_DONE);
+            Phone phone = PhoneFactory.getPhone(mPhoneId);
+            if (phone != null) {
+                if (DBG) {
+                    logd("Connect to the network: " + CellInfoUtil.getNetworkTitle(cellInfo));
+                }
+                // Set summary as "Connecting" to the selected network.
+                mSelectedNetworkOperatorPreference.setSummary(R.string.network_connecting);
+
+                // Set summary as "Disconnected" to the previously connected network
+                if (mConnectedNetworkOperatorsPreference.getPreferenceCount() > 0) {
+                    NetworkOperatorPreference connectedNetworkOperator = (NetworkOperatorPreference)
+                            (mConnectedNetworkOperatorsPreference.getPreference(0));
+                    if (!CellInfoUtil.getNetworkTitle(cellInfo).equals(
+                            CellInfoUtil.getNetworkTitle(connectedNetworkOperator.getCellInfo()))) {
+                        connectedNetworkOperator.setSummary(R.string.network_disconnected);
+                    }
+                }
+
+                // Select network manually via Phone
+                OperatorInfo operatorInfo = CellInfoUtil.getOperatorInfoFromCellInfo(cellInfo);
+                if (DBG) logd("manually selected network operator: " + operatorInfo.toString());
+                phone.selectNetworkManually(operatorInfo, true, msg);
+                setProgressBarVisible(true);
+                return true;
+            } else {
+                loge("Error selecting network. phone is null.");
+                mSelectedNetworkOperatorPreference = null;
+                return false;
+            }
+
+        } else {
+            preferenceScreen.setEnabled(false);
+            return false;
+        }
+    }
+
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
+        if (!(getActivity() instanceof NetworkSelectSettingActivity)) {
+            throw new IllegalStateException("Parent activity is not NetworkSelectSettingActivity");
+        }
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        if (DBG) logd("onStop");
+        getView().removeCallbacks(mUpdateNetworkOperatorsRunnable);
+        stopNetworkQuery();
+        // Unbind the NetworkQueryService
+        unbindNetworkQueryService();
+    }
+
+    private final Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            AsyncResult ar;
+            switch (msg.what) {
+                case EVENT_NETWORK_SELECTION_DONE:
+                    if (DBG) logd("network selection done: hide the progress header");
+                    setProgressBarVisible(false);
+
+                    ar = (AsyncResult) msg.obj;
+                    if (ar.exception != null) {
+                        if (DBG) logd("manual network selection: failed! ");
+                        updateNetworkSelection();
+                        // Set summary as "Couldn't connect" to the selected network.
+                        mSelectedNetworkOperatorPreference.setSummary(
+                                R.string.network_could_not_connect);
+                    } else {
+                        if (DBG) logd("manual network selection: succeeded! ");
+                        // Set summary as "Connected" to the selected network.
+                        mSelectedNetworkOperatorPreference.setSummary(R.string.network_connected);
+                    }
+                    break;
+
+                case EVENT_NETWORK_SCAN_RESULTS:
+                    List<CellInfo> results = aggregateCellInfoList((List<CellInfo>) msg.obj);
+                    mCellInfoList = new ArrayList<>(results);
+                    if (DBG) logd("after aggregate: " + mCellInfoList.toString());
+                    if (mCellInfoList != null && mCellInfoList.size() != 0) {
+                        updateNetworkOperators();
+                    } else {
+                        addMessagePreference(R.string.empty_networks_list);
+                    }
+
+                    break;
+
+                case EVENT_NETWORK_SCAN_ERROR:
+                    int error = msg.arg1;
+                    if (DBG) logd("error while querying available networks " + error);
+                    stopNetworkQuery();
+                    addMessagePreference(R.string.network_query_error);
+                    break;
+
+                case EVENT_NETWORK_SCAN_COMPLETED:
+                    stopNetworkQuery();
+                    if (DBG) logd("scan complete");
+                    if (mCellInfoList == null) {
+                        // In case the scan timeout before getting any results
+                        addMessagePreference(R.string.empty_networks_list);
+                    }
+                    break;
+            }
+            return;
+        }
+    };
+
+    private void loadNetworksList() {
+        if (DBG) logd("load networks list...");
+        setProgressBarVisible(true);
+        try {
+            if (mNetworkQueryService != null) {
+                if (DBG) logd("start network query");
+                mNetworkQueryService
+                        .startNetworkQuery(mCallback, mPhoneId, true /* is incremental result */);
+            } else {
+                if (DBG) logd("unable to start network query, mNetworkQueryService is null");
+                addMessagePreference(R.string.network_query_error);
+            }
+        } catch (RemoteException e) {
+            loge("loadNetworksList: exception from startNetworkQuery " + e);
+            addMessagePreference(R.string.network_query_error);
+        }
+    }
+
+    /**
+     * This implementation of INetworkQueryServiceCallback is used to receive
+     * callback notifications from the network query service.
+     */
+    private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() {
+
+        /** 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();
+        }
+    };
+
+    /**
+     * Updates network operators from {@link INetworkQueryServiceCallback#onResults()}.
+     */
+    private void updateNetworkOperators() {
+        if (DBG) logd("updateNetworkOperators");
+        if (getActivity() != null) {
+            final View view = getView();
+            final Handler handler = view.getHandler();
+            if (handler != null && handler.hasCallbacks(mUpdateNetworkOperatorsRunnable)) {
+                return;
+            }
+            view.post(mUpdateNetworkOperatorsRunnable);
+        }
+    }
+
+    /**
+     * Update the currently available network operators list, which only contains the unregistered
+     * network operators. So if the device has no data and the network operator in the connected
+     * network operator category shows "Disconnected", it will also exist in the available network
+     * operator category for user to select. On the other hand, if the device has data and the
+     * network operator in the connected network operator category shows "Connected", it will not
+     * exist in the available network category.
+     */
+    private void updateNetworkOperatorsPreferenceCategory() {
+        mNetworkOperatorsPreferences.removeAll();
+
+        configConnectedNetworkOperatorsPreferenceCategory();
+        for (int index = 0; index < mCellInfoList.size(); index++) {
+            if (!mCellInfoList.get(index).isRegistered()) {
+                NetworkOperatorPreference pref =
+                        new NetworkOperatorPreference(mCellInfoList.get(index), getContext());
+                pref.setKey(CellInfoUtil.getNetworkTitle(mCellInfoList.get(index)));
+                pref.setOrder(index);
+                mNetworkOperatorsPreferences.addPreference(pref);
+            }
+        }
+    }
+
+    /**
+     * Config the connected network operator preference when the page was created. When user get
+     * into this page, the device might or might not have data connection.
+     *   - If the device has data:
+     *     1. use {@code ServiceState#getNetworkRegistrationStates()} to get the currently
+     *        registered cellIdentity, wrap it into a CellInfo;
+     *     2. set the signal strength level as strong;
+     *     3. use {@link TelephonyManager#getNetworkOperatorName()} to get the title of the
+     *        previously connected network operator, since the CellIdentity got from step 1 only has
+     *        PLMN.
+     *   - If the device has no data, we will remove the connected network operators list from the
+     *     screen.
+     */
+    private void forceConfigConnectedNetworkOperatorsPreferenceCategory() {
+        if (DBG) logd("Force config ConnectedNetworkOperatorsPreferenceCategory");
+        if (mTelephonyManager.getDataState() == mTelephonyManager.DATA_CONNECTED) {
+            // Try to get the network registration states
+            ServiceState ss = mTelephonyManager.getServiceStateForSubscriber(mPhoneId);
+            List<NetworkRegistrationState> networkList =
+                    ss.getNetworkRegistrationStates(AccessNetworkConstants.TransportType.WWAN);
+            if (networkList == null || networkList.size() == 0) {
+                loge("getNetworkRegistrationStates return null");
+                // Remove the connected network operators category
+                removeConnectedNetworkOperatorPreference();
+                return;
+            }
+            CellIdentity cellIdentity = networkList.get(0).getCellIdentity();
+            CellInfo cellInfo = CellInfoUtil.wrapCellInfoWithCellIdentity(cellIdentity);
+            if (cellInfo != null) {
+                if (DBG) logd("Currently registered cell: " + cellInfo.toString());
+                NetworkOperatorPreference pref =
+                        new NetworkOperatorPreference(cellInfo, getContext());
+                pref.setTitle(mTelephonyManager.getNetworkOperatorName());
+                pref.setSummary(R.string.network_connected);
+                // Update the signal strength icon, since the default signalStrength value would be
+                // zero (it would be quite confusing why the connected network has no signal)
+                pref.setIcon(NetworkOperatorPreference.NUMBER_OF_LEVELS - 1);
+
+                mConnectedNetworkOperatorsPreference.addPreference(pref);
+            } else {
+                loge("Invalid CellIfno: " + cellInfo.toString());
+                // Remove the connected network operators category
+                removeConnectedNetworkOperatorPreference();
+            }
+        } else {
+            if (DBG) logd("No currently registered cell");
+            // Remove the connected network operators category
+            removeConnectedNetworkOperatorPreference();
+        }
+    }
+
+    /**
+     * Configure the ConnectedNetworkOperatorsPreferenceCategory. The category only need to be
+     * configured if the category is currently empty or the operator network title of the previous
+     * connected network is different from the new one.
+     */
+    private void configConnectedNetworkOperatorsPreferenceCategory() {
+        if (DBG) logd("config ConnectedNetworkOperatorsPreferenceCategory");
+        // Remove the category if the CellInfo list is empty or does not have registered cell.
+        if (mCellInfoList.size() == 0) {
+            if (DBG) logd("empty cellinfo list");
+            removeConnectedNetworkOperatorPreference();
+        }
+        CellInfo connectedNetworkOperator = null;
+        for (CellInfo cellInfo: mCellInfoList) {
+            if (cellInfo.isRegistered()) {
+                connectedNetworkOperator = cellInfo;
+                break;
+            }
+        }
+        if (connectedNetworkOperator == null) {
+            if (DBG) logd("no registered network");
+            removeConnectedNetworkOperatorPreference();
+            return;
+        }
+
+        // config the category if it is empty.
+        if (mConnectedNetworkOperatorsPreference.getPreferenceCount() == 0) {
+            if (DBG) logd("ConnectedNetworkSelectList is empty, add one");
+            addConnectedNetworkOperatorPreference(connectedNetworkOperator);
+            return;
+        }
+        NetworkOperatorPreference previousConnectedNetworkOperator = (NetworkOperatorPreference)
+                (mConnectedNetworkOperatorsPreference.getPreference(0));
+
+        // config the category if the network title of the previous connected network is different
+        // from the new one.
+        String cTitle = CellInfoUtil.getNetworkTitle(connectedNetworkOperator);
+        String pTitle = CellInfoUtil.getNetworkTitle(
+                previousConnectedNetworkOperator.getCellInfo());
+        if (!cTitle.equals(pTitle)) {
+            if (DBG) logd("reconfig the category: connected network changed");
+            addConnectedNetworkOperatorPreference(connectedNetworkOperator);
+            return;
+        }
+        if (DBG) logd("same network operator is connected, only refresh the connected network");
+        // Otherwise same network operator is connected, only refresh the connected network
+        // operator preference (first and the only one in this category).
+        ((NetworkOperatorPreference) mConnectedNetworkOperatorsPreference.getPreference(0))
+                .refresh();
+        return;
+    }
+
+    /**
+     * Creates a Preference for the given {@link CellInfo} and adds it to the
+     * {@link #mConnectedNetworkOperatorsPreference}.
+     */
+    private void addConnectedNetworkOperatorPreference(CellInfo cellInfo) {
+        if (DBG) logd("addConnectedNetworkOperatorPreference");
+        // Remove the current ConnectedNetworkOperatorsPreference
+        removeConnectedNetworkOperatorPreference();
+        final NetworkOperatorPreference pref =
+                new NetworkOperatorPreference(cellInfo, getContext());
+        pref.setSummary(R.string.network_connected);
+        mConnectedNetworkOperatorsPreference.addPreference(pref);
+        PreferenceScreen preferenceScreen = getPreferenceScreen();
+        preferenceScreen.addPreference(mConnectedNetworkOperatorsPreference);
+    }
+
+    /** Removes all preferences and hide the {@link #mConnectedNetworkOperatorsPreference}. */
+    private void removeConnectedNetworkOperatorPreference() {
+        mConnectedNetworkOperatorsPreference.removeAll();
+        PreferenceScreen preferenceScreen = getPreferenceScreen();
+        preferenceScreen.removePreference(mConnectedNetworkOperatorsPreference);
+    }
+
+    protected void setProgressBarVisible(boolean visible) {
+        if (mProgressHeader != null) {
+            mProgressHeader.setVisibility(visible ? View.VISIBLE : View.GONE);
+        }
+    }
+
+    private void addMessagePreference(int messageId) {
+        if (DBG) logd("remove callback");
+        getView().removeCallbacks(mUpdateNetworkOperatorsRunnable);
+        setProgressBarVisible(false);
+        if (DBG) logd("addMessagePreference");
+        mStatusMessagePreference.setTitle(messageId);
+        removeConnectedNetworkOperatorPreference();
+        mNetworkOperatorsPreferences.removeAll();
+        mNetworkOperatorsPreferences.addPreference(mStatusMessagePreference);
+    }
+
+    /**
+     * The Scan results may contains several cell infos with different radio technologies and signal
+     * strength for one network operator. Aggregate the CellInfoList by retaining only the cell info
+     * with the strongest signal strength.
+     */
+    private List<CellInfo> aggregateCellInfoList(List<CellInfo> cellInfoList) {
+        if (DBG) logd("before aggregate: " + cellInfoList.toString());
+        Map<String, CellInfo> map = new HashMap<>();
+        for (CellInfo cellInfo: cellInfoList) {
+            String networkTitle = CellInfoUtil.getNetworkTitle(cellInfo);
+            if (cellInfo.isRegistered() || !map.containsKey(networkTitle)) {
+                map.put(networkTitle, cellInfo);
+            } else {
+                if (map.get(networkTitle).isRegistered()
+                        || CellInfoUtil.getLevel(map.get(networkTitle))
+                        > CellInfoUtil.getLevel(cellInfo)) {
+                    // Skip if the stored cellInfo is registered or has higher signal strength level
+                    continue;
+                }
+                // Otherwise replace it with the new CellInfo
+                map.put(networkTitle, cellInfo);
+            }
+        }
+        return new ArrayList<>(map.values());
+    }
+
+    /**
+     * Service connection code for the NetworkQueryService.
+     * Handles the work of binding to a local object so that we can make
+     * the appropriate service calls.
+     */
+
+    /** Local service interface */
+    private INetworkQueryService mNetworkQueryService = null;
+    /** Flag indicating whether we have called bind on the service. */
+    boolean mShouldUnbind;
+
+    /** Service connection */
+    private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() {
+
+        /** Handle the task of binding the local object to the service */
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            if (DBG) logd("connection created, binding local service.");
+            mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService();
+            // Load the network list only when the service is well connected.
+            loadNetworksList();
+        }
+
+        /** Handle the task of cleaning up the local binding */
+        public void onServiceDisconnected(ComponentName className) {
+            if (DBG) logd("connection disconnected, cleaning local binding.");
+            mNetworkQueryService = null;
+        }
+    };
+
+    private void bindNetworkQueryService() {
+        if (DBG) logd("bindNetworkQueryService");
+        getContext().bindService(new Intent(getContext(), NetworkQueryService.class).setAction(
+                NetworkQueryService.ACTION_LOCAL_BINDER),
+                mNetworkQueryServiceConnection, Context.BIND_AUTO_CREATE);
+        mShouldUnbind = true;
+    }
+
+    private void unbindNetworkQueryService() {
+        if (DBG) logd("unbindNetworkQueryService");
+        if (mShouldUnbind) {
+            if (DBG) logd("mShouldUnbind is true");
+            // unbind the service.
+            getContext().unbindService(mNetworkQueryServiceConnection);
+            mShouldUnbind = false;
+        }
+    }
+
+    /**
+     * Call {@link NotificationMgr#updateNetworkSelection(int, int)} to send notification about
+     * no service of user selected operator
+     */
+    private void updateNetworkSelection() {
+        if (DBG) logd("Update notification about no service of user selected operator");
+        final PhoneGlobals app = PhoneGlobals.getInstance();
+        Phone phone = PhoneFactory.getPhone(mPhoneId);
+        if (phone != null) {
+            ServiceState ss = mTelephonyManager.getServiceStateForSubscriber(phone.getSubId());
+            if (ss != null) {
+                app.notificationMgr.updateNetworkSelection(ss.getState(), phone.getSubId());
+            }
+        }
+    }
+
+    private void stopNetworkQuery() {
+        // Stop the network query process
+        try {
+            if (mNetworkQueryService != null) {
+                if (DBG) logd("Stop network query");
+                mNetworkQueryService.stopNetworkQuery();
+                mNetworkQueryService.unregisterCallback(mCallback);
+            }
+        } catch (RemoteException e) {
+            loge("Exception from stopNetworkQuery " + e);
+        }
+    }
+
+    private void logd(String msg) {
+        Log.d(TAG, msg);
+    }
+
+    private void loge(String msg) {
+        Log.e(TAG, msg);
+    }
+}
diff --git a/src/com/android/phone/NetworkSelectSettingActivity.java b/src/com/android/phone/NetworkSelectSettingActivity.java
new file mode 100644
index 0000000..a151c81
--- /dev/null
+++ b/src/com/android/phone/NetworkSelectSettingActivity.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.MenuItem;
+
+
+/**
+ * Activity associated with NetworkSelectSetting fragment
+ */
+public class NetworkSelectSettingActivity extends Activity {
+    private static final String TAG = "NetworkSelectSettingActivity";
+    public static final String KEY_PHONE_ID = "phone_id";
+
+    /**
+     * Returns the Android Intent that led to this Activity being created.
+     */
+    public static Intent getIntent(Context context, int phoneId) {
+        Intent intent = new Intent(context, NetworkSelectSettingActivity.class);
+        intent.putExtra(KEY_PHONE_ID, phoneId);
+        return intent;
+    }
+
+    @Override
+    public void onCreate(Bundle savedState) {
+        Log.d(TAG, "onCreate()");
+        super.onCreate(savedState);
+        int phoneId = getIntent().getExtras().getInt(KEY_PHONE_ID);
+        setContentView(R.layout.choose_network);
+
+        FragmentManager fragmentManager = getFragmentManager();
+        Fragment fragment = fragmentManager.findFragmentById(R.id.choose_network_content);
+        if (fragment == null) {
+            fragmentManager.beginTransaction()
+                    .add(R.id.choose_network_content,
+                            NetworkSelectSetting.newInstance(phoneId), TAG)
+                    .commit();
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        final int itemId = item.getItemId();
+        if (itemId == android.R.id.home) {
+            onBackPressed();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/src/com/android/phone/NetworkSetting.java b/src/com/android/phone/NetworkSetting.java
deleted file mode 100644
index 72ad513..0000000
--- a/src/com/android/phone/NetworkSetting.java
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone;
-
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.UserManager;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceScreen;
-import android.telephony.ServiceState;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-import android.telephony.SubscriptionManager;
-
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneFactory;
-import com.android.internal.telephony.OperatorInfo;
-
-import java.util.HashMap;
-import java.util.List;
-import android.text.BidiFormatter;
-import android.text.TextDirectionHeuristics;
-
-/**
- * "Networks" settings UI for the Phone app.
- */
-public class NetworkSetting extends PreferenceActivity
-        implements DialogInterface.OnCancelListener {
-
-    private static final String LOG_TAG = "phone";
-    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_AUTO_SELECT_DONE = 300;
-
-    //dialog ids
-    private static final int DIALOG_NETWORK_SELECTION = 100;
-    private static final int DIALOG_NETWORK_LIST_LOAD = 200;
-    private static final int DIALOG_NETWORK_AUTO_SELECT = 300;
-
-    //String keys for preference lookup
-    private static final String LIST_NETWORKS_KEY = "list_networks_key";
-    private static final String BUTTON_SRCH_NETWRKS_KEY = "button_srch_netwrks_key";
-    private static final String BUTTON_AUTO_SELECT_KEY = "button_auto_select_key";
-
-    //map of network controls to the network data.
-    private HashMap<Preference, OperatorInfo> mNetworkMap;
-
-    int mPhoneId = SubscriptionManager.INVALID_PHONE_INDEX;
-    protected boolean mIsForeground = false;
-
-    private UserManager mUm;
-    private boolean mUnavailable;
-
-    /** message for network selection */
-    String mNetworkSelectMsg;
-
-    //preference objects
-    private PreferenceGroup mNetworkList;
-    private Preference mSearchButton;
-    private Preference mAutoSelect;
-
-    private final Handler mHandler = new Handler() {
-        @Override
-        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) log("hideProgressPanel");
-                    removeDialog(DIALOG_NETWORK_SELECTION);
-                    getPreferenceScreen().setEnabled(true);
-
-                    ar = (AsyncResult) msg.obj;
-                    if (ar.exception != null) {
-                        if (DBG) log("manual network selection: failed!");
-                        displayNetworkSelectionFailed(ar.exception);
-                    } else {
-                        if (DBG) log("manual network selection: succeeded!");
-                        displayNetworkSelectionSucceeded();
-                    }
-
-                    break;
-                case EVENT_AUTO_SELECT_DONE:
-                    if (DBG) log("hideProgressPanel");
-
-                    // Always try to dismiss the dialog because activity may
-                    // be moved to background after dialog is shown.
-                    try {
-                        dismissDialog(DIALOG_NETWORK_AUTO_SELECT);
-                    } catch (IllegalArgumentException e) {
-                        // "auto select" is always trigged in foreground, so "auto select" dialog
-                        //  should be shown when "auto select" is trigged. Should NOT get
-                        // this exception, and Log it.
-                        Log.w(LOG_TAG, "[NetworksList] Fail to dismiss auto select dialog ", e);
-                    }
-                    getPreferenceScreen().setEnabled(true);
-
-                    ar = (AsyncResult) msg.obj;
-                    if (ar.exception != null) {
-                        if (DBG) log("automatic network selection: failed!");
-                        displayNetworkSelectionFailed(ar.exception);
-                    } else {
-                        if (DBG) log("automatic network selection: succeeded!");
-                        displayNetworkSelectionSucceeded();
-                    }
-
-                    break;
-            }
-
-            return;
-        }
-    };
-
-    /**
-     * Service connection code for the NetworkQueryService.
-     * Handles the work of binding to a local object so that we can make
-     * the appropriate service calls.
-     */
-
-    /** Local service interface */
-    private INetworkQueryService mNetworkQueryService = null;
-
-    /** Service connection */
-    private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() {
-
-        /** Handle the task of binding the local object to the service */
-        public void onServiceConnected(ComponentName className, IBinder service) {
-            if (DBG) log("connection created, binding local service.");
-            mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService();
-        }
-
-        /** Handle the task of cleaning up the local binding */
-        public void onServiceDisconnected(ComponentName className) {
-            if (DBG) log("connection disconnected, cleaning local binding.");
-            mNetworkQueryService = null;
-        }
-    };
-
-    /**
-     * This implementation of INetworkQueryServiceCallback is used to receive
-     * callback notifications from the network query service.
-     */
-    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) log("notifying message loop of query completion.");
-            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED,
-                    status, 0, networkInfoArray);
-            msg.sendToTarget();
-        }
-    };
-
-    @Override
-    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-        boolean handled = false;
-
-        if (preference == mSearchButton) {
-            loadNetworksList();
-            handled = true;
-        } else if (preference == mAutoSelect) {
-            selectNetworkAutomatic();
-            handled = true;
-        } else {
-            Preference selectedCarrier = preference;
-
-            String networkStr = selectedCarrier.getTitle().toString();
-            if (DBG) log("selected network: " + networkStr);
-
-            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SELECTION_DONE);
-            Phone phone = PhoneFactory.getPhone(mPhoneId);
-            if (phone != null) {
-                phone.selectNetworkManually(mNetworkMap.get(selectedCarrier), true, msg);
-                displayNetworkSeletionInProgress(networkStr);
-                handled = true;
-            } else {
-                log("Error selecting network. phone is null.");
-            }
-
-
-        }
-
-        return handled;
-    }
-
-    //implemented for DialogInterface.OnCancelListener
-    public void onCancel(DialogInterface dialog) {
-        // request that the service stop the query with this callback object.
-        try {
-            mNetworkQueryService.stopNetworkQuery(mCallback);
-        } catch (RemoteException e) {
-            log("onCancel: exception from stopNetworkQuery " + e);
-        }
-        finish();
-    }
-
-    public String getNormalizedCarrierName(OperatorInfo ni) {
-        if (ni != null) {
-            return ni.getOperatorAlphaLong() + " (" + ni.getOperatorNumeric() + ")";
-        }
-        return null;
-    }
-
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        mUm = (UserManager) getSystemService(Context.USER_SERVICE);
-
-        if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
-            setContentView(R.layout.telephony_disallowed_preference_screen);
-            mUnavailable = true;
-            return;
-        }
-
-        addPreferencesFromResource(R.xml.carrier_select);
-
-        int subId;
-        Intent intent = getIntent();
-        if (intent != null && intent.getExtras() != null) {
-            subId = intent.getExtras().getInt(GsmUmtsOptions.EXTRA_SUB_ID);
-            if (SubscriptionManager.isValidSubscriptionId(subId)) {
-                mPhoneId = SubscriptionManager.getPhoneId(subId);
-            }
-        }
-
-        mNetworkList = (PreferenceGroup) getPreferenceScreen().findPreference(LIST_NETWORKS_KEY);
-        mNetworkMap = new HashMap<Preference, OperatorInfo>();
-
-        mSearchButton = getPreferenceScreen().findPreference(BUTTON_SRCH_NETWRKS_KEY);
-        mAutoSelect = getPreferenceScreen().findPreference(BUTTON_AUTO_SELECT_KEY);
-
-        // Start the Network Query service, and bind it.
-        // The OS knows to start he service only once and keep the instance around (so
-        // long as startService is called) until a stopservice request is made.  Since
-        // we want this service to just stay in the background until it is killed, we
-        // don't bother stopping it from our end.
-        startService (new Intent(this, NetworkQueryService.class));
-        bindService (new Intent(this, NetworkQueryService.class).setAction(
-                NetworkQueryService.ACTION_LOCAL_BINDER),
-                mNetworkQueryServiceConnection, Context.BIND_AUTO_CREATE);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        mIsForeground = true;
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mIsForeground = false;
-    }
-
-    /**
-     * Override onDestroy() to unbind the query service, avoiding service
-     * leak exceptions.
-     */
-    @Override
-    protected void onDestroy() {
-        try {
-            // used to un-register callback
-            mNetworkQueryService.unregisterCallback(mCallback);
-        } catch (RemoteException e) {
-            log("onDestroy: exception from unregisterCallback " + e);
-        }
-
-        if (!mUnavailable) {
-            // unbind the service.
-            unbindService(mNetworkQueryServiceConnection);
-        }
-        super.onDestroy();
-    }
-
-    @Override
-    protected Dialog onCreateDialog(int id) {
-
-        if ((id == DIALOG_NETWORK_SELECTION) || (id == DIALOG_NETWORK_LIST_LOAD) ||
-                (id == DIALOG_NETWORK_AUTO_SELECT)) {
-            ProgressDialog dialog = new ProgressDialog(this);
-            switch (id) {
-                case DIALOG_NETWORK_SELECTION:
-                    // It would be more efficient to reuse this dialog by moving
-                    // this setMessage() into onPreparedDialog() and NOT use
-                    // removeDialog().  However, this is not possible since the
-                    // message is rendered only 2 times in the ProgressDialog -
-                    // after show() and before onCreate.
-                    dialog.setMessage(mNetworkSelectMsg);
-                    dialog.setCancelable(false);
-                    dialog.setIndeterminate(true);
-                    break;
-                case DIALOG_NETWORK_AUTO_SELECT:
-                    dialog.setMessage(getResources().getString(R.string.register_automatically));
-                    dialog.setCancelable(false);
-                    dialog.setIndeterminate(true);
-                    break;
-                case DIALOG_NETWORK_LIST_LOAD:
-                default:
-                    // reinstate the cancelablity of the dialog.
-                    dialog.setMessage(getResources().getString(R.string.load_networks_progress));
-                    dialog.setCanceledOnTouchOutside(false);
-                    dialog.setOnCancelListener(this);
-                    break;
-            }
-            return dialog;
-        }
-        return null;
-    }
-
-    @Override
-    protected void onPrepareDialog(int id, Dialog dialog) {
-        if ((id == DIALOG_NETWORK_SELECTION) || (id == DIALOG_NETWORK_LIST_LOAD) ||
-                (id == DIALOG_NETWORK_AUTO_SELECT)) {
-            // when the dialogs come up, we'll need to indicate that
-            // we're in a busy state to dissallow further input.
-            getPreferenceScreen().setEnabled(false);
-        }
-    }
-
-    private void displayEmptyNetworkList(boolean flag) {
-        mNetworkList.setTitle(flag ? R.string.empty_networks_list : R.string.label_available);
-    }
-
-    private void displayNetworkSeletionInProgress(String networkStr) {
-        // TODO: use notification manager?
-        mNetworkSelectMsg = getResources().getString(R.string.register_on_network, networkStr);
-
-        if (mIsForeground) {
-            showDialog(DIALOG_NETWORK_SELECTION);
-        }
-    }
-
-    private void displayNetworkQueryFailed(int error) {
-        String status = getResources().getString(R.string.network_query_error);
-
-        final PhoneGlobals app = PhoneGlobals.getInstance();
-        app.notificationMgr.postTransientNotification(
-                NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
-    }
-
-    private void displayNetworkSelectionFailed(Throwable ex) {
-        String status;
-
-        if ((ex != null && ex instanceof CommandException) &&
-                ((CommandException)ex).getCommandError()
-                  == CommandException.Error.ILLEGAL_SIM_OR_ME)
-        {
-            status = getResources().getString(R.string.not_allowed);
-        } else {
-            status = getResources().getString(R.string.connect_later);
-        }
-
-        final PhoneGlobals app = PhoneGlobals.getInstance();
-        app.notificationMgr.postTransientNotification(
-                NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
-
-        TelephonyManager tm = (TelephonyManager) app.getSystemService(Context.TELEPHONY_SERVICE);
-        Phone phone = PhoneFactory.getPhone(mPhoneId);
-        if (phone != null) {
-            ServiceState ss = tm.getServiceStateForSubscriber(phone.getSubId());
-            if (ss != null) {
-                app.notificationMgr.updateNetworkSelection(ss.getState(), phone.getSubId());
-            }
-        }
-    }
-
-    private void displayNetworkSelectionSucceeded() {
-        String status = getResources().getString(R.string.registration_done);
-
-        final PhoneGlobals app = PhoneGlobals.getInstance();
-        app.notificationMgr.postTransientNotification(
-                NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
-
-        mHandler.postDelayed(new Runnable() {
-            public void run() {
-                finish();
-            }
-        }, 3000);
-    }
-
-    private void loadNetworksList() {
-        if (DBG) log("load networks list...");
-
-        if (mIsForeground) {
-            showDialog(DIALOG_NETWORK_LIST_LOAD);
-        }
-
-        // delegate query request to the service.
-        try {
-            mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId);
-        } catch (RemoteException e) {
-            log("loadNetworksList: exception from startNetworkQuery " + e);
-            if (mIsForeground) {
-                try {
-                    dismissDialog(DIALOG_NETWORK_LIST_LOAD);
-                } catch (IllegalArgumentException e1) {
-                    // do nothing
-                }
-            }
-        }
-
-        displayEmptyNetworkList(false);
-    }
-
-    /**
-     * 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) {
-        if (DBG) log("networks list loaded");
-
-        // used to un-register callback
-        try {
-            mNetworkQueryService.unregisterCallback(mCallback);
-        } catch (RemoteException e) {
-            log("networksListLoaded: exception from unregisterCallback " + e);
-        }
-
-        // update the state of the preferences.
-        if (DBG) log("hideProgressPanel");
-
-        // Always try to dismiss the dialog because activity may
-        // be moved to background after dialog is shown.
-        try {
-            dismissDialog(DIALOG_NETWORK_LIST_LOAD);
-        } catch (IllegalArgumentException e) {
-            // It's not a error in following scenario, we just ignore it.
-            // "Load list" dialog will not show, if NetworkQueryService is
-            // connected after this activity is moved to background.
-            if (DBG) log("Fail to dismiss network load list dialog " + e);
-        }
-
-        getPreferenceScreen().setEnabled(true);
-        clearList();
-
-        if (status != NetworkQueryService.QUERY_OK) {
-            if (DBG) log("error while querying available networks");
-            displayNetworkQueryFailed(status);
-            displayEmptyNetworkList(true);
-        } else {
-            if (result != null){
-                displayEmptyNetworkList(false);
-
-                // create a preference for each item in the list.
-                // just use the operator name instead of the mildly
-                // confusing mcc/mnc.
-                for (OperatorInfo ni : result) {
-                    Preference carrier = new Preference(this, null);
-                    carrier.setTitle(getNetworkTitle(ni));
-                    carrier.setPersistent(false);
-                    mNetworkList.addPreference(carrier);
-                    mNetworkMap.put(carrier, ni);
-
-                    if (DBG) log("  " + ni);
-                }
-            } else {
-                displayEmptyNetworkList(true);
-            }
-        }
-    }
-
-    /**
-     * Returns the title of the network obtained in the manual search.
-     *
-     * @param OperatorInfo 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) {
-        if (!TextUtils.isEmpty(ni.getOperatorAlphaLong())) {
-            return ni.getOperatorAlphaLong();
-        } else if (!TextUtils.isEmpty(ni.getOperatorAlphaShort())) {
-            return ni.getOperatorAlphaShort();
-        } else {
-            BidiFormatter bidiFormatter = BidiFormatter.getInstance();
-            return bidiFormatter.unicodeWrap(ni.getOperatorNumeric(), TextDirectionHeuristics.LTR);
-        }
-    }
-
-    private void clearList() {
-        for (Preference p : mNetworkMap.keySet()) {
-            mNetworkList.removePreference(p);
-        }
-        mNetworkMap.clear();
-    }
-
-    private void selectNetworkAutomatic() {
-        if (DBG) log("select network automatically...");
-        if (mIsForeground) {
-            showDialog(DIALOG_NETWORK_AUTO_SELECT);
-        }
-
-        Message msg = mHandler.obtainMessage(EVENT_AUTO_SELECT_DONE);
-        Phone phone = PhoneFactory.getPhone(mPhoneId);
-        if (phone != null) {
-            phone.setNetworkSelectionModeAutomatic(msg);
-        }
-    }
-
-    private void log(String msg) {
-        Log.d(LOG_TAG, "[NetworksList] " + msg);
-    }
-}
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index 1764d4c..cbf964c 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -16,6 +16,8 @@
 
 package com.android.phone;
 
+import static android.Manifest.permission.READ_PHONE_STATE;
+
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
@@ -43,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;
@@ -60,8 +61,6 @@
 import java.util.List;
 import java.util.Set;
 
-import static android.Manifest.permission.READ_PHONE_STATE;
-
 /**
  * NotificationManager-related utility code for the Phone app.
  *
@@ -81,15 +80,6 @@
     private static final String MWI_SHOULD_CHECK_VVM_CONFIGURATION_KEY_PREFIX =
             "mwi_should_check_vvm_configuration_state_";
 
-    /**
-     * Boolean value representing whether the {@link
-     * TelephonyManager#ACTION_SHOW_VOICEMAIL_NOTIFICATION} is new or a refresh of an existing
-     * notification.
-     *
-     * TODO(b/62202833): make public
-     */
-    private static final String EXTRA_IS_REFRESH = "is_refresh";
-
     // notification types
     static final int MMI_NOTIFICATION = 1;
     static final int NETWORK_SELECTION_NOTIFICATION = 2;
@@ -171,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();
@@ -405,7 +395,7 @@
             intent.setAction(TelephonyManager.ACTION_SHOW_VOICEMAIL_NOTIFICATION);
             intent.putExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE,
                     PhoneUtils.makePstnPhoneAccountHandle(phone));
-            intent.putExtra(EXTRA_IS_REFRESH, isRefresh);
+            intent.putExtra(TelephonyManager.EXTRA_IS_REFRESH, isRefresh);
             if (count != null) {
                 intent.putExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, count);
             }
@@ -453,9 +443,19 @@
     /**
      * Updates the message call forwarding indicator notification.
      *
-     * @param visible true if there are messages waiting
+     * @param visible true if call forwarding enabled
      */
-    /* package */ void updateCfi(int subId, boolean visible) {
+
+     /* package */ void updateCfi(int subId, boolean visible) {
+        updateCfi(subId, visible, false /* isRefresh */);
+    }
+
+    /**
+     * Updates the message call forwarding indicator notification.
+     *
+     * @param visible true if call forwarding enabled
+     */
+    /* package */ void updateCfi(int subId, boolean visible, boolean isRefresh) {
         logi("updateCfi: subId= " + subId + ", visible=" + (visible ? "Y" : "N"));
         if (visible) {
             // If Unconditional Call Forwarding (forward all calls) for VOICE
@@ -493,30 +493,21 @@
                     .setContentText(mContext.getString(R.string.sum_cfu_enabled_indicator))
                     .setShowWhen(false)
                     .setOngoing(true)
-                    .setChannel(NotificationChannelController.CHANNEL_ID_CALL_FORWARD);
+                    .setChannel(NotificationChannelController.CHANNEL_ID_CALL_FORWARD)
+                    .setOnlyAlertOnce(isRefresh);
 
             Intent intent = new Intent(Intent.ACTION_MAIN);
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
             intent.setClassName("com.android.phone", "com.android.phone.CallFeaturesSetting");
             SubscriptionInfoHelper.addExtrasToIntent(
                     intent, mSubscriptionManager.getActiveSubscriptionInfo(subId));
-            PendingIntent contentIntent =
-                    PendingIntent.getActivity(mContext, subId /* requestCode */, intent, 0);
-
-            List<UserInfo> users = mUserManager.getUsers(true);
-            for (int i = 0; i < users.size(); i++) {
-                final UserInfo user = users.get(i);
-                if (user.isManagedProfile()) {
-                    continue;
-                }
-                UserHandle userHandle = user.getUserHandle();
-                builder.setContentIntent(user.isAdmin() ? contentIntent : null);
-                mNotificationManager.notifyAsUser(
-                        Integer.toString(subId) /* tag */,
-                        CALL_FORWARD_NOTIFICATION,
-                        builder.build(),
-                        userHandle);
-            }
+            builder.setContentIntent(PendingIntent.getActivity(mContext, subId /* requestCode */,
+                    intent, 0));
+            mNotificationManager.notifyAsUser(
+                    Integer.toString(subId) /* tag */,
+                    CALL_FORWARD_NOTIFICATION,
+                    builder.build(),
+                    UserHandle.ALL);
         } else {
             List<UserInfo> users = mUserManager.getUsers(true);
             for (UserInfo user : users) {
@@ -548,24 +539,15 @@
 
         final Notification.Builder builder = new Notification.Builder(mContext)
                 .setSmallIcon(android.R.drawable.stat_sys_warning)
-                .setContentTitle(mContext.getText(R.string.roaming))
+                .setContentTitle(mContext.getText(R.string.roaming_notification_title))
                 .setColor(mContext.getResources().getColor(R.color.dialer_theme_color))
                 .setContentText(contentText)
-                .setChannel(NotificationChannelController.CHANNEL_ID_MOBILE_DATA_ALERT);
-
-        List<UserInfo> users = mUserManager.getUsers(true);
-        for (int i = 0; i < users.size(); i++) {
-            final UserInfo user = users.get(i);
-            if (user.isManagedProfile()) {
-                continue;
-            }
-            UserHandle userHandle = user.getUserHandle();
-            builder.setContentIntent(user.isAdmin() ? contentIntent : null);
-            final Notification notif =
-                    new Notification.BigTextStyle(builder).bigText(contentText).build();
-            mNotificationManager.notifyAsUser(
-                    null /* tag */, DATA_DISCONNECTED_ROAMING_NOTIFICATION, notif, userHandle);
-        }
+                .setChannel(NotificationChannelController.CHANNEL_ID_MOBILE_DATA_STATUS)
+                .setContentIntent(contentIntent);
+        final Notification notif =
+                new Notification.BigTextStyle(builder).bigText(contentText).build();
+        mNotificationManager.notifyAsUser(
+                null /* tag */, DATA_DISCONNECTED_ROAMING_NOTIFICATION, notif, UserHandle.ALL);
     }
 
     /**
@@ -597,27 +579,17 @@
         Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                 Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-        // Use NetworkSetting to handle the selection intent
+        // Use MobileNetworkSettings to handle the selection intent
         intent.setComponent(new ComponentName(
-                mContext.getString(R.string.network_operator_settings_package),
-                mContext.getString(R.string.network_operator_settings_class)));
+                mContext.getString(R.string.mobile_network_settings_package),
+                mContext.getString(R.string.mobile_network_settings_class)));
         intent.putExtra(GsmUmtsOptions.EXTRA_SUB_ID, subId);
-        PendingIntent contentIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
-
-        List<UserInfo> users = mUserManager.getUsers(true);
-        for (int i = 0; i < users.size(); i++) {
-            final UserInfo user = users.get(i);
-            if (user.isManagedProfile()) {
-                continue;
-            }
-            UserHandle userHandle = user.getUserHandle();
-            builder.setContentIntent(user.isAdmin() ? contentIntent : null);
-            mNotificationManager.notifyAsUser(
-                    null /* tag */,
-                    SELECTED_OPERATOR_FAIL_NOTIFICATION,
-                    builder.build(),
-                    userHandle);
-        }
+        builder.setContentIntent(PendingIntent.getActivity(mContext, 0, intent, 0));
+        mNotificationManager.notifyAsUser(
+                null /* tag */,
+                SELECTED_OPERATOR_FAIL_NOTIFICATION,
+                builder.build(),
+                UserHandle.ALL);
     }
 
     /**
@@ -641,24 +613,34 @@
                 PhoneFactory.getPhone(phoneId) : PhoneFactory.getDefaultPhone();
         if (TelephonyCapabilities.supportsNetworkSelection(phone)) {
             if (SubscriptionManager.isValidSubscriptionId(subId)) {
+                SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
+                String selectedNetworkOperatorName =
+                        sp.getString(Phone.NETWORK_SELECTION_NAME_KEY + subId, "");
                 // get the shared preference of network_selection.
                 // empty is auto mode, otherwise it is the operator alpha name
                 // in case there is no operator name, check the operator numeric
-                SharedPreferences sp =
-                        PreferenceManager.getDefaultSharedPreferences(mContext);
-                String networkSelection =
-                        sp.getString(Phone.NETWORK_SELECTION_NAME_KEY + subId, "");
-                if (TextUtils.isEmpty(networkSelection)) {
-                    networkSelection =
+                if (TextUtils.isEmpty(selectedNetworkOperatorName)) {
+                    selectedNetworkOperatorName =
                             sp.getString(Phone.NETWORK_SELECTION_KEY + subId, "");
                 }
+                boolean isManualSelection;
+                // if restoring manual selection is controlled by framework, then get network
+                // selection from shared preference, otherwise get from real network indicators.
+                boolean restoreSelection = !mContext.getResources().getBoolean(
+                        com.android.internal.R.bool.skip_restoring_network_selection);
+                if (restoreSelection) {
+                    isManualSelection = !TextUtils.isEmpty(selectedNetworkOperatorName);
+                } else {
+                    isManualSelection = phone.getServiceStateTracker().mSS.getIsManualSelection();
+                }
 
-                if (DBG) log("updateNetworkSelection()..." + "state = " +
-                        serviceState + " new network " + networkSelection);
+                if (DBG) {
+                    log("updateNetworkSelection()..." + "state = " + serviceState + " new network "
+                            + (isManualSelection ? selectedNetworkOperatorName : ""));
+                }
 
-                if (serviceState == ServiceState.STATE_OUT_OF_SERVICE
-                        && !TextUtils.isEmpty(networkSelection)) {
-                    showNetworkSelection(networkSelection, subId);
+                if (serviceState == ServiceState.STATE_OUT_OF_SERVICE && isManualSelection) {
+                    showNetworkSelection(selectedNetworkOperatorName, subId);
                     mSelectedUnavailableNotify = true;
                 } else {
                     if (mSelectedUnavailableNotify) {
diff --git a/src/com/android/phone/OutgoingCallBroadcaster.java b/src/com/android/phone/OutgoingCallBroadcaster.java
deleted file mode 100644
index 6bb1388..0000000
--- a/src/com/android/phone/OutgoingCallBroadcaster.java
+++ /dev/null
@@ -1,687 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone;
-
-import android.Manifest;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.app.AppOpsManager;
-import android.app.Dialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.SystemProperties;
-import android.os.UserHandle;
-import android.telecom.PhoneAccount;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.widget.ProgressBar;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-import com.android.internal.telephony.TelephonyCapabilities;
-
-/**
- * OutgoingCallBroadcaster receives CALL and CALL_PRIVILEGED Intents, and broadcasts the
- * ACTION_NEW_OUTGOING_CALL intent. ACTION_NEW_OUTGOING_CALL is an ordered broadcast intent which
- * contains the phone number being dialed. Applications can use this intent to (1) see which numbers
- * are being dialed, (2) redirect a call (change the number being dialed), or (3) prevent a call
- * from being placed.
- *
- * After the other applications have had a chance to see the
- * ACTION_NEW_OUTGOING_CALL intent, it finally reaches the
- * {@link OutgoingCallReceiver}, which passes the (possibly modified)
- * intent on to the {@link SipCallOptionHandler}, which will
- * ultimately start the call using the CallController.placeCall() API.
- *
- * Calls where no number is present (like for a CDMA "empty flash" or a nonexistent voicemail
- * number) are exempt from being broadcast.
- * Calls to emergency numbers are still broadcast for informative purposes. The call is placed
- * prior to sending ACTION_NEW_OUTGOING_CALL and cannot be redirected nor prevented.
- */
-public class OutgoingCallBroadcaster extends Activity
-        implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
-
-    private static final String TAG = "OutgoingCallBroadcaster";
-    private static final boolean DBG =
-            (PhoneGlobals.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
-    // Do not check in with VDBG = true, since that may write PII to the system log.
-    private static final boolean VDBG = false;
-
-    public static final String ACTION_SIP_SELECT_PHONE = "com.android.phone.SIP_SELECT_PHONE";
-    public static final String EXTRA_ALREADY_CALLED = "android.phone.extra.ALREADY_CALLED";
-    public static final String EXTRA_ORIGINAL_URI = "android.phone.extra.ORIGINAL_URI";
-    public static final String EXTRA_NEW_CALL_INTENT = "android.phone.extra.NEW_CALL_INTENT";
-    public static final String EXTRA_SIP_PHONE_URI = "android.phone.extra.SIP_PHONE_URI";
-    public static final String EXTRA_ACTUAL_NUMBER_TO_DIAL =
-            "android.phone.extra.ACTUAL_NUMBER_TO_DIAL";
-    public static final String EXTRA_THIRD_PARTY_CALL_COMPONENT =
-            "android.phone.extra.THIRD_PARTY_CALL_COMPONENT";
-
-    /**
-     * Identifier for intent extra for sending an empty Flash message for
-     * CDMA networks. This message is used by the network to simulate a
-     * press/depress of the "hookswitch" of a landline phone. Aka "empty flash".
-     *
-     * TODO: Receiving an intent extra to tell the phone to send this flash is a
-     * temporary measure. To be replaced with an external ITelephony call in the future.
-     * TODO: Keep in sync with the string defined in TwelveKeyDialer.java in Contacts app
-     * until this is replaced with the ITelephony API.
-     */
-    public static final String EXTRA_SEND_EMPTY_FLASH =
-            "com.android.phone.extra.SEND_EMPTY_FLASH";
-
-    // Dialog IDs
-    private static final int DIALOG_NOT_VOICE_CAPABLE = 1;
-
-    /** Note message codes < 100 are reserved for the PhoneApp. */
-    private static final int EVENT_OUTGOING_CALL_TIMEOUT = 101;
-    private static final int EVENT_DELAYED_FINISH = 102;
-
-    private static final int OUTGOING_CALL_TIMEOUT_THRESHOLD = 2000; // msec
-    private static final int DELAYED_FINISH_TIME = 2000; // msec
-
-    /**
-     * ProgressBar object with "spinner" style, which will be shown if we take more than
-     * {@link #EVENT_OUTGOING_CALL_TIMEOUT} msec to handle the incoming Intent.
-     */
-    private ProgressBar mWaitingSpinner;
-    private final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == EVENT_OUTGOING_CALL_TIMEOUT) {
-                Log.i(TAG, "Outgoing call takes too long. Showing the spinner.");
-                mWaitingSpinner.setVisibility(View.VISIBLE);
-            } else if (msg.what == EVENT_DELAYED_FINISH) {
-                finish();
-            } else {
-                Log.wtf(TAG, "Unknown message id: " + msg.what);
-            }
-        }
-    };
-
-    /**
-     * Starts the delayed finish() of OutgoingCallBroadcaster in order to give the UI
-     * some time to start up.
-     */
-    private void startDelayedFinish() {
-        mHandler.sendEmptyMessageDelayed(EVENT_DELAYED_FINISH, DELAYED_FINISH_TIME);
-    }
-
-    /**
-     * OutgoingCallReceiver finishes NEW_OUTGOING_CALL broadcasts, starting
-     * the InCallScreen if the broadcast has not been canceled, possibly with
-     * a modified phone number and optional provider info (uri + package name + remote views.)
-     */
-    public class OutgoingCallReceiver extends BroadcastReceiver {
-        private static final String TAG = "OutgoingCallReceiver";
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            mHandler.removeMessages(EVENT_OUTGOING_CALL_TIMEOUT);
-            final boolean isAttemptingCall = doReceive(context, intent);
-            if (DBG) Log.v(TAG, "OutgoingCallReceiver is going to finish the Activity itself.");
-
-            // We cannot finish the activity immediately here because it would cause the temporary
-            // black screen of OutgoingBroadcaster to go away and we need it to stay up until the
-            // UI (in a different process) has time to come up.
-            // However, if we know we are not attemping a call, we need to finish the activity
-            // immediately so that subsequent CALL intents will retrigger a new
-            // OutgoingCallReceiver. see b/10857203
-            if (isAttemptingCall) {
-                startDelayedFinish();
-            } else {
-                finish();
-            }
-        }
-
-
-        /**
-         * Handes receipt of ordered new_outgoing_call intent. Verifies that the return from the
-         * ordered intent is valid.
-         * @return true if the call is being attempted; false if we are canceling the call.
-         */
-        public boolean doReceive(Context context, Intent intent) {
-            if (DBG) Log.v(TAG, "doReceive: " + intent);
-
-            boolean alreadyCalled;
-            String number;
-            String originalUri;
-
-            alreadyCalled = intent.getBooleanExtra(
-                    OutgoingCallBroadcaster.EXTRA_ALREADY_CALLED, false);
-            if (alreadyCalled) {
-                if (DBG) Log.v(TAG, "CALL already placed -- returning.");
-                return false;
-            }
-
-            // Once the NEW_OUTGOING_CALL broadcast is finished, the resultData
-            // is used as the actual number to call. (If null, no call will be
-            // placed.)
-
-            number = getResultData();
-            if (VDBG) Log.v(TAG, "- got number from resultData: '" + number + "'");
-
-            final PhoneGlobals app = PhoneGlobals.getInstance();
-            final Phone phone = PhoneGlobals.getPhone();
-
-            if (number == null) {
-                if (DBG) Log.v(TAG, "CALL cancelled (null number), returning...");
-                return false;
-            } else if (TelephonyCapabilities.supportsOtasp(phone)
-                    && (phone.getState() != PhoneConstants.State.IDLE)
-                    && (phone.isOtaSpNumber(number))) {
-                if (DBG) Log.v(TAG, "Call is active, a 2nd OTA call cancelled -- returning.");
-                return false;
-            } else if (PhoneNumberUtils.isPotentialLocalEmergencyNumber(context, number)) {
-                // Just like 3rd-party apps aren't allowed to place emergency
-                // calls via the ACTION_CALL intent, we also don't allow 3rd
-                // party apps to use the NEW_OUTGOING_CALL broadcast to rewrite
-                // an outgoing call into an emergency number.
-                Log.w(TAG, "Cannot modify outgoing call to emergency number " + number + ".");
-                return false;
-            }
-
-            originalUri = intent.getStringExtra(
-                    OutgoingCallBroadcaster.EXTRA_ORIGINAL_URI);
-            if (originalUri == null) {
-                Log.e(TAG, "Intent is missing EXTRA_ORIGINAL_URI -- returning.");
-                return false;
-            }
-
-            Uri uri = Uri.parse(originalUri);
-
-            // We already called convertKeypadLettersToDigits() and
-            // stripSeparators() way back in onCreate(), before we sent out the
-            // NEW_OUTGOING_CALL broadcast.  But we need to do it again here
-            // too, since the number might have been modified/rewritten during
-            // the broadcast (and may now contain letters or separators again.)
-            number = PhoneNumberUtils.convertKeypadLettersToDigits(number);
-            number = PhoneNumberUtils.stripSeparators(number);
-
-            if (DBG) Log.v(TAG, "doReceive: proceeding with call...");
-            if (VDBG) Log.v(TAG, "- uri: " + uri);
-            if (VDBG) Log.v(TAG, "- actual number to dial: '" + number + "'");
-
-            startSipCallOptionHandler(context, intent, uri, number);
-
-            return true;
-        }
-    }
-
-    /**
-     * Launch the SipCallOptionHandler, which is the next step(*) in the
-     * outgoing-call sequence after the outgoing call broadcast is
-     * complete.
-     *
-     * (*) We now know exactly what phone number we need to dial, so the next
-     *     step is for the SipCallOptionHandler to decide which Phone type (SIP
-     *     or PSTN) should be used.  (Depending on the user's preferences, this
-     *     decision may also involve popping up a dialog to ask the user to
-     *     choose what type of call this should be.)
-     *
-     * @param context used for the startActivity() call
-     *
-     * @param intent the intent from the previous step of the outgoing-call
-     *   sequence.  Normally this will be the NEW_OUTGOING_CALL broadcast intent
-     *   that came in to the OutgoingCallReceiver, although it can also be the
-     *   original ACTION_CALL intent that started the whole sequence (in cases
-     *   where we don't do the NEW_OUTGOING_CALL broadcast at all, like for
-     *   emergency numbers or SIP addresses).
-     *
-     * @param uri the data URI from the original CALL intent, presumably either
-     *   a tel: or sip: URI.  For tel: URIs, note that the scheme-specific part
-     *   does *not* necessarily have separators and keypad letters stripped (so
-     *   we might see URIs like "tel:(650)%20555-1234" or "tel:1-800-GOOG-411"
-     *   here.)
-     *
-     * @param number the actual number (or SIP address) to dial.  This is
-     *   guaranteed to be either a PSTN phone number with separators stripped
-     *   out and keypad letters converted to digits (like "16505551234"), or a
-     *   raw SIP address (like "user@example.com").
-     */
-    private void startSipCallOptionHandler(Context context, Intent intent,
-            Uri uri, String number) {
-        // TODO: Remove this code.
-    }
-
-    /**
-     * This method is the single point of entry for the CALL intent, which is used (by built-in
-     * apps like Contacts / Dialer, as well as 3rd-party apps) to initiate an outgoing voice call.
-     *
-     *
-     */
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.outgoing_call_broadcaster);
-        mWaitingSpinner = (ProgressBar) findViewById(R.id.spinner);
-
-        Intent intent = getIntent();
-        if (DBG) {
-            final Configuration configuration = getResources().getConfiguration();
-            Log.v(TAG, "onCreate: this = " + this + ", icicle = " + icicle);
-            Log.v(TAG, " - getIntent() = " + intent);
-            Log.v(TAG, " - configuration = " + configuration);
-        }
-
-        if (icicle != null) {
-            // A non-null icicle means that this activity is being
-            // re-initialized after previously being shut down.
-            //
-            // In practice this happens very rarely (because the lifetime
-            // of this activity is so short!), but it *can* happen if the
-            // framework detects a configuration change at exactly the
-            // right moment; see bug 2202413.
-            //
-            // In this case, do nothing.  Our onCreate() method has already
-            // run once (with icicle==null the first time), which means
-            // that the NEW_OUTGOING_CALL broadcast for this new call has
-            // already been sent.
-            Log.i(TAG, "onCreate: non-null icicle!  "
-                  + "Bailing out, not sending NEW_OUTGOING_CALL broadcast...");
-
-            // No need to finish() here, since the OutgoingCallReceiver from
-            // our original instance will do that.  (It'll actually call
-            // finish() on our original instance, which apparently works fine
-            // even though the ActivityManager has already shut that instance
-            // down.  And note that if we *do* call finish() here, that just
-            // results in an "ActivityManager: Duplicate finish request"
-            // warning when the OutgoingCallReceiver runs.)
-
-            return;
-        }
-
-        processIntent(intent);
-
-        // isFinishing() return false when 1. broadcast is still ongoing, or 2. dialog is being
-        // shown. Otherwise finish() is called inside processIntent(), is isFinishing() here will
-        // return true.
-        if (DBG) Log.v(TAG, "At the end of onCreate(). isFinishing(): " + isFinishing());
-    }
-
-    /**
-     * Interprets a given Intent and starts something relevant to the Intent.
-     *
-     * This method will handle three kinds of actions:
-     *
-     * - CALL (action for usual outgoing voice calls)
-     * - CALL_PRIVILEGED (can come from built-in apps like contacts / voice dialer / bluetooth)
-     * - CALL_EMERGENCY (from the EmergencyDialer that's reachable from the lockscreen.)
-     *
-     * The exact behavior depends on the intent's data:
-     *
-     * - The most typical is a tel: URI, which we handle by starting the
-     *   NEW_OUTGOING_CALL broadcast.  That broadcast eventually triggers
-     *   the sequence OutgoingCallReceiver -> SipCallOptionHandler ->
-     *   InCallScreen.
-     *
-     * - Or, with a sip: URI we skip the NEW_OUTGOING_CALL broadcast and
-     *   go directly to SipCallOptionHandler, which then leads to the
-     *   InCallScreen.
-     *
-     * - voicemail: URIs take the same path as regular tel: URIs.
-     *
-     * Other special cases:
-     *
-     * - Outgoing calls are totally disallowed on non-voice-capable
-     *   devices (see handleNonVoiceCapable()).
-     *
-     * - A CALL intent with the EXTRA_SEND_EMPTY_FLASH extra (and
-     *   presumably no data at all) means "send an empty flash" (which
-     *   is only meaningful on CDMA devices while a call is already
-     *   active.)
-     *
-     */
-    private void processIntent(Intent intent) {
-        if (DBG) {
-            Log.v(TAG, "processIntent() = " + intent + ", thread: " + Thread.currentThread());
-        }
-        final Configuration configuration = getResources().getConfiguration();
-
-        // Outgoing phone calls are only allowed on "voice-capable" devices.
-        if (!PhoneGlobals.sVoiceCapable) {
-            Log.i(TAG, "This device is detected as non-voice-capable device.");
-            handleNonVoiceCapable(intent);
-            return;
-        }
-
-        String action = intent.getAction();
-        String number = PhoneNumberUtils.getNumberFromIntent(intent, this);
-        // Check the number, don't convert for sip uri
-        // TODO put uriNumber under PhoneNumberUtils
-        if (number != null) {
-            if (!PhoneNumberUtils.isUriNumber(number)) {
-                number = PhoneNumberUtils.convertKeypadLettersToDigits(number);
-                number = PhoneNumberUtils.stripSeparators(number);
-            }
-        } else {
-            Log.w(TAG, "The number obtained from Intent is null.");
-        }
-
-        AppOpsManager appOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE);
-        int launchedFromUid;
-        String launchedFromPackage;
-        try {
-            launchedFromUid = ActivityManager.getService().getLaunchedFromUid(
-                    getActivityToken());
-            launchedFromPackage = ActivityManager.getService().getLaunchedFromPackage(
-                    getActivityToken());
-        } catch (RemoteException e) {
-            launchedFromUid = -1;
-            launchedFromPackage = null;
-        }
-        if (appOps.noteOpNoThrow(AppOpsManager.OP_CALL_PHONE, launchedFromUid, launchedFromPackage)
-                != AppOpsManager.MODE_ALLOWED) {
-            Log.w(TAG, "Rejecting call from uid " + launchedFromUid + " package "
-                    + launchedFromPackage);
-            finish();
-            return;
-        }
-
-        // If true, this flag will indicate that the current call is a special kind
-        // of call (most likely an emergency number) that 3rd parties aren't allowed
-        // to intercept or affect in any way.  (In that case, we start the call
-        // immediately rather than going through the NEW_OUTGOING_CALL sequence.)
-        boolean callNow;
-
-        if (getClass().getName().equals(intent.getComponent().getClassName())) {
-            // If we were launched directly from the OutgoingCallBroadcaster,
-            // not one of its more privileged aliases, then make sure that
-            // only the non-privileged actions are allowed.
-            if (!Intent.ACTION_CALL.equals(intent.getAction())) {
-                Log.w(TAG, "Attempt to deliver non-CALL action; forcing to CALL");
-                intent.setAction(Intent.ACTION_CALL);
-            }
-        }
-
-        // Check whether or not this is an emergency number, in order to
-        // enforce the restriction that only the CALL_PRIVILEGED and
-        // CALL_EMERGENCY intents are allowed to make emergency calls.
-        //
-        // (Note that the ACTION_CALL check below depends on the result of
-        // isPotentialLocalEmergencyNumber() rather than just plain
-        // isLocalEmergencyNumber(), to be 100% certain that we *don't*
-        // allow 3rd party apps to make emergency calls by passing in an
-        // "invalid" number like "9111234" that isn't technically an
-        // emergency number but might still result in an emergency call
-        // with some networks.)
-        final boolean isExactEmergencyNumber =
-                (number != null) && PhoneNumberUtils.isLocalEmergencyNumber(this, number);
-        final boolean isPotentialEmergencyNumber =
-                (number != null) && PhoneNumberUtils.isPotentialLocalEmergencyNumber(this, number);
-        if (VDBG) {
-            Log.v(TAG, " - Checking restrictions for number '" + number + "':");
-            Log.v(TAG, "     isExactEmergencyNumber     = " + isExactEmergencyNumber);
-            Log.v(TAG, "     isPotentialEmergencyNumber = " + isPotentialEmergencyNumber);
-        }
-
-        /* Change CALL_PRIVILEGED into CALL or CALL_EMERGENCY as needed. */
-        // TODO: This code is redundant with some code in InCallScreen: refactor.
-        if (Intent.ACTION_CALL_PRIVILEGED.equals(action)) {
-            // We're handling a CALL_PRIVILEGED intent, so we know this request came
-            // from a trusted source (like the built-in dialer.)  So even a number
-            // that's *potentially* an emergency number can safely be promoted to
-            // CALL_EMERGENCY (since we *should* allow you to dial "91112345" from
-            // the dialer if you really want to.)
-            if (isPotentialEmergencyNumber) {
-                Log.i(TAG, "ACTION_CALL_PRIVILEGED is used while the number is a potential"
-                        + " emergency number. Use ACTION_CALL_EMERGENCY as an action instead.");
-                action = Intent.ACTION_CALL_EMERGENCY;
-            } else {
-                action = Intent.ACTION_CALL;
-            }
-            if (DBG) Log.v(TAG, " - updating action from CALL_PRIVILEGED to " + action);
-            intent.setAction(action);
-        }
-
-        if (Intent.ACTION_CALL.equals(action)) {
-            if (isPotentialEmergencyNumber) {
-                Log.w(TAG, "Cannot call potential emergency number '" + number
-                        + "' with CALL Intent " + intent + ".");
-                Log.i(TAG, "Launching default dialer instead...");
-
-                Intent invokeFrameworkDialer = new Intent();
-
-                // TwelveKeyDialer is in a tab so we really want
-                // DialtactsActivity.  Build the intent 'manually' to
-                // use the java resolver to find the dialer class (as
-                // opposed to a Context which look up known android
-                // packages only)
-                final Resources resources = getResources();
-                invokeFrameworkDialer.setClassName(
-                        resources.getString(R.string.ui_default_package),
-                        resources.getString(R.string.dialer_default_class));
-                invokeFrameworkDialer.setAction(Intent.ACTION_DIAL);
-                invokeFrameworkDialer.setData(intent.getData());
-                if (DBG) Log.v(TAG, "onCreate(): calling startActivity for Dialer: "
-                               + invokeFrameworkDialer);
-                startActivity(invokeFrameworkDialer);
-                finish();
-                return;
-            }
-            callNow = false;
-        } else if (Intent.ACTION_CALL_EMERGENCY.equals(action)) {
-            // ACTION_CALL_EMERGENCY case: this is either a CALL_PRIVILEGED
-            // intent that we just turned into a CALL_EMERGENCY intent (see
-            // above), or else it really is an CALL_EMERGENCY intent that
-            // came directly from some other app (e.g. the EmergencyDialer
-            // activity built in to the Phone app.)
-            // Make sure it's at least *possible* that this is really an
-            // emergency number.
-            if (!isPotentialEmergencyNumber) {
-                Log.w(TAG, "Cannot call non-potential-emergency number " + number
-                        + " with EMERGENCY_CALL Intent " + intent + "."
-                        + " Finish the Activity immediately.");
-                finish();
-                return;
-            }
-            callNow = true;
-        } else {
-            Log.e(TAG, "Unhandled Intent " + intent + ". Finish the Activity immediately.");
-            finish();
-            return;
-        }
-
-        // Make sure the screen is turned on.  This is probably the right
-        // thing to do, and more importantly it works around an issue in the
-        // activity manager where we will not launch activities consistently
-        // when the screen is off (since it is trying to keep them paused
-        // and has...  issues).
-        //
-        // Also, this ensures the device stays awake while doing the following
-        // broadcast; technically we should be holding a wake lock here
-        // as well.
-        PhoneGlobals.getInstance().wakeUpScreen();
-
-        // If number is null, we're probably trying to call a non-existent voicemail number,
-        // send an empty flash or something else is fishy.  Whatever the problem, there's no
-        // number, so there's no point in allowing apps to modify the number.
-        if (TextUtils.isEmpty(number)) {
-            if (intent.getBooleanExtra(EXTRA_SEND_EMPTY_FLASH, false)) {
-                Log.i(TAG, "onCreate: SEND_EMPTY_FLASH...");
-                PhoneUtils.sendEmptyFlash(PhoneGlobals.getPhone());
-                finish();
-                return;
-            } else {
-                Log.i(TAG, "onCreate: null or empty number, setting callNow=true...");
-                callNow = true;
-            }
-        }
-
-        if (callNow) {
-            // This is a special kind of call (most likely an emergency number)
-            // that 3rd parties aren't allowed to intercept or affect in any way.
-            // So initiate the outgoing call immediately.
-
-            Log.i(TAG, "onCreate(): callNow case! Calling placeCall(): " + intent);
-
-            // Initiate the outgoing call, and simultaneously launch the
-            // InCallScreen to display the in-call UI:
-            PhoneGlobals.getInstance().callController.placeCall(intent);
-
-            // Note we do *not* "return" here, but instead continue and
-            // send the ACTION_NEW_OUTGOING_CALL broadcast like for any
-            // other outgoing call.  (But when the broadcast finally
-            // reaches the OutgoingCallReceiver, we'll know not to
-            // initiate the call again because of the presence of the
-            // EXTRA_ALREADY_CALLED extra.)
-        }
-
-        // For now, SIP calls will be processed directly without a
-        // NEW_OUTGOING_CALL broadcast.
-        //
-        // TODO: In the future, though, 3rd party apps *should* be allowed to
-        // intercept outgoing calls to SIP addresses as well.  To do this, we should
-        // (1) update the NEW_OUTGOING_CALL intent documentation to explain this
-        // case, and (2) pass the outgoing SIP address by *not* overloading the
-        // EXTRA_PHONE_NUMBER extra, but instead using a new separate extra to hold
-        // the outgoing SIP address.  (Be sure to document whether it's a URI or just
-        // a plain address, whether it could be a tel: URI, etc.)
-        Uri uri = intent.getData();
-        String scheme = uri.getScheme();
-        if (PhoneAccount.SCHEME_SIP.equals(scheme) || PhoneNumberUtils.isUriNumber(number)) {
-            Log.i(TAG, "The requested number was detected as SIP call.");
-            startSipCallOptionHandler(this, intent, uri, number);
-            finish();
-            return;
-
-            // TODO: if there's ever a way for SIP calls to trigger a
-            // "callNow=true" case (see above), we'll need to handle that
-            // case here too (most likely by just doing nothing at all.)
-        }
-
-        Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);
-        if (number != null) {
-            broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
-        }
-        CallGatewayManager.checkAndCopyPhoneProviderExtras(intent, broadcastIntent);
-        broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow);
-        broadcastIntent.putExtra(EXTRA_ORIGINAL_URI, uri.toString());
-        // Need to raise foreground in-call UI as soon as possible while allowing 3rd party app
-        // to intercept the outgoing call.
-        broadcastIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        if (DBG) Log.v(TAG, " - Broadcasting intent: " + broadcastIntent + ".");
-
-        // Set a timer so that we can prepare for unexpected delay introduced by the broadcast.
-        // If it takes too much time, the timer will show "waiting" spinner.
-        // This message will be removed when OutgoingCallReceiver#onReceive() is called before the
-        // timeout.
-        mHandler.sendEmptyMessageDelayed(EVENT_OUTGOING_CALL_TIMEOUT,
-                OUTGOING_CALL_TIMEOUT_THRESHOLD);
-        sendOrderedBroadcastAsUser(broadcastIntent, UserHandle.SYSTEM,
-                android.Manifest.permission.PROCESS_OUTGOING_CALLS,
-                AppOpsManager.OP_PROCESS_OUTGOING_CALLS,
-                new OutgoingCallReceiver(),
-                null,  // scheduler
-                Activity.RESULT_OK,  // initialCode
-                number,  // initialData: initial value for the result data
-                null);  // initialExtras
-    }
-
-    @Override
-    protected void onStop() {
-        // Clean up (and dismiss if necessary) any managed dialogs.
-        //
-        // We don't do this in onPause() since we can be paused/resumed
-        // due to orientation changes (in which case we don't want to
-        // disturb the dialog), but we *do* need it here in onStop() to be
-        // sure we clean up if the user hits HOME while the dialog is up.
-        //
-        // Note it's safe to call removeDialog() even if there's no dialog
-        // associated with that ID.
-        removeDialog(DIALOG_NOT_VOICE_CAPABLE);
-
-        super.onStop();
-    }
-
-    /**
-     * Handle the specified CALL or CALL_* intent on a non-voice-capable
-     * device.
-     *
-     * This method may launch a different intent (if there's some useful
-     * alternative action to take), or otherwise display an error dialog,
-     * and in either case will finish() the current activity when done.
-     */
-    private void handleNonVoiceCapable(Intent intent) {
-        if (DBG) Log.v(TAG, "handleNonVoiceCapable: handling " + intent
-                       + " on non-voice-capable device...");
-
-        // Just show a generic "voice calling not supported" dialog.
-        showDialog(DIALOG_NOT_VOICE_CAPABLE);
-        // ...and we'll eventually finish() when the user dismisses
-        // or cancels the dialog.
-    }
-
-    @Override
-    protected Dialog onCreateDialog(int id) {
-        Dialog dialog;
-        switch(id) {
-            case DIALOG_NOT_VOICE_CAPABLE:
-                dialog = new AlertDialog.Builder(this)
-                        .setTitle(R.string.not_voice_capable)
-                        .setIconAttribute(android.R.attr.alertDialogIcon)
-                        .setPositiveButton(android.R.string.ok, this)
-                        .setOnCancelListener(this)
-                        .create();
-                break;
-            default:
-                Log.w(TAG, "onCreateDialog: unexpected ID " + id);
-                dialog = null;
-                break;
-        }
-        return dialog;
-    }
-
-    /** DialogInterface.OnClickListener implementation */
-    @Override
-    public void onClick(DialogInterface dialog, int id) {
-        // DIALOG_NOT_VOICE_CAPABLE is the only dialog we ever use (so far
-        // at least), and its only button is "OK".
-        finish();
-    }
-
-    /** DialogInterface.OnCancelListener implementation */
-    @Override
-    public void onCancel(DialogInterface dialog) {
-        // DIALOG_NOT_VOICE_CAPABLE is the only dialog we ever use (so far
-        // at least), and canceling it is just like hitting "OK".
-        finish();
-    }
-
-    /**
-     * Implement onConfigurationChanged() purely for debugging purposes,
-     * to make sure that the android:configChanges element in our manifest
-     * is working properly.
-     */
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        if (DBG) Log.v(TAG, "onConfigurationChanged: newConfig = " + newConfig);
-    }
-}
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 15f9eba..3b65f40 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -134,9 +134,6 @@
 
     private static PhoneGlobals sMe;
 
-    // A few important fields we expose to the rest of the package
-    // directly (rather than thru set/get methods) for efficiency.
-    CallController callController;
     CallManager mCM;
     CallNotifier notifier;
     CallerInfoCache callerInfoCache;
@@ -180,6 +177,7 @@
 
     private final CarrierVvmPackageInstalledReceiver mCarrierVvmPackageInstalledReceiver =
             new CarrierVvmPackageInstalledReceiver();
+
     private final SettingsObserver mSettingsObserver;
 
     Handler mHandler = new Handler() {
@@ -201,7 +199,8 @@
                         // The user won't be able to do anything else until
                         // they enter a valid SIM network PIN.
                         Log.i(LOG_TAG, "show sim depersonal panel");
-                        IccNetworkDepersonalizationPanel.showDialog();
+                        Phone phone = (Phone) ((AsyncResult) msg.obj).userObj;
+                        IccNetworkDepersonalizationPanel.showDialog(phone);
                     }
                     break;
 
@@ -325,11 +324,6 @@
 
             callGatewayManager = CallGatewayManager.getInstance();
 
-            // Create the CallController singleton, which is the interface
-            // to the telephony layer for user-initiated telephony functionality
-            // (like making outgoing calls.)
-            callController = CallController.init(this, callLogger, callGatewayManager);
-
             // Create the CallerInfoCache singleton, which remembers custom ring tone and
             // send-to-voicemail settings.
             //
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
old mode 100644
new mode 100755
index 7493858..1219185
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -19,7 +19,6 @@
 import static com.android.internal.telephony.PhoneConstants.SUBSCRIPTION_KEY;
 
 import android.Manifest.permission;
-import android.app.ActivityManager;
 import android.app.AppOpsManager;
 import android.app.PendingIntent;
 import android.content.ComponentName;
@@ -39,8 +38,8 @@
 import android.os.Looper;
 import android.os.Message;
 import android.os.Messenger;
-import android.os.Process;
 import android.os.PersistableBundle;
+import android.os.RemoteException;
 import android.os.ResultReceiver;
 import android.os.ServiceManager;
 import android.os.UserHandle;
@@ -56,6 +55,7 @@
 import android.telephony.CellInfo;
 import android.telephony.ClientRequestStats;
 import android.telephony.IccOpenLogicalChannelResponse;
+import android.telephony.LocationAccessPolicy;
 import android.telephony.ModemActivityInfo;
 import android.telephony.NeighboringCellInfo;
 import android.telephony.NetworkScanRequest;
@@ -68,8 +68,14 @@
 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.telephony.ims.aidl.IImsConfig;
+import android.telephony.ims.aidl.IImsMmTelFeature;
+import android.telephony.ims.aidl.IImsRcsFeature;
+import android.telephony.ims.aidl.IImsRegistration;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.Log;
@@ -77,8 +83,7 @@
 import android.util.Slog;
 
 import com.android.ims.ImsManager;
-import com.android.ims.internal.IImsServiceController;
-import com.android.ims.internal.IImsServiceFeatureListener;
+import com.android.ims.internal.IImsServiceFeatureCallback;
 import com.android.internal.telephony.CallManager;
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.CellNetworkScanResult;
@@ -86,6 +91,7 @@
 import com.android.internal.telephony.DefaultPhoneNotifier;
 import com.android.internal.telephony.ITelephony;
 import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.LocaleTracker;
 import com.android.internal.telephony.MccTable;
 import com.android.internal.telephony.NetworkScanRequestTracker;
 import com.android.internal.telephony.OperatorInfo;
@@ -96,8 +102,9 @@
 import com.android.internal.telephony.ProxyController;
 import com.android.internal.telephony.RIL;
 import com.android.internal.telephony.RILConstants;
+import com.android.internal.telephony.ServiceStateTracker;
 import com.android.internal.telephony.SubscriptionController;
-import com.android.internal.telephony.TelephonyProperties;
+import com.android.internal.telephony.TelephonyPermissions;
 import com.android.internal.telephony.euicc.EuiccConnector;
 import com.android.internal.telephony.uicc.IccIoResult;
 import com.android.internal.telephony.uicc.IccUtils;
@@ -105,6 +112,8 @@
 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.UiccProfile;
+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;
@@ -179,6 +188,14 @@
     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;
+
+    // Parameters of select command.
+    private static final int SELECT_COMMAND = 0xA4;
+    private static final int SELECT_P1 = 0x04;
+    private static final int SELECT_P2 = 0;
+    private static final int SELECT_P3 = 0x10;
 
     /** The singleton instance. */
     private static PhoneInterfaceManager sInstance;
@@ -613,7 +630,7 @@
                     uiccCard = getUiccCardFromRequest(request);
                     if (uiccCard == null) {
                         loge("iccCloseLogicalChannel: No UICC");
-                        request.result = new IccIoResult(0x6F, 0, (byte[])null);
+                        request.result = false;
                         synchronized (request) {
                             request.notifyAll();
                         }
@@ -956,6 +973,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;
@@ -1241,7 +1274,8 @@
 
     @Override
     public boolean isOffhookForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "isOffhookForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "isOffhookForSubscriber")) {
             return false;
         }
 
@@ -1260,7 +1294,8 @@
 
     @Override
     public boolean isRingingForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "isRingingForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "isRingingForSubscriber")) {
             return false;
         }
 
@@ -1279,7 +1314,8 @@
 
     @Override
     public boolean isIdleForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "isIdleForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "isIdleForSubscriber")) {
             return false;
         }
 
@@ -1454,7 +1490,8 @@
 
     @Override
     public boolean isRadioOnForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "isRadioOnForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "isRadioOnForSubscriber")) {
             return false;
         }
         return isRadioOnForSubscriber(subId);
@@ -1557,7 +1594,7 @@
         int subId = mSubscriptionController.getDefaultDataSubId();
         final Phone phone = getPhone(subId);
         if (phone != null) {
-            phone.setDataEnabled(true);
+            phone.setUserDataEnabled(true);
             return true;
         } else {
             return false;
@@ -1571,7 +1608,7 @@
         int subId = mSubscriptionController.getDefaultDataSubId();
         final Phone phone = getPhone(subId);
         if (phone != null) {
-            phone.setDataEnabled(false);
+            phone.setUserDataEnabled(false);
             return true;
         } else {
             return false;
@@ -1641,47 +1678,25 @@
 
     @Override
     public Bundle getCellLocation(String callingPackage) {
-        enforceFineOrCoarseLocationPermission("getCellLocation");
-
-        // OP_COARSE_LOCATION controls both fine and coarse location.
-        if (mAppOps.noteOp(AppOpsManager.OP_COARSE_LOCATION, Binder.getCallingUid(),
-                callingPackage) != AppOpsManager.MODE_ALLOWED) {
-            log("getCellLocation: returning null; mode != allowed");
+        mPhone.getContext().getSystemService(AppOpsManager.class)
+                .checkPackage(Binder.getCallingUid(), callingPackage);
+        if (!LocationAccessPolicy.canAccessCellLocation(mPhone.getContext(),
+                callingPackage, Binder.getCallingUid(),Binder.getCallingPid())) {
             return null;
         }
 
-        if (checkIfCallerIsSelfOrForegroundUser() ||
-                checkCallerInteractAcrossUsersFull()) {
-            if (DBG_LOC) log("getCellLocation: is active user");
-            Bundle data = new Bundle();
-            Phone phone = getPhone(mSubscriptionController.getDefaultDataSubId());
-            if (phone == null) {
-                return null;
-            }
-
-            WorkSource workSource = getWorkSource(null, Binder.getCallingUid());
-            phone.getCellLocation(workSource).fillInNotifierBundle(data);
-            return data;
-        } else {
-            log("getCellLocation: suppress non-active user");
+        if (DBG_LOC) log("getCellLocation: is active user");
+        Bundle data = new Bundle();
+        Phone phone = getPhone(mSubscriptionController.getDefaultDataSubId());
+        if (phone == null) {
             return null;
         }
-    }
 
-    private void enforceFineOrCoarseLocationPermission(String message) {
-        try {
-            mApp.enforceCallingOrSelfPermission(
-                    android.Manifest.permission.ACCESS_FINE_LOCATION, null);
-        } catch (SecurityException e) {
-            // If we have ACCESS_FINE_LOCATION permission, skip the check for ACCESS_COARSE_LOCATION
-            // A failure should throw the SecurityException from ACCESS_COARSE_LOCATION since this
-            // is the weaker precondition
-            mApp.enforceCallingOrSelfPermission(
-                    android.Manifest.permission.ACCESS_COARSE_LOCATION, message);
-        }
+        WorkSource workSource = getWorkSource(null, Binder.getCallingUid());
+        phone.getCellLocation(workSource).fillInNotifierBundle(data);
+        return data;
     }
 
-
     @Override
     public String getNetworkCountryIsoForPhone(int phoneId) {
         // Reporting the correct network country is ambiguous when IWLAN could conflict with
@@ -1689,6 +1704,8 @@
         final long identity = Binder.clearCallingIdentity();
         try {
             final int subId = mSubscriptionController.getSubIdUsingPhoneId(phoneId);
+            // Todo: fix this when we can get the actual cellular network info when the device
+            // is on IWLAN.
             if (TelephonyManager.NETWORK_TYPE_IWLAN
                     == getVoiceNetworkTypeForSubscriber(subId, mApp.getPackageName())) {
                 return "";
@@ -1696,8 +1713,18 @@
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
-        return TelephonyManager.getTelephonyProperty(
-                phoneId, TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, "");
+
+        Phone phone = PhoneFactory.getPhone(phoneId);
+        if (phone != null) {
+            ServiceStateTracker sst = phone.getServiceStateTracker();
+            if (sst != null) {
+                LocaleTracker lt = sst.getLocaleTracker();
+                if (lt != null) {
+                    return lt.getCurrentCountry();
+                }
+            }
+        }
+        return "";
     }
 
     @Override
@@ -1733,11 +1760,10 @@
     @Override
     @SuppressWarnings("unchecked")
     public List<NeighboringCellInfo> getNeighboringCellInfo(String callingPackage) {
-        enforceFineOrCoarseLocationPermission("getNeighboringCellInfo");
-
-        // OP_COARSE_LOCATION controls both fine and coarse location.
-        if (mAppOps.noteOp(AppOpsManager.OP_COARSE_LOCATION, Binder.getCallingUid(),
-                callingPackage) != AppOpsManager.MODE_ALLOWED) {
+        mPhone.getContext().getSystemService(AppOpsManager.class)
+                .checkPackage(Binder.getCallingUid(), callingPackage);
+        if (!LocationAccessPolicy.canAccessCellLocation(mPhone.getContext(),
+                callingPackage, Binder.getCallingUid(), Binder.getCallingPid())) {
             return null;
         }
 
@@ -1746,52 +1772,39 @@
             return null;
         }
 
-        if (checkIfCallerIsSelfOrForegroundUser() ||
-                checkCallerInteractAcrossUsersFull()) {
-            if (DBG_LOC) log("getNeighboringCellInfo: is active user");
+        if (DBG_LOC) log("getNeighboringCellInfo: is active user");
 
-            ArrayList<NeighboringCellInfo> cells = null;
+        ArrayList<NeighboringCellInfo> cells = null;
 
-            WorkSource workSource = getWorkSource(null, Binder.getCallingUid());
-            try {
-                cells = (ArrayList<NeighboringCellInfo>) sendRequest(
-                        CMD_HANDLE_NEIGHBORING_CELL, workSource,
-                        SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-            } catch (RuntimeException e) {
-                Log.e(LOG_TAG, "getNeighboringCellInfo " + e);
-            }
-            return cells;
-        } else {
-            if (DBG_LOC) log("getNeighboringCellInfo: suppress non-active user");
-            return null;
+        WorkSource workSource = getWorkSource(null, Binder.getCallingUid());
+        try {
+            cells = (ArrayList<NeighboringCellInfo>) sendRequest(
+                    CMD_HANDLE_NEIGHBORING_CELL, workSource,
+                    SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        } catch (RuntimeException e) {
+            Log.e(LOG_TAG, "getNeighboringCellInfo " + e);
         }
+        return cells;
     }
 
 
     @Override
     public List<CellInfo> getAllCellInfo(String callingPackage) {
-        enforceFineOrCoarseLocationPermission("getAllCellInfo");
-
-        // OP_COARSE_LOCATION controls both fine and coarse location.
-        if (mAppOps.noteOp(AppOpsManager.OP_COARSE_LOCATION, Binder.getCallingUid(),
-                callingPackage) != AppOpsManager.MODE_ALLOWED) {
+        mPhone.getContext().getSystemService(AppOpsManager.class)
+                .checkPackage(Binder.getCallingUid(), callingPackage);
+        if (!LocationAccessPolicy.canAccessCellLocation(mPhone.getContext(),
+                callingPackage, Binder.getCallingUid(), Binder.getCallingPid())) {
             return null;
         }
 
-        if (checkIfCallerIsSelfOrForegroundUser() ||
-                checkCallerInteractAcrossUsersFull()) {
-            if (DBG_LOC) log("getAllCellInfo: is active user");
-            WorkSource workSource = getWorkSource(null, Binder.getCallingUid());
-            List<CellInfo> cellInfos = new ArrayList<CellInfo>();
-            for (Phone phone : PhoneFactory.getPhones()) {
-                final List<CellInfo> info = phone.getAllCellInfo(workSource);
-                if (info != null) cellInfos.addAll(info);
-            }
-            return cellInfos;
-        } else {
-            if (DBG_LOC) log("getAllCellInfo: suppress non-active user");
-            return null;
+        if (DBG_LOC) log("getAllCellInfo: is active user");
+        WorkSource workSource = getWorkSource(null, Binder.getCallingUid());
+        List<CellInfo> cellInfos = new ArrayList<CellInfo>();
+        for (Phone phone : PhoneFactory.getPhones()) {
+            final List<CellInfo> info = phone.getAllCellInfo(workSource);
+            if (info != null) cellInfos.addAll(info);
         }
+        return cellInfos;
     }
 
     @Override
@@ -1803,29 +1816,56 @@
 
     @Override
     public String getImeiForSlot(int slotIndex, String callingPackage) {
-      if (!canReadPhoneState(callingPackage, "getImeiForSlot")) {
-          return null;
-      }
-      Phone phone = PhoneFactory.getPhone(slotIndex);
-      return phone == null ? null : phone.getImei();
+        Phone phone = PhoneFactory.getPhone(slotIndex);
+        if (phone == null) {
+            return null;
+        }
+        int subId = phone.getSubId();
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getImeiForSlot")) {
+            return null;
+        }
+        return phone.getImei();
     }
 
     @Override
     public String getMeidForSlot(int slotIndex, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getMeidForSlot")) {
+        Phone phone = PhoneFactory.getPhone(slotIndex);
+        if (phone == null) {
             return null;
         }
-        Phone phone = PhoneFactory.getPhone(slotIndex);
-        return phone == null ? null : phone.getMeid();
+        int subId = phone.getSubId();
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getMeidForSlot")) {
+            return null;
+        }
+        return phone.getMeid();
     }
 
     @Override
     public String getDeviceSoftwareVersionForSlot(int slotIndex, String callingPackage) {
-      if (!canReadPhoneState(callingPackage, "getDeviceSoftwareVersionForSlot")) {
-          return null;
-      }
-      Phone phone = PhoneFactory.getPhone(slotIndex);
-      return phone == null ? null : phone.getDeviceSvn();
+        Phone phone = PhoneFactory.getPhone(slotIndex);
+        if (phone == null) {
+            return null;
+        }
+        int subId = phone.getSubId();
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getDeviceSoftwareVersionForSlot")) {
+            return null;
+        }
+        return 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();
     }
 
     //
@@ -1833,47 +1873,6 @@
     //
 
     /**
-     * Returns true if the caller holds INTERACT_ACROSS_USERS_FULL.
-     */
-    private boolean checkCallerInteractAcrossUsersFull() {
-        return mPhone.getContext().checkCallingOrSelfPermission(
-                android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
-                == PackageManager.PERMISSION_GRANTED;
-    }
-
-    private static boolean checkIfCallerIsSelfOrForegroundUser() {
-        boolean ok;
-
-        boolean self = Binder.getCallingUid() == Process.myUid();
-        if (!self) {
-            // Get the caller's user id then clear the calling identity
-            // which will be restored in the finally clause.
-            int callingUser = UserHandle.getCallingUserId();
-            long ident = Binder.clearCallingIdentity();
-
-            try {
-                // With calling identity cleared the current user is the foreground user.
-                int foregroundUser = ActivityManager.getCurrentUser();
-                ok = (foregroundUser == callingUser);
-                if (DBG_LOC) {
-                    log("checkIfCallerIsSelfOrForegoundUser: foregroundUser=" + foregroundUser
-                            + " callingUser=" + callingUser + " ok=" + ok);
-                }
-            } catch (Exception ex) {
-                if (DBG_LOC) loge("checkIfCallerIsSelfOrForegoundUser: Exception ex=" + ex);
-                ok = false;
-            } finally {
-                Binder.restoreCallingIdentity(ident);
-            }
-        } else {
-            if (DBG_LOC) log("checkIfCallerIsSelfOrForegoundUser: is self");
-            ok = true;
-        }
-        if (DBG_LOC) log("checkIfCallerIsSelfOrForegoundUser: ret=" + ok);
-        return ok;
-    }
-
-    /**
      * Make sure the caller has the MODIFY_PHONE_STATE permission.
      *
      * @throws SecurityException if the caller does not have the required permission
@@ -1883,35 +1882,6 @@
     }
 
     /**
-     * Make sure either system app or the caller has carrier privilege.
-     *
-     * @throws SecurityException if the caller does not have the required permission/privilege
-     */
-    private void enforceModifyPermissionOrCarrierPrivilege(int subId) {
-        int permission = mApp.checkCallingOrSelfPermission(
-                android.Manifest.permission.MODIFY_PHONE_STATE);
-        if (permission == PackageManager.PERMISSION_GRANTED) {
-            return;
-        }
-
-        log("No modify permission, check carrier privilege next.");
-        enforceCarrierPrivilege(subId);
-    }
-
-    /**
-     * Make sure the caller has carrier privilege.
-     *
-     * @throws SecurityException if the caller does not have the required permission
-     */
-    private void enforceCarrierPrivilege(int subId) {
-        if (getCarrierPrivilegeStatus(subId) !=
-                    TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
-            loge("No Carrier Privilege.");
-            throw new SecurityException("No Carrier Privilege.");
-        }
-    }
-
-    /**
      * Make sure the caller has the CALL_PHONE permission.
      *
      * @throws SecurityException if the caller does not have the required permission
@@ -1971,7 +1941,8 @@
 
     @Override
     public int getCdmaEriIconIndexForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getCdmaEriIconIndexForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getCdmaEriIconIndexForSubscriber")) {
             return -1;
         }
         final Phone phone = getPhone(subId);
@@ -1994,7 +1965,8 @@
 
     @Override
     public int getCdmaEriIconModeForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getCdmaEriIconModeForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getCdmaEriIconModeForSubscriber")) {
             return -1;
         }
         final Phone phone = getPhone(subId);
@@ -2015,7 +1987,8 @@
 
     @Override
     public String getCdmaEriTextForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getCdmaEriIconTextForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getCdmaEriIconTextForSubscriber")) {
             return null;
         }
         final Phone phone = getPhone(subId);
@@ -2031,7 +2004,8 @@
      */
     @Override
     public String getCdmaMdn(int subId) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "getCdmaMdn");
         final Phone phone = getPhone(subId);
         if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA && phone != null) {
             return phone.getLine1Number();
@@ -2045,7 +2019,8 @@
      */
     @Override
     public String getCdmaMin(int subId) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "getCdmaMin");
         final Phone phone = getPhone(subId);
         if (phone != null && phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
             return phone.getCdmaMin();
@@ -2066,7 +2041,7 @@
      */
     @Override
     public boolean setVoiceMailNumber(int subId, String alphaTag, String number) {
-        enforceCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(subId, "setVoiceMailNumber");
         Boolean success = (Boolean) sendRequest(CMD_SET_VOICEMAIL_NUMBER,
                 new Pair<String, String>(alphaTag, number), new Integer(subId));
         return success;
@@ -2089,10 +2064,17 @@
     @Override
     public String getVisualVoicemailPackageName(String callingPackage, int subId) {
         mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
-        if (!canReadPhoneState(callingPackage, "getVisualVoicemailPackageName")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getVisualVoicemailPackageName")) {
             return null;
         }
-        return RemoteVvmTaskManager.getRemotePackage(mPhone.getContext(), subId).getPackageName();
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            return RemoteVvmTaskManager
+                    .getRemotePackage(mPhone.getContext(), subId).getPackageName();
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
     }
 
     @Override
@@ -2153,7 +2135,8 @@
      */
     @Override
     public void setVoiceActivationState(int subId, int activationState) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "setVoiceActivationState");
         final Phone phone = getPhone(subId);
         if (phone != null) {
             phone.setVoiceActivationState(activationState);
@@ -2167,7 +2150,8 @@
      */
     @Override
     public void setDataActivationState(int subId, int activationState) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "setDataActivationState");
         final Phone phone = getPhone(subId);
         if (phone != null) {
             phone.setDataActivationState(activationState);
@@ -2181,9 +2165,7 @@
      */
     @Override
     public int getVoiceActivationState(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getVoiceActivationStateForSubscriber")) {
-            return TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN;
-        }
+        enforceReadPrivilegedPermission();
         final Phone phone = getPhone(subId);
         if (phone != null) {
             return phone.getVoiceActivationState();
@@ -2197,9 +2179,7 @@
      */
     @Override
     public int getDataActivationState(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getDataActivationStateForSubscriber")) {
-            return TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN;
-        }
+        enforceReadPrivilegedPermission();
         final Phone phone = getPhone(subId);
         if (phone != null) {
             return phone.getDataActivationState();
@@ -2248,7 +2228,8 @@
         mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
         String defaultDialer = TelecomManager.from(mPhone.getContext()).getDefaultDialerPackage();
         if (!TextUtils.equals(callingPackage, defaultDialer)) {
-            enforceCarrierPrivilege(getDefaultSubscription());
+            TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(
+                    getDefaultSubscription(), "sendDialerSpecialCode");
         }
         mPhone.sendDialerSpecialCode(inputCode);
     }
@@ -2274,7 +2255,8 @@
      */
     @Override
     public int getNetworkTypeForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getNetworkTypeForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getNetworkTypeForSubscriber")) {
             return TelephonyManager.NETWORK_TYPE_UNKNOWN;
         }
 
@@ -2299,7 +2281,8 @@
      */
     @Override
     public int getDataNetworkTypeForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getDataNetworkTypeForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getDataNetworkTypeForSubscriber")) {
             return TelephonyManager.NETWORK_TYPE_UNKNOWN;
         }
 
@@ -2316,7 +2299,8 @@
      */
     @Override
     public int getVoiceNetworkTypeForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getDataNetworkTypeForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getDataNetworkTypeForSubscriber")) {
             return TelephonyManager.NETWORK_TYPE_UNKNOWN;
         }
 
@@ -2366,7 +2350,8 @@
 
     @Override
     public int getLteOnCdmaModeForSubscriber(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getLteOnCdmaModeForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getLteOnCdmaModeForSubscriber")) {
             return PhoneConstants.LTE_ON_CDMA_UNKNOWN;
         }
 
@@ -2423,7 +2408,8 @@
     @Override
     public IccOpenLogicalChannelResponse iccOpenLogicalChannel(
             int subId, String callingPackage, String aid, int p2) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "iccOpenLogicalChannel");
 
         if (TextUtils.equals(ISDR_AID, aid)) {
             // Only allows LPA to open logical channel to ISD-R.
@@ -2446,7 +2432,8 @@
 
     @Override
     public boolean iccCloseLogicalChannel(int subId, int channel) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "iccCloseLogicalChannel");
 
         if (DBG) log("iccCloseLogicalChannel: subId=" + subId + " chnl=" + channel);
         if (channel < 0) {
@@ -2460,7 +2447,8 @@
     @Override
     public String iccTransmitApduLogicalChannel(int subId, int channel, int cla,
             int command, int p1, int p2, int p3, String data) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "iccTransmitApduLogicalChannel");
 
         if (DBG) {
             log("iccTransmitApduLogicalChannel: subId=" + subId + " chnl=" + channel +
@@ -2486,9 +2474,23 @@
     }
 
     @Override
-    public String iccTransmitApduBasicChannel(int subId, int cla, int command, int p1, int p2,
-                int p3, String data) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+    public String iccTransmitApduBasicChannel(int subId, String callingPackage, int cla,
+            int command, int p1, int p2, int p3, String data) {
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "iccTransmitApduBasicChannel");
+
+        if (command == SELECT_COMMAND && p1 == SELECT_P1 && p2 == SELECT_P2 && p3 == SELECT_P3
+                && TextUtils.equals(ISDR_AID, data)) {
+            // Only allows LPA to select ISD-R.
+            mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
+            ComponentInfo bestComponent =
+                    EuiccConnector.findBestComponent(mPhone.getContext().getPackageManager());
+            if (bestComponent == null
+                    || !TextUtils.equals(callingPackage, bestComponent.packageName)) {
+                loge("The calling package is not allowed to select ISD-R.");
+                throw new SecurityException("The calling package is not allowed to select ISD-R.");
+            }
+        }
 
         if (DBG) {
             log("iccTransmitApduBasicChannel: subId=" + subId + " cla=" + cla + " cmd=" + command
@@ -2511,7 +2513,8 @@
     @Override
     public byte[] iccExchangeSimIO(int subId, int fileID, int command, int p1, int p2, int p3,
             String filePath) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "iccExchangeSimIO");
 
         if (DBG) {
             log("Exchange SIM_IO " + subId + ":" + fileID + ":" + command + " " +
@@ -2547,6 +2550,7 @@
      * on a particular subscription
      */
     public String[] getForbiddenPlmns(int subId, int appType) {
+        // TODO(b/73884967): Migrate to TelephonyPermissions check.
         mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE,
                 "Requires READ_PHONE_STATE");
         if (appType != TelephonyManager.APPTYPE_USIM && appType != TelephonyManager.APPTYPE_SIM) {
@@ -2564,7 +2568,8 @@
 
     @Override
     public String sendEnvelopeWithStatus(int subId, String content) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "sendEnvelopeWithStatus");
 
         IccIoResult response = (IccIoResult)sendRequest(CMD_SEND_ENVELOPE, content, subId);
         if (response.payload == null) {
@@ -2587,7 +2592,8 @@
      */
     @Override
     public String nvReadItem(int itemID) {
-        enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription());
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, getDefaultSubscription(), "nvReadItem");
         if (DBG) log("nvReadItem: item " + itemID);
         String value = (String) sendRequest(CMD_NV_READ_ITEM, itemID);
         if (DBG) log("nvReadItem: item " + itemID + " is \"" + value + '"');
@@ -2604,7 +2610,8 @@
      */
     @Override
     public boolean nvWriteItem(int itemID, String itemValue) {
-        enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription());
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, getDefaultSubscription(), "nvWriteItem");
         if (DBG) log("nvWriteItem: item " + itemID + " value \"" + itemValue + '"');
         Boolean success = (Boolean) sendRequest(CMD_NV_WRITE_ITEM,
                 new Pair<Integer, String>(itemID, itemValue));
@@ -2621,7 +2628,8 @@
      */
     @Override
     public boolean nvWriteCdmaPrl(byte[] preferredRoamingList) {
-        enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription());
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, getDefaultSubscription(), "nvWriteCdmaPrl");
         if (DBG) log("nvWriteCdmaPrl: value: " + HexDump.toHexString(preferredRoamingList));
         Boolean success = (Boolean) sendRequest(CMD_NV_WRITE_CDMA_PRL, preferredRoamingList);
         if (DBG) log("nvWriteCdmaPrl: " + (success ? "ok" : "fail"));
@@ -2637,24 +2645,17 @@
      */
     @Override
     public boolean nvResetConfig(int resetType) {
-        enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription());
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, getDefaultSubscription(), "nvResetConfig");
         if (DBG) log("nvResetConfig: type " + resetType);
         Boolean success = (Boolean) sendRequest(CMD_NV_RESET_CONFIG, resetType);
         if (DBG) log("nvResetConfig: type " + resetType + ' ' + (success ? "ok" : "fail"));
         return success;
     }
 
-    /**
-     * {@hide}
-     * Returns Default sim, 0 in the case of single standby.
-     */
-    public int getDefaultSim() {
-        //TODO Need to get it from Telephony Devcontroller
-        return 0;
-    }
-
     public String[] getPcscfAddress(String apnType, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getPcscfAddress")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, mPhone.getSubId(), callingPackage, "getPcscfAddress")) {
             return new String[0];
         }
 
@@ -2663,16 +2664,70 @@
     }
 
     /**
-     * Returns the {@link IImsServiceController} that corresponds to the given slot Id and IMS
-     * feature or {@link null} if the service is not available. If an ImsServiceController is
-     * available, the {@link IImsServiceFeatureListener} callback is registered as a listener for
-     * feature updates.
+     * Enables IMS for the framework. This will trigger IMS registration and ImsFeature capability
+     * status updates, if not already enabled.
      */
-    public IImsServiceController getImsServiceControllerAndListen(int slotIndex, int feature,
-            IImsServiceFeatureListener callback) {
+    public void enableIms(int slotId) {
         enforceModifyPermission();
-        return PhoneFactory.getImsResolver().getImsServiceControllerAndListen(slotIndex, feature,
-                callback);
+        PhoneFactory.getImsResolver().enableIms(slotId);
+    }
+
+    /**
+     * Disables IMS for the framework. This will trigger IMS de-registration and trigger ImsFeature
+     * status updates to disabled.
+     */
+    public void disableIms(int slotId) {
+        enforceModifyPermission();
+        PhoneFactory.getImsResolver().disableIms(slotId);
+    }
+
+    /**
+     * Returns the {@link IImsMmTelFeature} that corresponds to the given slot Id for the MMTel
+     * feature or {@link null} if the service is not available. If the feature is available, the
+     * {@link IImsServiceFeatureCallback} callback is registered as a listener for feature updates.
+     */
+    public IImsMmTelFeature getMmTelFeatureAndListen(int slotId,
+            IImsServiceFeatureCallback callback) {
+        enforceModifyPermission();
+        return PhoneFactory.getImsResolver().getMmTelFeatureAndListen(slotId, callback);
+    }
+
+    /**
+     * Returns the {@link IImsRcsFeature} that corresponds to the given slot Id for the RCS
+     * feature during emergency calling or {@link null} if the service is not available. If the
+     * feature is available, the {@link IImsServiceFeatureCallback} callback is registered as a
+     * listener for feature updates.
+     */
+    public IImsRcsFeature getRcsFeatureAndListen(int slotId, IImsServiceFeatureCallback callback) {
+        enforceModifyPermission();
+        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);
+    }
+
+    /**
+     * Returns the {@link IImsConfig} structure associated with the slotId and feature
+     * specified.
+     */
+    public IImsConfig getImsConfig(int slotId, int feature) throws RemoteException {
+        enforceModifyPermission();
+        return PhoneFactory.getImsResolver().getImsConfig(slotId, feature);
+    }
+
+    /**
+     * @return true if the IMS resolver is busy resolving a binding and should not be considered
+     * available, false if the IMS resolver is idle.
+     */
+    public boolean isResolvingImsBinding() {
+        enforceModifyPermission();
+        return PhoneFactory.getImsResolver().isResolvingBinding();
     }
 
     public void setImsRegistrationState(boolean registered) {
@@ -2686,7 +2741,8 @@
      */
     @Override
     public void setNetworkSelectionModeAutomatic(int subId) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "setNetworkSelectionModeAutomatic");
         if (DBG) log("setNetworkSelectionModeAutomatic: subId " + subId);
         sendRequest(CMD_SET_NETWORK_SELECTION_MODE_AUTOMATIC, null, subId);
     }
@@ -2695,9 +2751,14 @@
      * 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);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "setNetworkSelectionModeManual");
+        OperatorInfo operator = new OperatorInfo(
+                /* operatorAlphaLong */ "",
+                /* operatorAlphaShort */ "",
+                operatorNumeric);
         if (DBG) log("setNetworkSelectionModeManual: subId:" + subId + " operator:" + operator);
         ManualNetworkSelectionArgument arg = new ManualNetworkSelectionArgument(operator,
                 persistSelection);
@@ -2709,7 +2770,8 @@
      */
     @Override
     public CellNetworkScanResult getCellNetworkScanResults(int subId) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "getCellNetworkScanResults");
         if (DBG) log("getCellNetworkScanResults: subId " + subId);
         CellNetworkScanResult result = (CellNetworkScanResult) sendRequest(
                 CMD_PERFORM_NETWORK_SCAN, null, subId);
@@ -2728,7 +2790,8 @@
     @Override
     public int requestNetworkScan(int subId, NetworkScanRequest request, Messenger messenger,
             IBinder binder) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "requestNetworkScan");
         return mNetworkScanRequestTracker.startNetworkScan(
                 request, messenger, binder, getPhone(subId));
     }
@@ -2741,7 +2804,8 @@
      */
     @Override
     public void stopNetworkScan(int subId, int scanId) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "stopNetworkScan");
         mNetworkScanRequestTracker.stopNetworkScan(scanId);
     }
 
@@ -2753,7 +2817,8 @@
      */
     @Override
     public int getCalculatedPreferredNetworkType(String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getCalculatedPreferredNetworkType")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, mPhone.getSubId(), callingPackage, "getCalculatedPreferredNetworkType")) {
             return RILConstants.PREFERRED_NETWORK_MODE;
         }
 
@@ -2768,7 +2833,8 @@
      */
     @Override
     public int getPreferredNetworkType(int subId) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "getPreferredNetworkType");
         if (DBG) log("getPreferredNetworkType");
         int[] result = (int[]) sendRequest(CMD_GET_PREFERRED_NETWORK_TYPE, null, subId);
         int networkType = (result != null ? result[0] : -1);
@@ -2785,7 +2851,8 @@
      */
     @Override
     public boolean setPreferredNetworkType(int subId, int networkType) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "setPreferredNetworkType");
         if (DBG) log("setPreferredNetworkType: subId " + subId + " type " + networkType);
         Boolean success = (Boolean) sendRequest(CMD_SET_PREFERRED_NETWORK_TYPE, networkType, subId);
         if (DBG) log("setPreferredNetworkType: " + (success ? "ok" : "fail"));
@@ -2824,43 +2891,95 @@
      * @param enable {@code true} turn turn data on, else {@code false}
      */
     @Override
-    public void setDataEnabled(int subId, boolean enable) {
-        enforceModifyPermissionOrCarrierPrivilege(subId);
+    public void setUserDataEnabled(int subId, boolean enable) {
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, subId, "setUserDataEnabled");
         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);
         } catch (Exception e) {
-            enforceModifyPermissionOrCarrierPrivilege(subId);
+            TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                    mApp, subId, "isUserDataEnabled");
         }
         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) {
+            TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                    mApp, subId, "isDataEnabled");
+        }
+        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;
         }
     }
@@ -2882,6 +3001,22 @@
     }
 
     @Override
+    public int getCarrierPrivilegeStatusForUid(int subId, int uid) {
+        final Phone phone = getPhone(subId);
+        if (phone == null) {
+            loge("getCarrierPrivilegeStatus: Invalid subId");
+            return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
+        }
+        UiccProfile profile =
+                UiccController.getInstance().getUiccProfileForPhone(phone.getPhoneId());
+        if (profile == null) {
+            loge("getCarrierPrivilegeStatus: No UICC");
+            return TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED;
+        }
+        return profile.getCarrierPrivilegeStatusForUid(phone.getContext().getPackageManager(), uid);
+    }
+
+    @Override
     public int checkCarrierPrivilegesForPackage(String pkgName) {
         if (TextUtils.isEmpty(pkgName))
             return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
@@ -2980,7 +3115,8 @@
     @Override
     public boolean setLine1NumberForDisplayForSubscriber(int subId, String alphaTag,
             String number) {
-        enforceCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(
+                subId, "setLine1NumberForDisplayForSubscriber");
 
         final String iccId = getIccId(subId);
         final Phone phone = getPhone(subId);
@@ -3026,7 +3162,8 @@
     @Override
     public String getLine1NumberForDisplay(int subId, String callingPackage) {
         // This is open to apps with WRITE_SMS.
-        if (!canReadPhoneNumber(callingPackage, "getLine1NumberForDisplay")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneNumber(
+                mApp, subId, callingPackage, "getLine1NumberForDisplay")) {
             if (DBG_MERGE) log("getLine1NumberForDisplay returning null due to permission");
             return null;
         }
@@ -3046,7 +3183,8 @@
 
     @Override
     public String getLine1AlphaTagForDisplay(int subId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getLine1AlphaTagForDisplay")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getLine1AlphaTagForDisplay")) {
             return null;
         }
 
@@ -3060,7 +3198,11 @@
 
     @Override
     public String[] getMergedSubscriberIds(String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getMergedSubscriberIds")) {
+        // This API isn't public, so no need to provide a valid subscription ID - we're not worried
+        // about carrier-privileged callers not having access.
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, SubscriptionManager.INVALID_SUBSCRIPTION_ID, callingPackage,
+                "getMergedSubscriberIds")) {
             return null;
         }
         final Context context = mPhone.getContext();
@@ -3133,7 +3275,8 @@
 
     @Override
     public boolean setOperatorBrandOverride(int subId, String brand) {
-        enforceCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(
+                subId, "setOperatorBrandOverride");
         final Phone phone = getPhone(subId);
         return phone == null ? false : phone.setOperatorBrandOverride(brand);
     }
@@ -3142,7 +3285,7 @@
     public boolean setRoamingOverride(int subId, List<String> gsmRoamingList,
             List<String> gsmNonRoamingList, List<String> cdmaRoamingList,
             List<String> cdmaNonRoamingList) {
-        enforceCarrierPrivilege(subId);
+        TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(subId, "setRoamingOverride");
         final Phone phone = getPhone(subId);
         if (phone == null) {
             return false;
@@ -3195,7 +3338,13 @@
 
     @Override
     public int getRadioAccessFamily(int phoneId, String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getRadioAccessFamily")) {
+        Phone phone = PhoneFactory.getPhone(phoneId);
+        if (phone == null) {
+            return RadioAccessFamily.RAF_UNKNOWN;
+        }
+        int subId = phone.getSubId();
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getRadioAccessFamily")) {
             return RadioAccessFamily.RAF_UNKNOWN;
         }
 
@@ -3205,12 +3354,13 @@
     @Override
     public void enableVideoCalling(boolean enable) {
         enforceModifyPermission();
-        ImsManager.setVtSetting(mPhone.getContext(), enable);
+        ImsManager.getInstance(mPhone.getContext(), mPhone.getPhoneId()).setVtSetting(enable);
     }
 
     @Override
     public boolean isVideoCallingEnabled(String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "isVideoCallingEnabled")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, mPhone.getSubId(), callingPackage, "isVideoCallingEnabled")) {
             return false;
         }
 
@@ -3218,9 +3368,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
@@ -3246,6 +3397,19 @@
         return mPhone.getContext().getResources().getBoolean(R.bool.hac_enabled);
     }
 
+    public boolean isRttSupported() {
+        boolean isCarrierSupported =
+                mApp.getCarrierConfig().getBoolean(CarrierConfigManager.KEY_RTT_SUPPORTED_BOOL);
+        boolean isDeviceSupported =
+                mPhone.getContext().getResources().getBoolean(R.bool.config_support_rtt);
+        return isCarrierSupported && isDeviceSupported;
+    }
+
+    public boolean isRttEnabled() {
+        return isRttSupported() && Settings.Secure.getInt(mPhone.getContext().getContentResolver(),
+                Settings.Secure.RTT_CALLING_MODE, 0) != 0;
+    }
+
     /**
      * Returns the unique device ID of phone, for example, the IMEI for
      * GSM and the MEID for CDMA phones. Return null if device ID is not available.
@@ -3255,25 +3419,16 @@
      */
     @Override
     public String getDeviceId(String callingPackage) {
-        if (!canReadPhoneState(callingPackage, "getDeviceId")) {
-            return null;
-        }
-
         final Phone phone = PhoneFactory.getPhone(0);
-        if (phone != null) {
-            return phone.getDeviceId();
-        } else {
+        if (phone == null) {
             return null;
         }
-    }
-
-    /*
-     * {@hide}
-     * Returns the IMS Registration Status
-     */
-    @Override
-    public boolean isImsRegistered() {
-        return mPhone.isImsRegistered();
+        int subId = phone.getSubId();
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getDeviceId")) {
+            return null;
+        }
+        return phone.getDeviceId();
     }
 
     /**
@@ -3282,7 +3437,7 @@
      *
      * @param subId
      */
-    public boolean isImsRegisteredForSubscriber(int subId) {
+    public boolean isImsRegistered(int subId) {
         Phone phone = getPhone(subId);
         if (phone != null) {
             return phone.isImsRegistered();
@@ -3296,93 +3451,53 @@
         return PhoneUtils.getSubIdForPhoneAccount(phoneAccount);
     }
 
-    /*
-     * {@hide}
-     * Returns the IMS Registration Status
+    /**
+     * @return the VoWiFi calling availability.
      */
-    public boolean isWifiCallingAvailable() {
-        return mPhone.isWifiCallingEnabled();
-    }
-
-    /*
-     * {@hide}
-     * Returns the IMS Registration Status
-     */
-    public boolean isVolteAvailable() {
-        return mPhone.isVolteEnabled();
-    }
-
-    /*
-     * {@hide} Returns the IMS Registration Status
-     */
-    public boolean isVideoTelephonyAvailable() {
-        return mPhone.isVideoEnabled();
-    }
-
-    private boolean canReadPhoneState(String callingPackage, String message) {
-        try {
-            mApp.enforceCallingOrSelfPermission(
-                    android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, message);
-
-            // SKIP checking for run-time permission since caller or self has PRIVILEDGED permission
-            return true;
-        } catch (SecurityException e) {
-            mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE,
-                    message);
-        }
-
-        if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(),
-                callingPackage) != AppOpsManager.MODE_ALLOWED) {
+    public boolean isWifiCallingAvailable(int subId) {
+        Phone phone = getPhone(subId);
+        if (phone != null) {
+            return phone.isWifiCallingEnabled();
+        } else {
             return false;
         }
-
-        return true;
     }
 
     /**
-     * Besides READ_PHONE_STATE, WRITE_SMS and READ_SMS also allow apps to get phone numbers.
+     * @return the VoLTE availability.
      */
-    private boolean canReadPhoneNumber(String callingPackage, String message) {
-        // Default SMS app can always read it.
-        if (mAppOps.noteOp(AppOpsManager.OP_WRITE_SMS,
-                Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED) {
-            return true;
+    public boolean isVolteAvailable(int subId) {
+        Phone phone = getPhone(subId);
+        if (phone != null) {
+            return phone.isVolteEnabled();
+        } else {
+            return false;
         }
+    }
 
-        try {
-            return canReadPhoneState(callingPackage, message);
-        } catch (SecurityException readPhoneStateSecurityException) {
+    /**
+     * @return the VT calling availability.
+     */
+    public boolean isVideoTelephonyAvailable(int subId) {
+        Phone phone = getPhone(subId);
+        if (phone != null) {
+            return phone.isVideoEnabled();
+        } else {
+            return false;
         }
-        // Can be read with READ_SMS too.
-        try {
-            mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_SMS, message);
-            int opCode = mAppOps.permissionToOpCode(android.Manifest.permission.READ_SMS);
-            if (opCode != AppOpsManager.OP_NONE) {
-                return mAppOps.noteOp(opCode, Binder.getCallingUid(), callingPackage)
-                        == AppOpsManager.MODE_ALLOWED;
-            } else {
-                return true;
-            }
-        } catch (SecurityException readSmsSecurityException) {
-        }
-        // Can be read with READ_PHONE_NUMBERS too.
-        try {
-            mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_NUMBERS,
-                    message);
-            int opCode = mAppOps.permissionToOpCode(android.Manifest.permission.READ_PHONE_NUMBERS);
-            if (opCode != AppOpsManager.OP_NONE) {
-                return mAppOps.noteOp(opCode, Binder.getCallingUid(), callingPackage)
-                        == AppOpsManager.MODE_ALLOWED;
-            } else {
-                return true;
-            }
-        } catch (SecurityException readPhoneNumberSecurityException) {
-        }
+    }
 
-        throw new SecurityException(message + ": Neither user " + Binder.getCallingUid() +
-                " nor current process has" + android.Manifest.permission.READ_PHONE_STATE +
-                ", " + android.Manifest.permission.READ_SMS + ", or " +
-                android.Manifest.permission.READ_PHONE_NUMBERS);
+    /**
+     * @return the IMS registration technology for the MMTEL feature. Valid return values are
+     * defined in {@link ImsRegistrationImplBase}.
+     */
+    public @ImsRegistrationImplBase.ImsRegistrationTech int getImsRegTechnologyForMmTel(int subId) {
+        Phone phone = getPhone(subId);
+        if (phone != null) {
+            return phone.getImsRegistrationTech();
+        } else {
+            return ImsRegistrationImplBase.REGISTRATION_TECH_NONE;
+        }
     }
 
     @Override
@@ -3397,11 +3512,17 @@
             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
-                setPreferredNetworkType(subId, Phone.PREFERRED_NT_MODE);
+                String defaultNetwork = TelephonyManager.getTelephonyProperty(
+                        mSubscriptionController.getPhoneId(subId),
+                        "ro.telephony.default_network",
+                        null);
+                int networkType = !TextUtils.isEmpty(defaultNetwork)
+                        ? Integer.parseInt(defaultNetwork) : Phone.PREFERRED_NT_MODE;
+                setPreferredNetworkType(subId, networkType);
                 // Turn off roaming
                 mPhone.setDataRoamingEnabled(false);
             }
@@ -3515,7 +3636,8 @@
     @Override
     public ServiceState getServiceStateForSubscriber(int subId, String callingPackage) {
 
-        if (!canReadPhoneState(callingPackage, "getServiceStateForSubscriber")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getServiceStateForSubscriber")) {
             return null;
         }
 
@@ -3562,8 +3684,9 @@
         mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
         if (!TextUtils.equals(callingPackage,
                 TelecomManager.from(mPhone.getContext()).getDefaultDialerPackage())) {
-            enforceModifyPermissionOrCarrierPrivilege(
-                    PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccountHandle));
+            TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                    mApp, PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccountHandle),
+                    "setVoicemailRingtoneUri");
         }
         Phone phone = PhoneUtils.getPhoneForPhoneAccountHandle(phoneAccountHandle);
         if (phone == null){
@@ -3606,8 +3729,9 @@
         mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
         if (!TextUtils.equals(callingPackage,
                 TelecomManager.from(mPhone.getContext()).getDefaultDialerPackage())) {
-            enforceModifyPermissionOrCarrierPrivilege(
-                    PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccountHandle));
+            TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                    mApp, PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccountHandle),
+                    "setVoicemailVibrationEnabled");
         }
 
         Phone phone = PhoneUtils.getPhoneForPhoneAccountHandle(phoneAccountHandle);
@@ -3730,7 +3854,8 @@
      */
     @Override
     public List<TelephonyHistogram> getTelephonyHistograms() {
-        enforceModifyPermissionOrCarrierPrivilege(getDefaultSubscription());
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+                mApp, getDefaultSubscription(), "getTelephonyHistograms");
         return RIL.getTelephonyRILTimingHistograms();
     }
 
@@ -3897,7 +4022,8 @@
      */
     @Override
     public List<ClientRequestStats> getClientRequestStats(String callingPackage, int subId) {
-        if (!canReadPhoneState(callingPackage, "getClientRequestStats")) {
+        if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+                mApp, subId, callingPackage, "getClientRequestStats")) {
             return null;
         }
 
@@ -3984,4 +4110,87 @@
 
         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,
+                    slot.getPhoneId(),
+                    slot.isExtendedApduSupported());
+        }
+        return infos;
+    }
+
+    @Override
+    public boolean switchSlots(int[] physicalSlots) {
+        enforceModifyPermission();
+        return (Boolean) sendRequest(CMD_SWITCH_SLOTS, physicalSlots);
+    }
+
+    @Override
+    public void setRadioIndicationUpdateMode(int subId, int filters, int mode) {
+        enforceModifyPermission();
+        final Phone phone = getPhone(subId);
+        if (phone == null) {
+            loge("setRadioIndicationUpdateMode fails with invalid subId: " + subId);
+            return;
+        }
+
+        phone.setRadioIndicationUpdateMode(filters, mode);
+    }
+
+    @Override
+    public void setCarrierTestOverride(int subId, String mccmnc, String imsi, String iccid, String
+            gid1, String gid2, String plmn, String spn) {
+        enforceModifyPermission();
+        final Phone phone = getPhone(subId);
+        if (phone == null) {
+            loge("setCarrierTestOverride fails with invalid subId: " + subId);
+            return;
+        }
+        phone.setCarrierTestOverride(mccmnc, imsi, iccid, gid1, gid2, plmn, spn);
+    }
+
+    @Override
+    public int getCarrierIdListVersion(int subId) {
+        enforceReadPrivilegedPermission();
+        final Phone phone = getPhone(subId);
+        if (phone == null) {
+            loge("getCarrierIdListVersion fails with invalid subId: " + subId);
+            return TelephonyManager.UNKNOWN_CARRIER_ID_LIST_VERSION;
+        }
+        return phone.getCarrierIdListVersion();
+    }
 }
diff --git a/src/com/android/phone/PhoneSearchIndexablesProvider.java b/src/com/android/phone/PhoneSearchIndexablesProvider.java
index 1cee227..75e6bab 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 {
@@ -100,10 +99,11 @@
         MatrixCursor cursor = new MatrixCursor(NON_INDEXABLES_KEYS_COLUMNS);
 
         if (!mUserManager.isAdminUser()) {
-            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_carrier_sel_key", "carrier_settings_key",
-                    "cdma_system_select_key", "esim_list_profile"};
+            final String[] values = new String[]{"preferred_network_mode_key",
+                    "button_roaming_key", "cdma_lte_data_service_key", "enhanced_4g_lte",
+                    "button_apn_key", "button_network_select_key", "carrier_settings_key",
+                    "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));
             }
@@ -115,7 +115,13 @@
                 cursor.addRow(createNonIndexableRow("enhanced_4g_lte" /* key */));
             }
         }
+        // enabled_networks button and preferred_network_mode button share the same title
+        // "Preferred network type"and are mutual exclusive. Thus we remove one from search
+        // result to avoid duplicate search result.
+        // TODO: b/63381516 all hidden buttons should dynamically be removed from search result.
+        cursor.addRow(createNonIndexableRow("enabled_networks_key" /* key */));
         cursor.addRow(createNonIndexableRow("carrier_settings_euicc_key" /* key */));
+        cursor.addRow(createNonIndexableRow("advanced_options" /* key */));
         return cursor;
     }
 
@@ -124,10 +130,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/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java
index 50e7f0a..a153cf7 100644
--- a/src/com/android/phone/PhoneUtils.java
+++ b/src/com/android/phone/PhoneUtils.java
@@ -32,7 +32,6 @@
 import android.os.Message;
 import android.os.PersistableBundle;
 import android.os.RemoteException;
-import android.os.SystemProperties;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.VideoProfile;
@@ -61,7 +60,6 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.TelephonyCapabilities;
-import com.android.internal.telephony.TelephonyProperties;
 import com.android.internal.telephony.sip.SipPhone;
 import com.android.phone.CallGatewayManager.RawGatewayInfo;
 
@@ -1117,54 +1115,6 @@
     }
 
     /**
-     * Given an Intent (which is presumably the ACTION_CALL intent that
-     * initiated this outgoing call), figure out the actual phone number we
-     * should dial.
-     *
-     * Note that the returned "number" may actually be a SIP address,
-     * if the specified intent contains a sip: URI.
-     *
-     * This method is basically a wrapper around PhoneUtils.getNumberFromIntent(),
-     * except it's also aware of the EXTRA_ACTUAL_NUMBER_TO_DIAL extra.
-     * (That extra, if present, tells us the exact string to pass down to the
-     * telephony layer.  It's guaranteed to be safe to dial: it's either a PSTN
-     * phone number with separators and keypad letters stripped out, or a raw
-     * unencoded SIP address.)
-     *
-     * @return the phone number corresponding to the specified Intent, or null
-     *   if the Intent has no action or if the intent's data is malformed or
-     *   missing.
-     *
-     * @throws VoiceMailNumberMissingException if the intent
-     *   contains a "voicemail" URI, but there's no voicemail
-     *   number configured on the device.
-     */
-    public static String getInitialNumber(Intent intent)
-            throws PhoneUtils.VoiceMailNumberMissingException {
-        if (DBG) log("getInitialNumber(): " + intent);
-
-        String action = intent.getAction();
-        if (TextUtils.isEmpty(action)) {
-            return null;
-        }
-
-        // If the EXTRA_ACTUAL_NUMBER_TO_DIAL extra is present, get the phone
-        // number from there.  (That extra takes precedence over the actual data
-        // included in the intent.)
-        if (intent.hasExtra(OutgoingCallBroadcaster.EXTRA_ACTUAL_NUMBER_TO_DIAL)) {
-            String actualNumberToDial =
-                    intent.getStringExtra(OutgoingCallBroadcaster.EXTRA_ACTUAL_NUMBER_TO_DIAL);
-            if (DBG) {
-                log("==> got EXTRA_ACTUAL_NUMBER_TO_DIAL; returning '"
-                        + toLogSafePhoneNumber(actualNumberToDial) + "'");
-            }
-            return actualNumberToDial;
-        }
-
-        return getNumberFromIntent(PhoneGlobals.getInstance(), intent);
-    }
-
-    /**
      * Gets the phone number to be called from an intent.  Requires a Context
      * to access the contacts database, and a Phone to access the voicemail
      * number.
diff --git a/src/com/android/phone/ProcessOutgoingCallTest.java b/src/com/android/phone/ProcessOutgoingCallTest.java
deleted file mode 100644
index c76fb43..0000000
--- a/src/com/android/phone/ProcessOutgoingCallTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone;
-
-import android.app.SearchManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.util.Log;
-
-/**
- * ProcessOutgoingCallTest tests {@link OutgoingCallBroadcaster} by performing
- * a couple of simple modifications to outgoing calls, and by printing log
- * messages for each call.
- */
-public class ProcessOutgoingCallTest extends BroadcastReceiver {
-    private static final String TAG = "ProcessOutgoingCallTest";
-    private static final String AREACODE = "617";
-
-    private static final boolean LOGV = false;
-
-    private static final boolean REDIRECT_411_TO_GOOG411 = true;
-    private static final boolean SEVEN_DIGIT_DIALING = true;
-    private static final boolean POUND_POUND_SEARCH = true;
-    private static final boolean BLOCK_555 = true;
-
-    public void onReceive(Context context, Intent intent) {
-        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
-            String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
-            if (LOGV) Log.v(TAG, "Received intent " + intent + " (number = " + number + ".");
-            /* Example of how to redirect calls from one number to another. */
-            if (REDIRECT_411_TO_GOOG411 && number.equals("411")) {
-                setResultData("18004664411");
-            }
-
-            /* Example of how to modify the phone number in flight. */
-            if (SEVEN_DIGIT_DIALING && number.length() == 7) {
-                setResultData(AREACODE + number);
-            }
-
-            /* Example of how to route a call to another Application. */
-            if (POUND_POUND_SEARCH && number.startsWith("##")) {
-                Intent newIntent = new Intent(Intent.ACTION_SEARCH);
-                newIntent.putExtra(SearchManager.QUERY, number.substring(2));
-                newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                context.startActivity(newIntent);
-                setResultData(null);
-            }
-
-            /* Example of how to deny calls to a particular number.
-             * Note that no UI is displayed to the user -- the call simply 
-             * does not happen.  It is the application's responaibility to
-             * explain this to the user. */
-            int length = number.length();
-            if (BLOCK_555 && length >= 7) {
-                String exchange = number.substring(length - 7, length - 4);
-                Log.v(TAG, "exchange = " + exchange);
-                if (exchange.equals("555")) {
-                    setResultData(null);
-                }
-            }
-        }
-    }
-}
diff --git a/src/com/android/phone/RestrictedPreference.java b/src/com/android/phone/RestrictedPreference.java
new file mode 100644
index 0000000..b8b6fe7
--- /dev/null
+++ b/src/com/android/phone/RestrictedPreference.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone;
+
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
+import android.content.Context;
+import android.preference.Preference;
+import android.preference.PreferenceScreen;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.settingslib.RestrictedLockUtils;
+
+/**
+ * Preference class that supports being disabled by a device admin.
+ *
+ * <p>This class is a mimic of ../../../frameworks/base/packages/SettingsLib/src/com/android
+ * /settingslib/RestrictedPreference.java,
+ * but support framework {@link Preference}.
+ */
+public class RestrictedPreference extends Preference {
+    private final Context mContext;
+
+    private boolean mDisabledByAdmin;
+    private EnforcedAdmin mEnforcedAdmin;
+
+    public RestrictedPreference(Context context, AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        mContext = context;
+
+        setLayoutResource(com.android.settingslib.R.layout.preference_two_target);
+        setWidgetLayoutResource(R.layout.restricted_icon);
+    }
+
+    public RestrictedPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public RestrictedPreference(Context context, AttributeSet attrs) {
+        this(context, attrs, android.R.attr.preferenceStyle);
+    }
+
+    public RestrictedPreference(Context context) {
+        this(context, null);
+    }
+
+    @Override
+    public void performClick(PreferenceScreen preferenceScreen) {
+        if (mDisabledByAdmin) {
+            RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext, mEnforcedAdmin);
+        } else {
+            super.performClick(preferenceScreen);
+        }
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+
+        final View divider = view.findViewById(com.android.settingslib.R.id.two_target_divider);
+        final View widgetFrame = view.findViewById(android.R.id.widget_frame);
+        final View restrictedIcon = view.findViewById(R.id.restricted_icon);
+        final TextView summaryView = view.findViewById(android.R.id.summary);
+        if (divider != null) {
+            divider.setVisibility(mDisabledByAdmin ? View.VISIBLE : View.GONE);
+        }
+        if (widgetFrame != null) {
+            widgetFrame.setVisibility(mDisabledByAdmin ? View.VISIBLE : View.GONE);
+        }
+        if (restrictedIcon != null) {
+            restrictedIcon.setVisibility(mDisabledByAdmin ? View.VISIBLE : View.GONE);
+        }
+        if (summaryView != null && mDisabledByAdmin) {
+            summaryView.setText(com.android.settingslib.R.string.disabled_by_admin_summary_text);
+            summaryView.setVisibility(View.VISIBLE);
+        }
+
+        if (mDisabledByAdmin) {
+            view.setEnabled(true);
+        }
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        if (enabled && mDisabledByAdmin) {
+            setDisabledByAdmin(null);
+            return;
+        }
+        super.setEnabled(enabled);
+    }
+
+    /**
+     * Disable this preference based on the enforce admin.
+     *
+     * @param admin Details of the admin who enforced the restriction. If it is {@code null}, then
+     * this preference will be enabled. Otherwise, it will be disabled.
+     */
+    public void setDisabledByAdmin(EnforcedAdmin admin) {
+        final boolean disabled = admin != null;
+        mEnforcedAdmin = admin;
+        boolean changed = false;
+        if (mDisabledByAdmin != disabled) {
+            mDisabledByAdmin = disabled;
+            changed = true;
+        }
+        setEnabled(!disabled);
+        if (changed) {
+            notifyChanged();
+        }
+    }
+}
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/phone/TimeConsumingPreferenceActivity.java b/src/com/android/phone/TimeConsumingPreferenceActivity.java
index 05b86a5..354c4bb 100644
--- a/src/com/android/phone/TimeConsumingPreferenceActivity.java
+++ b/src/com/android/phone/TimeConsumingPreferenceActivity.java
@@ -1,7 +1,5 @@
 package com.android.phone;
 
-import com.android.internal.telephony.CommandException;
-
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.ProgressDialog;
@@ -11,6 +9,8 @@
 import android.util.Log;
 import android.view.WindowManager;
 
+import com.android.internal.telephony.CommandException;
+
 import java.util.ArrayList;
 
 interface  TimeConsumingPreferenceListener {
@@ -23,7 +23,7 @@
 public class TimeConsumingPreferenceActivity extends PreferenceActivity
                         implements TimeConsumingPreferenceListener,
                         DialogInterface.OnCancelListener {
-    private static final String LOG_TAG = "TimeConsumingPreferenceActivity";
+    private static final String LOG_TAG = "TimeConsumingPrefActivity";
     private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
 
     private class DismissOnClickListener implements DialogInterface.OnClickListener {
@@ -53,6 +53,7 @@
     static final int STK_CC_SS_TO_DIAL_ERROR = 700;
     static final int STK_CC_SS_TO_USSD_ERROR = 800;
     static final int STK_CC_SS_TO_SS_ERROR = 900;
+    static final int STK_CC_SS_TO_DIAL_VIDEO_ERROR = 1000;
 
     private final ArrayList<String> mBusyList = new ArrayList<String>();
 
@@ -81,7 +82,8 @@
 
         if (id == RESPONSE_ERROR || id == RADIO_OFF_ERROR || id == EXCEPTION_ERROR
                 || id == FDN_CHECK_FAILURE || id == STK_CC_SS_TO_DIAL_ERROR
-                || id == STK_CC_SS_TO_USSD_ERROR || id == STK_CC_SS_TO_SS_ERROR) {
+                || id == STK_CC_SS_TO_USSD_ERROR || id == STK_CC_SS_TO_SS_ERROR
+                || id == STK_CC_SS_TO_DIAL_VIDEO_ERROR) {
             AlertDialog.Builder builder = new AlertDialog.Builder(this);
 
             int msgId;
@@ -113,6 +115,10 @@
                     msgId = R.string.stk_cc_ss_to_ss_error;
                     builder.setPositiveButton(R.string.close_dialog, mDismiss);
                     break;
+                case STK_CC_SS_TO_DIAL_VIDEO_ERROR:
+                    msgId = R.string.stk_cc_ss_to_dial_video_error;
+                    builder.setPositiveButton(R.string.close_dialog, mDismiss);
+                    break;
                 case EXCEPTION_ERROR:
                 default:
                     msgId = R.string.exception_error;
@@ -149,8 +155,7 @@
     @Override
     public void onStarted(Preference preference, boolean reading) {
         if (DBG) dumpState();
-        if (DBG) Log.d(LOG_TAG, "onStarted, preference=" + preference.getKey()
-                + ", reading=" + reading);
+        Log.i(LOG_TAG, "onStarted, preference=" + preference.getKey() + ", reading=" + reading);
         mBusyList.add(preference.getKey());
 
         if (mIsForeground) {
@@ -166,8 +171,7 @@
     @Override
     public void onFinished(Preference preference, boolean reading) {
         if (DBG) dumpState();
-        if (DBG) Log.d(LOG_TAG, "onFinished, preference=" + preference.getKey()
-                + ", reading=" + reading);
+        Log.i(LOG_TAG, "onFinished, preference=" + preference.getKey() + ", reading=" + reading);
         mBusyList.remove(preference.getKey());
 
         if (mBusyList.isEmpty()) {
@@ -183,7 +187,7 @@
     @Override
     public void onError(Preference preference, int error) {
         if (DBG) dumpState();
-        if (DBG) Log.d(LOG_TAG, "onError, preference=" + preference.getKey() + ", error=" + error);
+        Log.i(LOG_TAG, "onError, preference=" + preference.getKey() + ", error=" + error);
 
         if (mIsForeground) {
             showDialog(error);
@@ -197,6 +201,15 @@
             onError(preference, FDN_CHECK_FAILURE);
         } else if (exception.getCommandError() == CommandException.Error.RADIO_NOT_AVAILABLE) {
             onError(preference, RADIO_OFF_ERROR);
+        } else if (exception.getCommandError() == CommandException.Error.SS_MODIFIED_TO_DIAL) {
+            onError(preference, STK_CC_SS_TO_DIAL_ERROR);
+        } else if (exception.getCommandError() == CommandException.Error
+                .SS_MODIFIED_TO_DIAL_VIDEO) {
+            onError(preference, STK_CC_SS_TO_DIAL_VIDEO_ERROR);
+        } else if (exception.getCommandError() == CommandException.Error.SS_MODIFIED_TO_USSD) {
+            onError(preference, STK_CC_SS_TO_USSD_ERROR);
+        } else if (exception.getCommandError() == CommandException.Error.SS_MODIFIED_TO_SS) {
+            onError(preference, STK_CC_SS_TO_SS_ERROR);
         } else {
             preference.setEnabled(false);
             onError(preference, EXCEPTION_ERROR);
diff --git a/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java b/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
index e774720..67234dd 100644
--- a/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
+++ b/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
@@ -89,24 +89,27 @@
     protected Intent getEuiccUiIntent() {
         String action = getIntent().getAction();
 
-        String euiccUiAction;
+        Intent intent = new Intent();
         switch (action) {
             case EuiccManager.ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS:
-                euiccUiAction = EuiccService.ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS;
+                intent.setAction(EuiccService.ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS);
                 break;
             case EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION:
                 if (isDeviceProvisioned()) {
                     Log.w(TAG, "Cannot perform eUICC provisioning once device is provisioned");
                     return null;
                 }
-                euiccUiAction = EuiccService.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION;
+                intent.setAction(EuiccService.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION);
+                intent.putExtra(
+                        EuiccManager.EXTRA_FORCE_PROVISION,
+                        getIntent().getBooleanExtra(EuiccManager.EXTRA_FORCE_PROVISION, false));
                 break;
             default:
                 Log.w(TAG, "Unsupported action: " + action);
                 return null;
         }
 
-        return new Intent(euiccUiAction);
+        return intent;
     }
 
     @VisibleForTesting
diff --git a/src/com/android/phone/settings/AccessibilitySettingsFragment.java b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
index af7d4bf..57b6d8e 100644
--- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java
+++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
@@ -19,13 +19,14 @@
 import android.content.Context;
 import android.media.AudioManager;
 import android.os.Bundle;
-import android.preference.SwitchPreference;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceScreen;
+import android.preference.SwitchPreference;
 import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
 import android.telephony.PhoneStateListener;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
@@ -41,6 +42,8 @@
 
     private static final String BUTTON_TTY_KEY = "button_tty_mode_key";
     private static final String BUTTON_HAC_KEY = "button_hac_key";
+    private static final String BUTTON_RTT_KEY = "button_rtt_key";
+    private static final String RTT_INFO_PREF = "button_rtt_more_information_key";
 
     private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
         /**
@@ -67,6 +70,7 @@
 
     private TtyModeListPreference mButtonTty;
     private SwitchPreference mButtonHac;
+    private SwitchPreference mButtonRtt;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -80,6 +84,7 @@
         mButtonTty = (TtyModeListPreference) findPreference(
                 getResources().getString(R.string.tty_mode_key));
         mButtonHac = (SwitchPreference) findPreference(BUTTON_HAC_KEY);
+        mButtonRtt = (SwitchPreference) findPreference(BUTTON_RTT_KEY);
 
         if (PhoneGlobals.getInstance().phoneMgr.isTtyModeSupported()) {
             mButtonTty.init();
@@ -96,6 +101,19 @@
             getPreferenceScreen().removePreference(mButtonHac);
             mButtonHac = null;
         }
+
+        if (PhoneGlobals.getInstance().phoneMgr.isRttSupported()) {
+            // TODO: this is going to be a on/off switch for now. Ask UX about how to integrate
+            // this settings with TTY
+            boolean rttOn = Settings.Secure.getInt(
+                    mContext.getContentResolver(), Settings.Secure.RTT_CALLING_MODE, 0) != 0;
+            mButtonRtt.setChecked(rttOn);
+        } else {
+            getPreferenceScreen().removePreference(mButtonRtt);
+            Preference rttInfoPref = findPreference(RTT_INFO_PREF);
+            getPreferenceScreen().removePreference(rttInfoPref);
+            mButtonRtt = null;
+        }
     }
 
     @Override
@@ -129,7 +147,18 @@
                     hac == SettingsConstants.HAC_ENABLED
                             ? SettingsConstants.HAC_VAL_ON : SettingsConstants.HAC_VAL_OFF);
             return true;
+        } else if (preference == mButtonRtt) {
+            Log.i(LOG_TAG, "RTT setting changed -- now " + mButtonRtt.isChecked());
+            int rttMode = mButtonRtt.isChecked() ? 1 : 0;
+            Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.RTT_CALLING_MODE,
+                    rttMode);
+            // Update RTT config with IMS Manager
+            ImsManager imsManager = ImsManager.getInstance(getContext(),
+                    SubscriptionManager.getDefaultVoicePhoneId());
+            imsManager.setRttEnabled(mButtonRtt.isChecked());
+            return true;
         }
+
         return false;
     }
 
diff --git a/src/com/android/phone/settings/TextViewPreference.java b/src/com/android/phone/settings/TextViewPreference.java
new file mode 100644
index 0000000..3770bda
--- /dev/null
+++ b/src/com/android/phone/settings/TextViewPreference.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.settings;
+
+import android.content.Context;
+import android.preference.Preference;
+import android.text.Html;
+import android.text.method.LinkMovementMethod;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.phone.R;
+
+/**
+ * Provides a {@link TextView} inside a preference. Useful for displaying static text which may
+ * contain hyperlinks.
+ */
+public class TextViewPreference extends Preference {
+
+    /**
+     * The resource ID of the text to be populated in the {@link TextView} when a resource ID is
+     * used.
+     */
+    private int mTextResourceId = 0;
+
+    /** The text to be populated in the {@link TextView} when a {@link CharSequence} is used. */
+    private CharSequence mText;
+
+    /** The {@link TextView} containing the text. */
+    private TextView mTextView;
+
+    /**
+     * Instantiates the {@link TextViewPreference} instance.
+     *
+     * @param context The Context this is associated with, through which it can access the current
+     *     theme, resources, etc.
+     * @param attrs The attributes of the XML tag that is inflating the preference.
+     * @param defStyleAttr An attribute in the current theme that contains a reference to a style
+     *     resource that supplies default values for the view. Can be 0 to not look for defaults.
+     * @param defStyleRes A resource identifier of a style resource that supplies default values for
+     *     the view, used only if defStyleAttr is 0 or can not be found in the theme. Can be 0 to
+     *     not look for defaults.
+     */
+    public TextViewPreference(
+            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+
+        setLayoutResource(R.layout.text_view_preference);
+    }
+
+    /**
+     * Instantiates the {@link TextViewPreference} instance.
+     *
+     * @param context The Context this is associated with, through which it can access the current
+     *     theme, resources, etc.
+     * @param attrs The attributes of the XML tag that is inflating the preference.
+     * @param defStyleAttr An attribute in the current theme that contains a reference to a style
+     *     resource that supplies default values for the view. Can be 0 to not look for defaults.
+     */
+    public TextViewPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    /**
+     * Instantiates the {@link TextViewPreference} instance.
+     *
+     * @param context The Context this is associated with, through which it can access the current
+     *     theme, resources, etc.
+     * @param attrs The attributes of the XML tag that is inflating the preference.
+     */
+    public TextViewPreference(Context context, AttributeSet attrs) {
+        this(context, attrs, android.R.attr.preferenceStyle, 0);
+    }
+
+    /**
+     * Instantiates the {@link TextViewPreference} instance.
+     *
+     * @param context The Context this is associated with, through which it can access the current
+     *     theme, resources, etc.
+     */
+    public TextViewPreference(Context context) {
+        super(context, null);
+
+        setLayoutResource(R.layout.text_view_preference);
+    }
+
+    /**
+     * Handles binding the preference.
+     *
+     * @param view The view.
+     */
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+        mTextView = (TextView) view.findViewById(R.id.text);
+        if (mTextResourceId != 0) {
+            setTitle(mTextResourceId);
+        } else if (mText != null) {
+            setTitle(mText);
+        } else if (getTitleRes() != 0) {
+            setTitle(getTitleRes());
+        }
+    }
+
+    /**
+     * Sets the preference title from a {@link CharSequence}.
+     *
+     * @param text The text.
+     */
+    @Override
+    public void setTitle(CharSequence text) {
+        mTextResourceId = 0;
+        mText = text;
+        if (mTextView == null) {
+            return;
+        }
+
+        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
+        mTextView.setText(text);
+    }
+
+    /**
+     * Sets the preference title from a resource id.
+     *
+     * @param textResId The string resource Id.
+     */
+    @Override
+    public void setTitle(int textResId) {
+        mTextResourceId = textResId;
+        setTitle(Html.fromHtml(getContext().getString(textResId), Html.FROM_HTML_MODE_COMPACT));
+    }
+}
+
diff --git a/src/com/android/phone/settings/VoicemailSettingsActivity.java b/src/com/android/phone/settings/VoicemailSettingsActivity.java
index 04e8bf5..74b8e4e 100644
--- a/src/com/android/phone/settings/VoicemailSettingsActivity.java
+++ b/src/com/android/phone/settings/VoicemailSettingsActivity.java
@@ -24,6 +24,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.os.PersistableBundle;
 import android.os.UserManager;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
@@ -31,6 +32,8 @@
 import android.preference.SwitchPreference;
 import android.provider.ContactsContract.CommonDataKinds;
 import android.provider.Settings;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.CarrierConfigManager;
 import android.telephony.TelephonyManager;
 import android.text.BidiFormatter;
 import android.text.TextDirectionHeuristics;
@@ -46,6 +49,7 @@
 import com.android.internal.telephony.util.NotificationChannelController;
 import com.android.phone.EditPhoneNumberPreference;
 import com.android.phone.PhoneGlobals;
+import com.android.phone.PhoneUtils;
 import com.android.phone.R;
 import com.android.phone.SubscriptionInfoHelper;
 
@@ -220,6 +224,12 @@
         mShowVoicemailPreference = (icicle == null) &&
                 TextUtils.equals(getIntent().getAction(), ACTION_ADD_VOICEMAIL);
 
+        PhoneAccountHandle phoneAccountHandle = (PhoneAccountHandle)
+                getIntent().getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+        if (phoneAccountHandle != null) {
+            getIntent().putExtra(SubscriptionInfoHelper.SUB_ID_EXTRA,
+                    PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccountHandle));
+        }
         mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent());
         mSubscriptionInfoHelper.setActionBarTitle(
                 getActionBar(), getResources(), R.string.voicemail_settings_with_label);
@@ -250,6 +260,10 @@
             mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
             mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
             mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
+            if (!getBooleanCarrierConfig(
+                    CarrierConfigManager.KEY_EDITABLE_VOICEMAIL_NUMBER_SETTING_BOOL)) {
+                mSubMenuVoicemailSettings.setEnabled(false);
+            }
         }
 
         mVoicemailProviders = (VoicemailProviderListPreference) findPreference(
@@ -545,6 +559,23 @@
         }
     }
 
+    /**
+     * Get the boolean config from carrier config manager.
+     *
+     * @param key config key defined in CarrierConfigManager
+     * @return boolean value of corresponding key.
+     */
+    private boolean getBooleanCarrierConfig(String key) {
+        PersistableBundle b = PhoneGlobals.getInstance()
+                .getCarrierConfigForSubId(mPhone.getSubId());
+        if (b != null) {
+            return b.getBoolean(key);
+        } else {
+            // Return static default defined in CarrierConfigManager.
+            return CarrierConfigManager.getDefaultConfig().getBoolean(key);
+        }
+    }
+
 
     //*********************************************************************************************
     // Activity Dialog Methods
diff --git a/src/com/android/phone/settings/fdn/EditFdnContactScreen.java b/src/com/android/phone/settings/fdn/EditFdnContactScreen.java
index b8a761c..921e947 100644
--- a/src/com/android/phone/settings/fdn/EditFdnContactScreen.java
+++ b/src/com/android/phone/settings/fdn/EditFdnContactScreen.java
@@ -33,9 +33,11 @@
 import android.provider.Contacts.PhonesColumns;
 import android.provider.ContactsContract.CommonDataKinds;
 import android.telephony.PhoneNumberUtils;
+import android.text.Editable;
 import android.text.Selection;
 import android.text.Spannable;
 import android.text.TextUtils;
+import android.text.TextWatcher;
 import android.text.method.DialerKeyListener;
 import android.util.Log;
 import android.view.Menu;
@@ -239,6 +241,7 @@
         if (mNameField != null) {
             mNameField.setOnFocusChangeListener(mOnFocusChangeHandler);
             mNameField.setOnClickListener(mClicked);
+            mNameField.addTextChangedListener(mTextWatcher);
         }
 
         mNumberField = (EditText) findViewById(R.id.fdn_number);
@@ -247,6 +250,7 @@
             mNumberField.setKeyListener(DialerKeyListener.getInstance());
             mNumberField.setOnFocusChangeListener(mOnFocusChangeHandler);
             mNumberField.setOnClickListener(mClicked);
+            mNumberField.addTextChangedListener(mTextWatcher);
         }
 
         if (!mAddContact) {
@@ -261,6 +265,7 @@
         mButton = (Button) findViewById(R.id.button);
         if (mButton != null) {
             mButton.setOnClickListener(mClicked);
+            setButtonEnabled();
         }
 
         mPinFieldContainer = (LinearLayout) findViewById(R.id.pinc);
@@ -276,6 +281,15 @@
     }
 
     /**
+     * Enable Save button if text has been added to both name and number
+     */
+    private void setButtonEnabled() {
+        if (mButton != null && mNameField != null && mNumberField != null) {
+            mButton.setEnabled(mNameField.length() > 0 && mNumberField.length() > 0);
+        }
+    }
+
+    /**
       * @param number is voice mail number
       * @return true if number length is less than 20-digit limit
       *
@@ -446,6 +460,19 @@
         }
     };
 
+    private final TextWatcher mTextWatcher = new TextWatcher() {
+        @Override
+        public void afterTextChanged(Editable arg0) {}
+
+        @Override
+        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
+
+        @Override
+        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
+            setButtonEnabled();
+        }
+    };
+
     private class QueryHandler extends AsyncQueryHandler {
         public QueryHandler(ContentResolver cr) {
             super(cr);
diff --git a/src/com/android/phone/settings/fdn/EditPinPreference.java b/src/com/android/phone/settings/fdn/EditPinPreference.java
index eaa3507..42fc418 100644
--- a/src/com/android/phone/settings/fdn/EditPinPreference.java
+++ b/src/com/android/phone/settings/fdn/EditPinPreference.java
@@ -39,7 +39,17 @@
 
     private boolean shouldHideButtons;
 
-    interface OnPinEnteredListener {
+    /**
+     * Interface definition for a callback to be invoked when the PIN is entered.
+     */
+    public interface OnPinEnteredListener {
+        /**
+         * Called when the dialog of {@link #EditPinPreference} is dismissed.
+         *
+         * @param preference the specified {@link #EditPinPreference}
+         * @param positiveResult Whether the positive button was clicked (true), or
+         *                       the negative button was clicked or the dialog was canceled (false).
+         */
         void onPinEntered(EditPinPreference preference, boolean positiveResult);
     }
 
diff --git a/src/com/android/phone/vvm/RemoteVvmTaskManager.java b/src/com/android/phone/vvm/RemoteVvmTaskManager.java
index 4fc8c57..cf5011e 100644
--- a/src/com/android/phone/vvm/RemoteVvmTaskManager.java
+++ b/src/com/android/phone/vvm/RemoteVvmTaskManager.java
@@ -119,6 +119,8 @@
         TelecomManager telecomManager = context.getSystemService(TelecomManager.class);
         List<String> packages = new ArrayList<>();
         packages.add(telecomManager.getDefaultDialerPackage());
+        // TODO(b/73136824): Check permissions in the calling function and avoid relying on the
+        // binder caller's permissions to access the carrier config.
         PersistableBundle carrierConfig = context
                 .getSystemService(CarrierConfigManager.class).getConfigForSubId(subId);
         packages.add(
diff --git a/src/com/android/services/telephony/DisconnectCauseUtil.java b/src/com/android/services/telephony/DisconnectCauseUtil.java
index 48a283a..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));
@@ -125,6 +142,11 @@
             case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_USSD:
             case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_SS:
             case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_DIAL:
+            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_DIAL_VIDEO:
+            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_SS:
+            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_USSD:
+            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_DIAL:
+            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO:
             case android.telephony.DisconnectCause.ERROR_UNSPECIFIED:
             case android.telephony.DisconnectCause.MAXIMUM_NUMBER_OF_CALLS_REACHED:
             case android.telephony.DisconnectCause.DATA_DISABLED:
@@ -163,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 "";
         }
 
@@ -259,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(
@@ -305,6 +526,26 @@
                 resourceId = R.string.callFailed_dialToDial;
                 break;
 
+            case android.telephony.DisconnectCause.DIAL_MODIFIED_TO_DIAL_VIDEO:
+                resourceId = R.string.callFailed_dialToDialVideo;
+                break;
+
+            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_SS:
+                resourceId = R.string.callFailed_dialVideoToSs;
+                break;
+
+            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_USSD:
+                resourceId = R.string.callFailed_dialVideoToUssd;
+                break;
+
+            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_DIAL:
+                resourceId = R.string.callFailed_dialVideoToDial;
+                break;
+
+            case android.telephony.DisconnectCause.DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO:
+                resourceId = R.string.callFailed_dialVideoToDialVideo;
+                break;
+
             case android.telephony.DisconnectCause.OUTGOING_FAILURE:
                 // We couldn't successfully place the call; there was some
                 // failure in the telephony layer.
diff --git a/src/com/android/services/telephony/EmergencyTonePlayer.java b/src/com/android/services/telephony/EmergencyTonePlayer.java
index aaec24f..a21489d 100644
--- a/src/com/android/services/telephony/EmergencyTonePlayer.java
+++ b/src/com/android/services/telephony/EmergencyTonePlayer.java
@@ -67,11 +67,7 @@
                 startVibrate();
                 break;
             case EMERGENCY_TONE_ALERT:
-                // Only start if we are not in silent mode.
-                int ringerMode = mAudioManager.getRingerMode();
-                if (ringerMode == AudioManager.RINGER_MODE_NORMAL) {
-                    startAlert();
-                }
+                startAlert();
                 break;
             case EMERGENCY_TONE_OFF:
                 // nothing;
diff --git a/src/com/android/services/telephony/GsmConnection.java b/src/com/android/services/telephony/GsmConnection.java
index ca547fa..23485d1 100644
--- a/src/com/android/services/telephony/GsmConnection.java
+++ b/src/com/android/services/telephony/GsmConnection.java
@@ -81,12 +81,6 @@
             }
         }
 
-        // For GSM connections, CAPABILITY_CONFERENCE_HAS_NO_CHILDREN should be applied whenever
-        // PROPERTY_IS_DOWNGRADED_CONFERENCE is true.
-        if ((getConnectionProperties() & PROPERTY_IS_DOWNGRADED_CONFERENCE) != 0) {
-            capabilities |= CAPABILITY_CONFERENCE_HAS_NO_CHILDREN;
-        }
-
         return capabilities;
     }
 
diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java
index 06bc06f..dd74d28 100644
--- a/src/com/android/services/telephony/ImsConference.java
+++ b/src/com/android/services/telephony/ImsConference.java
@@ -271,10 +271,10 @@
         long connectTime = conferenceHost.getOriginalConnection().getConnectTime();
         long connectElapsedTime = conferenceHost.getOriginalConnection().getConnectTimeReal();
         setConnectionTime(connectTime);
-        setConnectionElapsedTime(connectElapsedTime);
+        setConnectionStartElapsedRealTime(connectElapsedTime);
         // Set the connectTime in the connection as well.
         conferenceHost.setConnectTimeMillis(connectTime);
-        conferenceHost.setConnectElapsedTimeMillis(connectElapsedTime);
+        conferenceHost.setConnectionStartElapsedRealTime(connectElapsedTime);
 
         mTelephonyConnectionService = telephonyConnectionService;
         setConferenceHost(conferenceHost);
@@ -636,6 +636,11 @@
             return;
         }
 
+        if (parent != null && !parent.isManageImsConferenceCallSupported()) {
+            Log.i(this, "handleConferenceParticipantsUpdate: manage conference is disallowed");
+            return;
+        }
+
         Log.i(this, "handleConferenceParticipantsUpdate: size=%d", participants.size());
 
         // Perform the update in a synchronized manner.  It is possible for the IMS framework to
@@ -753,7 +758,8 @@
 
         participant.removeConnectionListener(mParticipantListener);
         synchronized(mUpdateSyncRoot) {
-            mConferenceParticipantConnections.remove(participant.getUserEntity());
+            mConferenceParticipantConnections.remove(new Pair<>(participant.getUserEntity(),
+                    participant.getEndpoint()));
         }
         mTelephonyConnectionService.removeConnection(participant);
     }
@@ -886,7 +892,6 @@
                         mConferenceHost.isOutgoingCall());
                 // This is a newly created conference connection as a result of SRVCC
                 c.setConferenceSupported(true);
-                c.addCapability(Connection.CAPABILITY_CONFERENCE_HAS_NO_CHILDREN);
                 c.setConnectionProperties(
                         c.getConnectionProperties() | Connection.PROPERTY_IS_DOWNGRADED_CONFERENCE);
                 c.updateState();
diff --git a/src/com/android/services/telephony/ImsConferenceController.java b/src/com/android/services/telephony/ImsConferenceController.java
index 501808f..971dd7b 100644
--- a/src/com/android/services/telephony/ImsConferenceController.java
+++ b/src/com/android/services/telephony/ImsConferenceController.java
@@ -16,18 +16,17 @@
 
 package com.android.services.telephony;
 
-import com.android.ims.ImsReasonInfo;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-import com.android.phone.PhoneUtils;
-
 import android.telecom.Conference;
+import android.telecom.Conferenceable;
 import android.telecom.Connection;
 import android.telecom.ConnectionService;
 import android.telecom.DisconnectCause;
-import android.telecom.Conferenceable;
 import android.telecom.PhoneAccountHandle;
 
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.phone.PhoneUtils;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -357,6 +356,8 @@
         // from Telecom.  Instead we create a new instance and remove the old one from telecom.
         TelephonyConnection conferenceHostConnection = connection.cloneConnection();
         conferenceHostConnection.setVideoPauseSupported(connection.getVideoPauseSupported());
+        conferenceHostConnection.setManageImsConferenceCallSupported(
+                connection.isManageImsConferenceCallSupported());
 
         PhoneAccountHandle phoneAccountHandle = null;
 
@@ -388,5 +389,8 @@
                         android.telephony.DisconnectCause.IMS_MERGED_SUCCESSFULLY)));
         connection.destroy();
         mImsConferences.add(conference);
+        // If one of the participants failed to join the conference, recalculate will set the
+        // conferenceable connections for the conference to show merge calls option.
+        recalculateConferenceable();
     }
 }
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/PstnIncomingCallNotifier.java b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
index e007bb4..4dfaf44 100644
--- a/src/com/android/services/telephony/PstnIncomingCallNotifier.java
+++ b/src/com/android/services/telephony/PstnIncomingCallNotifier.java
@@ -36,6 +36,7 @@
 import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
 import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
 import com.android.internal.telephony.imsphone.ImsExternalConnection;
+import com.android.internal.telephony.imsphone.ImsPhoneConnection;
 import com.android.phone.PhoneUtils;
 
 import com.google.common.base.Preconditions;
@@ -243,6 +244,11 @@
         extras.putLong(TelecomManager.EXTRA_CALL_CREATED_TIME_MILLIS,
                 SystemClock.elapsedRealtime());
 
+        if (connection.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) {
+            if (((ImsPhoneConnection) connection).isRttEnabledForCall()) {
+                extras.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_RTT, true);
+            }
+        }
         PhoneAccountHandle handle = findCorrectPhoneAccountHandle();
         if (handle == null) {
             try {
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index da9effc..f7632c7 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -22,6 +22,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.Resources;
+import android.database.ContentObserver;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.PorterDuff;
@@ -29,9 +30,12 @@
 import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
 import android.os.PersistableBundle;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.provider.Settings;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
@@ -82,6 +86,8 @@
         private boolean mIsMergeImsCallSupported;
         private boolean mIsVideoConferencingSupported;
         private boolean mIsMergeOfWifiCallsAllowedWhenVoWifiOff;
+        private boolean mIsManageImsConferenceCallSupported;
+        private boolean mIsShowPreciseFailedCause;
 
         AccountEntry(Phone phone, boolean isEmergency, boolean isDummy) {
             mPhone = phone;
@@ -183,8 +189,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.");
@@ -225,6 +231,17 @@
                         isHandoverFromSupported);
             }
 
+            final boolean isTelephonyAudioDeviceSupported = mContext.getResources().getBoolean(
+                    R.bool.config_support_telephony_audio_device);
+            if (isTelephonyAudioDeviceSupported && !isEmergency
+                    && isCarrierUseCallRecordingTone()) {
+                extras.putBoolean(PhoneAccount.EXTRA_PLAY_CALL_RECORDING_TONE, true);
+            }
+
+            if (PhoneGlobals.getInstance().phoneMgr.isRttEnabled()) {
+                capabilities |= PhoneAccount.CAPABILITY_RTT;
+            }
+
             extras.putBoolean(PhoneAccount.EXTRA_SUPPORTS_VIDEO_CALLING_FALLBACK,
                     mContext.getResources()
                             .getBoolean(R.bool.config_support_video_calling_fallback));
@@ -239,6 +256,8 @@
             mIsVideoConferencingSupported = isCarrierVideoConferencingSupported();
             mIsMergeOfWifiCallsAllowedWhenVoWifiOff =
                     isCarrierMergeOfWifiCallsAllowedWhenVoWifiOff();
+            mIsManageImsConferenceCallSupported = isCarrierManageImsConferenceCallSupported();
+            mIsShowPreciseFailedCause = isCarrierShowPreciseFailedCause();
 
             if (isEmergency && mContext.getResources().getBoolean(
                     R.bool.config_emergency_account_emergency_calls_only)) {
@@ -403,6 +422,43 @@
         }
 
         /**
+         * Determines from carrier config whether managing IMS conference calls is supported.
+         *
+         * @return {@code true} if managing IMS conference calls is supported,
+         *         {@code false} otherwise.
+         */
+        private boolean isCarrierManageImsConferenceCallSupported() {
+            PersistableBundle b =
+                    PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
+            return b.getBoolean(CarrierConfigManager.KEY_SUPPORT_MANAGE_IMS_CONFERENCE_CALL_BOOL);
+        }
+
+        /**
+         * 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);
+        }
+
+        /**
+         * Determines from carrier config whether the carrier requires the use of a call recording
+         * tone.
+         *
+         * @return {@code true} if a call recording tone should be used, {@code false} otherwise.
+         */
+        private boolean isCarrierUseCallRecordingTone() {
+            PersistableBundle b =
+                    PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
+            return b.getBoolean(CarrierConfigManager.KEY_PLAY_CALL_RECORDING_TONE_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.
@@ -444,6 +500,13 @@
             }
         }
 
+        public void updateRttCapability() {
+            boolean isRttEnabled = PhoneGlobals.getInstance().phoneMgr.isRttEnabled();
+            boolean oldRttEnabled = mAccount.hasCapabilities(PhoneAccount.CAPABILITY_RTT);
+            if (isRttEnabled != oldRttEnabled) {
+                mAccount = registerPstnPhoneAccount(mIsEmergency, mIsDummy);
+            }
+        }
         /**
          * Indicates whether this account supports pausing video calls.
          * @return {@code true} if the account supports pausing video calls, {@code false}
@@ -484,6 +547,25 @@
         public boolean isMergeOfWifiCallsAllowedWhenVoWifiOff() {
             return mIsMergeOfWifiCallsAllowedWhenVoWifiOff;
         }
+
+        /**
+         * Indicates whether this account supports managing IMS conference calls
+         * @return {@code true} if the account supports managing IMS conference calls,
+         *         {@code false} otherwise.
+         */
+        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 =
@@ -530,7 +612,7 @@
     private final TelephonyManager mTelephonyManager;
     private final SubscriptionManager mSubscriptionManager;
     private List<AccountEntry> mAccounts = new LinkedList<AccountEntry>();
-    private Object mAccountsLock = new Object();
+    private final Object mAccountsLock = new Object();
     private int mServiceState = ServiceState.STATE_POWER_OFF;
     private boolean mIsPrimaryUser = true;
 
@@ -653,6 +735,41 @@
     }
 
     /**
+     * Determines if the {@link AccountEntry} associated with a {@link PhoneAccountHandle} supports
+     * managing IMS conference calls.
+     *
+     * @param handle The {@link PhoneAccountHandle}.
+     * @return {@code True} if managing IMS conference calls is supported.
+     */
+    boolean isManageImsConferenceCallSupported(PhoneAccountHandle handle) {
+        synchronized (mAccountsLock) {
+            for (AccountEntry entry : mAccounts) {
+                if (entry.getPhoneAccountHandle().equals(handle)) {
+                    return entry.isManageImsConferenceCallSupported();
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 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() {
@@ -698,6 +815,23 @@
         // use is not the primary user we disable video calling.
         mContext.registerReceiver(mUserSwitchedReceiver,
                 new IntentFilter(Intent.ACTION_USER_SWITCHED));
+
+        // Listen to the RTT system setting so that we update it when the user flips it.
+        ContentObserver rttUiSettingObserver = new ContentObserver(
+                new Handler(Looper.getMainLooper())) {
+            @Override
+            public void onChange(boolean selfChange) {
+                synchronized (mAccountsLock) {
+                    for (AccountEntry account : mAccounts) {
+                        account.updateRttCapability();
+                    }
+                }
+            }
+        };
+
+        Uri rttSettingUri = Settings.Secure.getUriFor(Settings.Secure.RTT_CALLING_MODE);
+        mContext.getContentResolver().registerContentObserver(
+                rttSettingUri, false, rttUiSettingObserver);
     }
 
     /**
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index d5ff043..af9e9d5 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -22,6 +22,7 @@
 import android.os.AsyncResult;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.os.PersistableBundle;
 import android.telecom.CallAudioState;
@@ -36,11 +37,13 @@
 import android.telephony.DisconnectCause;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
+import android.telephony.ims.ImsCallProfile;
+import android.text.TextUtils;
 import android.util.Pair;
 
 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;
@@ -94,7 +97,7 @@
     private static final int MSG_CDMA_VOICE_PRIVACY_OFF = 16;
     private static final int MSG_HANGUP = 17;
 
-    private final Handler mHandler = new Handler() {
+    private final Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
@@ -168,10 +171,7 @@
                                         new ArrayList(Arrays.asList(mSsNotification.history)));
                                 putExtras(lastForwardedNumber);
                             }
-                            if (mSsNotification.code
-                                    == SuppServiceNotification.MO_CODE_CALL_FORWARDED) {
-                                sendConnectionEvent(TelephonyManager.EVENT_CALL_FORWARDED, null);
-                            }
+                            handleSuppServiceNotification(mSsNotification);
                         }
                     }
                     break;
@@ -254,6 +254,115 @@
     };
 
     /**
+     * Handles {@link SuppServiceNotification}s pertinent to Telephony.
+     * @param ssn the notification.
+     */
+    private void handleSuppServiceNotification(SuppServiceNotification ssn) {
+        Log.i(this, "handleSuppServiceNotification: type=%d, code=%d", ssn.notificationType,
+                ssn.code);
+        if (ssn.notificationType == SuppServiceNotification.NOTIFICATION_TYPE_CODE_1
+                && ssn.code == SuppServiceNotification.CODE_1_CALL_FORWARDED) {
+            sendConnectionEvent(TelephonyManager.EVENT_CALL_FORWARDED, null);
+        }
+        sendSuppServiceNotificationEvent(ssn.notificationType, ssn.code);
+    }
+
+    /**
+     * Sends a supplementary service notification connection event.
+     * This connection event includes the type and code, as well as a human readable message which
+     * is suitable for display to the user if the UI chooses to do so.
+     * @param type the {@link SuppServiceNotification#type}.
+     * @param code the {@link SuppServiceNotification#code}.
+     */
+    private void sendSuppServiceNotificationEvent(int type, int code) {
+        Bundle extras = new Bundle();
+        extras.putInt(TelephonyManager.EXTRA_NOTIFICATION_TYPE, type);
+        extras.putInt(TelephonyManager.EXTRA_NOTIFICATION_CODE, code);
+        extras.putCharSequence(TelephonyManager.EXTRA_NOTIFICATION_MESSAGE,
+                getSuppServiceMessage(type, code));
+        sendConnectionEvent(TelephonyManager.EVENT_SUPPLEMENTARY_SERVICE_NOTIFICATION, extras);
+    }
+
+    /**
+     * Retrieves a human-readable message for a supplementary service notification.
+     * This message is suitable for display to the user.
+     * @param type the code group.
+     * @param code the code.
+     * @return A {@link CharSequence} containing the message, or {@code null} if none defined.
+     */
+    private CharSequence getSuppServiceMessage(int type, int code) {
+        int messageId = -1;
+        if (type == SuppServiceNotification.NOTIFICATION_TYPE_CODE_1) {
+            switch (code) {
+                case SuppServiceNotification.CODE_1_CALL_DEFLECTED:
+                    messageId = R.string.supp_service_notification_call_deflected;
+                    break;
+                case SuppServiceNotification.CODE_1_CALL_FORWARDED:
+                    messageId = R.string.supp_service_notification_call_forwarded;
+                    break;
+                case SuppServiceNotification.CODE_1_CALL_IS_WAITING:
+                    messageId = R.string.supp_service_notification_call_waiting;
+                    break;
+                case SuppServiceNotification.CODE_1_CLIR_SUPPRESSION_REJECTED:
+                    messageId = R.string.supp_service_clir_suppression_rejected;
+                    break;
+                case SuppServiceNotification.CODE_1_CUG_CALL:
+                    messageId = R.string.supp_service_closed_user_group_call;
+                    break;
+                case SuppServiceNotification.CODE_1_INCOMING_CALLS_BARRED:
+                    messageId = R.string.supp_service_incoming_calls_barred;
+                    break;
+                case SuppServiceNotification.CODE_1_OUTGOING_CALLS_BARRED:
+                    messageId = R.string.supp_service_outgoing_calls_barred;
+                    break;
+                case SuppServiceNotification.CODE_1_SOME_CF_ACTIVE:
+                    // Intentional fall through.
+                case SuppServiceNotification.CODE_1_UNCONDITIONAL_CF_ACTIVE:
+                    messageId = R.string.supp_service_call_forwarding_active;
+                    break;
+            }
+        } else if (type == SuppServiceNotification.NOTIFICATION_TYPE_CODE_2) {
+            switch (code) {
+                case SuppServiceNotification.CODE_2_ADDITIONAL_CALL_FORWARDED:
+                    messageId = R.string.supp_service_additional_call_forwarded;
+                    break;
+                case SuppServiceNotification.CODE_2_CALL_CONNECTED_ECT:
+                    messageId = R.string.supp_service_additional_ect_connected;
+                    break;
+                case SuppServiceNotification.CODE_2_CALL_CONNECTING_ECT:
+                    messageId = R.string.supp_service_additional_ect_connecting;
+                    break;
+                case SuppServiceNotification.CODE_2_CALL_ON_HOLD:
+                    messageId = R.string.supp_service_call_on_hold;
+                    break;
+                case SuppServiceNotification.CODE_2_CALL_RETRIEVED:
+                    messageId = R.string.supp_service_call_resumed;
+                    break;
+                case SuppServiceNotification.CODE_2_CUG_CALL:
+                    messageId = R.string.supp_service_closed_user_group_call;
+                    break;
+                case SuppServiceNotification.CODE_2_DEFLECTED_CALL:
+                    messageId = R.string.supp_service_deflected_call;
+                    break;
+                case SuppServiceNotification.CODE_2_FORWARDED_CALL:
+                    messageId = R.string.supp_service_forwarded_call;
+                    break;
+                case SuppServiceNotification.CODE_2_MULTI_PARTY_CALL:
+                    messageId = R.string.supp_service_conference_call;
+                    break;
+                case SuppServiceNotification.CODE_2_ON_HOLD_CALL_RELEASED:
+                    messageId = R.string.supp_service_held_call_released;
+                    break;
+            }
+        }
+        if (messageId != -1 && getPhone() != null && getPhone().getContext() != null) {
+            return getPhone().getContext().getText(messageId);
+        } else {
+            return null;
+        }
+    }
+
+    /**
      * @return {@code true} if carrier video conferencing is supported, {@code false} otherwise.
      */
     public boolean isCarrierVideoConferencingSupported() {
@@ -437,12 +546,32 @@
 
         @Override
         public void onRttModifyResponseReceived(int status) {
+            updateConnectionProperties();
             if (status == RttModifyStatus.SESSION_MODIFY_REQUEST_SUCCESS) {
                 sendRttInitiationSuccess();
             } else {
                 sendRttInitiationFailure(status);
             }
         }
+
+        @Override
+        public void onDisconnect(int cause) {
+            Log.i(this, "onDisconnect: callId=%s, cause=%s", getTelecomCallId(),
+                    DisconnectCause.toString(cause));
+            mHandler.obtainMessage(MSG_DISCONNECT).sendToTarget();
+        }
+
+        @Override
+        public void onRttInitiated() {
+            updateConnectionProperties();
+            sendRttInitiationSuccess();
+        }
+
+        @Override
+        public void onRttTerminated() {
+            updateConnectionProperties();
+            sendRttSessionRemotelyTerminated();
+        }
     };
 
     protected com.android.internal.telephony.Connection mOriginalConnection;
@@ -451,6 +580,7 @@
     private boolean mIsStateOverridden = false;
     private Call.State mOriginalConnectionState = Call.State.IDLE;
     private Call.State mConnectionOverriddenState = Call.State.IDLE;
+    private RttTextStream mRttTextStream = null;
 
     private boolean mWasImsConnection;
 
@@ -498,6 +628,12 @@
     private boolean mIsConferenceSupported;
 
     /**
+     * Indicates whether managing conference call is supported after this connection being
+     * a part of a IMS conference.
+     */
+    private boolean mIsManageImsConferenceCallSupported;
+
+    /**
      * Indicates whether the carrier supports video conferencing; captures the current state of the
      * carrier config
      * {@link android.telephony.CarrierConfigManager#KEY_SUPPORT_VIDEO_CONFERENCE_CALL_BOOL}.
@@ -515,6 +651,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(
@@ -614,6 +760,45 @@
     }
 
     @Override
+    public void onDeflect(Uri address) {
+        Log.v(this, "onDeflect");
+        if (mOriginalConnection != null && isValidRingingCall()) {
+            if (address == null) {
+                Log.w(this, "call deflect address uri is null");
+                return;
+            }
+            String scheme = address.getScheme();
+            String deflectNumber = "";
+            String uriString = address.getSchemeSpecificPart();
+            if (!PhoneAccount.SCHEME_VOICEMAIL.equals(scheme)) {
+                if (!PhoneAccount.SCHEME_TEL.equals(scheme)) {
+                    Log.w(this, "onDeflect, address scheme is not of type tel instead: " +
+                            scheme);
+                    return;
+                }
+                if (PhoneNumberUtils.isUriNumber(uriString)) {
+                    Log.w(this, "Invalid deflect address. Not a legal PSTN number.");
+                    return;
+                }
+                deflectNumber = PhoneNumberUtils.convertAndStrip(uriString);
+                if (TextUtils.isEmpty(deflectNumber)) {
+                    Log.w(this, "Empty deflect number obtained from address uri");
+                    return;
+                }
+            } else {
+                Log.w(this, "Cannot deflect to voicemail uri");
+                return;
+            }
+
+            try {
+                mOriginalConnection.deflect(deflectNumber);
+            } catch (CallStateException e) {
+                Log.e(this, e, "Failed to deflect call.");
+            }
+        }
+    }
+
+    @Override
     public void onReject() {
         Log.v(this, "onReject");
         if (isValidRingingCall()) {
@@ -663,7 +848,7 @@
 
     @Override
     public void onStopRtt() {
-        // This is not supported by carriers/vendor yet. No-op for now.
+        Log.i(this, "Stopping RTT currently not supported. Doing nothing.");
     }
 
     @Override
@@ -785,6 +970,8 @@
         newCapabilities = changeBitmask(newCapabilities, CAPABILITY_CAN_PULL_CALL,
                 isExternalConnection() && isPullable());
         newCapabilities = applyConferenceTerminationCapabilities(newCapabilities);
+        newCapabilities = changeBitmask(newCapabilities, CAPABILITY_SUPPORT_DEFLECT,
+                isImsConnection() && canDeflectImsCalls());
 
         if (getConnectionCapabilities() != newCapabilities) {
             setConnectionCapabilities(newCapabilities);
@@ -817,6 +1004,9 @@
                 isExternalConnection());
         newProperties = changeBitmask(newProperties, PROPERTY_HAS_CDMA_VOICE_PRIVACY,
                 mIsCdmaVoicePrivacyEnabled);
+        newProperties = changeBitmask(newProperties, PROPERTY_ASSISTED_DIALING_USED,
+                mIsUsingAssistedDialing);
+        newProperties = changeBitmask(newProperties, PROPERTY_IS_RTT, isRtt());
 
         if (getConnectionProperties() != newProperties) {
             setConnectionProperties(newProperties);
@@ -871,7 +1061,6 @@
         getPhone().registerForHandoverStateChanged(
                 mHandler, MSG_HANDOVER_STATE_CHANGED, null);
         getPhone().registerForRingbackTone(mHandler, MSG_RINGBACK_TONE, null);
-        getPhone().registerForDisconnect(mHandler, MSG_DISCONNECT, null);
         getPhone().registerForSuppServiceNotification(mHandler, MSG_SUPP_SERVICE_NOTIFY, null);
         getPhone().registerForOnHoldTone(mHandler, MSG_ON_HOLD_TONE, null);
         getPhone().registerForInCallVoicePrivacyOn(mHandler, MSG_CDMA_VOICE_PRIVACY_ON, null);
@@ -1022,6 +1211,8 @@
                 b != null && b.getBoolean(CarrierConfigManager.KEY_WIFI_CALLS_CAN_BE_HD_AUDIO);
         boolean canVideoCallsBeHdAudio =
                 b != null && b.getBoolean(CarrierConfigManager.KEY_VIDEO_CALLS_CAN_BE_HD_AUDIO);
+        boolean canGsmCdmaCallsBeHdAudio =
+                b != null && b.getBoolean(CarrierConfigManager.KEY_GSM_CDMA_CALLS_CAN_BE_HD_AUDIO);
         boolean shouldDisplayHdAudio =
                 b != null && b.getBoolean(CarrierConfigManager.KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL);
 
@@ -1029,6 +1220,10 @@
             return false;
         }
 
+        if (isGsmCdmaConnection() && !canGsmCdmaCallsBeHdAudio) {
+            return false;
+        }
+
         if (isVideoCall && !canVideoCallsBeHdAudio) {
             return false;
         }
@@ -1055,6 +1250,17 @@
         return PhoneGlobals.getInstance().getCarrierConfigForSubId(phone.getSubId());
     }
 
+    private boolean canDeflectImsCalls() {
+        PersistableBundle b = getCarrierConfig();
+        // Return false if the CarrierConfig is unavailable
+        if (b != null) {
+            return b.getBoolean(
+                    CarrierConfigManager.KEY_CARRIER_ALLOW_DEFLECT_IMS_CALL_BOOL) &&
+                    isValidRingingCall();
+        }
+        return false;
+    }
+
     /**
      * Determines if the device will respect the value of the
      * {@link CarrierConfigManager#KEY_ALLOW_HOLD_IN_IMS_CALL_BOOL} configuration option.
@@ -1311,7 +1517,8 @@
             newState = mOriginalConnection.getState();
         }
         int cause = mOriginalConnection.getDisconnectCause();
-        Log.v(this, "Update state from %s to %s for %s", mConnectionState, newState, this);
+        Log.v(this, "Update state from %s to %s for %s", mConnectionState, newState,
+                getTelecomCallId());
 
         if (mConnectionState != newState) {
             mConnectionState = newState;
@@ -1350,8 +1557,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();
                     }
@@ -1373,6 +1586,7 @@
         updateConnectionProperties();
         updateAddress();
         updateMultiparty();
+        refreshDisableAddCall();
     }
 
     /**
@@ -1479,6 +1693,16 @@
     }
 
     /**
+     * Determines if the current connection has RTT enabled.
+     */
+    private boolean isRtt() {
+        return mOriginalConnection != null
+                && mOriginalConnection.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS
+                && mOriginalConnection instanceof ImsPhoneConnection
+                && ((ImsPhoneConnection) mOriginalConnection).isRttEnabledForCall();
+    }
+
+    /**
      * Determines if the current connection is pullable.
      *
      * A connection is deemed to be pullable if the original connection capabilities state that it
@@ -1612,6 +1836,14 @@
         return false;
     }
 
+    public void setRttTextStream(RttTextStream s) {
+        mRttTextStream = s;
+    }
+
+    public RttTextStream getRttTextStream() {
+        return mRttTextStream;
+    }
+
     /**
      * For video calls, sets whether this connection supports pausing the outgoing video for the
      * call using the {@link android.telecom.VideoProfile#STATE_PAUSED} VideoState.
@@ -1647,6 +1879,35 @@
     }
 
     /**
+     * Sets whether managing conference call is supported after this connection being a part of a
+     * Ims conference.
+     *
+     * @param isManageImsConferenceCallSupported {@code true} if manage conference calling is
+     *        supported after this connection being a part of a IMS conference,
+     *        {@code false} otherwise.
+     */
+    public void setManageImsConferenceCallSupported(boolean isManageImsConferenceCallSupported) {
+        mIsManageImsConferenceCallSupported = isManageImsConferenceCallSupported;
+    }
+
+    /**
+     * @return {@code true} if manage conference calling is supported after this connection being a
+     * part of a IMS conference.
+     */
+    public boolean isManageImsConferenceCallSupported() {
+        return mIsManageImsConferenceCallSupported;
+    }
+
+    /**
+     * 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.
@@ -1658,6 +1919,25 @@
     }
 
     /**
+     * Whether the original connection is an GSM/CDMA connection.
+     * @return {@code True} if the original connection is an GSM/CDMA connection, {@code false}
+     *     otherwise.
+     */
+    protected boolean isGsmCdmaConnection() {
+        Phone phone = getPhone();
+        if (phone != null) {
+            switch (phone.getPhoneType()) {
+                case PhoneConstants.PHONE_TYPE_GSM:
+                case PhoneConstants.PHONE_TYPE_CDMA:
+                    return true;
+                default:
+                    return false;
+            }
+        }
+        return false;
+    }
+
+    /**
      * Whether the original connection was ever an IMS connection, either before or now.
      * @return {@code True} if the original connection was ever an IMS connection, {@code false}
      *     otherwise.
@@ -1666,6 +1946,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 ded2468..b3369b5 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -52,6 +52,7 @@
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
 import com.android.internal.telephony.imsphone.ImsPhone;
+import com.android.internal.telephony.imsphone.ImsPhoneConnection;
 import com.android.phone.MMIDialogActivity;
 import com.android.phone.PhoneUtils;
 import com.android.phone.R;
@@ -421,7 +422,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;
@@ -646,6 +651,7 @@
         connection.setAddress(handle, PhoneConstants.PRESENTATION_ALLOWED);
         connection.setInitializing();
         connection.setVideoState(request.getVideoState());
+        connection.setRttTextStream(request.getRttTextStream());
 
         return connection;
     }
@@ -695,10 +701,11 @@
         int videoState = originalConnection != null ? originalConnection.getVideoState() :
                 VideoProfile.STATE_AUDIO_ONLY;
 
-        Connection connection =
+        TelephonyConnection connection =
                 createConnectionFor(phone, originalConnection, false /* isOutgoing */,
                         request.getAccountHandle(), request.getTelecomCallId(),
                         request.getAddress(), videoState);
+        handleIncomingRtt(request, originalConnection);
         if (connection == null) {
             return Connection.createCanceledConnection();
         } else {
@@ -706,6 +713,36 @@
         }
     }
 
+    private void handleIncomingRtt(ConnectionRequest request,
+            com.android.internal.telephony.Connection originalConnection) {
+        if (originalConnection == null
+                || originalConnection.getPhoneType() != PhoneConstants.PHONE_TYPE_IMS) {
+            if (request.isRequestingRtt()) {
+                Log.w(this, "Requesting RTT on non-IMS call, ignoring");
+            }
+            return;
+        }
+
+        ImsPhoneConnection imsOriginalConnection = (ImsPhoneConnection) originalConnection;
+        if (!request.isRequestingRtt()) {
+            if (imsOriginalConnection.isRttEnabledForCall()) {
+                Log.w(this, "Incoming call requested RTT but we did not get a RttTextStream");
+            }
+            return;
+        }
+
+        if (!imsOriginalConnection.isRttEnabledForCall()) {
+            if (request.isRequestingRtt()) {
+                Log.w(this, "Incoming call processed as RTT but did not come in as one. Ignoring");
+            }
+            return;
+        }
+
+        Log.i(this, "Setting RTT stream on ImsPhoneConnection");
+        imsOriginalConnection.setCurrentRttTextStream(request.getRttTextStream());
+        imsOriginalConnection.getImsCall().setAnswerWithRtt();
+    }
+
     /**
      * Called by the {@link ConnectionService} when a newly created {@link Connection} has been
      * added to the {@link ConnectionService} and sent to Telecom.  Here it is safe to send
@@ -984,7 +1021,11 @@
         com.android.internal.telephony.Connection originalConnection = null;
         try {
             if (phone != null) {
-                originalConnection = phone.dial(number, null, videoState, extras);
+                originalConnection = phone.dial(number, new ImsPhone.ImsDialArgs.Builder()
+                        .setVideoState(videoState)
+                        .setIntentExtras(extras)
+                        .setRttTextStream(connection.getRttTextStream())
+                        .build());
             }
         } catch (CallStateException e) {
             Log.e(this, e, "placeOutgoingConnection, phone.dial exception: " + e);
@@ -1046,6 +1087,12 @@
             returnConnection.setVideoPauseSupported(
                     TelecomAccountRegistry.getInstance(this).isVideoPauseSupported(
                             phoneAccountHandle));
+            returnConnection.setManageImsConferenceCallSupported(
+                    TelecomAccountRegistry.getInstance(this).isManageImsConferenceCallSupported(
+                            phoneAccountHandle));
+            returnConnection.setShowPreciseFailedCause(
+                    TelecomAccountRegistry.getInstance(this).isShowPreciseFailedCause(
+                            phoneAccountHandle));
         }
         return returnConnection;
     }
diff --git a/testapps/EmbmsServiceTestApp/Android.mk b/testapps/EmbmsServiceTestApp/Android.mk
index d8c4493..29b8112 100644
--- a/testapps/EmbmsServiceTestApp/Android.mk
+++ b/testapps/EmbmsServiceTestApp/Android.mk
@@ -10,6 +10,7 @@
 LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
 
 LOCAL_PACKAGE_NAME := EmbmsTestService
+LOCAL_PRIVATE_PLATFORM_APIS := true
 
 LOCAL_CERTIFICATE := platform
 LOCAL_PRIVILEGED_MODULE := true
diff --git a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
index 128793f..3d83a4c 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
@@ -31,8 +31,9 @@
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
 import android.telephony.MbmsDownloadSession;
+import android.telephony.mbms.DownloadProgressListener;
 import android.telephony.mbms.DownloadRequest;
-import android.telephony.mbms.DownloadStateCallback;
+import android.telephony.mbms.DownloadStatusListener;
 import android.telephony.mbms.FileInfo;
 import android.telephony.mbms.FileServiceInfo;
 import android.telephony.mbms.MbmsDownloadSessionCallback;
@@ -143,9 +144,16 @@
         }
 
         @Override
-        public int registerStateCallback(DownloadRequest downloadRequest,
-                DownloadStateCallback callback) throws RemoteException {
-            mDownloadStateCallbacks.put(downloadRequest, callback);
+        public int addStatusListener(DownloadRequest downloadRequest,
+                DownloadStatusListener callback) throws RemoteException {
+            mDownloadStatusCallbacks.put(downloadRequest, callback);
+            return MbmsErrors.SUCCESS;
+        }
+
+        @Override
+        public int addProgressListener(DownloadRequest downloadRequest,
+                DownloadProgressListener callback) throws RemoteException {
+            mDownloadProgressCallbacks.put(downloadRequest, callback);
             return MbmsErrors.SUCCESS;
         }
 
@@ -183,7 +191,9 @@
     // A map of app-identifiers to (maps of service-ids to sets of temp file uris in use)
     private final Map<FrontendAppIdentifier, Map<String, Set<Uri>>> mTempFilesInUse =
             new ConcurrentHashMap<>();
-    private final Map<DownloadRequest, DownloadStateCallback> mDownloadStateCallbacks =
+    private final Map<DownloadRequest, DownloadStatusListener> mDownloadStatusCallbacks =
+            new ConcurrentHashMap<>();
+    private final Map<DownloadRequest, DownloadProgressListener> mDownloadProgressCallbacks =
             new ConcurrentHashMap<>();
 
     private HandlerThread mHandlerThread;
@@ -261,7 +271,8 @@
     }
 
     private void sendFdRequest(DownloadRequest request, FrontendAppIdentifier appKey) {
-        int numFds = getNumFdsNeededForRequest(request);
+        // Request twice as many as needed to exercise the post-download cleanup mechanism
+        int numFds = getNumFdsNeededForRequest(request) * 2;
         // Compose the FILE_DESCRIPTOR_REQUEST_INTENT
         Intent requestIntent = new Intent(VendorUtils.ACTION_FILE_DESCRIPTOR_REQUEST);
         requestIntent.putExtra(VendorUtils.EXTRA_SERVICE_ID, request.getFileServiceId());
@@ -299,8 +310,8 @@
                 .getFileServiceInfoForId(request.getFileServiceId())
                 .getFiles();
 
-        if (tempFiles.size() != filesToDownload.size()) {
-            Log.w(LOG_TAG, "Different numbers of temp files and files to download...");
+        if (tempFiles.size() != filesToDownload.size() * 2) {
+            Log.w(LOG_TAG, "Incorrect numbers of temp files and files to download...");
         }
 
         if (!mActiveDownloadRequests.containsKey(appKey)) {
@@ -310,37 +321,39 @@
 
         // Go through the files one-by-one and send them to the frontend app with a delay between
         // each one.
-        for (int i = 0; i < tempFiles.size(); i++) {
-            if (i >= filesToDownload.size()) {
+        for (int i = 0; i < tempFiles.size(); i += 2) {
+            if (i >= filesToDownload.size() * 2) {
                 break;
             }
             UriPathPair tempFile = tempFiles.get(i);
+            UriPathPair extraTempFile = tempFiles.get(i + 1);
             addTempFileInUse(appKey, request.getFileServiceId(),
                     tempFile.getFilePathUri());
-            FileInfo fileToDownload = filesToDownload.get(i);
+            FileInfo fileToDownload = filesToDownload.get(i / 2);
             mHandler.postDelayed(() -> {
                 if (mActiveDownloadRequests.get(appKey) == null ||
                         !mActiveDownloadRequests.get(appKey).contains(request)) {
                     return;
                 }
-                downloadSingleFile(appKey, request, tempFile, fileToDownload);
+                downloadSingleFile(appKey, request, tempFile, extraTempFile, fileToDownload);
                 removeTempFileInUse(appKey, request.getFileServiceId(),
                         tempFile.getFilePathUri());
-            }, FILE_SEPARATION_DELAY * i * mDownloadDelayFactor);
+            }, FILE_SEPARATION_DELAY * i * mDownloadDelayFactor / 2);
         }
     }
 
     private void downloadSingleFile(FrontendAppIdentifier appKey, DownloadRequest request,
-            UriPathPair tempFile, FileInfo fileToDownload) {
+            UriPathPair tempFile, UriPathPair extraTempFile, FileInfo fileToDownload) {
         int result = MbmsDownloadSession.RESULT_SUCCESSFUL;
         // Test Callback
-        DownloadStateCallback c = mDownloadStateCallbacks.get(request);
-        if (c != null) {
-            c.onProgressUpdated(request, fileToDownload, 0, 10, 0, 10);
+        DownloadStatusListener statusListener = mDownloadStatusCallbacks.get(request);
+        DownloadProgressListener progressListener = mDownloadProgressCallbacks.get(request);
+        if (progressListener != null) {
+            progressListener.onProgressUpdated(request, fileToDownload, 0, 10, 0, 10);
         }
         // Test Callback
-        if (c != null) {
-            c.onStateUpdated(request, fileToDownload,
+        if (statusListener != null) {
+            statusListener.onStatusUpdated(request, fileToDownload,
                     MbmsDownloadSession.STATUS_ACTIVELY_DOWNLOADING);
         }
         try {
@@ -367,15 +380,12 @@
             result = MbmsDownloadSession.RESULT_CANCELLED;
         }
         // Test Callback
-        if (c != null) {
-            c.onProgressUpdated(request, fileToDownload, 10, 10, 10, 10);
+        if (progressListener != null) {
+            progressListener.onProgressUpdated(request, fileToDownload, 10, 10, 10, 10);
         }
         // Take a round-trip through the download request serialization to exercise it
-        DownloadRequest request1 = new DownloadRequest.Builder(request.getSourceUri())
-                .setSubscriptionId(request.getSubscriptionId())
-                .setServiceId(request.getFileServiceId())
-                .setOpaqueData(request.getOpaqueData())
-                .build();
+        DownloadRequest request1 = DownloadRequest.Builder.fromSerializedRequest(
+                request.toByteArray()).build();
 
         Intent downloadResultIntent =
                 new Intent(VendorUtils.ACTION_DOWNLOAD_RESULT_INTERNAL);
@@ -385,9 +395,10 @@
         downloadResultIntent.putExtra(MbmsDownloadSession.EXTRA_MBMS_FILE_INFO, fileToDownload);
         downloadResultIntent.putExtra(VendorUtils.EXTRA_TEMP_FILE_ROOT,
                 mAppTempFileRoots.get(appKey));
-        ArrayList<Uri> tempFileList = new ArrayList<>(1);
+        ArrayList<Uri> tempFileList = new ArrayList<>(2);
         tempFileList.add(tempFile.getFilePathUri());
-        downloadResultIntent.getExtras().putParcelableArrayList(
+        tempFileList.add(extraTempFile.getFilePathUri());
+        downloadResultIntent.putParcelableArrayListExtra(
                 VendorUtils.EXTRA_TEMP_LIST, tempFileList);
         downloadResultIntent.putExtra(MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_RESULT, result);
         downloadResultIntent.setComponent(mAppReceivers.get(appKey));
diff --git a/testapps/EmbmsTestDownloadApp/Android.mk b/testapps/EmbmsTestDownloadApp/Android.mk
index 080e5b0..445357c 100644
--- a/testapps/EmbmsTestDownloadApp/Android.mk
+++ b/testapps/EmbmsTestDownloadApp/Android.mk
@@ -14,6 +14,7 @@
 LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
 
 LOCAL_PACKAGE_NAME := EmbmsTestDownloadApp
+LOCAL_PRIVATE_PLATFORM_APIS := true
 
 LOCAL_CERTIFICATE := platform
 LOCAL_MODULE_TAGS := tests
diff --git a/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml b/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
index 1aea6a5..8bbc806 100644
--- a/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
+++ b/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
@@ -51,85 +51,93 @@
                 android:layout_column="0"
                 android:text="@string/bind_button" />
             <Button
-                android:id="@+id/set_temp_root_button"
+                android:id="@+id/set_temp_root_button_internal"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_row="0"
                 android:layout_column="1"
-                android:text="@string/set_temp_root_button" />
+                android:text="@string/set_temp_root_button_internal" />
+            <Button
+                android:id="@+id/set_temp_root_button_external"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_row="1"
+                android:layout_column="0"
+                android:text="@string/set_temp_root_button_external" />
             <Button
                 android:id="@+id/get_file_services_button"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_row="1"
-                android:layout_column="0"
+                android:layout_column="1"
                 android:text="@string/get_file_services_button" />
             <Button
                 android:id="@+id/request_dl_button"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_row="1"
-                android:layout_column="1"
+                android:layout_row="2"
+                android:layout_column="0"
                 android:text="@string/request_dl_button" />
             <Button
                 android:id="@+id/request_cleanup_button"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_row="2"
-                android:layout_column="0"
+                android:layout_column="1"
                 android:text="@string/request_cleanup_button" />
             <Button
                 android:id="@+id/request_spurious_temp_files_button"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_row="2"
-                android:layout_column="1"
+                android:layout_row="3"
+                android:layout_column="0"
                 android:text="@string/request_spurious_temp_files_button" />
             <Button
                 android:id="@+id/delay_download_button"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_row="3"
+                android:layout_row="4"
                 android:layout_column="0"
                 android:text="@string/delay_download_button" />
-            <NumberPicker
+            <EditText
                 android:id="@+id/delay_factor"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_row="3"
+                android:inputType="number"
+                android:layout_row="4"
                 android:layout_column="1"/>
             <Button
                 android:id="@+id/cancel_download_button"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_row="4"
+                android:layout_row="5"
                 android:layout_column="0"
                 android:text="@string/cancel_download_button" />
             <Button
+                android:id="@+id/register_all_callback_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_row="5"
+                android:layout_column="1"
+                android:text="@string/register_all_callback_button" />
+            <Button
                 android:id="@+id/register_state_callback_button"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_row="5"
+                android:layout_row="6"
                 android:layout_column="0"
                 android:text="@string/register_state_callback_button" />
             <Button
                 android:id="@+id/register_progress_callback_button"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_row="5"
+                android:layout_row="6"
                 android:layout_column="1"
                 android:text="@string/register_progress_callback_button" />
-            <Button
-                android:id="@+id/register_all_callback_button"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_row="6"
-                android:layout_column="0"
-                android:text="@string/register_all_callback_button" />
 
             <Spinner
                 android:id="@+id/active_downloads"
-                android:layout_row="7"
+                android:layout_row="8"
                 android:layout_column="1"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>
diff --git a/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml b/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
index b032b26..d1ee79e 100644
--- a/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
+++ b/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
@@ -19,7 +19,8 @@
     <string name="bind_button">Bind</string>
     <string name="request_dl_button">Request DL</string>
     <string name="get_file_services_button">Fetch file services</string>
-    <string name="set_temp_root_button">Set temp file root</string>
+    <string name="set_temp_root_button_internal">Set tmp root (int)</string>
+    <string name="set_temp_root_button_external">Set tmp root (ext)</string>
     <string name="request_cleanup_button">Cleanup</string>
     <string name="request_spurious_temp_files_button">Request more temp files</string>
     <string name="delay_download_button">Delay download</string>
diff --git a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/DownloadCompletionReceiver.java b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/DownloadCompletionReceiver.java
index 3c94b76..736b912 100644
--- a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/DownloadCompletionReceiver.java
+++ b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/DownloadCompletionReceiver.java
@@ -21,14 +21,12 @@
 import android.content.Intent;
 import android.net.Uri;
 import android.telephony.MbmsDownloadSession;
-import android.telephony.mbms.DownloadRequest;
 import android.telephony.mbms.FileInfo;
 
 import java.io.IOException;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.StandardCopyOption;
 
 public class DownloadCompletionReceiver extends BroadcastReceiver {
     @Override
@@ -41,22 +39,8 @@
             }
             Uri completedFile = intent.getParcelableExtra(
                     MbmsDownloadSession.EXTRA_MBMS_COMPLETED_FILE_URI);
-            FileInfo completedFileInfo = intent.getParcelableExtra(
-                    MbmsDownloadSession.EXTRA_MBMS_FILE_INFO);
-            DownloadRequest request = intent.getParcelableExtra(
-                    MbmsDownloadSession.EXTRA_MBMS_DOWNLOAD_REQUEST);
 
-            Path destinationFile = getDestinationFile(context,
-                    request.getFileServiceId(), completedFileInfo);
-            Path sourceFile = FileSystems.getDefault().getPath(completedFile.getPath());
-            try {
-                Files.move(sourceFile, destinationFile, StandardCopyOption.REPLACE_EXISTING);
-            } catch (IOException e) {
-                return;
-            }
-
-            EmbmsTestDownloadApp.getInstance().onDownloadDone(
-                    Uri.fromFile(destinationFile.toFile()));
+            EmbmsTestDownloadApp.getInstance().onDownloadDone(completedFile);
         }
     }
 
diff --git a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
index 4083f67..78fa34f 100644
--- a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
+++ b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
@@ -27,8 +27,9 @@
 import android.support.v7.widget.RecyclerView;
 import android.telephony.MbmsDownloadSession;
 import android.telephony.SubscriptionManager;
+import android.telephony.mbms.DownloadProgressListener;
 import android.telephony.mbms.DownloadRequest;
-import android.telephony.mbms.DownloadStateCallback;
+import android.telephony.mbms.DownloadStatusListener;
 import android.telephony.mbms.FileInfo;
 import android.telephony.mbms.FileServiceInfo;
 import android.telephony.mbms.MbmsDownloadSessionCallback;
@@ -37,13 +38,14 @@
 import android.view.ViewGroup;
 import android.widget.ArrayAdapter;
 import android.widget.Button;
+import android.widget.EditText;
 import android.widget.ImageView;
-import android.widget.NumberPicker;
 import android.widget.Spinner;
 import android.widget.TextView;
 import android.widget.Toast;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -182,6 +184,7 @@
     private FileServiceInfoAdapter mFileServiceInfoAdapter;
     private DownloadRequestAdapter mDownloadRequestAdapter;
     private ImageAdapter mImageAdapter;
+    private boolean mIsTempDirExternal = false;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -203,15 +206,29 @@
 
         Button bindButton = (Button) findViewById(R.id.bind_button);
         bindButton.setOnClickListener((view) -> {
-            mDownloadManager = MbmsDownloadSession.create(this, mCallback, mHandler);
+            mDownloadManager = MbmsDownloadSession.create(this, mHandler::post, mCallback);
         });
 
-        Button setTempFileRootButton = (Button) findViewById(R.id.set_temp_root_button);
-        setTempFileRootButton.setOnClickListener((view) -> {
+        Button setTempFileRootButtonExternal =
+                (Button) findViewById(R.id.set_temp_root_button_external);
+        setTempFileRootButtonExternal.setOnClickListener((view) -> {
+            File downloadDir = new File(EmbmsTestDownloadApp.this.getExternalFilesDir(null),
+                    CUSTOM_EMBMS_TEMP_FILE_LOCATION);
+            downloadDir.mkdirs();
+            mDownloadManager.setTempFileRootDirectory(downloadDir);
+            mIsTempDirExternal = true;
+            Toast.makeText(EmbmsTestDownloadApp.this,
+                    "temp file root set to " + downloadDir, Toast.LENGTH_SHORT).show();
+        });
+
+        Button setTempFileRootButtonInternal =
+                (Button) findViewById(R.id.set_temp_root_button_internal);
+        setTempFileRootButtonInternal.setOnClickListener((view) -> {
             File downloadDir = new File(EmbmsTestDownloadApp.this.getFilesDir(),
                     CUSTOM_EMBMS_TEMP_FILE_LOCATION);
             downloadDir.mkdirs();
             mDownloadManager.setTempFileRootDirectory(downloadDir);
+            mIsTempDirExternal = false;
             Toast.makeText(EmbmsTestDownloadApp.this,
                     "temp file root set to " + downloadDir, Toast.LENGTH_SHORT).show();
         });
@@ -252,14 +269,13 @@
                 SideChannel.requestSpuriousTempFiles(EmbmsTestDownloadApp.this,
                         (FileServiceInfo) serviceSelector.getSelectedItem()));
 
-        NumberPicker downloadDelayPicker = (NumberPicker) findViewById(R.id.delay_factor);
-        downloadDelayPicker.setMinValue(1);
-        downloadDelayPicker.setMaxValue(50);
+        EditText downloadDelay = findViewById(R.id.delay_factor);
+        downloadDelay.setText(String.valueOf(5));
 
         Button delayDownloadButton = (Button) findViewById(R.id.delay_download_button);
         delayDownloadButton.setOnClickListener((view) ->
                 SideChannel.delayDownloads(EmbmsTestDownloadApp.this,
-                        downloadDelayPicker.getValue()));
+                        Integer.valueOf(downloadDelay.getText().toString())));
 
         final Spinner downloadRequestSpinner = (Spinner) findViewById(R.id.active_downloads);
         downloadRequestSpinner.setAdapter(mDownloadRequestAdapter);
@@ -291,26 +307,18 @@
                         "No DownloadRequest Pending for progress...", Toast.LENGTH_SHORT).show();
                 return;
             }
-            mDownloadManager.registerStateCallback(req, new DownloadStateCallback(
-                    DownloadStateCallback.PROGRESS_UPDATES) {
-                @Override
-                public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
-                        int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
-                        int fullDecodedSize) {
-                    Toast.makeText(EmbmsTestDownloadApp.this,
-                            "Progress Updated (" + fileInfo + ") cd: " + currentDecodedSize
-                                    + " fd: " + fullDownloadSize, Toast.LENGTH_SHORT).show();
-                }
-
-                @Override
-                public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
-                        @MbmsDownloadSession.DownloadStatus int state) {
-                    // only registered for state callback, this shouldn't happen!
-                    Toast.makeText(EmbmsTestDownloadApp.this,
-                            "State ERROR: received state update for callback that didn't filter it",
-                            Toast.LENGTH_SHORT).show();
-                }
-            }, sInstance.getMainThreadHandler());
+            mDownloadManager.addProgressListener(req, sInstance.getMainThreadHandler()::post,
+                    new DownloadProgressListener() {
+                        @Override
+                        public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
+                                int currentDownloadSize, int fullDownloadSize,
+                                int currentDecodedSize, int fullDecodedSize) {
+                            Toast.makeText(EmbmsTestDownloadApp.this,
+                                    "Progress Updated (" + fileInfo + ") cd: " + currentDecodedSize
+                                            + " fd: " + fullDownloadSize, Toast.LENGTH_SHORT)
+                                    .show();
+                        }
+                    });
         });
 
         Button registerStateCallback =
@@ -327,26 +335,16 @@
                         "No DownloadRequest Pending for state...", Toast.LENGTH_SHORT).show();
                 return;
             }
-            mDownloadManager.registerStateCallback(req, new DownloadStateCallback(
-                    DownloadStateCallback.STATE_UPDATES) {
-                @Override
-                public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
-                        int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
-                        int fullDecodedSize) {
-                    // only registered for state callback, this shouldn't happen!
-                    Toast.makeText(EmbmsTestDownloadApp.this,
-                            "Progress ERROR: received progress update for callback that didn't "
-                                    + "filter it", Toast.LENGTH_SHORT).show();
-                }
-
-                @Override
-                public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
-                        @MbmsDownloadSession.DownloadStatus int state) {
-                    Toast.makeText(EmbmsTestDownloadApp.this,
-                            "State Updated (" + fileInfo + ") state: " + state,
-                            Toast.LENGTH_SHORT).show();
-                }
-            }, sInstance.getMainThreadHandler());
+            mDownloadManager.addStatusListener(req, sInstance.getMainThreadHandler()::post,
+                    new DownloadStatusListener() {
+                        @Override
+                        public void onStatusUpdated(DownloadRequest request, FileInfo fileInfo,
+                                @MbmsDownloadSession.DownloadStatus int state) {
+                            Toast.makeText(EmbmsTestDownloadApp.this,
+                                    "State Updated (" + fileInfo + ") state: " + state,
+                                    Toast.LENGTH_SHORT).show();
+                        }
+                    });
         });
 
         Button registerAllCallbacks =
@@ -363,24 +361,30 @@
                         "No DownloadRequest Pending for state...", Toast.LENGTH_SHORT).show();
                 return;
             }
-            mDownloadManager.registerStateCallback(req, new DownloadStateCallback() {
-                @Override
-                public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
-                        int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
-                        int fullDecodedSize) {
-                    Toast.makeText(EmbmsTestDownloadApp.this,
-                            "Progress Updated (" + fileInfo + ") cd: " + currentDecodedSize
-                                    + " fd: " + fullDownloadSize, Toast.LENGTH_SHORT).show();
-                }
 
-                @Override
-                public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
-                        @MbmsDownloadSession.DownloadStatus int state) {
-                    Toast.makeText(EmbmsTestDownloadApp.this,
-                            "State Updated (" + fileInfo + ") state: " + state,
-                            Toast.LENGTH_SHORT).show();
-                }
-            }, sInstance.getMainThreadHandler());
+            mDownloadManager.addStatusListener(req, sInstance.getMainThreadHandler()::post,
+                    new DownloadStatusListener() {
+                        @Override
+                        public void onStatusUpdated(DownloadRequest request, FileInfo fileInfo,
+                                @MbmsDownloadSession.DownloadStatus int state) {
+                            Toast.makeText(EmbmsTestDownloadApp.this,
+                                    "State Updated (" + fileInfo + ") state: " + state,
+                                    Toast.LENGTH_SHORT).show();
+                        }
+                    });
+
+            mDownloadManager.addProgressListener(req, sInstance.getMainThreadHandler()::post,
+                    new DownloadProgressListener() {
+                        @Override
+                        public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
+                                int currentDownloadSize, int fullDownloadSize,
+                                int currentDecodedSize, int fullDecodedSize) {
+                            Toast.makeText(EmbmsTestDownloadApp.this,
+                                    "Progress Updated (" + fileInfo + ") cd: " + currentDecodedSize
+                                            + " fd: " + fullDownloadSize, Toast.LENGTH_SHORT)
+                                    .show();
+                        }
+                    });
         });
     }
 
@@ -423,13 +427,14 @@
         if (info.getServiceId().contains("2")) {
             sourceUriBuilder.path("/*");
         } else {
-            sourceUriBuilder.path("/image.png");
+            sourceUriBuilder.path("/sunAndTree.png");
         }
 
         Intent completionIntent = new Intent(DOWNLOAD_DONE_ACTION);
         completionIntent.setClass(this, DownloadCompletionReceiver.class);
 
-        DownloadRequest request = new DownloadRequest.Builder(sourceUriBuilder.build())
+        DownloadRequest request = new DownloadRequest.Builder(sourceUriBuilder.build(),
+                getDestination(info.getServiceId()))
                 .setServiceInfo(info)
                 .setAppIntent(completionIntent)
                 .setSubscriptionId(SubscriptionManager.getDefaultSubscriptionId())
@@ -438,4 +443,25 @@
         mDownloadManager.download(request);
         mDownloadRequestAdapter.add(request);
     }
+
+    private Uri getDestination(String serviceId) {
+        File dest;
+        File baseDir = mIsTempDirExternal ? getExternalFilesDir(null) : getFilesDir();
+        try {
+            if (serviceId.contains("2")) {
+                dest = new File(baseDir.getCanonicalFile(), "images/animals/");
+                if (!dest.exists()) {
+                    dest.mkdirs();
+                }
+            } else {
+                dest = new File(baseDir.getCanonicalFile(), "images/");
+                if (!dest.exists()) {
+                    dest.mkdirs();
+                }
+            }
+            return Uri.fromFile(dest);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }
diff --git a/testapps/EmbmsTestStreamingApp/Android.mk b/testapps/EmbmsTestStreamingApp/Android.mk
index 45826b9..f574990 100644
--- a/testapps/EmbmsTestStreamingApp/Android.mk
+++ b/testapps/EmbmsTestStreamingApp/Android.mk
@@ -10,6 +10,7 @@
 LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
 
 LOCAL_PACKAGE_NAME := EmbmsTestStreamingApp
+LOCAL_PRIVATE_PLATFORM_APIS := true
 
 LOCAL_CERTIFICATE := platform
 LOCAL_MODULE_TAGS := tests
diff --git a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
index 0546c9d..75febda 100644
--- a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
+++ b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
@@ -154,7 +154,7 @@
         Button bindButton = (Button) findViewById(R.id.bind_button);
         bindButton.setOnClickListener((view) -> {
             mStreamingManager = MbmsStreamingSession.create(
-                    EmbmsTestStreamingApp.this, mStreamingListener, mHandler);
+                    EmbmsTestStreamingApp.this, mHandler::post, mStreamingListener);
         });
 
         Button getStreamingServicesButton = (Button)
diff --git a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java
index 5244d30..d45b5fd 100644
--- a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java
+++ b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java
@@ -60,13 +60,13 @@
      * Start streaming using the provided streaming session
      */
     public boolean startStreaming(MbmsStreamingSession streamingManager) {
-        mStreamingService =
-                streamingManager.startStreaming(mStreamingServiceInfo, new Callback(), null);
+        mStreamingService = streamingManager.startStreaming(mStreamingServiceInfo,
+                mActivity.getMainThreadHandler()::post, new Callback());
         return true;
     }
 
     public void stopStreaming() {
-        mStreamingService.stopStreaming();
+        mStreamingService.close();
     }
 
     public String getServiceId() {
diff --git a/testapps/ImsTestService/Android.mk b/testapps/ImsTestService/Android.mk
new file mode 100644
index 0000000..29df224
--- /dev/null
+++ b/testapps/ImsTestService/Android.mk
@@ -0,0 +1,27 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_STATIC_ANDROID_LIBRARIES := \
+    android-support-v4 \
+    android-support-v7-appcompat \
+    android-support-v7-recyclerview \
+    android-support-v7-cardview
+
+LOCAL_USE_AAPT2 := true
+
+src_dirs := src
+res_dirs := res
+
+LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
+LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
+
+LOCAL_PACKAGE_NAME := ImsTestApp
+LOCAL_PRIVATE_PLATFORM_APIS := true
+
+LOCAL_CERTIFICATE := platform
+LOCAL_PRIVILEGED_MODULE := true
+
+include $(BUILD_PACKAGE)
diff --git a/testapps/ImsTestService/AndroidManifest.xml b/testapps/ImsTestService/AndroidManifest.xml
new file mode 100644
index 0000000..f47210e
--- /dev/null
+++ b/testapps/ImsTestService/AndroidManifest.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          coreApp="true"
+          package="com.android.phone.testapps.imstestapp">
+    <application
+        android:label="ImsTestService"
+        android:directBootAware="true">
+        <activity
+            android:name=".ImsTestServiceApp"
+            android:label="ImsTestService">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".ImsRegistrationActivity" android:label="IMS Registration" />
+        <activity android:name=".ImsCallingActivity" android:label="IMS Calling" />
+        <activity android:name=".ImsConfigActivity" android:label="IMS Config" />
+
+        <service android:name=".TestImsService"
+                 android:exported="true"
+                 android:enabled="true"
+                 android:persistent="true"
+                 android:permission="android.permission.BIND_IMS_SERVICE">
+            <!--meta-data android:name="android.telephony.ims.MMTEL_FEATURE" android:value="true"/-->
+            <!-- No features means we will get queried for dynamic config. -->
+            <intent-filter>
+                <action android:name="android.telephony.ims.ImsService" />
+            </intent-filter>
+        </service>
+    </application>
+</manifest>
+
diff --git a/testapps/ImsTestService/res/layout/activity_calling.xml b/testapps/ImsTestService/res/layout/activity_calling.xml
new file mode 100644
index 0000000..c1d6993
--- /dev/null
+++ b/testapps/ImsTestService/res/layout/activity_calling.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingLeft="4dp">
+
+    <GridLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:columnCount="2" android:rowCount="2">
+
+        <CheckBox
+            android:id="@+id/call_cap_voice"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:layout_column="0"
+            android:layout_gravity="center" android:layout_row="0"
+            android:text="@string/calling_cap_voice"/>
+        <CheckBox
+            android:id="@+id/call_cap_video"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:layout_column="1"
+            android:layout_gravity="center" android:layout_row="0"
+            android:text="@string/calling_cap_video"/>
+        <CheckBox
+            android:id="@+id/call_cap_ut"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:layout_column="0"
+            android:layout_gravity="center" android:layout_row="1"
+            android:text="@string/calling_cap_ut"/>
+        <CheckBox
+            android:id="@+id/call_cap_sms"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:layout_column="1"
+            android:layout_gravity="center" android:layout_row="1"
+            android:text="@string/calling_cap_sms"/>
+    </GridLayout>
+    <Button
+        android:id="@+id/call_cap_change"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/calling_cap_change_button" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:background="?android:attr/listDivider"
+        android:paddingRight="4dp"/>
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" android:text="@string/calling_cap_enabled_text"
+        android:textStyle="bold"/>
+    <TextView
+        android:id="@+id/call_cap_enabled_text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" android:text=""/>
+
+
+</LinearLayout>
\ No newline at end of file
diff --git a/testapps/ImsTestService/res/layout/activity_config.xml b/testapps/ImsTestService/res/layout/activity_config.xml
new file mode 100644
index 0000000..636bc2d
--- /dev/null
+++ b/testapps/ImsTestService/res/layout/activity_config.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingLeft="4dp">
+
+    <TextView
+        android:id="@+id/textView2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textStyle="bold"
+        android:text="Set Configuration Value"/>
+
+    <LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:paddingLeft="4dp">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:layout_weight="0"
+            android:text="Item"/>
+
+        <EditText
+            android:id="@+id/set_config_item"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:inputType="number" android:text="0"/>
+    </LinearLayout>
+
+    <LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:paddingLeft="4dp">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:layout_weight="0"
+            android:text="Value"/>
+
+        <EditText
+            android:id="@+id/set_config_value"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:inputType="number" android:text="0"/>
+    </LinearLayout>
+
+    <Button
+        android:id="@+id/config_button"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingRight="4dp"
+        android:text="Set"/>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height= "1dp"
+        android:paddingRight="4dp"
+        android:background="?android:attr/listDivider" />
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textStyle="bold"
+        android:text="Cached Config Values"/>
+
+    <ListView
+        android:id="@+id/config_list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/testapps/ImsTestService/res/layout/activity_main.xml b/testapps/ImsTestService/res/layout/activity_main.xml
new file mode 100644
index 0000000..a45bd40
--- /dev/null
+++ b/testapps/ImsTestService/res/layout/activity_main.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingLeft="4dp">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical" >
+
+        <TextView
+            android:id="@+id/features_main_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/features_main_text"/>
+        <CheckBox
+            android:id="@+id/features_check_mmtel"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/features_check_mmtel"/>
+        <CheckBox
+            android:id="@+id/features_check_rcs"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/features_check_rcs"/>
+        <Button
+            android:id="@+id/features_change_button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/features_change_button"/>
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height= "1dp"
+        android:paddingRight="4dp"
+        android:background="?android:attr/listDivider" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical" >
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="ImsService Controls"/>
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <Button
+                android:id="@+id/control_launch_reg"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingRight="4dp"
+                android:text="Registration"/>
+            <Button
+                android:id="@+id/control_launch_calling"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingRight="4dp"
+                android:text="Calling"/>
+            <Button
+                android:id="@+id/control_launch_config"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingRight="4dp"
+                android:text="Config"/>
+        </LinearLayout>
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height= "1dp"
+        android:paddingRight="4dp"
+        android:background="?android:attr/listDivider" />
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:id="@+id/connections_list"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/testapps/ImsTestService/res/layout/activity_registration.xml b/testapps/ImsTestService/res/layout/activity_registration.xml
new file mode 100644
index 0000000..2e381eb
--- /dev/null
+++ b/testapps/ImsTestService/res/layout/activity_registration.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingLeft="4dp">
+
+    <LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:paddingLeft="4dp">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/reg_text_reg_tech"/>
+        <Spinner
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:id="@+id/reg_tech_selector"/>
+    </LinearLayout>
+    <Button
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/reg_registered_button"
+        android:id="@+id/reg_registered_button"/>
+    <Button
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/reg_registering_button"
+        android:id="@+id/reg_registering_button"/>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height= "1dp"
+        android:paddingRight="4dp"
+        android:background="?android:attr/listDivider" />
+
+    <include layout="@layout/construct_imsreasoninfo"
+             android:id="@+id/deregistered_imsreasoninfo" />
+    <Button
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/reg_deregistered_button"
+        android:id="@+id/reg_deregistered_button"/>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height= "1dp"
+        android:paddingRight="4dp"
+        android:background="?android:attr/listDivider" />
+
+    <include layout="@layout/construct_imsreasoninfo"
+             android:id="@+id/regchangefail_imsreasoninfo" />
+    <Button
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/reg_changefailed_button"
+        android:id="@+id/reg_changefailed_button"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/testapps/ImsTestService/res/layout/config_item.xml b/testapps/ImsTestService/res/layout/config_item.xml
new file mode 100644
index 0000000..796a741
--- /dev/null
+++ b/testapps/ImsTestService/res/layout/config_item.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal">
+
+    <TextView
+        android:id="@+id/configItem"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1" android:text="Item" android:textAlignment="viewStart"/>
+
+    <TextView
+        android:id="@+id/configValue"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1" android:text="Value"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/testapps/ImsTestService/res/layout/construct_imsreasoninfo.xml b/testapps/ImsTestService/res/layout/construct_imsreasoninfo.xml
new file mode 100644
index 0000000..dd32ca3
--- /dev/null
+++ b/testapps/ImsTestService/res/layout/construct_imsreasoninfo.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical" >
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/imsreasoninfo_text"/>
+        
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:layout_weight="0"
+            android:maxLines="1" android:minEms="2" android:paddingRight="4dp"
+            android:text="@string/imsreasoninfo_errorcode"/>
+        <EditText
+            android:id="@+id/imsreasoninfo_error"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:ems="3"
+            android:inputType="number" android:text="0"/>
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:layout_weight="0"
+            android:autoText="true" android:maxLines="1" android:paddingRight="4dp"
+            android:text="@string/imsreasoninfo_extracode"/>
+        <EditText
+            android:id="@+id/imsreasoninfo_extra"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:ems="3"
+            android:inputType="number" android:text="0"/>
+    </LinearLayout>
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_weight="1" android:orientation="horizontal">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:layout_weight="0"
+            android:paddingRight="4dp" android:text="@string/imsreasoninfo_message"/>
+        <EditText
+            android:id="@+id/imsreasoninfo_message"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:ems="10"
+            android:inputType="text"/>
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/testapps/ImsTestService/res/layout/ims_connection.xml b/testapps/ImsTestService/res/layout/ims_connection.xml
new file mode 100644
index 0000000..4c08082
--- /dev/null
+++ b/testapps/ImsTestService/res/layout/ims_connection.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<android.support.v7.widget.CardView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:card_view="http://schemas.android.com/apk/res-auto"
+    android:layout_gravity="center"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:id="@+id/connection_info"
+    card_view:cardCornerRadius="4dp"
+    card_view:cardElevation="4dp"
+    card_view:cardUseCompatPadding="true">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical" >
+        <TextView
+            android:id="@+id/reg_main_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" android:text="@string/features_main_text"/>
+        <CheckBox
+            android:id="@+id/reg_check_mmtel"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" android:text="@string/features_check_mmtel"/>
+        <CheckBox
+            android:id="@+id/reg_check_rcs"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" android:text="@string/features_check_rcs"/>
+        </LinearLayout>
+</android.support.v7.widget.CardView>
\ No newline at end of file
diff --git a/testapps/ImsTestService/res/values/donottranslate_strings.xml b/testapps/ImsTestService/res/values/donottranslate_strings.xml
new file mode 100644
index 0000000..68da69e
--- /dev/null
+++ b/testapps/ImsTestService/res/values/donottranslate_strings.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<resources>
+    <string name="features_main_text">Registration Configuration</string>
+    <string name="features_check_mmtel">MmTel Feature</string>
+    <string name="features_check_rcs">RCS Feature</string>
+    <string name="features_change_button">Change Features</string>
+
+    <string name="reg_text_reg_tech">Registration Technology</string>
+    <string name="reg_registered_button">Send Registered</string>
+    <string name="reg_registering_button">Send Registering</string>
+    <string name="reg_deregistered_button">Send Deregistered Using Reason Above</string>
+    <string name="reg_changefailed_button">Reg Change Failed Using Reason Above</string>
+
+    <string name="imsreasoninfo_text">Construct ImsReasonInfo</string>
+    <string name="imsreasoninfo_errorcode">Error Code</string>
+    <string name="imsreasoninfo_extracode">Extra Code</string>
+    <string name="imsreasoninfo_message">Message</string>
+
+    <string name="calling_cap_voice">Voice</string>
+    <string name="calling_cap_video">Video</string>
+    <string name="calling_cap_ut">UT</string>
+    <string name="calling_cap_sms">SMS</string>
+    <string name="calling_cap_change_button">Change Capability Status</string>
+    <string name="calling_cap_enabled_text">Enabled Capabilities</string>
+</resources>
\ No newline at end of file
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsCallingActivity.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsCallingActivity.java
new file mode 100644
index 0000000..48944e4
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsCallingActivity.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
+import android.util.SparseArray;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class ImsCallingActivity extends Activity {
+
+    //Capabilities available by service
+    private CheckBox mCapVoiceAvailBox;
+    private CheckBox mCapVideoAvailBox;
+    private CheckBox mCapUtAvailBox;
+    private CheckBox mCapSmsAvailBox;
+
+    private TextView mCapEnabledText;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.activity_calling);
+
+        TestMmTelFeatureImpl.getInstance().initialize(this, 0);
+
+        mCapVoiceAvailBox = findViewById(R.id.call_cap_voice);
+        mCapVideoAvailBox = findViewById(R.id.call_cap_video);
+        mCapUtAvailBox = findViewById(R.id.call_cap_ut);
+        mCapSmsAvailBox = findViewById(R.id.call_cap_sms);
+        mCapEnabledText = findViewById(R.id.call_cap_enabled_text);
+        Button capChangedButton = findViewById(R.id.call_cap_change);
+        capChangedButton.setOnClickListener((v) -> onCapabilitiesChangedClicked());
+
+        TestMmTelFeatureImpl.getInstance().addUpdateCallback(
+                new TestMmTelFeatureImpl.MmTelUpdateCallback() {
+                    @Override
+                    void onEnabledCapabilityChanged() {
+                        mmTelCapabilityChanged();
+                    }
+                });
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mmTelCapabilityChanged();
+    }
+
+    private void mmTelCapabilityChanged() {
+        SparseArray<MmTelFeature.MmTelCapabilities> caps =
+                TestMmTelFeatureImpl.getInstance().getEnabledCapabilities();
+        StringBuilder sb = new StringBuilder("LTE: ");
+        sb.append("{");
+        sb.append(caps.get(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
+        sb.append("}, \nIWLAN: ");
+        sb.append("{");
+        sb.append(caps.get(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
+        sb.append("}");
+        mCapEnabledText.setText(sb.toString());
+    }
+
+    private void onCapabilitiesChangedClicked() {
+        if (!isFrameworkConnected()) {
+            return;
+        }
+        boolean isVoiceAvail = mCapVoiceAvailBox.isChecked();
+        boolean isVideoAvail = mCapVideoAvailBox.isChecked();
+        boolean isUtAvail = mCapUtAvailBox.isChecked();
+        // Not used yet
+        boolean isSmsAvail = mCapSmsAvailBox.isChecked();
+
+        MmTelFeature.MmTelCapabilities capabilities = new MmTelFeature.MmTelCapabilities();
+        if (isVoiceAvail) {
+            capabilities.addCapabilities(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE);
+        }
+        if (isVideoAvail) {
+            capabilities.addCapabilities(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO);
+        }
+        if (isUtAvail) {
+            capabilities.addCapabilities(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT);
+        }
+        TestMmTelFeatureImpl.getInstance().sendCapabilitiesUpdate(capabilities);
+    }
+
+    private boolean isFrameworkConnected() {
+        if (!TestMmTelFeatureImpl.getInstance().isReady()) {
+            Toast.makeText(this, "Connection to Framework Unavailable",
+                    Toast.LENGTH_SHORT).show();
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsConfigActivity.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsConfigActivity.java
new file mode 100644
index 0000000..1f8e1c3
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsConfigActivity.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+public class ImsConfigActivity extends Activity {
+
+    private static final String PREFIX_ITEM = "Item: ";
+    private static final String PREFIX_VALUE = "Value: ";
+
+    public static class ConfigItemAdapter extends ArrayAdapter<TestImsConfigImpl.ConfigItem> {
+        public ConfigItemAdapter(Context context, ArrayList<TestImsConfigImpl.ConfigItem> configs) {
+            super(context, 0, configs);
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            TestImsConfigImpl.ConfigItem configItem = getItem(position);
+
+            if (convertView == null) {
+                convertView = LayoutInflater.from(getContext()).inflate(R.layout.config_item,
+                        parent, false);
+            }
+
+            TextView textItem = (TextView) convertView.findViewById(R.id.configItem);
+            TextView textValue = (TextView) convertView.findViewById(R.id.configValue);
+
+            textItem.setText(PREFIX_ITEM + configItem.item);
+            if (configItem.valueString != null) {
+                textValue.setText(PREFIX_VALUE + configItem.valueString);
+            } else {
+                textValue.setText(PREFIX_VALUE + configItem.value);
+            }
+
+            return convertView;
+        }
+    }
+
+    private final TestImsConfigImpl.ImsConfigListener mConfigListener =
+            new TestImsConfigImpl.ImsConfigListener() {
+                @Override
+                public void notifyConfigChanged() {
+                    Log.i("ImsConfigActivity", "notifyConfigChanged");
+                    mConfigItemAdapter.notifyDataSetChanged();
+                }
+            };
+
+    ConfigItemAdapter mConfigItemAdapter;
+    ListView mListView;
+
+    EditText mConfigItemText;
+    EditText mConfigValueText;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.activity_config);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        mConfigItemAdapter = new ConfigItemAdapter(this,
+                TestImsConfigImpl.getInstance().getConfigList());
+
+        mListView = (ListView) findViewById(R.id.config_list);
+        mListView.setAdapter(mConfigItemAdapter);
+
+        TestImsConfigImpl.getInstance().setConfigListener(mConfigListener);
+
+        Button setConfigButton = findViewById(R.id.config_button);
+        setConfigButton.setOnClickListener((v) -> onSetConfigClicked());
+
+        mConfigItemText = findViewById(R.id.set_config_item);
+        mConfigValueText = findViewById(R.id.set_config_value);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+
+        TestImsConfigImpl.getInstance().setConfigListener(null);
+    }
+
+    private void onSetConfigClicked() {
+        String configItem = mConfigItemText.getText().toString();
+        String configValue = mConfigValueText.getText().toString();
+        TestImsConfigImpl.getInstance().setConfigValue(Integer.parseInt(configItem),
+                Integer.parseInt(configValue));
+    }
+}
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsRegistrationActivity.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsRegistrationActivity.java
new file mode 100644
index 0000000..7e27371
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsRegistrationActivity.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
+import android.util.ArrayMap;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Spinner;
+import android.widget.Toast;
+import android.telephony.ims.ImsReasonInfo;
+
+import java.util.Map;
+
+public class ImsRegistrationActivity extends Activity {
+
+    private int mSelectedRegTech = ImsRegistrationImplBase.REGISTRATION_TECH_LTE;
+
+    private static final Map<String, Integer> REG_TECH = new ArrayMap<>(2);
+    static {
+        REG_TECH.put("LTE", ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+        REG_TECH.put("IWLAN", ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN);
+    }
+
+    private View mDeregisteredReason;
+    private View mRegChangeFailedReason;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.activity_registration);
+
+        //Set up registration tech spinner
+        Spinner regTechDropDown = findViewById(R.id.reg_tech_selector);
+        regTechDropDown.setAdapter(new ArrayAdapter<>(this,
+                android.R.layout.simple_spinner_dropdown_item,
+                REG_TECH.keySet().toArray(new String[REG_TECH.size()])));
+        regTechDropDown.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                onTechDropDownChanged((String) parent.getItemAtPosition(position));
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+                // Don't change selection
+            }
+        });
+
+        // Map buttons to onClick listeners
+        Button registeredButton = findViewById(R.id.reg_registered_button);
+        registeredButton.setOnClickListener((v)->onRegisteredClicked());
+        Button registeringButton = findViewById(R.id.reg_registering_button);
+        registeringButton.setOnClickListener((v)->onRegisteringClicked());
+        Button deregisteredButton = findViewById(R.id.reg_deregistered_button);
+        deregisteredButton.setOnClickListener((v)->onDeregisteredClicked());
+        Button regChangeFailedButton = findViewById(R.id.reg_changefailed_button);
+        regChangeFailedButton.setOnClickListener((v)->onRegChangeFailedClicked());
+
+        mDeregisteredReason = findViewById(R.id.deregistered_imsreasoninfo);
+        mRegChangeFailedReason = findViewById(R.id.regchangefail_imsreasoninfo);
+    }
+
+    private void onRegisteredClicked() {
+        if (!isFrameworkConnected()) {
+            return;
+        }
+        TestImsRegistrationImpl.getInstance().onRegistered(mSelectedRegTech);
+    }
+
+    private void onRegisteringClicked() {
+        if (!isFrameworkConnected()) {
+            return;
+        }
+        TestImsRegistrationImpl.getInstance().onRegistering(mSelectedRegTech);
+    }
+
+    private void onDeregisteredClicked() {
+        if (!isFrameworkConnected()) {
+            return;
+        }
+        TestImsRegistrationImpl.getInstance().onDeregistered(getReasonInfo(mDeregisteredReason));
+    }
+
+    private void onRegChangeFailedClicked() {
+        if (!isFrameworkConnected()) {
+            return;
+        }
+        TestImsRegistrationImpl.getInstance().onTechnologyChangeFailed(mSelectedRegTech,
+                getReasonInfo(mRegChangeFailedReason));
+    }
+
+    private void onTechDropDownChanged(String item) {
+        mSelectedRegTech = REG_TECH.get(item);
+    }
+
+    private ImsReasonInfo getReasonInfo(View reasonView) {
+        EditText errorCodeText = reasonView.findViewById(R.id.imsreasoninfo_error);
+        EditText extraCodeText = reasonView.findViewById(R.id.imsreasoninfo_extra);
+        EditText messageText = reasonView.findViewById(R.id.imsreasoninfo_message);
+
+        int errorCode = ImsReasonInfo.CODE_UNSPECIFIED;
+        try {
+            errorCode = Integer.parseInt(errorCodeText.getText().toString());
+        } catch (NumberFormatException e) {
+            Toast.makeText(this, "Couldn't parse reason, defaulting to Unspecified.",
+                    Toast.LENGTH_SHORT).show();
+        }
+
+        int extraCode = ImsReasonInfo.CODE_UNSPECIFIED;
+        try {
+            extraCode = Integer.parseInt(extraCodeText.getText().toString());
+        } catch (NumberFormatException e) {
+            Toast.makeText(this, "Couldn't parse reason, defaulting to Unspecified.",
+                    Toast.LENGTH_SHORT).show();
+        }
+
+        String message = messageText.getText().toString();
+
+        ImsReasonInfo result = new ImsReasonInfo(errorCode, extraCode, message);
+        Toast.makeText(this, "getReasonInfo: " + result, Toast.LENGTH_SHORT).show();
+        return result;
+    }
+
+    private boolean isFrameworkConnected() {
+        if (TestImsRegistrationImpl.getInstance() == null) {
+            Toast.makeText(this, "Connection to Framework Unavailable!",
+                    Toast.LENGTH_LONG).show();
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsTestServiceApp.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsTestServiceApp.java
new file mode 100644
index 0000000..6b78a30
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/ImsTestServiceApp.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+/**
+ * Main activity for Test ImsService Application.
+ */
+
+public class ImsTestServiceApp extends Activity {
+
+    private LinearLayout mConnections;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.activity_main);
+
+        ((Button) findViewById(R.id.control_launch_reg)).setOnClickListener(
+                (view) -> launchRegistrationActivity());
+
+        ((Button) findViewById(R.id.control_launch_calling)).setOnClickListener(
+                (view) -> launchCallingActivity());
+
+        ((Button) findViewById(R.id.control_launch_config)).setOnClickListener(
+                (view) -> launchConfigActivity());
+
+        // Adds Card view for testing
+        mConnections = findViewById(R.id.connections_list);
+        mConnections.addView(getLayoutInflater().inflate(R.layout.ims_connection, null, false));
+    }
+
+    private void launchRegistrationActivity() {
+        Intent intent = new Intent(this, ImsRegistrationActivity.class);
+        startActivity(intent);
+    }
+
+    private void launchCallingActivity() {
+        Intent intent = new Intent(this, ImsCallingActivity.class);
+        startActivity(intent);
+    }
+
+    private void launchConfigActivity() {
+        Intent intent = new Intent(this, ImsConfigActivity.class);
+        startActivity(intent);
+    }
+}
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsConfigImpl.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsConfigImpl.java
new file mode 100644
index 0000000..3269a5a
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsConfigImpl.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.telephony.ims.stub.ImsConfigImplBase;
+
+import com.android.ims.ImsConfig;
+
+import java.util.ArrayList;
+
+public class TestImsConfigImpl extends ImsConfigImplBase {
+
+    public static class ConfigItem {
+        public int item;
+        public int value;
+        public String valueString;
+
+        public ConfigItem(int item, int value) {
+            this.item = item;
+            this.value = value;
+        }
+
+        public ConfigItem(int item, String value) {
+            this.item = item;
+            valueString = value;
+        }
+    }
+
+    public interface ImsConfigListener {
+        void notifyConfigChanged();
+    }
+
+    private static TestImsConfigImpl sTestImsConfigImpl;
+    private ImsConfigListener mListener;
+    private ArrayList<ConfigItem> mArrayOfConfigs = new ArrayList<>();
+
+    public static TestImsConfigImpl getInstance() {
+        if (sTestImsConfigImpl == null) {
+            sTestImsConfigImpl = new TestImsConfigImpl();
+        }
+        return sTestImsConfigImpl;
+    }
+
+    private TestImsConfigImpl() {
+        super();
+    }
+
+    public void setConfigListener(ImsConfigListener listener) {
+        mListener = listener;
+    }
+
+    public ArrayList<ConfigItem> getConfigList() {
+        return mArrayOfConfigs;
+    }
+
+    @Override
+    public int setConfig(int item, int value) {
+        replaceConfig(new ConfigItem(item, value));
+        return ImsConfig.OperationStatusConstants.SUCCESS;
+    }
+
+    @Override
+    public int setConfig(int item, String value) {
+        replaceConfig(new ConfigItem(item, value));
+        return ImsConfig.OperationStatusConstants.SUCCESS;
+    }
+
+    @Override
+    public int getConfigInt(int item) {
+        replaceConfig(new ConfigItem(item, ImsConfig.FeatureValueConstants.ON));
+        return ImsConfig.FeatureValueConstants.ON;
+    }
+
+    @Override
+    public String getConfigString(int item) {
+        return null;
+    }
+
+    public void setConfigValue(int item, int value) {
+        replaceConfig(new ConfigItem(item, value));
+        notifyProvisionedValueChanged(item, value);
+    }
+
+    public void replaceConfig(ConfigItem configItem) {
+        ConfigItem config = mArrayOfConfigs.stream()
+                .filter(configElem -> configElem.item == configItem.item)
+                .findFirst().orElse(null);
+        if (config != null) {
+            mArrayOfConfigs.remove(config);
+        }
+        mArrayOfConfigs.add(configItem);
+        if (mListener != null) {
+            mListener.notifyConfigChanged();
+        }
+    }
+}
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsRegistrationImpl.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsRegistrationImpl.java
new file mode 100644
index 0000000..50bf5d4
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsRegistrationImpl.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.telephony.ims.stub.ImsRegistrationImplBase;
+
+public class TestImsRegistrationImpl extends ImsRegistrationImplBase {
+
+    private static TestImsRegistrationImpl sInstance;
+
+    public static TestImsRegistrationImpl getInstance() {
+        if (sInstance == null) {
+            sInstance = new TestImsRegistrationImpl();
+        }
+        return sInstance;
+    }
+}
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsService.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsService.java
new file mode 100644
index 0000000..71323d8
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestImsService.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.telephony.ims.ImsService;
+import android.telephony.ims.feature.ImsFeature;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.feature.RcsFeature;
+import android.telephony.ims.stub.ImsConfigImplBase;
+import android.telephony.ims.stub.ImsFeatureConfiguration;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
+import android.util.Log;
+
+/**
+ * Creates a test ImsService, which is used for testing framework IMS.
+ */
+
+public class TestImsService extends ImsService {
+
+    public static final String LOG_TAG = "ImsTestApp";
+
+    public static TestImsService mInstance;
+
+    public TestImsRegistrationImpl mImsRegistration;
+    public TestMmTelFeatureImpl mTestMmTelFeature;
+    public TestRcsFeatureImpl mTestRcsFeature;
+    public TestImsConfigImpl mTestImsConfig;
+
+    public static TestImsService getInstance() {
+        return mInstance;
+    }
+
+    @Override
+    public void onCreate() {
+        Log.i(LOG_TAG, "TestImsService: onCreate");
+        mImsRegistration = TestImsRegistrationImpl.getInstance();
+        mTestMmTelFeature = TestMmTelFeatureImpl.getInstance();
+        mTestRcsFeature = new TestRcsFeatureImpl();
+        mTestImsConfig = TestImsConfigImpl.getInstance();
+
+        mInstance = this;
+    }
+
+    @Override
+    public ImsFeatureConfiguration querySupportedImsFeatures() {
+        return new ImsFeatureConfiguration.Builder()
+                .addFeature(0, ImsFeature.FEATURE_EMERGENCY_MMTEL)
+                .addFeature(0, ImsFeature.FEATURE_MMTEL)
+                .build();
+    }
+
+    @Override
+    public MmTelFeature createMmTelFeature(int slotId) {
+        Log.i(LOG_TAG, "TestImsService: onCreateMmTelImsFeature");
+        return mTestMmTelFeature;
+    }
+
+    @Override
+    public RcsFeature createRcsFeature(int slotId) {
+        return mTestRcsFeature;
+    }
+
+    @Override
+    public ImsRegistrationImplBase getRegistration(int slotId) {
+        Log.i(LOG_TAG, "TestImsService: getRegistration");
+        return mImsRegistration;
+    }
+
+    @Override
+    public ImsConfigImplBase getConfig(int slotId) {
+        return mTestImsConfig;
+    }
+}
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestMmTelFeatureImpl.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestMmTelFeatureImpl.java
new file mode 100644
index 0000000..2a0463d
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestMmTelFeatureImpl.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.telephony.ims.feature.CapabilityChangeRequest;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
+import android.util.ArraySet;
+import android.util.SparseArray;
+import android.widget.Toast;
+
+import java.util.Set;
+
+public class TestMmTelFeatureImpl extends MmTelFeature {
+
+    public static TestMmTelFeatureImpl sTestMmTelFeatureImpl;
+    private boolean mIsReady = false;
+    // Enabled Capabilities - not status
+    private SparseArray<MmTelCapabilities> mEnabledCapabilities = new SparseArray<>();
+    private final Set<MmTelUpdateCallback> mCallbacks = new ArraySet<>();
+
+    static class MmTelUpdateCallback {
+        void onEnabledCapabilityChanged() {
+        }
+    }
+
+    public TestMmTelFeatureImpl() {
+        mEnabledCapabilities.append(ImsRegistrationImplBase.REGISTRATION_TECH_LTE,
+                new MmTelCapabilities());
+        mEnabledCapabilities.append(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN,
+                new MmTelCapabilities());
+        setFeatureState(STATE_READY);
+    }
+
+    public static TestMmTelFeatureImpl getInstance() {
+        if (sTestMmTelFeatureImpl == null) {
+            sTestMmTelFeatureImpl = new TestMmTelFeatureImpl();
+        }
+        return sTestMmTelFeatureImpl;
+    }
+
+    public void addUpdateCallback(MmTelUpdateCallback callback) {
+        mCallbacks.add(callback);
+    }
+
+    public boolean isReady() {
+        return mIsReady;
+    }
+
+    @Override
+    public boolean queryCapabilityConfiguration(int capability, int radioTech) {
+        return mEnabledCapabilities.get(radioTech).isCapable(capability);
+    }
+
+    @Override
+    public void changeEnabledCapabilities(CapabilityChangeRequest request,
+            CapabilityCallbackProxy c) {
+        for (CapabilityChangeRequest.CapabilityPair pair : request.getCapabilitiesToEnable()) {
+            mEnabledCapabilities.get(pair.getRadioTech()).addCapabilities(pair.getCapability());
+        }
+        for (CapabilityChangeRequest.CapabilityPair pair : request.getCapabilitiesToDisable()) {
+            mEnabledCapabilities.get(pair.getRadioTech()).removeCapabilities(pair.getCapability());
+        }
+        mCallbacks.forEach(callback->callback.onEnabledCapabilityChanged());
+    }
+
+    @Override
+    public void onFeatureRemoved() {
+        super.onFeatureRemoved();
+    }
+
+    public void sendCapabilitiesUpdate(MmTelFeature.MmTelCapabilities c) {
+        Toast.makeText(mContext, "Sending Capabilities:{" + c + "}",
+                Toast.LENGTH_LONG).show();
+
+        notifyCapabilitiesStatusChanged(c);
+    }
+
+    public SparseArray<MmTelCapabilities> getEnabledCapabilities() {
+        return mEnabledCapabilities;
+    }
+
+    @Override
+    public void onFeatureReady() {
+        mIsReady = true;
+    }
+}
diff --git a/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestRcsFeatureImpl.java b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestRcsFeatureImpl.java
new file mode 100644
index 0000000..996a569
--- /dev/null
+++ b/testapps/ImsTestService/src/com/android/phone/testapps/imstestapp/TestRcsFeatureImpl.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.imstestapp;
+
+import android.telephony.ims.feature.RcsFeature;
+
+public class TestRcsFeatureImpl extends RcsFeature {
+
+    private boolean mIsReady = false;
+
+
+    public boolean isReady() {
+        return mIsReady;
+    }
+
+    @Override
+    public void onFeatureReady() {
+        mIsReady = true;
+    }
+}
diff --git a/testapps/TelephonyRegistryTestApp/Android.mk b/testapps/TelephonyRegistryTestApp/Android.mk
new file mode 100644
index 0000000..8c0d286
--- /dev/null
+++ b/testapps/TelephonyRegistryTestApp/Android.mk
@@ -0,0 +1,18 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+src_dirs := src
+res_dirs := res
+
+LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
+LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
+
+LOCAL_PACKAGE_NAME := TelephonyRegistryTestApp
+LOCAL_PRIVATE_PLATFORM_APIS := true
+
+LOCAL_CERTIFICATE := platform
+LOCAL_MODULE_TAGS := tests
+#LOCAL_MODULE_TAGS := debug
+
+include $(BUILD_PACKAGE)
diff --git a/testapps/TelephonyRegistryTestApp/AndroidManifest.xml b/testapps/TelephonyRegistryTestApp/AndroidManifest.xml
new file mode 100644
index 0000000..5f19509
--- /dev/null
+++ b/testapps/TelephonyRegistryTestApp/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.phone.testapps.telephonyregistry">
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+    <application android:label="TelephonyRegistryTestApp">
+        <activity
+            android:name=".TelephonyRegistryTestApp"
+            android:label="TelephonyRegistryTestApp">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
+
diff --git a/testapps/TelephonyRegistryTestApp/res/layout/activity_main.xml b/testapps/TelephonyRegistryTestApp/res/layout/activity_main.xml
new file mode 100644
index 0000000..405efe2
--- /dev/null
+++ b/testapps/TelephonyRegistryTestApp/res/layout/activity_main.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:id="@+id/events">
+        </LinearLayout>
+    </ScrollView>
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+        <Button
+            android:id="@+id/queryCellLocationButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_row="0"
+            android:layout_column="0"
+            android:text="@string/query_cell_location_button" />
+        <Button
+            android:id="@+id/registerButton"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_row="0"
+            android:layout_column="0"
+            android:text="@string/register_button" />
+    </LinearLayout>
+</LinearLayout>
diff --git a/testapps/TelephonyRegistryTestApp/res/values/donottranslate_strings.xml b/testapps/TelephonyRegistryTestApp/res/values/donottranslate_strings.xml
new file mode 100644
index 0000000..897b83e
--- /dev/null
+++ b/testapps/TelephonyRegistryTestApp/res/values/donottranslate_strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<resources>
+    <string name="register_button">Register</string>
+    <string name="query_cell_location_button">Query</string>
+</resources>
\ No newline at end of file
diff --git a/testapps/TelephonyRegistryTestApp/src/com/android/phone/testapps/telephonyregistry/TelephonyRegistryTestApp.java b/testapps/TelephonyRegistryTestApp/src/com/android/phone/testapps/telephonyregistry/TelephonyRegistryTestApp.java
new file mode 100644
index 0000000..e423619
--- /dev/null
+++ b/testapps/TelephonyRegistryTestApp/src/com/android/phone/testapps/telephonyregistry/TelephonyRegistryTestApp.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.phone.testapps.telephonyregistry;
+
+import android.app.Activity;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.os.Bundle;
+import android.provider.Telephony;
+import android.telephony.CellInfo;
+import android.telephony.CellLocation;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+import android.util.SparseArray;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.LinearLayout;
+import android.widget.Toast;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class TelephonyRegistryTestApp extends Activity {
+    private TelephonyManager telephonyManager;
+    private NotificationManager notificationManager;
+    private int mSelectedEvents = 0;
+    private static final String NOTIFICATION_CHANNEL = "registryUpdate";
+
+    private static final SparseArray<String> EVENTS = new SparseArray<String>() {{
+        put(PhoneStateListener.LISTEN_SERVICE_STATE, "SERVICE_STATE");
+        put(PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR, "MESSAGE_WAITING_INDICATOR");
+        put(PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR, "CALL_FORWARDING_INDICATOR");
+        put(PhoneStateListener.LISTEN_CELL_LOCATION, "CELL_LOCATION");
+        put(PhoneStateListener.LISTEN_CALL_STATE, "CALL_STATE");
+        put(PhoneStateListener.LISTEN_DATA_CONNECTION_STATE, "DATA_CONNECTION_STATE");
+        put(PhoneStateListener.LISTEN_DATA_ACTIVITY, "DATA_ACTIVITY");
+        put(PhoneStateListener.LISTEN_SIGNAL_STRENGTHS, "SIGNAL_STRENGTHS");
+        put(PhoneStateListener.LISTEN_OTASP_CHANGED, "OTASP_CHANGED");
+        put(PhoneStateListener.LISTEN_CELL_INFO, "CELL_INFO");
+        put(PhoneStateListener.LISTEN_PRECISE_CALL_STATE, "PRECISE_CALL_STATE");
+        put(PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE,
+                "PRECISE_DATA_CONNECTION_STATE");
+        put(PhoneStateListener.LISTEN_VOLTE_STATE, "VOLTE_STATE");
+        put(PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE, "CARRIER_NETWORK_CHANGE");
+        put(PhoneStateListener.LISTEN_VOICE_ACTIVATION_STATE, "VOICE_ACTIVATION_STATE");
+        put(PhoneStateListener.LISTEN_DATA_ACTIVATION_STATE, "DATA_ACTIVATION_STATE");
+    }};
+
+    private final PhoneStateListener phoneStateListener = new PhoneStateListener() {
+        @Override
+        public void onCellLocationChanged(CellLocation location) {
+            notify("onCellLocationChanged", location);
+        }
+
+        @Override
+        public void onCellInfoChanged(List<CellInfo> cellInfo) {
+            notify("onCellInfoChanged", cellInfo);
+        }
+
+        private void notify(String method, Object data) {
+            Notification.Builder builder = new Notification.Builder(TelephonyRegistryTestApp.this,
+                    NOTIFICATION_CHANNEL);
+            Notification notification = builder.setSmallIcon(android.R.drawable.sym_def_app_icon)
+                    .setContentTitle("Registry update: " + method)
+                    .setContentText(data == null ? "null" : data.toString())
+                    .build();
+            notificationManager.notify(0, notification);
+        }
+    };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+
+        telephonyManager = getSystemService(TelephonyManager.class);
+
+        LinearLayout eventContainer = (LinearLayout) findViewById(R.id.events);
+        for (int i = 0; i < EVENTS.size(); i++) {
+            CheckBox box = new CheckBox(this);
+            box.setText(EVENTS.valueAt(i));
+            final int eventCode = EVENTS.keyAt(i);
+            box.setOnCheckedChangeListener((buttonView, isChecked) -> {
+                if (buttonView.isChecked()) {
+                    mSelectedEvents |= eventCode;
+                } else {
+                    mSelectedEvents &= ~eventCode;
+                }
+            });
+            eventContainer.addView(box);
+        }
+
+        Button registerButton = (Button) findViewById(R.id.registerButton);
+        registerButton.setOnClickListener(v ->
+                telephonyManager.listen(phoneStateListener, mSelectedEvents));
+
+        Button queryCellLocationButton = findViewById(R.id.queryCellLocationButton);
+        queryCellLocationButton.setOnClickListener(v -> {
+            List<CellInfo> cellInfos = telephonyManager.getAllCellInfo();
+            String cellInfoText;
+            if (cellInfos == null || cellInfos.size() == 0) {
+                cellInfoText = "null";
+            } else {
+                cellInfoText = cellInfos.stream().map(CellInfo::toString)
+                        .collect(Collectors.joining(","));
+            }
+            Toast.makeText(TelephonyRegistryTestApp.this, "queryCellInfo: " + cellInfoText,
+                    Toast.LENGTH_SHORT).show();
+        });
+
+        notificationManager = getSystemService(NotificationManager.class);
+        NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL,
+                "Telephony Registry updates", NotificationManager.IMPORTANCE_HIGH);
+        notificationManager.createNotificationChannel(channel);
+    }
+}
diff --git a/tests/Android.mk b/tests/Android.mk
index b43533f..a6a79fe 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -21,6 +21,7 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 LOCAL_PACKAGE_NAME := TeleServiceTests
+LOCAL_PRIVATE_PLATFORM_APIS := true
 LOCAL_CERTIFICATE := platform
 
 LOCAL_MODULE_TAGS := tests
diff --git a/tests/src/com/android/phone/CallFeaturesSettingTest.java b/tests/src/com/android/phone/CallFeaturesSettingTest.java
new file mode 100644
index 0000000..816642a
--- /dev/null
+++ b/tests/src/com/android/phone/CallFeaturesSettingTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.phone;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+import static org.mockito.Mockito.when;
+
+import android.support.test.filters.FlakyTest;
+import android.support.test.rule.ActivityTestRule;
+
+import com.android.internal.telephony.IccCard;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.lang.reflect.Field;
+
+public class CallFeaturesSettingTest {
+    @Mock
+    Phone mMockPhone;
+    @Mock
+    IccCard mMockIccCard;
+    @Rule
+    public ActivityTestRule<CallFeaturesSetting> mRule =
+            new ActivityTestRule<>(CallFeaturesSetting.class);
+    private CallFeaturesSetting mActivity;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mActivity = mRule.getActivity();
+    }
+
+    @FlakyTest
+    @Test
+    public void onResume_fdnIsAvailable_shouldShowFdnMenu() throws NoSuchFieldException,
+            IllegalAccessException {
+        when(mMockPhone.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_GSM);
+        when(mMockPhone.getIccCard()).thenReturn(mMockIccCard);
+        when(mMockIccCard.getIccFdnAvailable()).thenReturn(true);
+        getField("mPhone").set(mActivity, mMockPhone);
+
+        mActivity.onResume();
+
+        // Check the FDN menu is displayed.
+        onView(withText(R.string.fdn)).check(matches(isDisplayed()));
+    }
+
+    @FlakyTest
+    @Test
+    public void onResume_iccCardIsNull_shouldNotShowFdnMenu() throws NoSuchFieldException,
+            IllegalAccessException {
+        when(mMockPhone.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_GSM);
+        when(mMockPhone.getIccCard()).thenReturn(null);
+        getField("mPhone").set(mActivity, mMockPhone);
+
+        mActivity.onResume();
+
+        // Check the FDN menu is not displayed.
+        onView(withText(R.string.fdn)).check(doesNotExist());
+    }
+
+    @FlakyTest
+    @Test
+    public void onResume_fdnIsNotAvailable_shouldNotShowFdnMenu() throws NoSuchFieldException,
+            IllegalAccessException {
+        when(mMockPhone.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_GSM);
+        when(mMockPhone.getIccCard()).thenReturn(mMockIccCard);
+        when(mMockIccCard.getIccFdnAvailable()).thenReturn(false);
+        getField("mPhone").set(mActivity, mMockPhone);
+
+        mActivity.onResume();
+
+        // Check the FDN menu is not displayed.
+        onView(withText(R.string.fdn)).check(doesNotExist());
+    }
+
+    private Field getField(String fieldName) throws NoSuchFieldException {
+        Field field = mActivity.getClass().getDeclaredField(fieldName);
+        field.setAccessible(true);
+        return field;
+    }
+}
diff --git a/tests/src/com/android/phone/PhoneGlobalsTest.java b/tests/src/com/android/phone/PhoneGlobalsTest.java
deleted file mode 100644
index b862ee3..0000000
--- a/tests/src/com/android/phone/PhoneGlobalsTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.phone;
-
-import android.content.Intent;
-import android.os.Handler;
-import android.os.Message;
-import android.support.test.runner.AndroidJUnit4;
-
-import com.android.TelephonyTestBase;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-import com.android.internal.telephony.PhoneFactory;
-import com.android.internal.telephony.TelephonyIntents;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-
-import java.lang.reflect.Field;
-
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Mockito.atLeast;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-@RunWith(AndroidJUnit4.class)
-public class PhoneGlobalsTest extends TelephonyTestBase {
-
-    private Phone mPhone = PhoneFactory.getDefaultPhone();
-
-    private PhoneGlobals mPhoneGlobals = PhoneGlobals.getInstance();
-
-    private Handler mHandler = mock(Handler.class);
-
-    private static final int EVENT_DATA_ROAMING_DISCONNECTED = 10;
-
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-        Field handler = PhoneGlobals.class.getDeclaredField("mHandler");
-        handler.setAccessible(true);
-        handler.set(mPhoneGlobals, mHandler);
-    }
-
-    @Test
-    public void testDataDisconnectedNotification() {
-        mPhone.setDataRoamingEnabled(false);
-        // Test no notification sent out when data is disabled, data raoming enabled and data
-        // disconnected because of roaming.
-        mPhone.setDataEnabled(false);
-        Intent intent = new Intent(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
-        intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY,
-                PhoneConstants.APN_TYPE_DEFAULT);
-        intent.putExtra(PhoneConstants.STATE_KEY, PhoneConstants.DataState.DISCONNECTED.name());
-        intent.putExtra(PhoneConstants.STATE_CHANGE_REASON_KEY, Phone.REASON_ROAMING_ON);
-        mContext.sendBroadcast(intent);
-
-        waitForMs(300);
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler, atLeast(0)).sendMessageAtTime(any(Message.class), anyLong());
-        boolean flag = true;
-        for (Message msg : messageArgumentCaptor.getAllValues()) {
-            if (msg.what == EVENT_DATA_ROAMING_DISCONNECTED) {
-                flag = false;
-            }
-        }
-        assertTrue(flag);
-
-
-        // Test notification sent out when data is enabled, data raoming enabled and data
-        // disconnected because of roaming.
-        mPhone.setDataEnabled(true);
-        mContext.sendBroadcast(intent);
-
-        waitForMs(300);
-
-
-        verify(mHandler, atLeast(1)).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
-        flag = false;
-        for (Message msg : messageArgumentCaptor.getAllValues()) {
-            if (msg.what == EVENT_DATA_ROAMING_DISCONNECTED) {
-                flag = true;
-            }
-        }
-        assertTrue(flag);
-    }
-}
diff --git a/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java b/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java
index 730db93..6b7f825 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(3);
 
         mProvider.setIsEuiccSettingsHidden(true /* isEuiccSettingsHidden */);
         Cursor cursor3 = mProvider
                 .queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
-        assertThat(cursor3.getCount()).isEqualTo(2);
+        assertThat(cursor3.getCount()).isEqualTo(4);
 
         mProvider.setIsEnhanced4gLteHidden(true /* isEnhanced4gLteHidden */);
         Cursor cursor4 = mProvider
                 .queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
-        assertThat(cursor4.getCount()).isEqualTo(3);
+        assertThat(cursor4.getCount()).isEqualTo(5);
     }
 }
diff --git a/tests/src/com/android/phone/tests/CallForwardInfoTest.java b/tests/src/com/android/phone/tests/CallForwardInfoTest.java
new file mode 100644
index 0000000..acf5955
--- /dev/null
+++ b/tests/src/com/android/phone/tests/CallForwardInfoTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.tests;
+
+import android.support.test.runner.AndroidJUnit4;
+import android.telephony.PhoneNumberUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Locale;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Tests Related to CallForwardInfoTest
+ */
+@RunWith(AndroidJUnit4.class)
+public class CallForwardInfoTest {
+
+    @Test
+    public void testCallForwardNumberResponses() {
+        // Test numbers in correct formats
+        assertNotNull(PhoneNumberUtils.formatNumber("+12345678900", Locale.US.getCountry()));
+        assertNotNull(PhoneNumberUtils.formatNumber("123-456-7890", Locale.US.getCountry()));
+        assertNotNull(PhoneNumberUtils.formatNumber("#123", Locale.US.getCountry()));
+        assertNotNull(PhoneNumberUtils.formatNumber("*12", Locale.US.getCountry()));
+        // Test invalid numbers
+        assertNull(PhoneNumberUtils.formatNumber("a", Locale.US.getCountry()));
+        assertNull(PhoneNumberUtils.formatNumber("a1", Locale.US.getCountry()));
+    }
+}
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index eb8c48a..3bd2716 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -16,13 +16,29 @@
 
 package com.android.services.telephony;
 
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import android.net.Uri;
+import android.os.AsyncResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.test.filters.FlakyTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.telecom.DisconnectCause;
 import android.telecom.TelecomManager;
 import android.telephony.RadioAccessFamily;
 import android.telephony.ServiceState;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
 import android.telephony.TelephonyManager;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -30,29 +46,18 @@
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection;
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.gsm.SuppServiceNotification;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 /**
  * Unit tests for TelephonyConnectionService.
  */
@@ -60,6 +65,7 @@
 @RunWith(AndroidJUnit4.class)
 public class TelephonyConnectionServiceTest extends TelephonyTestBase {
 
+    private static final long TIMEOUT_MS = 100;
     private static final int SLOT_0_PHONE_ID = 0;
     private static final int SLOT_1_PHONE_ID = 1;
 
@@ -533,7 +539,7 @@
         // was redialed on the same slot
         assertEquals(0, c.getNotifyPhoneAccountChangedCount());
         try {
-            verify(slot0Phone).dial(anyString(), any(), anyInt(), any());
+            verify(slot0Phone).dial(anyString(), any());
         } catch (CallStateException e) {
             // This shouldn't happen
             fail();
@@ -565,7 +571,7 @@
         // was never redialed
         assertEquals(0, c.getNotifyPhoneAccountChangedCount());
         try {
-            verify(slot0Phone, never()).dial(anyString(), any(), anyInt(), any());
+            verify(slot0Phone, never()).dial(anyString(), any());
         } catch (CallStateException e) {
             // This shouldn't happen
             fail();
@@ -605,7 +611,7 @@
         // redialed on another slot
         assertEquals(1, c.getNotifyPhoneAccountChangedCount());
         try {
-            verify(slot1Phone).dial(anyString(), any(), anyInt(), any());
+            verify(slot1Phone).dial(anyString(), any());
         } catch (CallStateException e) {
             // This shouldn't happen
             fail();
@@ -643,7 +649,7 @@
         // redialed on another slot
         assertEquals(1, c.getNotifyPhoneAccountChangedCount());
         try {
-            verify(slot1Phone).dial(anyString(), any(), anyInt(), any());
+            verify(slot1Phone).dial(anyString(), any());
         } catch (CallStateException e) {
             // This shouldn't happen
             fail();
@@ -694,8 +700,8 @@
         // redialed on another slot
         assertEquals(2, c.getNotifyPhoneAccountChangedCount());
         try {
-            verify(slot0Phone).dial(anyString(), any(), anyInt(), any());
-            verify(slot1Phone).dial(anyString(), any(), anyInt(), any());
+            verify(slot0Phone).dial(anyString(), any());
+            verify(slot1Phone).dial(anyString(), any());
         } catch (CallStateException e) {
             // This shouldn't happen
             fail();
@@ -744,14 +750,66 @@
         // redialed on another slot
         assertEquals(1, c.getNotifyPhoneAccountChangedCount());
         try {
-            verify(slot1Phone).dial(anyString(), any(), anyInt(), any());
-            verify(slot0Phone, never()).dial(anyString(), any(), anyInt(), any());
+            verify(slot1Phone).dial(anyString(), any());
+            verify(slot0Phone, never()).dial(anyString(), any());
         } catch (CallStateException e) {
             // This shouldn't happen
             fail();
         }
     }
 
+    @Test
+    @SmallTest
+    public void testSuppServiceNotification() {
+        TestTelephonyConnection c = new TestTelephonyConnection();
+
+        // We need to set the original connection to cause the supp service notification
+        // registration to occur.
+        Phone phone = c.getPhone();
+        c.setOriginalConnection(c.getOriginalConnection());
+
+        // When the registration occurs, we'll capture the handler and message so we can post our
+        // own messages to it.
+        ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
+        ArgumentCaptor<Integer> messageCaptor = ArgumentCaptor.forClass(Integer.class);
+        verify(phone).registerForSuppServiceNotification(handlerCaptor.capture(),
+                messageCaptor.capture(), any());
+        Handler handler = handlerCaptor.getValue();
+        int message = messageCaptor.getValue();
+
+        // With the handler and message now known, we'll post a supp service notification.
+        AsyncResult result = getSuppServiceNotification(
+                SuppServiceNotification.NOTIFICATION_TYPE_CODE_1,
+                SuppServiceNotification.CODE_1_CALL_FORWARDED);
+        handler.obtainMessage(message, result).sendToTarget();
+        waitForHandlerAction(handler, TIMEOUT_MS);
+
+        assertTrue(c.getLastConnectionEvents().contains(TelephonyManager.EVENT_CALL_FORWARDED));
+
+        // With the handler and message now known, we'll post a supp service notification.
+        result = getSuppServiceNotification(
+                SuppServiceNotification.NOTIFICATION_TYPE_CODE_1,
+                SuppServiceNotification.CODE_1_CALL_IS_WAITING);
+        handler.obtainMessage(message, result).sendToTarget();
+        waitForHandlerAction(handler, TIMEOUT_MS);
+
+        // We we want the 3rd event since the forwarding one above sends 2.
+        assertEquals(c.getLastConnectionEvents().get(2),
+                TelephonyManager.EVENT_SUPPLEMENTARY_SERVICE_NOTIFICATION);
+        Bundle extras = c.getLastConnectionEventExtras().get(2);
+        assertEquals(SuppServiceNotification.NOTIFICATION_TYPE_CODE_1,
+                extras.getInt(TelephonyManager.EXTRA_NOTIFICATION_TYPE));
+        assertEquals(SuppServiceNotification.CODE_1_CALL_IS_WAITING,
+                extras.getInt(TelephonyManager.EXTRA_NOTIFICATION_CODE));
+    }
+
+    private AsyncResult getSuppServiceNotification(int notificationType, int code) {
+        SuppServiceNotification notification = new SuppServiceNotification();
+        notification.notificationType = notificationType;
+        notification.code = code;
+        return new AsyncResult(null, notification, null);
+    }
+
     private Phone makeTestPhone(int phoneId, int serviceState, boolean isEmergencyOnly) {
         Phone phone = mock(Phone.class);
         ServiceState testServiceState = new ServiceState();
@@ -792,7 +850,7 @@
 
     private void setPhonesDialConnection(Phone phone, Connection c) {
         try {
-            when(phone.dial(anyString(), anyInt())).thenReturn(c);
+            when(phone.dial(anyString(), any())).thenReturn(c);
         } catch (CallStateException e) {
             // this shouldn't happen
             fail();
diff --git a/tests/src/com/android/services/telephony/TestTelephonyConnection.java b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
index ea0f965..9040257 100644
--- a/tests/src/com/android/services/telephony/TestTelephonyConnection.java
+++ b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
@@ -16,17 +16,25 @@
 
 package com.android.services.telephony;
 
+import android.content.Context;
+import android.os.Bundle;
 import android.telecom.PhoneAccountHandle;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import com.android.internal.telephony.Call;
+import com.android.internal.telephony.Connection;
 import com.android.internal.telephony.Phone;
 
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Mock Telephony Connection used in TelephonyConferenceController.java for testing purpose
  */
@@ -39,8 +47,13 @@
     @Mock
     Call mMockCall;
 
+    @Mock
+    Context mMockContext;
+
     private Phone mMockPhone;
     private int mNotifyPhoneAccountChangedCount = 0;
+    private List<String> mLastConnectionEvents = new ArrayList<>();
+    private List<Bundle> mLastConnectionEventExtras = new ArrayList<>();
 
     @Override
     public com.android.internal.telephony.Connection getOriginalConnection() {
@@ -52,11 +65,17 @@
         MockitoAnnotations.initMocks(this);
 
         mMockPhone = mock(Phone.class);
+        mMockContext = mock(Context.class);
         // Set up mMockRadioConnection and mMockPhone to contain an active call
         when(mMockRadioConnection.getState()).thenReturn(Call.State.ACTIVE);
         when(mMockRadioConnection.getCall()).thenReturn(mMockCall);
+        doNothing().when(mMockRadioConnection).addListener(any(Connection.Listener.class));
+        doNothing().when(mMockRadioConnection).addPostDialListener(
+                any(Connection.PostDialListener.class));
         when(mMockPhone.getRingingCall()).thenReturn(mMockCall);
+        when(mMockPhone.getContext()).thenReturn(null);
         when(mMockCall.getState()).thenReturn(Call.State.ACTIVE);
+        when(mMockCall.getPhone()).thenReturn(mMockPhone);
     }
 
     @Override
@@ -82,7 +101,21 @@
         mNotifyPhoneAccountChangedCount++;
     }
 
+    @Override
+    public void sendConnectionEvent(String event, Bundle extras) {
+        mLastConnectionEvents.add(event);
+        mLastConnectionEventExtras.add(extras);
+    }
+
     public int getNotifyPhoneAccountChangedCount() {
         return mNotifyPhoneAccountChangedCount;
     }
+
+    public List<String> getLastConnectionEvents() {
+        return mLastConnectionEvents;
+    }
+
+    public List<Bundle> getLastConnectionEventExtras() {
+        return mLastConnectionEventExtras;
+    }
 }