diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f1cd72b..ccb240c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -22,12 +22,14 @@
     <uses-permission android:name="android.permission.RECEIVE_SMS" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
 
     <application android:process="com.android.phone"
                  android:allowClearUserData="false"
                  android:allowBackup="false"
                  android:label="@string/app_label"
-                 android:icon="@mipmap/ic_launcher_phone">
+                 android:icon="@mipmap/ic_launcher_phone"
+                 android:usesCleartextTraffic="false">
 
         <provider android:name="TelephonyProvider"
                   android:authorities="telephony"
@@ -43,19 +45,20 @@
                   android:multiprocess="false"
                   android:exported="true"
                   android:singleUser="true"
-                  android:readPermission="android.permission.READ_SMS"
-                  android:writePermission="android.permission.WRITE_SMS" />
+                  android:readPermission="android.permission.READ_SMS" />
 
         <!-- This is a singleton provider that is used by all users.
              A new instance is not created for each user. And the db is shared
-             as well. -->
+             as well.
+
+             Note: We do not require a write permission as it is guarded by an app op.
+              -->
         <provider android:name="MmsProvider"
                   android:authorities="mms"
                   android:multiprocess="false"
                   android:exported="true"
                   android:singleUser="true"
-                  android:readPermission="android.permission.READ_SMS"
-                  android:writePermission="android.permission.WRITE_SMS">
+                  android:readPermission="android.permission.READ_SMS">
             <grant-uri-permission android:pathPrefix="/part/" />
             <grant-uri-permission android:pathPrefix="/drm/" />
         </provider>
@@ -68,8 +71,7 @@
                   android:multiprocess="false"
                   android:exported="true"
                   android:singleUser="true"
-                  android:readPermission="android.permission.READ_SMS"
-                  android:writePermission="android.permission.WRITE_SMS" />
+                  android:readPermission="android.permission.READ_SMS" />
 
         <provider android:name="HbpcdLookupProvider"
                   android:authorities="hbpcd_lookup"
diff --git a/res/values-af/config.xml b/res/values-af/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-af/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-am/config.xml b/res/values-am/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-am/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ar/config.xml b/res/values-ar/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ar/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-az-rAZ/config.xml b/res/values-az-rAZ/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-az-rAZ/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-bg/config.xml b/res/values-bg/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-bg/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-bn-rBD/config.xml b/res/values-bn-rBD/config.xml
new file mode 100644
index 0000000..a0f404f
--- /dev/null
+++ b/res/values-bn-rBD/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"২০৪০৪"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ca/config.xml b/res/values-ca/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ca/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-cs/config.xml b/res/values-cs/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-cs/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-da/config.xml b/res/values-da/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-da/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-de/config.xml b/res/values-de/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-de/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-el/config.xml b/res/values-el/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-el/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-en-rAU/config.xml b/res/values-en-rAU/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-en-rAU/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..5252756
--- /dev/null
+++ b/res/values-en-rAU/strings.xml
@@ -0,0 +1,21 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" product="tablet" msgid="9194799012395299737">"Mobile Network Configuration"</string>
+    <string name="app_label" product="default" msgid="4282451239358791628">"Phone/Messaging Storage"</string>
+</resources>
diff --git a/res/values-en-rGB/config.xml b/res/values-en-rGB/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-en-rGB/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-en-rIN/config.xml b/res/values-en-rIN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-en-rIN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-es-rUS/config.xml b/res/values-es-rUS/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-es-rUS/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-es/config.xml b/res/values-es/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-es/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-et-rEE/config.xml b/res/values-et-rEE/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-et-rEE/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-eu-rES/config.xml b/res/values-eu-rES/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-eu-rES/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-fa/config.xml b/res/values-fa/config.xml
new file mode 100644
index 0000000..8c2d094
--- /dev/null
+++ b/res/values-fa/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"۲۰۴۰۴"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-fi/config.xml b/res/values-fi/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-fi/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-fr-rCA/config.xml b/res/values-fr-rCA/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-fr-rCA/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-fr/config.xml b/res/values-fr/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-fr/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-gl-rES/config.xml b/res/values-gl-rES/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-gl-rES/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-gu-rIN/config.xml b/res/values-gu-rIN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-gu-rIN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
new file mode 100644
index 0000000..6dc1083
--- /dev/null
+++ b/res/values-gu-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" product="tablet" msgid="9194799012395299737">"મોબાઇલ નેટવર્ક ગોઠવણી"</string>
+    <string name="app_label" product="default" msgid="4282451239358791628">"ફોન/મેસેજિંગ સંગ્રહ"</string>
+</resources>
diff --git a/res/values-hi/config.xml b/res/values-hi/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-hi/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index f018658..4eedae0 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -17,5 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" product="tablet" msgid="9194799012395299737">"मोबाइल नेटवर्क कॉन्फ़िगरेशन"</string>
-    <string name="app_label" product="default" msgid="4282451239358791628">"फ़ोन/संदेश संग्रहण"</string>
+    <string name="app_label" product="default" msgid="4282451239358791628">"फ़ोन/संदेश मेमोरी"</string>
 </resources>
diff --git a/res/values-hr/config.xml b/res/values-hr/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-hr/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-hu/config.xml b/res/values-hu/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-hu/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-hy-rAM/config.xml b/res/values-hy-rAM/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-hy-rAM/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-in/config.xml b/res/values-in/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-in/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-is-rIS/config.xml b/res/values-is-rIS/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-is-rIS/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-it/config.xml b/res/values-it/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-it/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-iw/config.xml b/res/values-iw/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-iw/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ja/config.xml b/res/values-ja/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ja/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ka-rGE/config.xml b/res/values-ka-rGE/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ka-rGE/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-kk-rKZ/config.xml b/res/values-kk-rKZ/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-kk-rKZ/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-km-rKH/config.xml b/res/values-km-rKH/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-km-rKH/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-kn-rIN/config.xml b/res/values-kn-rIN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-kn-rIN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ko/config.xml b/res/values-ko/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ko/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ky-rKG/config.xml b/res/values-ky-rKG/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ky-rKG/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-lo-rLA/config.xml b/res/values-lo-rLA/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-lo-rLA/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-lt/config.xml b/res/values-lt/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-lt/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 3c26fdb..ee8e7c0 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -17,5 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" product="tablet" msgid="9194799012395299737">"Tinklo mobiliesiems konfigūracija"</string>
-    <string name="app_label" product="default" msgid="4282451239358791628">"Telefono / pranešimų saugykla"</string>
+    <string name="app_label" product="default" msgid="4282451239358791628">"Telefono / susirašinėjimo saugykla"</string>
 </resources>
diff --git a/res/values-lv/config.xml b/res/values-lv/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-lv/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-mk-rMK/config.xml b/res/values-mk-rMK/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-mk-rMK/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ml-rIN/config.xml b/res/values-ml-rIN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ml-rIN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index 993ca28..7da2780 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -17,5 +17,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_label" product="tablet" msgid="9194799012395299737">"മൊബൈൽ നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷൻ"</string>
-    <string name="app_label" product="default" msgid="4282451239358791628">"ഫോൺ/സന്ദേശമയയ്‌ക്കൽ സംഭരണം"</string>
+    <string name="app_label" product="default" msgid="4282451239358791628">"ഫോൺ/സന്ദേശ സ്റ്റോറേജ്"</string>
 </resources>
diff --git a/res/values-mn-rMN/config.xml b/res/values-mn-rMN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-mn-rMN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-mr-rIN/config.xml b/res/values-mr-rIN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-mr-rIN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ms-rMY/config.xml b/res/values-ms-rMY/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ms-rMY/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-my-rMM/config.xml b/res/values-my-rMM/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-my-rMM/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index 8227c76..fe6f377 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -16,6 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" product="tablet" msgid="9194799012395299737">"မိုဘိုင်း ကွန်ယက် အစီအစဉ်"</string>
+    <string name="app_label" product="tablet" msgid="9194799012395299737">"မိုဘိုင်း ကွန်ရက် အစီအစဉ်"</string>
     <string name="app_label" product="default" msgid="4282451239358791628">"ဖုန်း/စာပို့ခြင်း သိုလှောင်မှု"</string>
 </resources>
diff --git a/res/values-nb/config.xml b/res/values-nb/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-nb/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ne-rNP/config.xml b/res/values-ne-rNP/config.xml
new file mode 100644
index 0000000..629af9c
--- /dev/null
+++ b/res/values-ne-rNP/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"२०४०४"</item>
+    <item msgid="5639159280778239123">"३१०००४"</item>
+    <item msgid="3860605521380788028">"३१०१२०"</item>
+    <item msgid="537693705785480198">"३११४८०"</item>
+  </string-array>
+</resources>
diff --git a/res/values-nl/config.xml b/res/values-nl/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-nl/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-pa-rIN/config.xml b/res/values-pa-rIN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-pa-rIN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml
new file mode 100644
index 0000000..e499a0a
--- /dev/null
+++ b/res/values-pa-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" product="tablet" msgid="9194799012395299737">"ਮੋਬਾਈਲ ਨੈਟਵਰਕ ਕੌਂਫਿਗਰੇਸ਼ਨ"</string>
+    <string name="app_label" product="default" msgid="4282451239358791628">"ਫੋਨ/ਮੈਸੇਜ਼ਿੰਗ ਸਟੋਰੇਜ"</string>
+</resources>
diff --git a/res/values-pl/config.xml b/res/values-pl/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-pl/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-pt-rPT/config.xml b/res/values-pt-rPT/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-pt-rPT/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-pt/config.xml b/res/values-pt/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-pt/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ro/config.xml b/res/values-ro/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ro/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ru/config.xml b/res/values-ru/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ru/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-si-rLK/config.xml b/res/values-si-rLK/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-si-rLK/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-sk/config.xml b/res/values-sk/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-sk/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-sl/config.xml b/res/values-sl/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-sl/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-sq-rAL/config.xml b/res/values-sq-rAL/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-sq-rAL/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml
new file mode 100644
index 0000000..17cf91d
--- /dev/null
+++ b/res/values-sq-rAL/strings.xml
@@ -0,0 +1,21 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" product="tablet" msgid="9194799012395299737">"Konfigurimi i rrjetit celular"</string>
+    <string name="app_label" product="default" msgid="4282451239358791628">"Hapësira ruajtëse e telefonit/mesazheve"</string>
+</resources>
diff --git a/res/values-sr/config.xml b/res/values-sr/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-sr/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-sv/config.xml b/res/values-sv/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-sv/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-sw/config.xml b/res/values-sw/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-sw/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ta-rIN/config.xml b/res/values-ta-rIN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ta-rIN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-te-rIN/config.xml b/res/values-te-rIN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-te-rIN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-th/config.xml b/res/values-th/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-th/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-tl/config.xml b/res/values-tl/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-tl/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-tr/config.xml b/res/values-tr/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-tr/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-uk/config.xml b/res/values-uk/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-uk/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-ur-rPK/config.xml b/res/values-ur-rPK/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-ur-rPK/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-uz-rUZ/config.xml b/res/values-uz-rUZ/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-uz-rUZ/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-vi/config.xml b/res/values-vi/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-vi/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-zh-rCN/config.xml b/res/values-zh-rCN/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-zh-rCN/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-zh-rHK/config.xml b/res/values-zh-rHK/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-zh-rHK/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-zh-rTW/config.xml b/res/values-zh-rTW/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-zh-rTW/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values-zu/config.xml b/res/values-zu/config.xml
new file mode 100644
index 0000000..99877a6
--- /dev/null
+++ b/res/values-zu/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <string-array name="persist_apns_for_plmn">
+    <item msgid="6413072509259000954">"20404"</item>
+    <item msgid="5639159280778239123">"310004"</item>
+    <item msgid="3860605521380788028">"310120"</item>
+    <item msgid="537693705785480198">"311480"</item>
+  </string-array>
+</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
new file mode 100644
index 0000000..6148e5e
--- /dev/null
+++ b/res/values/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- persist APNs for these PLMNs on db upgrade to version 14 -->
+    <string-array name="persist_apns_for_plmn">
+        <item>20404</item>
+        <item>310004</item>
+        <item>310120</item>
+        <item>311480</item>
+    </string-array>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 42a91f5..8fa3a58 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -25,7 +25,7 @@
     <!-- Official label of the TelephonyProvider, as seen in the "Manage
          Applications" UI.  The TelephonyProvider stores configuration
          info about the carrier and cell network, and also provides
-         storage for SMS and MMS messages. [CHAR LIMIT=25] -->
-    <string name="app_label" product="default">Phone/Messaging Storage</string>
+         storage for SMS and MMS messages. [CHAR LIMIT=40] -->
+    <string name="app_label" product="default">Phone and Messaging Storage</string>
 
 </resources>
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
index 329f505..b7e410a 100644
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ b/src/com/android/providers/telephony/MmsProvider.java
@@ -63,6 +63,7 @@
     static final String TABLE_RATE = "rate";
     static final String TABLE_DRM  = "drm";
     static final String TABLE_WORDS = "words";
+    static final String VIEW_PDU_RESTRICTED = "pdu_restricted";
 
     // The name of parts directory. The full dir is "app_parts".
     private static final String PARTS_DIR_NAME = "parts";
@@ -74,9 +75,27 @@
         return true;
     }
 
+    /**
+     * Return the proper view of "pdu" table for the current access status.
+     *
+     * @param accessRestricted If the access is restricted
+     * @return the table/view name of the mms data
+     */
+    public static String getPduTable(boolean accessRestricted) {
+        return accessRestricted ? VIEW_PDU_RESTRICTED : TABLE_PDU;
+    }
+
     @Override
     public Cursor query(Uri uri, String[] projection,
             String selection, String[] selectionArgs, String sortOrder) {
+        // First check if a restricted view of the "pdu" table should be used based on the
+        // caller's identity. Only system, phone or the default sms app can have full access
+        // of mms data. For other apps, we present a restricted view which only contains sent
+        // or received messages, without wap pushes.
+        final boolean accessRestricted = ProviderUtil.isAccessRestricted(
+                getContext(), getCallingPackage(), Binder.getCallingUid());
+        final String pduTable = getPduTable(accessRestricted);
+
         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
 
         // Generate the body of the query.
@@ -87,29 +106,29 @@
 
         switch (match) {
             case MMS_ALL:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_ALL);
+                constructQueryForBox(qb, Mms.MESSAGE_BOX_ALL, pduTable);
                 break;
             case MMS_INBOX:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_INBOX);
+                constructQueryForBox(qb, Mms.MESSAGE_BOX_INBOX, pduTable);
                 break;
             case MMS_SENT:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_SENT);
+                constructQueryForBox(qb, Mms.MESSAGE_BOX_SENT, pduTable);
                 break;
             case MMS_DRAFTS:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_DRAFTS);
+                constructQueryForBox(qb, Mms.MESSAGE_BOX_DRAFTS, pduTable);
                 break;
             case MMS_OUTBOX:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_OUTBOX);
+                constructQueryForBox(qb, Mms.MESSAGE_BOX_OUTBOX, pduTable);
                 break;
             case MMS_ALL_ID:
-                qb.setTables(TABLE_PDU);
+                qb.setTables(pduTable);
                 qb.appendWhere(Mms._ID + "=" + uri.getPathSegments().get(0));
                 break;
             case MMS_INBOX_ID:
             case MMS_SENT_ID:
             case MMS_DRAFTS_ID:
             case MMS_OUTBOX_ID:
-                qb.setTables(TABLE_PDU);
+                qb.setTables(pduTable);
                 qb.appendWhere(Mms._ID + "=" + uri.getPathSegments().get(1));
                 qb.appendWhere(" AND " + Mms.MESSAGE_BOX + "="
                         + getMessageBoxByMatch(match));
@@ -156,19 +175,23 @@
                    OR (msg_id = id3 AND type = 137)
                    WHERE T.id1 = ?;
                  */
-                qb.setTables("addr INNER JOIN (SELECT P1._id AS id1, P2._id" +
-                             " AS id2, P3._id AS id3, ifnull(P2.st, 0) AS" +
-                             " delivery_status, ifnull(P3.read_status, 0) AS" +
-                             " read_status FROM pdu P1 INNER JOIN pdu P2 ON" +
-                             " P1.m_id=P2.m_id AND P2.m_type=134 LEFT JOIN" +
-                             " pdu P3 ON P1.m_id=P3.m_id AND P3.m_type=136" +
-                             " UNION SELECT P1._id AS id1, P2._id AS id2, P3._id" +
-                             " AS id3, ifnull(P2.st, 0) AS delivery_status," +
-                             " ifnull(P3.read_status, 0) AS read_status FROM" +
-                             " pdu P1 INNER JOIN pdu P3 ON P1.m_id=P3.m_id AND" +
-                             " P3.m_type=136 LEFT JOIN pdu P2 ON P1.m_id=P2.m_id" +
-                             " AND P2.m_type=134) T ON (msg_id=id2 AND type=151)" +
-                             " OR (msg_id=id3 AND type=137)");
+                qb.setTables(TABLE_ADDR + " INNER JOIN "
+                        + "(SELECT P1._id AS id1, P2._id AS id2, P3._id AS id3, "
+                        + "ifnull(P2.st, 0) AS delivery_status, "
+                        + "ifnull(P3.read_status, 0) AS read_status "
+                        + "FROM " + pduTable + " P1 INNER JOIN " + pduTable + " P2 "
+                        + "ON P1.m_id=P2.m_id AND P2.m_type=134 "
+                        + "LEFT JOIN " + pduTable + " P3 "
+                        + "ON P1.m_id=P3.m_id AND P3.m_type=136 "
+                        + "UNION "
+                        + "SELECT P1._id AS id1, P2._id AS id2, P3._id AS id3, "
+                        + "ifnull(P2.st, 0) AS delivery_status, "
+                        + "ifnull(P3.read_status, 0) AS read_status "
+                        + "FROM " + pduTable + " P1 INNER JOIN " + pduTable + " P3 "
+                        + "ON P1.m_id=P3.m_id AND P3.m_type=136 "
+                        + "LEFT JOIN " + pduTable + " P2 "
+                        + "ON P1.m_id=P2.m_id AND P2.m_type=134) T "
+                        + "ON (msg_id=id2 AND type=151) OR (msg_id=id3 AND type=137)");
                 qb.appendWhere("T.id1 = " + uri.getLastPathSegment());
                 qb.setDistinct(true);
                 break;
@@ -179,9 +202,9 @@
                    WHERE pdu._id = messageId AND addr.type = 151
                  */
                 qb.setTables(TABLE_ADDR + " join " +
-                        TABLE_PDU + " on pdu._id = addr.msg_id");
-                qb.appendWhere("pdu._id = " + uri.getLastPathSegment());
-                qb.appendWhere(" AND " + "addr.type = " + PduHeaders.TO);
+                        pduTable + " on " + pduTable + "._id = addr.msg_id");
+                qb.appendWhere(pduTable + "._id = " + uri.getLastPathSegment());
+                qb.appendWhere(" AND " + TABLE_ADDR + ".type = " + PduHeaders.TO);
                 break;
             case MMS_SENDING_RATE:
                 qb.setTables(TABLE_RATE);
@@ -191,7 +214,7 @@
                 qb.appendWhere(BaseColumns._ID + "=" + uri.getLastPathSegment());
                 break;
             case MMS_THREADS:
-                qb.setTables("pdu group by thread_id");
+                qb.setTables(pduTable + " group by thread_id");
                 break;
             default:
                 Log.e(TAG, "query: invalid request: " + uri);
@@ -200,7 +223,7 @@
 
         String finalSortOrder = null;
         if (TextUtils.isEmpty(sortOrder)) {
-            if (qb.getTables().equals(TABLE_PDU)) {
+            if (qb.getTables().equals(pduTable)) {
                 finalSortOrder = Mms.DATE + " DESC";
             } else if (qb.getTables().equals(TABLE_PART)) {
                 finalSortOrder = Part.SEQ;
@@ -224,8 +247,8 @@
         return ret;
     }
 
-    private void constructQueryForBox(SQLiteQueryBuilder qb, int msgBox) {
-        qb.setTables(TABLE_PDU);
+    private void constructQueryForBox(SQLiteQueryBuilder qb, int msgBox, String pduTable) {
+        qb.setTables(pduTable);
 
         if (msgBox != Mms.MESSAGE_BOX_ALL) {
             qb.appendWhere(Mms.MESSAGE_BOX + "=" + msgBox);
@@ -287,6 +310,7 @@
             return null;
         }
         final int callerUid = Binder.getCallingUid();
+        final String callerPkg = getCallingPackage();
         int msgBox = Mms.MESSAGE_BOX_ALL;
         boolean notify = true;
 
@@ -384,8 +408,7 @@
                 // If caller is not SYSTEM or PHONE, or SYSTEM or PHONE does not set CREATOR
                 // set CREATOR using the truth on caller.
                 // Note: Inferring package name from UID may include unrelated package names
-                finalValues.put(Telephony.Mms.CREATOR,
-                        ProviderUtil.getPackageNamesByUid(getContext(), callerUid));
+                finalValues.put(Telephony.Mms.CREATOR, callerPkg);
             }
 
             if ((rowId = db.insert(table, null, finalValues)) <= 0) {
@@ -717,6 +740,7 @@
             return 0;
         }
         final int callerUid = Binder.getCallingUid();
+        final String callerPkg = getCallingPackage();
         int match = sURLMatcher.match(uri);
         if (LOCAL_LOGV) {
             Log.v(TAG, "Update uri=" + uri + ", match=" + match);
@@ -771,8 +795,7 @@
             filterUnsupportedKeys(values);
             if (ProviderUtil.shouldRemoveCreator(values, callerUid)) {
                 // CREATOR should not be changed by non-SYSTEM/PHONE apps
-                Log.w(TAG, ProviderUtil.getPackageNamesByUid(getContext(), callerUid) +
-                        " tries to update CREATOR");
+                Log.w(TAG, callerPkg + " tries to update CREATOR");
                 values.remove(Mms.CREATOR);
             }
             finalValues = new ContentValues(values);
@@ -855,11 +878,11 @@
             // TODO(afurtado): provide a more robust mechanism to avoid disallowed _data paths to
             // be inserted/updated in the first place, including via SQL injection.
             if (!filePath.getCanonicalPath()
-                    .startsWith(getContext().getDir(PARTS_DIR_NAME, 0).getPath())) {
+                    .startsWith(getContext().getDir(PARTS_DIR_NAME, 0).getCanonicalPath())) {
                 Log.e(TAG, "openFile: path "
                         + filePath.getCanonicalPath()
                         + " does not start with "
-                        + getContext().getDir(PARTS_DIR_NAME, 0).getPath());
+                        + getContext().getDir(PARTS_DIR_NAME, 0).getCanonicalPath());
                 // Don't care return value
                 return null;
             }
diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
index 6325905..e763f35 100644
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
@@ -16,14 +16,6 @@
 
 package com.android.providers.telephony;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.FileInputStream;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-
 import android.content.BroadcastReceiver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -35,19 +27,27 @@
 import android.provider.BaseColumns;
 import android.provider.Telephony;
 import android.provider.Telephony.Mms;
-import android.provider.Telephony.MmsSms;
-import android.provider.Telephony.Sms;
-import android.provider.Telephony.Threads;
 import android.provider.Telephony.Mms.Addr;
 import android.provider.Telephony.Mms.Part;
 import android.provider.Telephony.Mms.Rate;
+import android.provider.Telephony.MmsSms;
 import android.provider.Telephony.MmsSms.PendingMessages;
+import android.provider.Telephony.Sms;
+import android.provider.Telephony.Threads;
 import android.telephony.SubscriptionManager;
 import android.util.Log;
 
 import com.google.android.mms.pdu.EncodedStringValue;
 import com.google.android.mms.pdu.PduHeaders;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+
 public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
     private static final String TAG = "MmsSmsDatabaseHelper";
 
@@ -216,7 +216,7 @@
     private static boolean sFakeLowStorageTest = false;     // for testing only
 
     static final String DATABASE_NAME = "mmssms.db";
-    static final int DATABASE_VERSION = 60;
+    static final int DATABASE_VERSION = 61;
     private final Context mContext;
     private LowStorageMonitor mLowStorageMonitor;
 
@@ -630,6 +630,15 @@
         db.execSQL("CREATE TABLE " + MmsProvider.TABLE_DRM + " (" +
                    BaseColumns._ID + " INTEGER PRIMARY KEY," +
                    "_data TEXT);");
+
+        // Restricted view of pdu table, only sent/received messages without wap pushes
+        db.execSQL("CREATE VIEW " + MmsProvider.VIEW_PDU_RESTRICTED + " AS " +
+                "SELECT * FROM " + MmsProvider.TABLE_PDU + " WHERE " +
+                "(" + Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_INBOX +
+                " OR " +
+                Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_SENT + ")" +
+                " AND " +
+                "(" + Mms.MESSAGE_TYPE + "!=" + PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND + ");");
     }
 
     // Unlike the other trigger-creating functions, this function can be called multiple times
@@ -873,6 +882,13 @@
                    "reference_number INTEGER," +
                    "action TEXT," +
                    "data TEXT);");
+
+        // Restricted view of sms table, only sent/received messages
+        db.execSQL("CREATE VIEW " + SmsProvider.VIEW_SMS_RESTRICTED + " AS " +
+                   "SELECT * FROM " + SmsProvider.TABLE_SMS + " WHERE " +
+                   Sms.TYPE + "=" + Sms.MESSAGE_TYPE_INBOX +
+                   " OR " +
+                   Sms.TYPE + "=" + Sms.MESSAGE_TYPE_SENT + ";");
     }
 
     private void createCommonTables(SQLiteDatabase db) {
@@ -1331,6 +1347,22 @@
             } finally {
                 db.endTransaction();
             }
+            // fall through
+        case 60:
+            if (currentVersion <= 60) {
+                return;
+            }
+
+            db.beginTransaction();
+            try {
+                upgradeDatabaseToVersion61(db);
+                db.setTransactionSuccessful();
+            } catch (Throwable ex) {
+                Log.e(TAG, ex.getMessage(), ex);
+                break;
+            } finally {
+                db.endTransaction();
+            }
             return;
         }
 
@@ -1559,6 +1591,22 @@
                 + Threads.ARCHIVED + " INTEGER DEFAULT 0");
     }
 
+    private void upgradeDatabaseToVersion61(SQLiteDatabase db) {
+        db.execSQL("CREATE VIEW " + SmsProvider.VIEW_SMS_RESTRICTED + " AS " +
+                   "SELECT * FROM " + SmsProvider.TABLE_SMS + " WHERE " +
+                   Sms.TYPE + "=" + Sms.MESSAGE_TYPE_INBOX +
+                   " OR " +
+                   Sms.TYPE + "=" + Sms.MESSAGE_TYPE_SENT + ";");
+        db.execSQL("CREATE VIEW " + MmsProvider.VIEW_PDU_RESTRICTED + "  AS " +
+                   "SELECT * FROM " + MmsProvider.TABLE_PDU + " WHERE " +
+                   "(" + Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_INBOX +
+                   " OR " +
+                   Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_SENT + ")" +
+                   " AND " +
+                   "(" + Mms.MESSAGE_TYPE + "!=" + PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND + ");");
+
+    }
+
     @Override
     public synchronized SQLiteDatabase getWritableDatabase() {
         SQLiteDatabase db = super.getWritableDatabase();
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index 457e472..0e4e447 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -30,6 +30,7 @@
 import android.os.Binder;
 import android.os.UserHandle;
 import android.provider.BaseColumns;
+import android.provider.Telephony;
 import android.provider.Telephony.CanonicalAddressesColumns;
 import android.provider.Telephony.Mms;
 import android.provider.Telephony.MmsSms;
@@ -43,6 +44,8 @@
 
 import com.google.android.mms.pdu.PduHeaders;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
@@ -187,32 +190,50 @@
             Mms.MESSAGE_TYPE + " = " + PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF + " OR " +
             Mms.MESSAGE_TYPE + " = " + PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND + "))";
 
-    // Search on the words table but return the rows from the corresponding sms table
-    private static final String SMS_QUERY =
-            "SELECT sms._id AS _id,thread_id,address,body,date,date_sent,index_text,words._id " +
-            "FROM sms,words WHERE (index_text MATCH ? " +
-            "AND sms._id=words.source_id AND words.table_to_use=1)";
+    private static String getTextSearchQuery(String smsTable, String pduTable) {
+        // Search on the words table but return the rows from the corresponding sms table
+        final String smsQuery = "SELECT "
+                + smsTable + "._id AS _id,"
+                + "thread_id,"
+                + "address,"
+                + "body,"
+                + "date,"
+                + "date_sent,"
+                + "index_text,"
+                + "words._id "
+                + "FROM " + smsTable + ",words "
+                + "WHERE (index_text MATCH ? "
+                + "AND " + smsTable + "._id=words.source_id "
+                + "AND words.table_to_use=1)";
 
-    // Search on the words table but return the rows from the corresponding parts table
-    private static final String MMS_QUERY =
-            "SELECT pdu._id,thread_id,addr.address,part.text " +
-            "AS body,pdu.date,pdu.date_sent,index_text,words._id " +
-            "FROM pdu,part,addr,words WHERE ((part.mid=pdu._id) AND " +
-            "(addr.msg_id=pdu._id) AND " +
-            "(addr.type=" + PduHeaders.TO + ") AND " +
-            "(part.ct='text/plain') AND " +
-            "(index_text MATCH ?) AND " +
-            "(part._id = words.source_id) AND " +
-            "(words.table_to_use=2))";
+        // Search on the words table but return the rows from the corresponding parts table
+        final String mmsQuery = "SELECT "
+                + pduTable + "._id,"
+                + "thread_id,"
+                + "addr.address,"
+                + "part.text AS body,"
+                + pduTable + ".date,"
+                + pduTable + ".date_sent,"
+                + "index_text,"
+                + "words._id "
+                + "FROM " + pduTable + ",part,addr,words "
+                + "WHERE ((part.mid=" + pduTable + "._id) "
+                + "AND (addr.msg_id=" + pduTable + "._id) "
+                + "AND (addr.type=" + PduHeaders.TO + ") "
+                + "AND (part.ct='text/plain') "
+                + "AND (index_text MATCH ?) "
+                + "AND (part._id = words.source_id) "
+                + "AND (words.table_to_use=2))";
 
-    // This code queries the sms and mms tables and returns a unified result set
-    // of text matches.  We query the sms table which is pretty simple.  We also
-    // query the pdu, part and addr table to get the mms result.  Notet we're
-    // using a UNION so we have to have the same number of result columns from
-    // both queries.
-    private static final String SMS_MMS_QUERY =
-            SMS_QUERY + " UNION " + MMS_QUERY +
-            " GROUP BY thread_id ORDER BY thread_id ASC, date DESC";
+        // This code queries the sms and mms tables and returns a unified result set
+        // of text matches.  We query the sms table which is pretty simple.  We also
+        // query the pdu, part and addr table to get the mms result.  Note we're
+        // using a UNION so we have to have the same number of result columns from
+        // both queries.
+        return smsQuery + " UNION " + mmsQuery + " "
+                + "GROUP BY thread_id "
+                + "ORDER BY thread_id ASC, date DESC";
+    }
 
     private static final String AUTHORITY = "mms-sms";
 
@@ -297,11 +318,22 @@
     @Override
     public Cursor query(Uri uri, String[] projection,
             String selection, String[] selectionArgs, String sortOrder) {
+        // First check if restricted views of the "sms" and "pdu" tables should be used based on the
+        // caller's identity. Only system, phone or the default sms app can have full access
+        // of sms/mms data. For other apps, we present a restricted view which only contains sent
+        // or received messages, without wap pushes.
+        final boolean accessRestricted = ProviderUtil.isAccessRestricted(
+                getContext(), getCallingPackage(), Binder.getCallingUid());
+        final String pduTable = MmsProvider.getPduTable(accessRestricted);
+        final String smsTable = SmsProvider.getSmsTable(accessRestricted);
+
         SQLiteDatabase db = mOpenHelper.getReadableDatabase();
         Cursor cursor = null;
-        switch(URI_MATCHER.match(uri)) {
+        final int match = URI_MATCHER.match(uri);
+        switch (match) {
             case URI_COMPLETE_CONVERSATIONS:
-                cursor = getCompleteConversations(projection, selection, sortOrder);
+                cursor = getCompleteConversations(projection, selection, sortOrder, smsTable,
+                        pduTable);
                 break;
             case URI_CONVERSATIONS:
                 String simple = uri.getQueryParameter("simple");
@@ -315,12 +347,12 @@
                             projection, selection, selectionArgs, sortOrder);
                 } else {
                     cursor = getConversations(
-                            projection, selection, sortOrder);
+                            projection, selection, sortOrder, smsTable, pduTable);
                 }
                 break;
             case URI_CONVERSATIONS_MESSAGES:
                 cursor = getConversationMessages(uri.getPathSegments().get(1), projection,
-                        selection, sortOrder);
+                        selection, sortOrder, smsTable, pduTable);
                 break;
             case URI_CONVERSATIONS_RECIPIENTS:
                 cursor = getConversationById(
@@ -334,7 +366,8 @@
                 break;
             case URI_MESSAGES_BY_PHONE:
                 cursor = getMessagesByPhoneNumber(
-                        uri.getPathSegments().get(2), projection, selection, sortOrder);
+                        uri.getPathSegments().get(2), projection, selection, sortOrder, smsTable,
+                        pduTable);
                 break;
             case URI_THREAD_ID:
                 List<String> recipients = uri.getQueryParameters("recipient");
@@ -387,7 +420,7 @@
                     switch (Integer.parseInt(uri.getQueryParameter("table_to_use"))) {
                         case 1:  // sms
                             cursor = db.query(
-                                "sms",
+                                smsTable,
                                 new String[] { "thread_id" },
                                 "_id=?",
                                 new String[] { String.valueOf(id) },
@@ -396,9 +429,10 @@
                                 null);
                             break;
                         case 2:  // mms
-                            String mmsQuery =
-                                "SELECT thread_id FROM pdu,part WHERE ((part.mid=pdu._id) AND " +
-                                "(part._id=?))";
+                            String mmsQuery = "SELECT thread_id "
+                                    + "FROM " + pduTable + ",part "
+                                    + "WHERE ((part.mid=" + pduTable + "._id) "
+                                    + "AND " + "(part._id=?))";
                             cursor = db.rawQuery(mmsQuery, new String[] { String.valueOf(id) });
                             break;
                     }
@@ -420,7 +454,8 @@
                 String searchString = uri.getQueryParameter("pattern") + "*";
 
                 try {
-                    cursor = db.rawQuery(SMS_MMS_QUERY, new String[] { searchString, searchString });
+                    cursor = db.rawQuery(getTextSearchQuery(smsTable, pduTable),
+                            new String[] { searchString, searchString });
                 } catch (Exception ex) {
                     Log.e(LOG_TAG, "got exception: " + ex.toString());
                 }
@@ -448,11 +483,11 @@
             }
             case URI_UNDELIVERED_MSG: {
                 cursor = getUndeliveredMessages(projection, selection,
-                        selectionArgs, sortOrder);
+                        selectionArgs, sortOrder, smsTable, pduTable);
                 break;
             }
             case URI_DRAFT: {
-                cursor = getDraftThread(projection, selection, sortOrder);
+                cursor = getDraftThread(projection, selection, sortOrder, smsTable, pduTable);
                 break;
             }
             case URI_FIRST_LOCKED_MESSAGE_BY_THREAD_ID: {
@@ -464,11 +499,12 @@
                     break;
                 }
                 cursor = getFirstLockedMessage(projection, "thread_id=" + Long.toString(threadId),
-                        sortOrder);
+                        sortOrder, smsTable, pduTable);
                 break;
             }
             case URI_FIRST_LOCKED_MESSAGE_ALL: {
-                cursor = getFirstLockedMessage(projection, selection, sortOrder);
+                cursor = getFirstLockedMessage(
+                        projection, selection, sortOrder, smsTable, pduTable);
                 break;
             }
             default:
@@ -743,13 +779,13 @@
      *   ;
      */
     private Cursor getDraftThread(String[] projection, String selection,
-            String sortOrder) {
+            String sortOrder, String smsTable, String pduTable) {
         String[] innerProjection = new String[] {BaseColumns._ID, Conversations.THREAD_ID};
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
         SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
 
-        mmsQueryBuilder.setTables(MmsProvider.TABLE_PDU);
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
+        mmsQueryBuilder.setTables(pduTable);
+        smsQueryBuilder.setTables(smsTable);
 
         String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerProjection,
@@ -803,12 +839,12 @@
      * messages.
      */
     private Cursor getConversations(String[] projection, String selection,
-            String sortOrder) {
+            String sortOrder, String smsTable, String pduTable) {
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
         SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
 
-        mmsQueryBuilder.setTables(MmsProvider.TABLE_PDU);
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
+        mmsQueryBuilder.setTables(pduTable);
+        smsQueryBuilder.setTables(smsTable);
 
         String[] columns = handleNullMessageProjection(projection);
         String[] innerMmsProjection = makeProjectionWithDateAndThreadId(
@@ -856,12 +892,12 @@
      * there is *any* locked message, not the actual messages themselves.
      */
     private Cursor getFirstLockedMessage(String[] projection, String selection,
-            String sortOrder) {
+            String sortOrder, String smsTable, String pduTable) {
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
         SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
 
-        mmsQueryBuilder.setTables(MmsProvider.TABLE_PDU);
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
+        mmsQueryBuilder.setTables(pduTable);
+        smsQueryBuilder.setTables(smsTable);
 
         String[] idColumn = new String[] { BaseColumns._ID };
 
@@ -899,8 +935,9 @@
      * and SMS.
      */
     private Cursor getCompleteConversations(String[] projection,
-            String selection, String sortOrder) {
-        String unionQuery = buildConversationQuery(projection, selection, sortOrder);
+            String selection, String sortOrder, String smsTable, String pduTable) {
+        String unionQuery = buildConversationQuery(projection, selection, sortOrder, smsTable,
+                pduTable);
 
         return mOpenHelper.getReadableDatabase().rawQuery(unionQuery, EMPTY_STRING_ARRAY);
     }
@@ -929,7 +966,7 @@
      */
     private Cursor getConversationMessages(
             String threadIdString, String[] projection, String selection,
-            String sortOrder) {
+            String sortOrder, String smsTable, String pduTable) {
         try {
             Long.parseLong(threadIdString);
         } catch (NumberFormatException exception) {
@@ -939,7 +976,8 @@
 
         String finalSelection = concatSelections(
                 selection, "thread_id = " + threadIdString);
-        String unionQuery = buildConversationQuery(projection, finalSelection, sortOrder);
+        String unionQuery = buildConversationQuery(projection, finalSelection, sortOrder, smsTable,
+                pduTable);
 
         return mOpenHelper.getReadableDatabase().rawQuery(unionQuery, EMPTY_STRING_ARRAY);
     }
@@ -964,12 +1002,12 @@
      */
     private Cursor getMessagesByPhoneNumber(
             String phoneNumber, String[] projection, String selection,
-            String sortOrder) {
+            String sortOrder, String smsTable, String pduTable) {
         String escapedPhoneNumber = DatabaseUtils.sqlEscapeString(phoneNumber);
         String finalMmsSelection =
                 concatSelections(
                         selection,
-                        "pdu._id = matching_addresses.address_msg_id");
+                        pduTable + "._id = matching_addresses.address_msg_id");
         String finalSmsSelection =
                 concatSelections(
                         selection,
@@ -982,14 +1020,14 @@
         mmsQueryBuilder.setDistinct(true);
         smsQueryBuilder.setDistinct(true);
         mmsQueryBuilder.setTables(
-                MmsProvider.TABLE_PDU +
+                pduTable +
                 ", (SELECT msg_id AS address_msg_id " +
                 "FROM addr WHERE (address=" + escapedPhoneNumber +
                 " OR PHONE_NUMBERS_EQUAL(addr.address, " +
                 escapedPhoneNumber +
                 (mUseStrictPhoneNumberComparation ? ", 1))) " : ", 0))) ") +
                 "AS matching_addresses");
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
+        smsQueryBuilder.setTables(smsTable);
 
         String[] columns = handleNullMessageProjection(projection);
         String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
@@ -1033,16 +1071,16 @@
                 selectionArgs, sortOrder, null, null);
     }
 
-    private static String joinPduAndPendingMsgTables() {
-        return MmsProvider.TABLE_PDU + " LEFT JOIN " + TABLE_PENDING_MSG
-                + " ON pdu._id = pending_msgs.msg_id";
+    private static String joinPduAndPendingMsgTables(String pduTable) {
+        return pduTable + " LEFT JOIN " + TABLE_PENDING_MSG
+                + " ON " + pduTable + "._id = pending_msgs.msg_id";
     }
 
-    private static String[] createMmsProjection(String[] old) {
+    private static String[] createMmsProjection(String[] old, String pduTable) {
         String[] newProjection = new String[old.length];
         for (int i = 0; i < old.length; i++) {
             if (old[i].equals(BaseColumns._ID)) {
-                newProjection[i] = "pdu._id";
+                newProjection[i] = pduTable + "._id";
             } else {
                 newProjection[i] = old[i];
             }
@@ -1052,14 +1090,14 @@
 
     private Cursor getUndeliveredMessages(
             String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
-        String[] mmsProjection = createMmsProjection(projection);
+            String sortOrder, String smsTable, String pduTable) {
+        String[] mmsProjection = createMmsProjection(projection, pduTable);
 
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
         SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
 
-        mmsQueryBuilder.setTables(joinPduAndPendingMsgTables());
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
+        mmsQueryBuilder.setTables(joinPduAndPendingMsgTables(pduTable));
+        smsQueryBuilder.setTables(smsTable);
 
         String finalMmsSelection = concatSelections(
                 selection, Mms.MESSAGE_BOX + " = " + Mms.MESSAGE_BOX_OUTBOX);
@@ -1076,7 +1114,7 @@
                 smsColumns, 1);
 
         Set<String> columnsPresentInTable = new HashSet<String>(MMS_COLUMNS);
-        columnsPresentInTable.add("pdu._id");
+        columnsPresentInTable.add(pduTable + "._id");
         columnsPresentInTable.add(PendingMessages.ERROR_TYPE);
         String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
                 MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerMmsProjection,
@@ -1118,16 +1156,16 @@
     }
 
     private static String buildConversationQuery(String[] projection,
-            String selection, String sortOrder) {
-        String[] mmsProjection = createMmsProjection(projection);
+            String selection, String sortOrder, String smsTable, String pduTable) {
+        String[] mmsProjection = createMmsProjection(projection, pduTable);
 
         SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
         SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
 
         mmsQueryBuilder.setDistinct(true);
         smsQueryBuilder.setDistinct(true);
-        mmsQueryBuilder.setTables(joinPduAndPendingMsgTables());
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
+        mmsQueryBuilder.setTables(joinPduAndPendingMsgTables(pduTable));
+        smsQueryBuilder.setTables(smsTable);
 
         String[] smsColumns = handleNullMessageProjection(projection);
         String[] mmsColumns = handleNullMessageProjection(mmsProjection);
@@ -1135,7 +1173,7 @@
         String[] innerSmsProjection = makeProjectionWithNormalizedDate(smsColumns, 1);
 
         Set<String> columnsPresentInTable = new HashSet<String>(MMS_COLUMNS);
-        columnsPresentInTable.add("pdu._id");
+        columnsPresentInTable.add(pduTable + "._id");
         columnsPresentInTable.add(PendingMessages.ERROR_TYPE);
 
         String mmsSelection = concatSelections(selection,
@@ -1241,13 +1279,14 @@
     public int update(Uri uri, ContentValues values,
             String selection, String[] selectionArgs) {
         final int callerUid = Binder.getCallingUid();
+        final String callerPkg = getCallingPackage();
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         int affectedRows = 0;
         switch(URI_MATCHER.match(uri)) {
             case URI_CONVERSATIONS_MESSAGES:
                 String threadIdString = uri.getPathSegments().get(1);
                 affectedRows = updateConversation(threadIdString, values,
-                        selection, selectionArgs, callerUid);
+                        selection, selectionArgs, callerUid, callerPkg);
                 break;
 
             case URI_PENDING_MSG:
@@ -1285,9 +1324,8 @@
         return affectedRows;
     }
 
-    private int updateConversation(
-            String threadIdString, ContentValues values, String selection,
-            String[] selectionArgs, int callerUid) {
+    private int updateConversation(String threadIdString, ContentValues values, String selection,
+            String[] selectionArgs, int callerUid, String callerPkg) {
         try {
             Long.parseLong(threadIdString);
         } catch (NumberFormatException exception) {
@@ -1297,8 +1335,7 @@
         }
         if (ProviderUtil.shouldRemoveCreator(values, callerUid)) {
             // CREATOR should not be changed by non-SYSTEM/PHONE apps
-            Log.w(LOG_TAG, ProviderUtil.getPackageNamesByUid(getContext(), callerUid) +
-                    " tries to update CREATOR");
+            Log.w(LOG_TAG, callerPkg + " tries to update CREATOR");
             // Sms.CREATOR and Mms.CREATOR are same. But let's do this
             // twice in case the names may differ in the future
             values.remove(Sms.CREATOR);
@@ -1341,4 +1378,14 @@
             UNION_COLUMNS[i++] = columnName;
         }
     }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+        // Dump default SMS app
+        String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(getContext());
+        if (TextUtils.isEmpty(defaultSmsApp)) {
+            defaultSmsApp = "None";
+        }
+        writer.println("Default SMS app: " + defaultSmsApp);
+    }
 }
diff --git a/src/com/android/providers/telephony/ProviderUtil.java b/src/com/android/providers/telephony/ProviderUtil.java
index 8abe934..9435409 100644
--- a/src/com/android/providers/telephony/ProviderUtil.java
+++ b/src/com/android/providers/telephony/ProviderUtil.java
@@ -18,10 +18,10 @@
 
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.os.Process;
 import android.provider.Telephony;
-import android.text.TextUtils;
+
+import com.android.internal.telephony.SmsApplication;
 
 /**
  * Helpers
@@ -29,28 +29,18 @@
 public class ProviderUtil {
 
     /**
-     * Get space separated package names associated with a UID
+     * Check if a caller of the provider has restricted access,
+     * i.e. being non-system, non-phone, non-default SMS app
      *
-     * @param context The context to use
-     * @param uid The UID to look up
-     * @return The space separated list of package names for UID
+     * @param context the context to use
+     * @param packageName the caller package name
+     * @param uid the caller uid
+     * @return true if the caller is not system, or phone or default sms app, false otherwise
      */
-    public static String getPackageNamesByUid(Context context, int uid) {
-        final PackageManager pm = context.getPackageManager();
-        final String[] packageNames = pm.getPackagesForUid(uid);
-        if (packageNames != null) {
-            final StringBuilder sb = new StringBuilder();
-            for (String name : packageNames) {
-                if (!TextUtils.isEmpty(name)) {
-                    if (sb.length() > 0) {
-                        sb.append(' ');
-                    }
-                    sb.append(name);
-                }
-            }
-            return sb.toString();
-        }
-        return null;
+    public static boolean isAccessRestricted(Context context, String packageName, int uid) {
+        return (uid != Process.SYSTEM_UID
+                && uid != Process.PHONE_UID
+                && !SmsApplication.isDefaultSmsApplication(context, packageName));
     }
 
     /**
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index 03d2aa6..d48f1c6 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -51,6 +51,7 @@
     static final String TABLE_RAW = "raw";
     private static final String TABLE_SR_PENDING = "sr_pending";
     private static final String TABLE_WORDS = "words";
+    static final String VIEW_SMS_RESTRICTED = "sms_restricted";
 
     private static final Integer ONE = Integer.valueOf(1);
 
@@ -88,48 +89,65 @@
         return true;
     }
 
+    /**
+     * Return the proper view of "sms" table for the current access status.
+     *
+     * @param accessRestricted If the access is restricted
+     * @return the table/view name of the "sms" data
+     */
+    public static String getSmsTable(boolean accessRestricted) {
+        return accessRestricted ? VIEW_SMS_RESTRICTED : TABLE_SMS;
+    }
+
     @Override
     public Cursor query(Uri url, String[] projectionIn, String selection,
             String[] selectionArgs, String sort) {
+        // First check if a restricted view of the "sms" table should be used based on the
+        // caller's identity. Only system, phone or the default sms app can have full access
+        // of sms data. For other apps, we present a restricted view which only contains sent
+        // or received messages.
+        final boolean accessRestricted = ProviderUtil.isAccessRestricted(
+                getContext(), getCallingPackage(), Binder.getCallingUid());
+        final String smsTable = getSmsTable(accessRestricted);
         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
 
         // Generate the body of the query.
         int match = sURLMatcher.match(url);
         switch (match) {
             case SMS_ALL:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_ALL);
+                constructQueryForBox(qb, Sms.MESSAGE_TYPE_ALL, smsTable);
                 break;
 
             case SMS_UNDELIVERED:
-                constructQueryForUndelivered(qb);
+                constructQueryForUndelivered(qb, smsTable);
                 break;
 
             case SMS_FAILED:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_FAILED);
+                constructQueryForBox(qb, Sms.MESSAGE_TYPE_FAILED, smsTable);
                 break;
 
             case SMS_QUEUED:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_QUEUED);
+                constructQueryForBox(qb, Sms.MESSAGE_TYPE_QUEUED, smsTable);
                 break;
 
             case SMS_INBOX:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_INBOX);
+                constructQueryForBox(qb, Sms.MESSAGE_TYPE_INBOX, smsTable);
                 break;
 
             case SMS_SENT:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_SENT);
+                constructQueryForBox(qb, Sms.MESSAGE_TYPE_SENT, smsTable);
                 break;
 
             case SMS_DRAFT:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_DRAFT);
+                constructQueryForBox(qb, Sms.MESSAGE_TYPE_DRAFT, smsTable);
                 break;
 
             case SMS_OUTBOX:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_OUTBOX);
+                constructQueryForBox(qb, Sms.MESSAGE_TYPE_OUTBOX, smsTable);
                 break;
 
             case SMS_ALL_ID:
-                qb.setTables(TABLE_SMS);
+                qb.setTables(smsTable);
                 qb.appendWhere("(_id = " + url.getPathSegments().get(0) + ")");
                 break;
 
@@ -138,7 +156,7 @@
             case SMS_SENT_ID:
             case SMS_DRAFT_ID:
             case SMS_OUTBOX_ID:
-                qb.setTables(TABLE_SMS);
+                qb.setTables(smsTable);
                 qb.appendWhere("(_id = " + url.getPathSegments().get(1) + ")");
                 break;
 
@@ -158,16 +176,28 @@
                     return null;
                 }
 
-                qb.setTables(TABLE_SMS);
+                qb.setTables(smsTable);
                 qb.appendWhere("thread_id = " + threadID);
                 break;
 
             case SMS_CONVERSATIONS:
-                qb.setTables("sms, (SELECT thread_id AS group_thread_id, MAX(date)AS group_date,"
-                       + "COUNT(*) AS msg_count FROM sms GROUP BY thread_id) AS groups");
-                qb.appendWhere("sms.thread_id = groups.group_thread_id AND sms.date ="
-                       + "groups.group_date");
-                qb.setProjectionMap(sConversationProjectionMap);
+                qb.setTables(smsTable + ", "
+                        + "(SELECT thread_id AS group_thread_id, "
+                        + "MAX(date) AS group_date, "
+                        + "COUNT(*) AS msg_count "
+                        + "FROM " + smsTable + " "
+                        + "GROUP BY thread_id) AS groups");
+                qb.appendWhere(smsTable + ".thread_id=groups.group_thread_id"
+                        + " AND " + smsTable + ".date=groups.group_date");
+                final HashMap<String, String> projectionMap = new HashMap<>();
+                projectionMap.put(Sms.Conversations.SNIPPET,
+                        smsTable + ".body AS snippet");
+                projectionMap.put(Sms.Conversations.THREAD_ID,
+                        smsTable + ".thread_id AS thread_id");
+                projectionMap.put(Sms.Conversations.MESSAGE_COUNT,
+                        "groups.msg_count AS msg_count");
+                projectionMap.put("delta", null);
+                qb.setProjectionMap(projectionMap);
                 break;
 
             case SMS_RAW_MESSAGE:
@@ -196,7 +226,7 @@
                 break;
 
             case SMS_STATUS_ID:
-                qb.setTables(TABLE_SMS);
+                qb.setTables(smsTable);
                 qb.appendWhere("(_id = " + url.getPathSegments().get(1) + ")");
                 break;
 
@@ -217,7 +247,7 @@
 
         if (!TextUtils.isEmpty(sort)) {
             orderBy = sort;
-        } else if (qb.getTables().equals(TABLE_SMS)) {
+        } else if (qb.getTables().equals(smsTable)) {
             orderBy = Sms.DEFAULT_SORT_ORDER;
         }
 
@@ -314,16 +344,16 @@
         return cursor;
     }
 
-    private void constructQueryForBox(SQLiteQueryBuilder qb, int type) {
-        qb.setTables(TABLE_SMS);
+    private void constructQueryForBox(SQLiteQueryBuilder qb, int type, String smsTable) {
+        qb.setTables(smsTable);
 
         if (type != Sms.MESSAGE_TYPE_ALL) {
             qb.appendWhere("type=" + type);
         }
     }
 
-    private void constructQueryForUndelivered(SQLiteQueryBuilder qb) {
-        qb.setTables(TABLE_SMS);
+    private void constructQueryForUndelivered(SQLiteQueryBuilder qb, String smsTable) {
+        qb.setTables(smsTable);
 
         qb.appendWhere("(type=" + Sms.MESSAGE_TYPE_OUTBOX +
                        " OR type=" + Sms.MESSAGE_TYPE_FAILED +
@@ -356,15 +386,16 @@
     @Override
     public Uri insert(Uri url, ContentValues initialValues) {
         final int callerUid = Binder.getCallingUid();
+        final String callerPkg = getCallingPackage();
         long token = Binder.clearCallingIdentity();
         try {
-            return insertInner(url, initialValues, callerUid);
+            return insertInner(url, initialValues, callerUid, callerPkg);
         } finally {
             Binder.restoreCallingIdentity(token);
         }
     }
 
-    private Uri insertInner(Uri url, ContentValues initialValues, int callerUid) {
+    private Uri insertInner(Uri url, ContentValues initialValues, int callerUid, String callerPkg) {
         ContentValues values;
         long rowID;
         int type = Sms.MESSAGE_TYPE_ALL;
@@ -512,7 +543,7 @@
                 // If caller is not SYSTEM or PHONE, or SYSTEM or PHONE does not set CREATOR
                 // set CREATOR using the truth on caller.
                 // Note: Inferring package name from UID may include unrelated package names
-                values.put(Sms.CREATOR, ProviderUtil.getPackageNamesByUid(getContext(), callerUid));
+                values.put(Sms.CREATOR, callerPkg);
             }
         } else {
             if (initialValues == null) {
@@ -643,6 +674,7 @@
     @Override
     public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
         final int callerUid = Binder.getCallingUid();
+        final String callerPkg = getCallingPackage();
         int count = 0;
         String table = TABLE_SMS;
         String extraWhere = null;
@@ -704,8 +736,7 @@
 
         if (table.equals(TABLE_SMS) && ProviderUtil.shouldRemoveCreator(values, callerUid)) {
             // CREATOR should not be changed by non-SYSTEM/PHONE apps
-            Log.w(TAG, ProviderUtil.getPackageNamesByUid(getContext(), callerUid) +
-                    " tries to update CREATOR");
+            Log.w(TAG, callerPkg + " tries to update CREATOR");
             values.remove(Sms.CREATOR);
         }
 
@@ -738,8 +769,6 @@
     private final static String VND_ANDROID_DIR_SMS =
             "vnd.android.cursor.dir/sms";
 
-    private static final HashMap<String, String> sConversationProjectionMap =
-            new HashMap<String, String>();
     private static final String[] sIDProjection = new String[] { "_id" };
 
     private static final int SMS_ALL = 0;
@@ -800,13 +829,5 @@
         //we keep these for not breaking old applications
         sURLMatcher.addURI("sms", "sim", SMS_ALL_ICC);
         sURLMatcher.addURI("sms", "sim/#", SMS_ICC);
-
-        sConversationProjectionMap.put(Sms.Conversations.SNIPPET,
-            "sms.body AS snippet");
-        sConversationProjectionMap.put(Sms.Conversations.THREAD_ID,
-            "sms.thread_id AS thread_id");
-        sConversationProjectionMap.put(Sms.Conversations.MESSAGE_COUNT,
-            "groups.msg_count AS msg_count");
-        sConversationProjectionMap.put("delta", null);
     }
 }
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 64ab430..67b0645 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -35,16 +35,17 @@
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Environment;
+import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Telephony;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import android.util.Log;
 import android.util.Xml;
 
-import com.android.internal.telephony.BaseCommands;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.util.XmlUtils;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -55,14 +56,17 @@
 import java.io.FileReader;
 import java.io.IOException;
 import java.lang.NumberFormatException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 public class TelephonyProvider extends ContentProvider
 {
     private static final String DATABASE_NAME = "telephony.db";
     private static final boolean DBG = true;
-    private static final boolean VDBG = false;
+    private static final boolean VDBG = false; // STOPSHIP if true
 
-    private static final int DATABASE_VERSION = 13 << 16;
+    private static final int DATABASE_VERSION = 16 << 16;
     private static final int URL_UNKNOWN = 0;
     private static final int URL_TELEPHONY = 1;
     private static final int URL_CURRENT = 2;
@@ -77,16 +81,23 @@
     private static final int URL_PREFERAPN_USING_SUBID = 11;
     private static final int URL_PREFERAPN_NO_UPDATE_USING_SUBID = 12;
     private static final int URL_SIMINFO_USING_SUBID = 13;
+    private static final int URL_UPDATE_DB = 14;
 
     private static final String TAG = "TelephonyProvider";
     private static final String CARRIERS_TABLE = "carriers";
+    private static final String CARRIERS_TABLE_TMP = "carriers_tmp";
     private static final String SIMINFO_TABLE = "siminfo";
 
     private static final String PREF_FILE = "preferred-apn";
     private static final String COLUMN_APN_ID = "apn_id";
 
+    private static final String BUILD_ID_FILE = "build-id";
+    private static final String RO_BUILD_ID = "ro_build_id";
+
     private static final String PARTNER_APNS_PATH = "etc/apns-conf.xml";
     private static final String OEM_APNS_PATH = "telephony/apns-conf.xml";
+    private static final String OTA_UPDATED_APNS_PATH = "misc/apns-conf.xml";
+    private static final String OLD_APNS_PATH = "etc/old-apns-conf.xml";
 
     private static final UriMatcher s_urlMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 
@@ -110,12 +121,13 @@
         s_urlMatcher.addURI("telephony", "carriers/preferapn_no_update/subId/*",
                 URL_PREFERAPN_NO_UPDATE_USING_SUBID);
 
+        s_urlMatcher.addURI("telephony", "carriers/update_db", URL_UPDATE_DB);
 
         s_currentNullMap = new ContentValues(1);
-        s_currentNullMap.put("current", (Long) null);
+        s_currentNullMap.put(Telephony.Carriers.CURRENT, "0");
 
         s_currentSetMap = new ContentValues(1);
-        s_currentSetMap.put("current", "1");
+        s_currentSetMap.put(Telephony.Carriers.CURRENT, "1");
     }
 
     private static class DatabaseHelper extends SQLiteOpenHelper {
@@ -156,7 +168,7 @@
         public void onCreate(SQLiteDatabase db) {
             if (DBG) log("dbh.onCreate:+ db=" + db);
             createSimInfoTable(db);
-            createCarriersTable(db);
+            createCarriersTable(db, CARRIERS_TABLE);
             initDatabase(db);
             if (DBG) log("dbh.onCreate:- db=" + db);
         }
@@ -180,7 +192,7 @@
             } catch (SQLiteException e) {
                 loge("Exception " + CARRIERS_TABLE + " e=" + e);
                 if (e.getMessage().startsWith("no such table")) {
-                    createCarriersTable(db);
+                    createCarriersTable(db, CARRIERS_TABLE);
                 }
             }
             if (VDBG) log("dbh.onOpen:- db=" + db);
@@ -200,48 +212,73 @@
                     + SubscriptionManager.DISPLAY_NUMBER_FORMAT + " INTEGER NOT NULL DEFAULT " + SubscriptionManager.DISPLAY_NUMBER_DEFAULT + ","
                     + SubscriptionManager.DATA_ROAMING + " INTEGER DEFAULT " + SubscriptionManager.DATA_ROAMING_DEFAULT + ","
                     + SubscriptionManager.MCC + " INTEGER DEFAULT 0,"
-                    + SubscriptionManager.MNC + " INTEGER DEFAULT 0"
+                    + SubscriptionManager.MNC + " INTEGER DEFAULT 0,"
+                    + SubscriptionManager.CB_EXTREME_THREAT_ALERT + " INTEGER DEFAULT 1,"
+                    + SubscriptionManager.CB_SEVERE_THREAT_ALERT + " INTEGER DEFAULT 1,"
+                    + SubscriptionManager.CB_AMBER_ALERT + " INTEGER DEFAULT 1,"
+                    + SubscriptionManager.CB_EMERGENCY_ALERT + " INTEGER DEFAULT 1,"
+                    + SubscriptionManager.CB_ALERT_SOUND_DURATION + " INTEGER DEFAULT 4,"
+                    + SubscriptionManager.CB_ALERT_REMINDER_INTERVAL + " INTEGER DEFAULT 0,"
+                    + SubscriptionManager.CB_ALERT_VIBRATE + " INTEGER DEFAULT 1,"
+                    + SubscriptionManager.CB_ALERT_SPEECH + " INTEGER DEFAULT 1,"
+                    + SubscriptionManager.CB_ETWS_TEST_ALERT + " INTEGER DEFAULT 0,"
+                    + SubscriptionManager.CB_CHANNEL_50_ALERT + " INTEGER DEFAULT 1,"
+                    + SubscriptionManager.CB_CMAS_TEST_ALERT + " INTEGER DEFAULT 0,"
+                    + SubscriptionManager.CB_OPT_OUT_DIALOG + " INTEGER DEFAULT 1"
                     + ");");
             if (DBG) log("dbh.createSimInfoTable:-");
         }
 
-        private void createCarriersTable(SQLiteDatabase db) {
+        private void createCarriersTable(SQLiteDatabase db, String tableName) {
             // Set up the database schema
-            if (DBG) log("dbh.createCarriersTable:+");
-            db.execSQL("CREATE TABLE " + CARRIERS_TABLE +
-                "(_id INTEGER PRIMARY KEY," +
-                    "name TEXT," +
-                    "numeric TEXT," +
-                    "mcc TEXT," +
-                    "mnc TEXT," +
-                    "apn TEXT," +
-                    "user TEXT," +
-                    "server TEXT," +
-                    "password TEXT," +
-                    "proxy TEXT," +
-                    "port TEXT," +
-                    "mmsproxy TEXT," +
-                    "mmsport TEXT," +
-                    "mmsc TEXT," +
-                    "authtype INTEGER," +
-                    "type TEXT," +
+            if (DBG) log("dbh.createCarriersTable: " + tableName);
+            db.execSQL("CREATE TABLE " + tableName +
+                    "(_id INTEGER PRIMARY KEY," +
+                    "name TEXT DEFAULT ''," +
+                    "numeric TEXT DEFAULT ''," +
+                    "mcc TEXT DEFAULT ''," +
+                    "mnc TEXT DEFAULT ''," +
+                    "apn TEXT DEFAULT ''," +
+                    "user TEXT DEFAULT ''," +
+                    "server TEXT DEFAULT ''," +
+                    "password TEXT DEFAULT ''," +
+                    "proxy TEXT DEFAULT ''," +
+                    "port TEXT DEFAULT ''," +
+                    "mmsproxy TEXT DEFAULT ''," +
+                    "mmsport TEXT DEFAULT ''," +
+                    "mmsc TEXT DEFAULT ''," +
+                    "authtype INTEGER DEFAULT -1," +
+                    "type TEXT DEFAULT ''," +
                     "current INTEGER," +
-                    "protocol TEXT," +
-                    "roaming_protocol TEXT," +
-                    "carrier_enabled BOOLEAN," +
-                    "bearer INTEGER," +
-                    "mvno_type TEXT," +
-                    "mvno_match_data TEXT," +
+                    "protocol TEXT DEFAULT 'IP'," +
+                    "roaming_protocol TEXT DEFAULT 'IP'," +
+                    "carrier_enabled BOOLEAN DEFAULT 1," +
+                    "bearer INTEGER DEFAULT 0," +
+                    "bearer_bitmask INTEGER DEFAULT 0," +
+                    "mvno_type TEXT DEFAULT ''," +
+                    "mvno_match_data TEXT DEFAULT ''," +
                     "sub_id INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID + "," +
-                    "profile_id INTEGER default 0," +
-                    "modem_cognitive BOOLEAN default 0," +
-                    "max_conns INTEGER default 0," +
-                    "wait_time INTEGER default 0," +
-                    "max_conns_time INTEGER default 0," +
-                    "mtu INTEGER);");
+                    "profile_id INTEGER DEFAULT 0," +
+                    "modem_cognitive BOOLEAN DEFAULT 0," +
+                    "max_conns INTEGER DEFAULT 0," +
+                    "wait_time INTEGER DEFAULT 0," +
+                    "max_conns_time INTEGER DEFAULT 0," +
+                    "mtu INTEGER DEFAULT 0," +
+                    "edited INTEGER DEFAULT " + Telephony.Carriers.UNEDITED + "," +
+                    // Uniqueness collisions are used to trigger merge code so if a field is listed
+                    // here it means we will accept both (user edited + new apn_conf definition)
+                    // Columns not included in UNIQUE constraint: name, current, edited,
+                    // user, server, password, authtype, type, protocol, roaming_protocol, sub_id,
+                    // modem_cognitive, max_conns, wait_time, max_conns_time, mtu, bearer_bitmask
+                    "UNIQUE (numeric, mcc, mnc, apn, proxy, port, mmsproxy, mmsport, mmsc," +
+                    "carrier_enabled, bearer, mvno_type, mvno_match_data, profile_id));");
             if (DBG) log("dbh.createCarriersTable:-");
         }
 
+        /**
+         *  This function adds APNs from xml file(s) to db. The db may or may not be empty to begin
+         *  with.
+         */
         private void initDatabase(SQLiteDatabase db) {
             if (VDBG) log("dbh.initDatabase:+ db=" + db);
             // Read internal APNS data
@@ -263,23 +300,9 @@
             // Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system".
             File confFile = new File(Environment.getRootDirectory(), PARTNER_APNS_PATH);
             File oemConfFile =  new File(Environment.getOemDirectory(), OEM_APNS_PATH);
-            if (oemConfFile.exists()) {
-                // OEM image exist APN xml, get the timestamp from OEM & System image for comparison
-                long oemApnTime = oemConfFile.lastModified();
-                long sysApnTime = confFile.lastModified();
-                if (DBG) log("APNs Timestamp: oemTime = " + oemApnTime + " sysTime = "
-                        + sysApnTime);
-
-                // To get the latest version from OEM or System image
-                if (oemApnTime > sysApnTime) {
-                    if (DBG) log("APNs Timestamp: OEM image is greater than System image");
-                    confFile = oemConfFile;
-                }
-            } else {
-                // No Apn in OEM image, so load it from system image.
-                if (DBG) log("No APNs in OEM image = " + oemConfFile.getPath() +
-                        " Load APNs from system image");
-            }
+            File updatedConfFile = new File(Environment.getDataDirectory(), OTA_UPDATED_APNS_PATH);
+            confFile = getNewerFile(confFile, oemConfFile);
+            confFile = getNewerFile(confFile, updatedConfFile);
 
             FileReader confreader = null;
             if (DBG) log("confFile = " + confFile);
@@ -292,6 +315,7 @@
                 // Sanity check. Force internal version and confidential versions to agree
                 int confversion = Integer.parseInt(confparser.getAttributeValue(null, "version"));
                 if (publicversion != confversion) {
+                    log("initDatabase: throwing exception due to version mismatch");
                     throw new IllegalStateException("Internal APNS file version doesn't match "
                             + confFile.getAbsolutePath());
                 }
@@ -301,14 +325,66 @@
                 // It's ok if the file isn't found. It means there isn't a confidential file
                 // Log.e(TAG, "File not found: '" + confFile.getAbsolutePath() + "'");
             } catch (Exception e) {
-                loge("Exception while parsing '" + confFile.getAbsolutePath() + "'" + e);
+                loge("initDatabase: Exception while parsing '" + confFile.getAbsolutePath() + "'" +
+                        e);
             } finally {
-                try { if (confreader != null) confreader.close(); } catch (IOException e) { }
+                // Get rid of user/carrier deleted entries that are not present in apn xml file.
+                // Those entries have edited value USER_DELETED/CARRIER_DELETED.
+                if (VDBG) {
+                    log("initDatabase: deleting USER_DELETED and replacing "
+                            + "DELETED_BUT_PRESENT_IN_XML with DELETED");
+                }
+
+                // Delete USER_DELETED
+                db.delete(CARRIERS_TABLE, "edited=" + Telephony.Carriers.USER_DELETED + " or " +
+                        "edited=" + Telephony.Carriers.CARRIER_DELETED, null);
+
+                // Change USER_DELETED_BUT_PRESENT_IN_XML to USER_DELETED
+                ContentValues cv = new ContentValues();
+                cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_DELETED);
+                db.update(CARRIERS_TABLE, cv, "edited=" + Telephony.Carriers.USER_DELETED_BUT_PRESENT_IN_XML,
+                        null);
+
+                // Change CARRIER_DELETED_BUT_PRESENT_IN_XML to CARRIER_DELETED
+                cv = new ContentValues();
+                cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.CARRIER_DELETED);
+                db.update(CARRIERS_TABLE, cv, "edited=" + Telephony.Carriers.CARRIER_DELETED_BUT_PRESENT_IN_XML,
+                        null);
+
+                if (confreader != null) {
+                    try {
+                        confreader.close();
+                    } catch (IOException e) {
+                        // do nothing
+                    }
+                }
             }
             if (VDBG) log("dbh.initDatabase:- db=" + db);
 
         }
 
+        private File getNewerFile(File sysApnFile, File altApnFile) {
+            if (altApnFile.exists()) {
+                // Alternate file exists. Use the newer one.
+                long altFileTime = altApnFile.lastModified();
+                long currFileTime = sysApnFile.lastModified();
+                if (DBG) log("APNs Timestamp: altFileTime = " + altFileTime + " currFileTime = "
+                        + currFileTime);
+
+                // To get the latest version from OEM or System image
+                if (altFileTime > currFileTime) {
+                    if (DBG) log("APNs Timestamp: Alternate image " + altApnFile.getPath() +
+                            " is greater than System image");
+                    return altApnFile;
+                }
+            } else {
+                // No Apn in alternate image, so load it from system image.
+                if (DBG) log("No APNs in OEM image = " + altApnFile.getPath() +
+                        " Load APNs from system image");
+            }
+            return sysApnFile;
+        }
+
         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
             if (DBG) {
@@ -400,8 +476,8 @@
             if (oldVersion < (13 << 16 | 6)) {
                 try {
                     // Try to update the siminfo table. It might not be there.
-                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE +
-                            " ADD COLUMN " + SubscriptionManager.CARRIER_NAME + " TEXT DEFAULT '';");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN " +
+                            SubscriptionManager.CARRIER_NAME + " TEXT DEFAULT '';");
                 } catch (SQLiteException e) {
                     if (DBG) {
                         log("onUpgrade skipping " + SIMINFO_TABLE + " upgrade. " +
@@ -410,11 +486,408 @@
                 }
                 oldVersion = 13 << 16 | 6;
             }
+            if (oldVersion < (14 << 16 | 6)) {
+                // Do nothing. This is to avoid recreating table twice. Table is anyway recreated
+                // for next version and that takes care of updates for this version as well.
+                // This version added a new column user_edited to carriers db.
+            }
+            if (oldVersion < (15 << 16 | 6)) {
+                // Most devices should be upgrading from version 13. On upgrade new db will be
+                // populated from the xml included in OTA but user and carrier edited/added entries
+                // need to be preserved. This new version also adds new columns EDITED and
+                // BEARER_BITMASK to the table. Upgrade steps from version 13 are:
+                // 1. preserve user and carrier added/edited APNs (by comparing against
+                // old-apns-conf.xml included in OTA) - done in preserveUserAndCarrierApns()
+                // 2. add new columns EDITED and BEARER_BITMASK (create a new table for that) - done
+                // in createCarriersTable()
+                // 3. copy over preserved APNs from old table to new table - done in
+                // copyPreservedApnsToNewTable()
+                // The only exception if upgrading from version 14 is that EDITED field is already
+                // present (but is called USER_EDITED)
+                Cursor c;
+                String[] proj = {"_id"};
+                if (VDBG) {
+                    c = db.query(CARRIERS_TABLE, proj, null, null, null, null, null);
+                    log("dbh.onUpgrade:- before upgrading total number of rows: " + c.getCount());
+                }
+
+                // Compare db with old apns xml file so that any user or carrier edited/added
+                // entries can be preserved across upgrade
+                preserveUserAndCarrierApns(db);
+
+                c = db.query(CARRIERS_TABLE, null, null, null, null, null, null);
+
+                if (VDBG) {
+                    log("dbh.onUpgrade:- after preserveUserAndCarrierApns() total number of " +
+                            "rows: " + ((c == null) ? 0 : c.getCount()));
+                }
+
+                createCarriersTable(db, CARRIERS_TABLE_TMP);
+
+                copyPreservedApnsToNewTable(db, c);
+                c.close();
+
+                db.execSQL("DROP TABLE IF EXISTS " + CARRIERS_TABLE);
+
+                db.execSQL("ALTER TABLE " + CARRIERS_TABLE_TMP + " rename to " + CARRIERS_TABLE +
+                        ";");
+
+                if (VDBG) {
+                    c = db.query(CARRIERS_TABLE, proj, null, null, null, null, null);
+                    log("dbh.onUpgrade:- after upgrading total number of rows: " + c.getCount());
+                    c.close();
+                    c = db.query(CARRIERS_TABLE, proj, "edited=" + Telephony.Carriers.UNEDITED,
+                            null, null, null, null);
+                    log("dbh.onUpgrade:- after upgrading total number of rows with edited="
+                            + Telephony.Carriers.UNEDITED + ": " + c.getCount());
+                    c.close();
+                    c = db.query(CARRIERS_TABLE, proj, "edited!=" + Telephony.Carriers.UNEDITED,
+                            null, null, null, null);
+                    log("dbh.onUpgrade:- after upgrading total number of rows with edited!="
+                            + Telephony.Carriers.UNEDITED + ": " + c.getCount());
+                    c.close();
+                }
+
+                oldVersion = 15 << 16 | 6;
+            }
+            if (oldVersion < (16 << 16 | 6)) {
+                try {
+                    // Try to update the siminfo table. It might not be there.
+                    // These columns may already be present in which case execSQL will throw an
+                    // exception
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_EXTREME_THREAT_ALERT + " INTEGER DEFAULT 1;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_SEVERE_THREAT_ALERT + " INTEGER DEFAULT 1;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_AMBER_ALERT + " INTEGER DEFAULT 1;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_EMERGENCY_ALERT + " INTEGER DEFAULT 1;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_ALERT_SOUND_DURATION + " INTEGER DEFAULT 4;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_ALERT_REMINDER_INTERVAL + " INTEGER DEFAULT 0;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_ALERT_VIBRATE + " INTEGER DEFAULT 1;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_ALERT_SPEECH + " INTEGER DEFAULT 1;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_ETWS_TEST_ALERT + " INTEGER DEFAULT 0;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_CHANNEL_50_ALERT + " INTEGER DEFAULT 1;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_CMAS_TEST_ALERT + " INTEGER DEFAULT 0;");
+                    db.execSQL("ALTER TABLE " + SIMINFO_TABLE + " ADD COLUMN "
+                            + SubscriptionManager.CB_OPT_OUT_DIALOG + " INTEGER DEFAULT 1;");
+                } catch (SQLiteException e) {
+                    if (DBG) {
+                        log("onUpgrade skipping " + SIMINFO_TABLE + " upgrade. " +
+                                " The table will get created in onOpen.");
+                    }
+                }
+                oldVersion = 16 << 16 | 6;
+            }
             if (DBG) {
                 log("dbh.onUpgrade:- db=" + db + " oldV=" + oldVersion + " newV=" + newVersion);
             }
         }
 
+        private void preserveUserAndCarrierApns(SQLiteDatabase db) {
+            if (VDBG) log("preserveUserAndCarrierApns");
+            XmlPullParser confparser;
+            File confFile = new File(Environment.getRootDirectory(), OLD_APNS_PATH);
+            FileReader confreader = null;
+            try {
+                confreader = new FileReader(confFile);
+                confparser = Xml.newPullParser();
+                confparser.setInput(confreader);
+                XmlUtils.beginDocument(confparser, "apns");
+
+                deleteMatchingApns(db, confparser);
+            } catch (FileNotFoundException e) {
+                // This function is called only when upgrading db to version 15. Details about the
+                // upgrade are mentioned in onUpgrade(). This file missing means user/carrier added
+                // APNs cannot be preserved. Throw an exception so that OEMs know they need to
+                // include old apns file for comparison.
+                loge("preserveUserAndCarrierApns: FileNotFoundException");
+                throw new RuntimeException("preserveUserAndCarrierApns: " + OLD_APNS_PATH +
+                        " not found. It is needed to upgrade from older versions of APN " +
+                        "db while preserving user/carrier added/edited entries.");
+            } catch (Exception e) {
+                loge("preserveUserAndCarrierApns: Exception while parsing '" +
+                        confFile.getAbsolutePath() + "'" + e);
+            } finally {
+                if (confreader != null) {
+                    try {
+                        confreader.close();
+                    } catch (IOException e) {
+                        // do nothing
+                    }
+                }
+            }
+        }
+
+        private void deleteMatchingApns(SQLiteDatabase db, XmlPullParser parser) {
+            if (VDBG) log("deleteMatchingApns");
+            if (parser != null) {
+                if (VDBG) log("deleteMatchingApns: parser != null");
+                try {
+                    XmlUtils.nextElement(parser);
+                    while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+                        ContentValues row = getRow(parser);
+                        if (row == null) {
+                            throw new XmlPullParserException("Expected 'apn' tag", parser, null);
+                        }
+                        deleteRow(db, row);
+                        XmlUtils.nextElement(parser);
+                    }
+                } catch (XmlPullParserException e) {
+                    loge("deleteMatchingApns: Got XmlPullParserException while deleting apns." + e);
+                } catch (IOException e) {
+                    loge("deleteMatchingApns: Got IOException while deleting apns." + e);
+                } catch (SQLException e) {
+                    loge("deleteMatchingApns: Got SQLException while deleting apns." + e);
+                }
+            }
+        }
+
+        private void deleteRow(SQLiteDatabase db, ContentValues values) {
+            if (VDBG) log("deleteRow");
+            String where = "numeric=? and mcc=? and mnc=? and name=? and " +
+                    "(apn=? or apn is null) and " +
+                    "(user=? or user is null) and (server=? or server is null) and " +
+                    "(password=? or password is null) and (proxy=? or proxy is null) and " +
+                    "(port=? or port is null) and (mmsproxy=? or mmsproxy is null) and " +
+                    "(mmsport=? or mmsport is null) and (mmsc=? or mmsc is null) and " +
+                    "(authtype=? or authtype is null) and (type=? or type is null) and " +
+                    "(protocol=? or protocol is null) and " +
+                    "(roaming_protocol=? or roaming_protocol is null) and " +
+                    "(carrier_enabled=? or carrier_enabled=? or carrier_enabled is null) and " +
+                    "(bearer=? or bearer is null) and (mvno_type=? or mvno_type is null) and " +
+                    "(mvno_match_data=? or mvno_match_data is null) and " +
+                    "(profile_id=? or profile_id is null) and " +
+                    "(modem_cognitive=? or modem_cognitive=? or modem_cognitive is null) and " +
+                    "(max_conns=? or max_conns is null) and " +
+                    "(wait_time=? or wait_time is null) and " +
+                    "(max_conns_time=? or max_conns_time is null) and (mtu=? or mtu is null)";
+            String[] whereArgs = new String[29];
+            int i = 0;
+            whereArgs[i++] = values.getAsString(Telephony.Carriers.NUMERIC);
+            whereArgs[i++] = values.getAsString(Telephony.Carriers.MCC);
+            whereArgs[i++] = values.getAsString(Telephony.Carriers.MNC);
+            whereArgs[i++] = values.getAsString(Telephony.Carriers.NAME);
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.APN) ?
+                    values.getAsString(Telephony.Carriers.APN) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.USER) ?
+                    values.getAsString(Telephony.Carriers.USER) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.SERVER) ?
+                    values.getAsString(Telephony.Carriers.SERVER) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.PASSWORD) ?
+                    values.getAsString(Telephony.Carriers.PASSWORD) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.PROXY) ?
+                    values.getAsString(Telephony.Carriers.PROXY) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.PORT) ?
+                    values.getAsString(Telephony.Carriers.PORT) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.MMSPROXY) ?
+                    values.getAsString(Telephony.Carriers.MMSPROXY) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.MMSPORT) ?
+                    values.getAsString(Telephony.Carriers.MMSPORT) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.MMSC) ?
+                    values.getAsString(Telephony.Carriers.MMSC) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.AUTH_TYPE) ?
+                    values.getAsString(Telephony.Carriers.AUTH_TYPE) : "-1";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.TYPE) ?
+                    values.getAsString(Telephony.Carriers.TYPE) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.PROTOCOL) ?
+                    values.getAsString(Telephony.Carriers.PROTOCOL) : "IP";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.ROAMING_PROTOCOL) ?
+                    values.getAsString(Telephony.Carriers.ROAMING_PROTOCOL) : "IP";
+
+            if (values.containsKey(Telephony.Carriers.CARRIER_ENABLED) &&
+                    (values.getAsString(Telephony.Carriers.CARRIER_ENABLED).
+                            equalsIgnoreCase("false") ||
+                            values.getAsString(Telephony.Carriers.CARRIER_ENABLED).equals("0"))) {
+                whereArgs[i++] = "false";
+                whereArgs[i++] = "0";
+            } else {
+                whereArgs[i++] = "true";
+                whereArgs[i++] = "1";
+            }
+
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.BEARER) ?
+                    values.getAsString(Telephony.Carriers.BEARER) : "0";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.MVNO_TYPE) ?
+                    values.getAsString(Telephony.Carriers.MVNO_TYPE) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.MVNO_MATCH_DATA) ?
+                    values.getAsString(Telephony.Carriers.MVNO_MATCH_DATA) : "";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.PROFILE_ID) ?
+                    values.getAsString(Telephony.Carriers.PROFILE_ID) : "0";
+
+            if (values.containsKey(Telephony.Carriers.MODEM_COGNITIVE) &&
+                    (values.getAsString(Telephony.Carriers.MODEM_COGNITIVE).
+                            equalsIgnoreCase("true") ||
+                            values.getAsString(Telephony.Carriers.MODEM_COGNITIVE).equals("1"))) {
+                whereArgs[i++] = "true";
+                whereArgs[i++] = "1";
+            } else {
+                whereArgs[i++] = "false";
+                whereArgs[i++] = "0";
+            }
+
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.MAX_CONNS) ?
+                    values.getAsString(Telephony.Carriers.MAX_CONNS) : "0";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.WAIT_TIME) ?
+                    values.getAsString(Telephony.Carriers.WAIT_TIME) : "0";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.MAX_CONNS_TIME) ?
+                    values.getAsString(Telephony.Carriers.MAX_CONNS_TIME) : "0";
+            whereArgs[i++] = values.containsKey(Telephony.Carriers.MTU) ?
+                    values.getAsString(Telephony.Carriers.MTU) : "0";
+
+            if (VDBG) {
+                log("deleteRow: where: " + where);
+
+                StringBuilder builder = new StringBuilder();
+                for (String s : whereArgs) {
+                    builder.append(s + ", ");
+                }
+
+                log("deleteRow: whereArgs: " + builder.toString());
+            }
+            db.delete(CARRIERS_TABLE, where, whereArgs);
+        }
+
+        private void copyPreservedApnsToNewTable(SQLiteDatabase db, Cursor c) {
+            // Move entries from CARRIERS_TABLE to CARRIERS_TABLE_TMP
+            if (c != null) {
+                String[] persistApnsForPlmns = mContext.getResources().getStringArray(
+                        R.array.persist_apns_for_plmn);
+                while (c.moveToNext()) {
+                    ContentValues cv = new ContentValues();
+                    String val;
+
+                    // Include only non-null values in cv so that null values can be replaced
+                    // with default if there's a default value for the field
+
+                    // String vals
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.NAME);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.NUMERIC);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.MCC);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.MNC);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.APN);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.USER);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.SERVER);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.PASSWORD);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.PROXY);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.PORT);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.MMSPROXY);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.MMSPORT);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.MMSC);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.TYPE);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.PROTOCOL);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.ROAMING_PROTOCOL);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.MVNO_TYPE);
+                    getStringValueFromCursor(cv, c, Telephony.Carriers.MVNO_MATCH_DATA);
+
+                    // bool/int vals
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.AUTH_TYPE);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.CURRENT);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.CARRIER_ENABLED);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.BEARER);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.SUBSCRIPTION_ID);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.PROFILE_ID);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.MODEM_COGNITIVE);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.MAX_CONNS);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.WAIT_TIME);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.MAX_CONNS_TIME);
+                    getIntValueFromCursor(cv, c, Telephony.Carriers.MTU);
+
+                    // Change bearer to a bitmask
+                    String bearerStr = c.getString(c.getColumnIndex(Telephony.Carriers.BEARER));
+                    if (!TextUtils.isEmpty(bearerStr)) {
+                        int bearer_bitmask = ServiceState.getBitmaskForTech(
+                                Integer.parseInt(bearerStr));
+                        cv.put(Telephony.Carriers.BEARER_BITMASK, bearer_bitmask);
+                    }
+
+                    int userEditedColumnIdx = c.getColumnIndex("user_edited");
+                    if (userEditedColumnIdx != -1) {
+                        String user_edited = c.getString(userEditedColumnIdx);
+                        if (!TextUtils.isEmpty(user_edited)) {
+                            cv.put(Telephony.Carriers.EDITED, new Integer(user_edited));
+                        }
+                    } else {
+                        cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                    }
+
+                    // New EDITED column. Default value (Telephony.Carriers.UNEDITED) will
+                    // be used for all rows except for non-mvno entries for plmns indicated
+                    // by resource: those will be set to CARRIER_EDITED to preserve
+                    // their current values
+                    val = c.getString(c.getColumnIndex(Telephony.Carriers.NUMERIC));
+                    for (String s : persistApnsForPlmns) {
+                        if (!TextUtils.isEmpty(val) && val.equals(s) &&
+                                (!cv.containsKey(Telephony.Carriers.MVNO_TYPE) ||
+                                        TextUtils.isEmpty(cv.getAsString(Telephony.Carriers.
+                                                MVNO_TYPE)))) {
+                            if (userEditedColumnIdx == -1) {
+                                cv.put(Telephony.Carriers.EDITED,
+                                        Telephony.Carriers.CARRIER_EDITED);
+                            } else { // if (oldVersion == 14) -- if db had user_edited column
+                                if (cv.getAsInteger(Telephony.Carriers.EDITED) ==
+                                        Telephony.Carriers.USER_EDITED) {
+                                    cv.put(Telephony.Carriers.EDITED,
+                                            Telephony.Carriers.CARRIER_EDITED);
+                                }
+                            }
+
+                            break;
+                        }
+                    }
+
+                    try {
+                        db.insertWithOnConflict(CARRIERS_TABLE_TMP, null, cv,
+                                SQLiteDatabase.CONFLICT_ABORT);
+                        if (VDBG) {
+                            log("dbh.copyPreservedApnsToNewTable: db.insert returned >= 0; " +
+                                    "insert successful for cv " + cv);
+                        }
+                    } catch (SQLException e) {
+                        if (VDBG)
+                            log("dbh.copyPreservedApnsToNewTable insertWithOnConflict exception " +
+                                    e + " for cv " + cv);
+                        // Insertion failed which could be due to a conflict. Check if that is
+                        // the case and merge the entries
+                        Cursor oldRow = DatabaseHelper.selectConflictingRow(db,
+                                CARRIERS_TABLE_TMP, cv);
+                        if (oldRow != null) {
+                            ContentValues mergedValues = new ContentValues();
+                            mergeFieldsAndUpdateDb(db, CARRIERS_TABLE_TMP, oldRow, cv,
+                                    mergedValues, true, mContext);
+                            oldRow.close();
+                        }
+                    }
+                }
+            }
+        }
+
+        private void getStringValueFromCursor(ContentValues cv, Cursor c, String key) {
+            String fromCursor = c.getString(c.getColumnIndex(key));
+            if (!TextUtils.isEmpty(fromCursor)) {
+                cv.put(key, fromCursor);
+            }
+        }
+
+        private void getIntValueFromCursor(ContentValues cv, Cursor c, String key) {
+            String fromCursor = c.getString(c.getColumnIndex(key));
+            if (!TextUtils.isEmpty(fromCursor)) {
+                try {
+                    cv.put(key, new Integer(fromCursor));
+                } catch (NumberFormatException nfe) {
+                    // do nothing
+                }
+            }
+        }
+
         /**
          * Gets the next row of apn values.
          *
@@ -432,61 +905,40 @@
             String mnc = parser.getAttributeValue(null, "mnc");
             String numeric = mcc + mnc;
 
-            map.put(Telephony.Carriers.NUMERIC,numeric);
+            map.put(Telephony.Carriers.NUMERIC, numeric);
             map.put(Telephony.Carriers.MCC, mcc);
             map.put(Telephony.Carriers.MNC, mnc);
             map.put(Telephony.Carriers.NAME, parser.getAttributeValue(null, "carrier"));
-            map.put(Telephony.Carriers.APN, parser.getAttributeValue(null, "apn"));
-            map.put(Telephony.Carriers.USER, parser.getAttributeValue(null, "user"));
-            map.put(Telephony.Carriers.SERVER, parser.getAttributeValue(null, "server"));
-            map.put(Telephony.Carriers.PASSWORD, parser.getAttributeValue(null, "password"));
 
-            // do not add NULL to the map so that insert() will set the default value
-            String proxy = parser.getAttributeValue(null, "proxy");
-            if (proxy != null) {
-                map.put(Telephony.Carriers.PROXY, proxy);
-            }
-            String port = parser.getAttributeValue(null, "port");
-            if (port != null) {
-                map.put(Telephony.Carriers.PORT, port);
-            }
-            String mmsproxy = parser.getAttributeValue(null, "mmsproxy");
-            if (mmsproxy != null) {
-                map.put(Telephony.Carriers.MMSPROXY, mmsproxy);
-            }
-            String mmsport = parser.getAttributeValue(null, "mmsport");
-            if (mmsport != null) {
-                map.put(Telephony.Carriers.MMSPORT, mmsport);
-            }
-            map.put(Telephony.Carriers.MMSC, parser.getAttributeValue(null, "mmsc"));
-            String type = parser.getAttributeValue(null, "type");
-            if (type != null) {
-                map.put(Telephony.Carriers.TYPE, type);
-            }
+            // do not add NULL to the map so that default values can be inserted in db
+            addStringAttribute(parser, "apn", map, Telephony.Carriers.APN);
+            addStringAttribute(parser, "user", map, Telephony.Carriers.USER);
+            addStringAttribute(parser, "server", map, Telephony.Carriers.SERVER);
+            addStringAttribute(parser, "password", map, Telephony.Carriers.PASSWORD);
+            addStringAttribute(parser, "proxy", map, Telephony.Carriers.PROXY);
+            addStringAttribute(parser, "port", map, Telephony.Carriers.PORT);
+            addStringAttribute(parser, "mmsproxy", map, Telephony.Carriers.MMSPROXY);
+            addStringAttribute(parser, "mmsport", map, Telephony.Carriers.MMSPORT);
+            addStringAttribute(parser, "mmsc", map, Telephony.Carriers.MMSC);
+            addStringAttribute(parser, "type", map, Telephony.Carriers.TYPE);
+            addStringAttribute(parser, "protocol", map, Telephony.Carriers.PROTOCOL);
+            addStringAttribute(parser, "roaming_protocol", map, Telephony.Carriers.ROAMING_PROTOCOL);
 
-            String auth = parser.getAttributeValue(null, "authtype");
-            if (auth != null) {
-                map.put(Telephony.Carriers.AUTH_TYPE, Integer.parseInt(auth));
-            }
+            addIntAttribute(parser, "authtype", map, Telephony.Carriers.AUTH_TYPE);
+            addIntAttribute(parser, "bearer", map, Telephony.Carriers.BEARER);
+            addIntAttribute(parser, "profile_id", map, Telephony.Carriers.PROFILE_ID);
+            addIntAttribute(parser, "max_conns", map, Telephony.Carriers.MAX_CONNS);
+            addIntAttribute(parser, "wait_time", map, Telephony.Carriers.WAIT_TIME);
+            addIntAttribute(parser, "max_conns_time", map, Telephony.Carriers.MAX_CONNS_TIME);
+            addIntAttribute(parser, "mtu", map, Telephony.Carriers.MTU);
 
-            String protocol = parser.getAttributeValue(null, "protocol");
-            if (protocol != null) {
-                map.put(Telephony.Carriers.PROTOCOL, protocol);
-            }
+            addBoolAttribute(parser, "carrier_enabled", map, Telephony.Carriers.CARRIER_ENABLED);
+            addBoolAttribute(parser, "modem_cognitive", map, Telephony.Carriers.MODEM_COGNITIVE);
 
-            String roamingProtocol = parser.getAttributeValue(null, "roaming_protocol");
-            if (roamingProtocol != null) {
-                map.put(Telephony.Carriers.ROAMING_PROTOCOL, roamingProtocol);
-            }
-
-            String carrierEnabled = parser.getAttributeValue(null, "carrier_enabled");
-            if (carrierEnabled != null) {
-                map.put(Telephony.Carriers.CARRIER_ENABLED, Boolean.parseBoolean(carrierEnabled));
-            }
-
-            String bearer = parser.getAttributeValue(null, "bearer");
-            if (bearer != null) {
-                map.put(Telephony.Carriers.BEARER, Integer.parseInt(bearer));
+            String bearerList = parser.getAttributeValue(null, "bearer_bitmask");
+            if (bearerList != null) {
+                int bearerBitmask = ServiceState.getBitmaskFromString(bearerList);
+                map.put(Telephony.Carriers.BEARER_BITMASK, bearerBitmask);
             }
 
             String mvno_type = parser.getAttributeValue(null, "mvno_type");
@@ -498,39 +950,33 @@
                 }
             }
 
-            String profileId = parser.getAttributeValue(null, "profile_id");
-            if (profileId != null) {
-                map.put(Telephony.Carriers.PROFILE_ID, Integer.parseInt(profileId));
-            }
-
-            String modemCognitive = parser.getAttributeValue(null, "modem_cognitive");
-            if (modemCognitive != null) {
-                map.put(Telephony.Carriers.MODEM_COGNITIVE, Boolean.parseBoolean(modemCognitive));
-            }
-
-            String maxConns = parser.getAttributeValue(null, "max_conns");
-            if (maxConns != null) {
-                map.put(Telephony.Carriers.MAX_CONNS, Integer.parseInt(maxConns));
-            }
-
-            String waitTime = parser.getAttributeValue(null, "wait_time");
-            if (waitTime != null) {
-                map.put(Telephony.Carriers.WAIT_TIME, Integer.parseInt(waitTime));
-            }
-
-            String maxConnsTime = parser.getAttributeValue(null, "max_conns_time");
-            if (maxConnsTime != null) {
-                map.put(Telephony.Carriers.MAX_CONNS_TIME, Integer.parseInt(maxConnsTime));
-            }
-
-            String mtu = parser.getAttributeValue(null, "mtu");
-            if (mtu != null) {
-                map.put(Telephony.Carriers.MTU, Integer.parseInt(mtu));
-            }
-
             return map;
         }
 
+        private void addStringAttribute(XmlPullParser parser, String att,
+                                        ContentValues map, String key) {
+            String val = parser.getAttributeValue(null, att);
+            if (val != null) {
+                map.put(key, val);
+            }
+        }
+
+        private void addIntAttribute(XmlPullParser parser, String att,
+                                     ContentValues map, String key) {
+            String val = parser.getAttributeValue(null, att);
+            if (val != null) {
+                map.put(key, Integer.parseInt(val));
+            }
+        }
+
+        private void addBoolAttribute(XmlPullParser parser, String att,
+                                      ContentValues map, String key) {
+            String val = parser.getAttributeValue(null, att);
+            if (val != null) {
+                map.put(key, Boolean.parseBoolean(val));
+            }
+        }
+
         /*
          * Loads apns from xml file into the database
          *
@@ -548,7 +994,7 @@
                         if (row == null) {
                             throw new XmlPullParserException("Expected 'apn' tag", parser, null);
                         }
-                        insertAddingDefaults(db, CARRIERS_TABLE, row);
+                        insertAddingDefaults(db, row);
                         XmlUtils.nextElement(parser);
                     }
                     db.setTransactionSuccessful();
@@ -565,117 +1011,394 @@
         }
 
         static public ContentValues setDefaultValue(ContentValues values) {
-            if (!values.containsKey(Telephony.Carriers.NAME)) {
-                values.put(Telephony.Carriers.NAME, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.APN)) {
-                values.put(Telephony.Carriers.APN, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.PORT)) {
-                values.put(Telephony.Carriers.PORT, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.PROXY)) {
-                values.put(Telephony.Carriers.PROXY, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.USER)) {
-                values.put(Telephony.Carriers.USER, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.SERVER)) {
-                values.put(Telephony.Carriers.SERVER, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.PASSWORD)) {
-                values.put(Telephony.Carriers.PASSWORD, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.MMSPORT)) {
-                values.put(Telephony.Carriers.MMSPORT, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.MMSPROXY)) {
-                values.put(Telephony.Carriers.MMSPROXY, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.AUTH_TYPE)) {
-                values.put(Telephony.Carriers.AUTH_TYPE, -1);
-            }
-            if (!values.containsKey(Telephony.Carriers.PROTOCOL)) {
-                values.put(Telephony.Carriers.PROTOCOL, "IP");
-            }
-            if (!values.containsKey(Telephony.Carriers.ROAMING_PROTOCOL)) {
-                values.put(Telephony.Carriers.ROAMING_PROTOCOL, "IP");
-            }
-            if (!values.containsKey(Telephony.Carriers.CARRIER_ENABLED)) {
-                values.put(Telephony.Carriers.CARRIER_ENABLED, true);
-            }
-            if (!values.containsKey(Telephony.Carriers.BEARER)) {
-                values.put(Telephony.Carriers.BEARER, 0);
-            }
-            if (!values.containsKey(Telephony.Carriers.MVNO_TYPE)) {
-                values.put(Telephony.Carriers.MVNO_TYPE, "");
-            }
-            if (!values.containsKey(Telephony.Carriers.MVNO_MATCH_DATA)) {
-                values.put(Telephony.Carriers.MVNO_MATCH_DATA, "");
-            }
-
-            int subId = SubscriptionManager.getDefaultSubId();
             if (!values.containsKey(Telephony.Carriers.SUBSCRIPTION_ID)) {
+                int subId = SubscriptionManager.getDefaultSubId();
                 values.put(Telephony.Carriers.SUBSCRIPTION_ID, subId);
             }
 
-            if (!values.containsKey(Telephony.Carriers.PROFILE_ID)) {
-                values.put(Telephony.Carriers.PROFILE_ID, 0);
-            }
-            if (!values.containsKey(Telephony.Carriers.MODEM_COGNITIVE)) {
-                values.put(Telephony.Carriers.MODEM_COGNITIVE, false);
-            }
-            if (!values.containsKey(Telephony.Carriers.MAX_CONNS)) {
-                values.put(Telephony.Carriers.MAX_CONNS, 0);
-            }
-            if (!values.containsKey(Telephony.Carriers.WAIT_TIME)) {
-                values.put(Telephony.Carriers.WAIT_TIME, 0);
-            }
-            if (!values.containsKey(Telephony.Carriers.MAX_CONNS_TIME)) {
-                values.put(Telephony.Carriers.MAX_CONNS_TIME, 0);
-            }
-
             return values;
         }
 
-        private void insertAddingDefaults(SQLiteDatabase db, String table, ContentValues row) {
+        private void insertAddingDefaults(SQLiteDatabase db, ContentValues row) {
             row = setDefaultValue(row);
-            db.insert(CARRIERS_TABLE, null, row);
+            try {
+                db.insertWithOnConflict(CARRIERS_TABLE, null, row,
+                        SQLiteDatabase.CONFLICT_ABORT);
+                if (VDBG) log("dbh.insertAddingDefaults: db.insert returned >= 0; insert " +
+                        "successful for cv " + row);
+            } catch (SQLException e) {
+                if (VDBG) log("dbh.insertAddingDefaults: exception " + e);
+                // Insertion failed which could be due to a conflict. Check if that is the case and
+                // update edited field accordingly.
+                // Search for the exact same entry and update edited field.
+                // If it is USER_EDITED/CARRIER_EDITED change it to UNEDITED,
+                // and if USER/CARRIER_DELETED change it to USER/CARRIER_DELETED_BUT_PRESENT_IN_XML.
+                Cursor oldRow = selectConflictingRow(db, CARRIERS_TABLE, row);
+                if (oldRow != null) {
+                    // Update the row
+                    ContentValues mergedValues = new ContentValues();
+                    int edited = oldRow.getInt(oldRow.getColumnIndex(
+                            Telephony.Carriers.EDITED));
+                    int old_edited = edited;
+                    if (edited != Telephony.Carriers.UNEDITED) {
+                        if (edited == Telephony.Carriers.USER_DELETED) {
+                            // USER_DELETED_BUT_PRESENT_IN_XML indicates entry has been deleted
+                            // by user but present in apn xml file.
+                            edited = Telephony.Carriers.USER_DELETED_BUT_PRESENT_IN_XML;
+                        } else if (edited == Telephony.Carriers.CARRIER_DELETED) {
+                            // CARRIER_DELETED_BUT_PRESENT_IN_XML indicates entry has been deleted
+                            // by user but present in apn xml file.
+                            edited = Telephony.Carriers.CARRIER_DELETED_BUT_PRESENT_IN_XML;
+                        }
+                        mergedValues.put(Telephony.Carriers.EDITED, edited);
+                    }
+
+                    mergeFieldsAndUpdateDb(db, CARRIERS_TABLE, oldRow, row, mergedValues, false,
+                            mContext);
+
+                    if (VDBG) log("dbh.insertAddingDefaults: old edited = " + old_edited
+                            + " new edited = " + edited);
+
+                    oldRow.close();
+                }
+            }
+        }
+
+        public static void mergeFieldsAndUpdateDb(SQLiteDatabase db, String table, Cursor oldRow,
+                                                  ContentValues newRow, ContentValues mergedValues,
+                                                  boolean onUpgrade, Context context) {
+            if (newRow.containsKey(Telephony.Carriers.TYPE)) {
+                // Merge the types
+                String oldType = oldRow.getString(oldRow.getColumnIndex(Telephony.Carriers.TYPE));
+                String newType = newRow.getAsString(Telephony.Carriers.TYPE);
+
+                if (!oldType.equalsIgnoreCase(newType)) {
+                    if (oldType.equals("") || newType.equals("")) {
+                        newRow.put(Telephony.Carriers.TYPE, "");
+                    } else {
+                        String[] oldTypes = oldType.toLowerCase().split(",");
+                        String[] newTypes = newType.toLowerCase().split(",");
+
+                        if (VDBG) {
+                            log("mergeFieldsAndUpdateDb: Calling separateRowsNeeded() oldType=" +
+                                    oldType + " old bearer=" + oldRow.getInt(oldRow.getColumnIndex(
+                                    Telephony.Carriers.BEARER_BITMASK)) +
+                                    " old profile_id=" + oldRow.getInt(oldRow.getColumnIndex(
+                                    Telephony.Carriers.PROFILE_ID)) +
+                                    " newRow " + newRow);
+                        }
+
+                        // If separate rows are needed, do not need to merge any further
+                        if (separateRowsNeeded(db, table, oldRow, newRow, context, oldTypes,
+                                newTypes)) {
+                            if (VDBG) log("mergeFieldsAndUpdateDb: separateRowsNeeded() returned " +
+                                    "true");
+                            return;
+                        }
+
+                        // Merge the 2 types
+                        ArrayList<String> mergedTypes = new ArrayList<String>();
+                        mergedTypes.addAll(Arrays.asList(oldTypes));
+                        for (String s : newTypes) {
+                            if (!mergedTypes.contains(s.trim())) {
+                                mergedTypes.add(s);
+                            }
+                        }
+                        StringBuilder mergedType = new StringBuilder();
+                        for (int i = 0; i < mergedTypes.size(); i++) {
+                            mergedType.append((i == 0 ? "" : ",") + mergedTypes.get(i));
+                        }
+                        newRow.put(Telephony.Carriers.TYPE, mergedType.toString());
+                    }
+                }
+                mergedValues.put(Telephony.Carriers.TYPE, newRow.getAsString(
+                        Telephony.Carriers.TYPE));
+            }
+
+            if (newRow.containsKey(Telephony.Carriers.BEARER_BITMASK)) {
+                int oldBearer = oldRow.getInt(oldRow.getColumnIndex(Telephony.Carriers.
+                        BEARER_BITMASK));
+                int newBearer = newRow.getAsInteger(Telephony.Carriers.BEARER_BITMASK);
+                if (oldBearer != newBearer) {
+                    if (oldBearer == 0 || newBearer == 0) {
+                        newRow.put(Telephony.Carriers.BEARER_BITMASK, 0);
+                    } else {
+                        newRow.put(Telephony.Carriers.BEARER_BITMASK, (oldBearer | newBearer));
+                    }
+                }
+                mergedValues.put(Telephony.Carriers.BEARER_BITMASK, newRow.getAsInteger(
+                        Telephony.Carriers.BEARER_BITMASK));
+            }
+
+            if (!onUpgrade) {
+                mergedValues.putAll(newRow);
+            }
+
+            if (mergedValues.size() > 0) {
+                db.update(table, mergedValues, "_id=" + oldRow.getInt(oldRow.getColumnIndex("_id")),
+                        null);
+            }
+        }
+
+        private static boolean separateRowsNeeded(SQLiteDatabase db, String table, Cursor oldRow,
+                                                  ContentValues newRow, Context context,
+                                                  String[] oldTypes, String[] newTypes) {
+            // If this APN falls under persist_apns_for_plmn, and the
+            // only difference between old type and new type is that one has dun, and
+            // the APNs have profile_id 0 or not set, then set the profile_id to 1 for
+            // the dun APN/remove dun from type. This will ensure both oldRow and newRow exist
+            // separately in db.
+
+            boolean match = false;
+
+            // Check if APN falls under persist_apns_for_plmn
+            String[] persistApnsForPlmns = context.getResources().getStringArray(
+                    R.array.persist_apns_for_plmn);
+            for (String s : persistApnsForPlmns) {
+                if (s.equalsIgnoreCase(newRow.getAsString(Telephony.Carriers.
+                        NUMERIC))) {
+                    match = true;
+                    break;
+                }
+            }
+
+            if (!match) return false;
+
+            // APN falls under persist_apns_for_plmn
+            // Check if only difference between old type and new type is that
+            // one has dun
+            ArrayList<String> oldTypesAl = new ArrayList<String>(
+                    Arrays.asList(oldTypes));
+            ArrayList<String> newTypesAl = new ArrayList<String>(
+                    Arrays.asList(newTypes));
+            ArrayList<String> listWithDun = null;
+            ArrayList<String> listWithoutDun = null;
+            boolean dunInOld = false;
+            if (oldTypesAl.size() == newTypesAl.size() + 1) {
+                listWithDun = oldTypesAl;
+                listWithoutDun = newTypesAl;
+                dunInOld = true;
+            } else if (oldTypesAl.size() + 1 == newTypesAl.size()) {
+                listWithDun = newTypesAl;
+                listWithoutDun = oldTypesAl;
+            } else {
+                return false;
+            }
+
+            if (listWithDun.contains("dun") &&
+                    !listWithoutDun.contains("dun")) {
+                listWithoutDun.add("dun");
+                if (!listWithDun.containsAll(listWithoutDun)) {
+                    return false;
+                }
+
+                // Only difference between old type and new type is that
+                // one has dun
+                // Check if profile_id is 0/not set
+                if (oldRow.getInt(oldRow.getColumnIndex(Telephony.Carriers.
+                        PROFILE_ID)) == 0) {
+                    if (dunInOld) {
+                        // Update oldRow to remove dun from its type field
+                        ContentValues updateOldRow = new ContentValues();
+                        StringBuilder sb = new StringBuilder();
+                        boolean first = true;
+                        for (String s : listWithDun) {
+                            if (!s.equalsIgnoreCase("dun")) {
+                                sb.append(first ? s : "," + s);
+                                first = false;
+                            }
+                        }
+                        String updatedType = sb.toString();
+                        if (VDBG) {
+                            log("separateRowsNeeded: updating type in oldRow to " +
+                                    updatedType);
+                        }
+                        updateOldRow.put(Telephony.Carriers.TYPE, updatedType);
+                        db.update(table, updateOldRow,
+                                "_id=" + oldRow.getInt(oldRow.getColumnIndex("_id")), null);
+                        return true;
+                    } else {
+                        if (VDBG) log("separateRowsNeeded: adding profile id 1 to newRow");
+                        // Update newRow to set profile_id to 1
+                        newRow.put(Telephony.Carriers.PROFILE_ID,
+                                new Integer(1));
+                    }
+                } else {
+                    return false;
+                }
+
+                // If match was found, both oldRow and newRow need to exist
+                // separately in db. Add newRow to db.
+                try {
+                    db.insertWithOnConflict(table, null, newRow,
+                            SQLiteDatabase.CONFLICT_REPLACE);
+                    if (VDBG) log("separateRowsNeeded: added newRow with profile id 1 to db");
+                    return true;
+                } catch (SQLException e) {
+                    loge("Exception on trying to add new row after " +
+                            "updating profile_id");
+                }
+            }
+
+            return false;
+        }
+
+        public static Cursor selectConflictingRow(SQLiteDatabase db, String table,
+                                                  ContentValues row) {
+            // Conflict is possible only when numeric, mcc, mnc (fields without any default value)
+            // are set in the new row
+            if (!row.containsKey(Telephony.Carriers.NUMERIC) ||
+                    !row.containsKey(Telephony.Carriers.MCC) ||
+                    !row.containsKey(Telephony.Carriers.MNC)) {
+                loge("dbh.selectConflictingRow: called for non-conflicting row: " + row);
+                return null;
+            }
+
+            String[] columns = { "_id",
+                    Telephony.Carriers.TYPE,
+                    Telephony.Carriers.EDITED,
+                    Telephony.Carriers.BEARER_BITMASK,
+                    Telephony.Carriers.PROFILE_ID };
+            String selection = "numeric=? AND mcc=? AND mnc=? AND apn=? AND proxy=? AND port=? "
+                    + "AND mmsproxy=? AND mmsport=? AND mmsc=? AND carrier_enabled=? AND bearer=? "
+                    + "AND mvno_type=? AND mvno_match_data=? AND profile_id=?";
+            int i = 0;
+            String[] selectionArgs = new String[14];
+            selectionArgs[i++] = row.getAsString(Telephony.Carriers.NUMERIC);
+            selectionArgs[i++] = row.getAsString(Telephony.Carriers.MCC);
+            selectionArgs[i++] = row.getAsString(Telephony.Carriers.MNC);
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.APN) ?
+                    row.getAsString(Telephony.Carriers.APN) : "";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.PROXY) ?
+                    row.getAsString(Telephony.Carriers.PROXY) : "";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.PORT) ?
+                    row.getAsString(Telephony.Carriers.PORT) : "";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.MMSPROXY) ?
+                    row.getAsString(Telephony.Carriers.MMSPROXY) : "";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.MMSPORT) ?
+                    row.getAsString(Telephony.Carriers.MMSPORT) : "";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.MMSC) ?
+                    row.getAsString(Telephony.Carriers.MMSC) : "";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.CARRIER_ENABLED) &&
+                    (row.getAsString(Telephony.Carriers.CARRIER_ENABLED).equals("0") ||
+                            row.getAsString(Telephony.Carriers.CARRIER_ENABLED).equals("false")) ?
+                    "0" : "1";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.BEARER) ?
+                    row.getAsString(Telephony.Carriers.BEARER) : "0";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.MVNO_TYPE) ?
+                    row.getAsString(Telephony.Carriers.MVNO_TYPE) : "";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.MVNO_MATCH_DATA) ?
+                    row.getAsString(Telephony.Carriers.MVNO_MATCH_DATA) : "";
+            selectionArgs[i++] = row.containsKey(Telephony.Carriers.PROFILE_ID) ?
+                    row.getAsString(Telephony.Carriers.PROFILE_ID) : "0";
+
+            Cursor c = db.query(table, columns, selection, selectionArgs, null, null, null);
+
+            if (c != null) {
+                if (c.getCount() == 1) {
+                    if (VDBG) log("dbh.selectConflictingRow: " + c.getCount() + " conflicting " +
+                            "row found");
+                    if (c.moveToFirst()) {
+                        return c;
+                    } else {
+                        loge("dbh.selectConflictingRow: moveToFirst() failed");
+                    }
+                } else {
+                    loge("dbh.selectConflictingRow: Expected 1 but found " + c.getCount() +
+                            " matching rows found for cv " + row);
+                }
+                c.close();
+            } else {
+                loge("dbh.selectConflictingRow: Error - c is null; no matching row found for " +
+                        "cv " + row);
+            }
+
+            return null;
         }
     }
 
     @Override
     public boolean onCreate() {
-        if (VDBG) log("onCreate:+");
         mOpenHelper = new DatabaseHelper(getContext());
+
+        // Call getReadableDatabase() to make sure onUpgrade is called
+        if (VDBG) log("onCreate: calling getReadableDatabase to trigger onUpgrade");
+        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+
+        // Update APN db on build update
+        String newBuildId = SystemProperties.get("ro.build.id", null);
+        if (!TextUtils.isEmpty(newBuildId)) {
+            // Check if build id has changed
+            SharedPreferences sp = getContext().getSharedPreferences(BUILD_ID_FILE,
+                    Context.MODE_PRIVATE);
+            String oldBuildId = sp.getString(RO_BUILD_ID, "");
+            if (!newBuildId.equals(oldBuildId)) {
+                if (DBG) log("onCreate: build id changed from " + oldBuildId + " to " +
+                        newBuildId);
+
+                // Get rid of old preferred apn shared preferences
+                SubscriptionManager sm = SubscriptionManager.from(getContext());
+                if (sm != null) {
+                    List<SubscriptionInfo> subInfoList = sm.getAllSubscriptionInfoList();
+                    for (SubscriptionInfo subInfo : subInfoList) {
+                        SharedPreferences spPrefFile = getContext().getSharedPreferences(
+                                PREF_FILE + subInfo.getSubscriptionId(), Context.MODE_PRIVATE);
+                        if (spPrefFile != null) {
+                            SharedPreferences.Editor editor = spPrefFile.edit();
+                            editor.clear();
+                            editor.apply();
+                        }
+                    }
+                }
+
+                // Update APN DB
+                updateApnDb();
+            } else {
+                if (VDBG) log("onCreate: build id did not change: " + oldBuildId);
+            }
+            sp.edit().putString(RO_BUILD_ID, newBuildId).apply();
+        } else {
+            if (VDBG) log("onCreate: newBuildId is empty");
+        }
+
         if (VDBG) log("onCreate:- ret true");
         return true;
     }
 
     private void setPreferredApnId(Long id, int subId) {
         SharedPreferences sp = getContext().getSharedPreferences(
-                PREF_FILE + subId, Context.MODE_PRIVATE);
+                PREF_FILE, Context.MODE_PRIVATE);
         SharedPreferences.Editor editor = sp.edit();
-        editor.putLong(COLUMN_APN_ID, id != null ? id.longValue() : -1);
+        editor.putLong(COLUMN_APN_ID + subId, id != null ? id.longValue() : -1);
         editor.apply();
     }
 
     private long getPreferredApnId(int subId) {
         SharedPreferences sp = getContext().getSharedPreferences(
-                PREF_FILE + subId, Context.MODE_PRIVATE);
-        return sp.getLong(COLUMN_APN_ID, -1);
+                PREF_FILE, Context.MODE_PRIVATE);
+        return sp.getLong(COLUMN_APN_ID + subId, -1);
+    }
+
+    private void deletePreferredApnId() {
+        SharedPreferences sp = getContext().getSharedPreferences(
+                PREF_FILE, Context.MODE_PRIVATE);
+        SharedPreferences.Editor editor = sp.edit();
+        editor.clear();
+        editor.apply();
     }
 
     @Override
-    public Cursor query(Uri url, String[] projectionIn, String selection,
+    public synchronized Cursor query(Uri url, String[] projectionIn, String selection,
             String[] selectionArgs, String sort) {
+        if (VDBG) log("query: url=" + url + ", projectionIn=" + projectionIn + ", selection="
+            + selection + "selectionArgs=" + selectionArgs + ", sort=" + sort);
         TelephonyManager mTelephonyManager =
                 (TelephonyManager)getContext().getSystemService(Context.TELEPHONY_SERVICE);
         int subId = SubscriptionManager.getDefaultSubId();
         String subIdString;
         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
         qb.setStrict(true); // a little protection from injection attacks
-        qb.setTables("carriers");
+        qb.setTables(CARRIERS_TABLE);
 
         int match = s_urlMatcher.match(url);
         switch (match) {
@@ -692,7 +1415,7 @@
                 // FIXME alter the selection to pass subId
                 // selection = selection + "and subId = "
             }
-            //intentional fall through from above case
+            // intentional fall through from above case
             // do nothing
             case URL_TELEPHONY: {
                 break;
@@ -774,6 +1497,19 @@
         SQLiteDatabase db = mOpenHelper.getReadableDatabase();
         Cursor ret = null;
         try {
+            // Exclude entries marked deleted
+            if (CARRIERS_TABLE.equals(qb.getTables())) {
+                if (TextUtils.isEmpty(selection)) {
+                    selection = "";
+                } else {
+                    selection += " and ";
+                }
+                selection += "edited!=" + Telephony.Carriers.USER_DELETED + " and edited!="
+                        + Telephony.Carriers.USER_DELETED_BUT_PRESENT_IN_XML + " and edited!="
+                        + Telephony.Carriers.CARRIER_DELETED + " and edited!="
+                        + Telephony.Carriers.CARRIER_DELETED_BUT_PRESENT_IN_XML;
+                if (VDBG) log("query: selection modified to " + selection);
+            }
             ret = qb.query(db, projectionIn, selection, selectionArgs, null, null, sort);
         } catch (SQLException e) {
             loge("got exception when querying: " + e);
@@ -806,7 +1542,7 @@
     }
 
     @Override
-    public Uri insert(Uri url, ContentValues initialValues)
+    public synchronized Uri insert(Uri url, ContentValues initialValues)
     {
         Uri result = null;
         int subId = SubscriptionManager.getDefaultSubId();
@@ -841,15 +1577,35 @@
                 }
 
                 values = DatabaseHelper.setDefaultValue(values);
-
-                long rowID = db.insert(CARRIERS_TABLE, null, values);
-                if (rowID > 0)
-                {
-                    result = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, rowID);
-                    notify = true;
+                if (!values.containsKey(Telephony.Carriers.EDITED)) {
+                    values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
                 }
 
-                if (VDBG) log("inserted " + values.toString() + " rowID = " + rowID);
+                try {
+                    // Replace on conflict so that if same APN is present in db with edited
+                    // as Telephony.Carriers.UNEDITED or USER/CARRIER_DELETED, it is replaced with
+                    // edited USER/CARRIER_EDITED
+                    long rowID = db.insertWithOnConflict(CARRIERS_TABLE, null, values,
+                            SQLiteDatabase.CONFLICT_REPLACE);
+                    if (rowID >= 0) {
+                        result = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, rowID);
+                        notify = true;
+                    }
+                    if (VDBG) log("insert: inserted " + values.toString() + " rowID = " + rowID);
+                } catch (SQLException e) {
+                    log("insert: exception " + e);
+                    // Insertion failed which could be due to a conflict. Check if that is the case
+                    // and merge the entries
+                    Cursor oldRow = DatabaseHelper.selectConflictingRow(db, CARRIERS_TABLE, values);
+                    if (oldRow != null) {
+                        ContentValues mergedValues = new ContentValues();
+                        DatabaseHelper.mergeFieldsAndUpdateDb(db, CARRIERS_TABLE, oldRow, values,
+                                mergedValues, false, getContext());
+                        oldRow.close();
+                        notify = true;
+                    }
+                }
+
                 break;
             }
 
@@ -869,11 +1625,11 @@
 
             case URL_CURRENT:
             {
-                // null out the previous operator
-                db.update("carriers", s_currentNullMap, "current IS NOT NULL", null);
+                // zero out the previous operator
+                db.update(CARRIERS_TABLE, s_currentNullMap, "current!=0", null);
 
-                String numeric = initialValues.getAsString("numeric");
-                int updated = db.update("carriers", s_currentSetMap,
+                String numeric = initialValues.getAsString(Telephony.Carriers.NUMERIC);
+                int updated = db.update(CARRIERS_TABLE, s_currentSetMap,
                         "numeric = '" + numeric + "'", null);
 
                 if (updated > 0)
@@ -928,10 +1684,18 @@
     }
 
     @Override
-    public int delete(Uri url, String where, String[] whereArgs)
+    public synchronized int delete(Uri url, String where, String[] whereArgs)
     {
         int count = 0;
         int subId = SubscriptionManager.getDefaultSubId();
+        String userOrCarrierEdited = ") and (" +
+                Telephony.Carriers.EDITED + "=" + Telephony.Carriers.USER_EDITED +  " or " +
+                Telephony.Carriers.EDITED + "=" + Telephony.Carriers.CARRIER_EDITED + ")";
+        String notUserOrCarrierEdited = ") and (" +
+                Telephony.Carriers.EDITED + "!=" + Telephony.Carriers.USER_EDITED +  " and " +
+                Telephony.Carriers.EDITED + "!=" + Telephony.Carriers.CARRIER_EDITED + ")";
+        ContentValues cv = new ContentValues();
+        cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_DELETED);
 
         checkPermission();
 
@@ -955,7 +1719,11 @@
 
             case URL_TELEPHONY:
             {
-                count = db.delete(CARRIERS_TABLE, where, whereArgs);
+                // Delete user/carrier edited entries
+                count = db.delete(CARRIERS_TABLE, "(" + where + userOrCarrierEdited, whereArgs);
+                // Otherwise mark as user deleted instead of deleting
+                count += db.update(CARRIERS_TABLE, cv, "(" + where + notUserOrCarrierEdited,
+                        whereArgs);
                 break;
             }
 
@@ -974,13 +1742,23 @@
 
             case URL_CURRENT:
             {
-                count = db.delete(CARRIERS_TABLE, where, whereArgs);
+                // Delete user/carrier edited entries
+                count = db.delete(CARRIERS_TABLE, "(" + where + userOrCarrierEdited, whereArgs);
+                // Otherwise mark as user deleted instead of deleting
+                count += db.update(CARRIERS_TABLE, cv, "(" + where + notUserOrCarrierEdited,
+                        whereArgs);
                 break;
             }
 
             case URL_ID:
             {
-                count = db.delete(CARRIERS_TABLE, Telephony.Carriers._ID + "=?",
+                // Delete user/carrier edited entries
+                count = db.delete(CARRIERS_TABLE,
+                        "(" + Telephony.Carriers._ID + "=?" + userOrCarrierEdited,
+                        new String[] { url.getLastPathSegment() });
+                // Otherwise mark as user deleted instead of deleting
+                count += db.update(CARRIERS_TABLE, cv,
+                        "(" + Telephony.Carriers._ID + "=?" + notUserOrCarrierEdited,
                         new String[] { url.getLastPathSegment() });
                 break;
             }
@@ -1028,6 +1806,12 @@
                 break;
             }
 
+            case URL_UPDATE_DB: {
+                updateApnDb();
+                count = 1;
+                break;
+            }
+
             default: {
                 throw new UnsupportedOperationException("Cannot delete that URL: " + url);
             }
@@ -1042,7 +1826,7 @@
     }
 
     @Override
-    public int update(Uri url, ContentValues values, String where, String[] whereArgs)
+    public synchronized int update(Uri url, ContentValues values, String where, String[] whereArgs)
     {
         int count = 0;
         int uriType = URL_UNKNOWN;
@@ -1070,7 +1854,15 @@
 
             case URL_TELEPHONY:
             {
-                count = db.update(CARRIERS_TABLE, values, where, whereArgs);
+                if (!values.containsKey(Telephony.Carriers.EDITED)) {
+                    values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                }
+
+                // Replace on conflict so that if same APN is present in db with edited
+                // as Telephony.Carriers.UNEDITED or USER/CARRIER_DELETED, it is replaced with
+                // edited USER/CARRIER_EDITED
+                count = db.updateWithOnConflict(CARRIERS_TABLE, values, where, whereArgs,
+                        SQLiteDatabase.CONFLICT_REPLACE);
                 break;
             }
 
@@ -1090,7 +1882,14 @@
 
             case URL_CURRENT:
             {
-                count = db.update(CARRIERS_TABLE, values, where, whereArgs);
+                if (!values.containsKey(Telephony.Carriers.EDITED)) {
+                    values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                }
+                // Replace on conflict so that if same APN is present in db with edited
+                // as Telephony.Carriers.UNEDITED or USER/CARRIER_DELETED, it is replaced with
+                // edited USER/CARRIER_EDITED
+                count = db.updateWithOnConflict(CARRIERS_TABLE, values, where, whereArgs,
+                        SQLiteDatabase.CONFLICT_REPLACE);
                 break;
             }
 
@@ -1100,8 +1899,15 @@
                     throw new UnsupportedOperationException(
                             "Cannot update URL " + url + " with a where clause");
                 }
-                count = db.update(CARRIERS_TABLE, values, Telephony.Carriers._ID + "=?",
-                        new String[] { url.getLastPathSegment() });
+                if (!values.containsKey(Telephony.Carriers.EDITED)) {
+                    values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                }
+                // Replace on conflict so that if same APN is present in db with edited
+                // as Telephony.Carriers.UNEDITED or USER/CARRIER_DELETED, it is replaced with
+                // edited USER/CARRIER_EDITED
+                count = db.updateWithOnConflict(CARRIERS_TABLE, values,
+                        Telephony.Carriers._ID + "=?", new String[] { url.getLastPathSegment() },
+                        SQLiteDatabase.CONFLICT_REPLACE);
                 break;
             }
 
@@ -1194,6 +2000,28 @@
         mOpenHelper.initDatabase(db);
     }
 
+    private synchronized void updateApnDb() {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+
+        // Delete preferred APN for all subIds
+        deletePreferredApnId();
+
+        // Delete entries in db
+        try {
+            if (VDBG) log("updateApnDb: deleting edited=Telephony.Carriers.UNEDITED entries");
+            db.delete(CARRIERS_TABLE, "edited=" + Telephony.Carriers.UNEDITED, null);
+        } catch (SQLException e) {
+            loge("got exception when deleting to update: " + e);
+        }
+
+        mOpenHelper.initDatabase(db);
+
+        // Notify listereners of DB change since DB has been updated
+        getContext().getContentResolver().notifyChange(
+                Telephony.Carriers.CONTENT_URI, null, true, UserHandle.USER_ALL);
+
+    }
+
     /**
      * Log with debug
      *
