diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index e604196..f47959e 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -38,6 +38,7 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Telephony;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
@@ -56,6 +57,7 @@
 import java.lang.NumberFormatException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 public class TelephonyProvider extends ContentProvider
 {
@@ -99,14 +101,6 @@
     private static final ContentValues s_currentNullMap;
     private static final ContentValues s_currentSetMap;
 
-    private static final int USER_EDITED_UNTOUCHED = 0;
-    private static final int USER_EDITED_EDITED = 1;
-    private static final int USER_EDITED_DELETED = 2;
-        // DELETED_BUT_PRESENT is an intermediate value used to indicate that an entry deleted
-        // by the user is still present in the new APN database and therefore must remain tagged
-        // as user deleted rather than completely removed from the database
-    private static final int USER_EDITED_DELETED_BUT_PRESENT = 3;
-
     static {
         s_urlMatcher.addURI("telephony", "carriers", URL_TELEPHONY);
         s_urlMatcher.addURI("telephony", "carriers/current", URL_CURRENT);
@@ -224,7 +218,7 @@
             // Set up the database schema
             if (DBG) log("dbh.createCarriersTable: " + tableName);
             db.execSQL("CREATE TABLE " + tableName +
-                "(_id INTEGER PRIMARY KEY," +
+                    "(_id INTEGER PRIMARY KEY," +
                     "name TEXT DEFAULT ''," +
                     "numeric TEXT DEFAULT ''," +
                     "mcc TEXT DEFAULT ''," +
@@ -254,9 +248,8 @@
                     "wait_time INTEGER DEFAULT 0," +
                     "max_conns_time INTEGER DEFAULT 0," +
                     "mtu INTEGER DEFAULT 0," +
-                    "user_edited INTEGER DEFAULT " + USER_EDITED_UNTOUCHED + "," +
-                    // Uniqueness collisions are used to trigger merge code so
-                    // if a field is listed
+                    "user_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, user_edited,
                     // user, server, password, authtype, type, protocol, roaming_protocol, sub_id,
@@ -266,6 +259,10 @@
             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
@@ -329,21 +326,29 @@
                 loge("initDatabase: Exception while parsing '" + confFile.getAbsolutePath() + "'" +
                         e);
             } finally {
-                // Get rid of user deleted entries that are not present in apn xml file. Those
-                // entries have user_edited value USER_EDITED_DELETED.
-                // Update user_edited value from USER_EDITED_DELETED_BUT_PRESENT
-                // to USER_EDITED_DELETED.
-                // USER_EDITED_DELETED_BUT_PRESENT indicates rows deleted by user but still
-                // present in the xml file. Mark them as user deleted (2).
+                // Get rid of user/carrier deleted entries that are not present in apn xml file.
+                // Those entries have user_edited value USER_DELETED/CARRIER_DELETED.
                 if (VDBG) {
-                    log("initDatabase: deleting USER_EDITED_DELETED and replacing "
-                            + "USER_EDITED_DELETED_BUT_PRESENT with USER_EDITED_DELETED");
+                    log("initDatabase: deleting USER_DELETED and replacing "
+                            + "DELETED_BUT_PRESENT_IN_XML with DELETED");
                 }
-                db.delete(CARRIERS_TABLE, "user_edited=" + USER_EDITED_DELETED, null);
+
+                // Delete USER_DELETED
+                db.delete(CARRIERS_TABLE, "user_edited=" + Telephony.Carriers.USER_DELETED + " or " +
+                        "user_edited=" + Telephony.Carriers.CARRIER_DELETED, null);
+
+                // Change USER_DELETED_BUT_PRESENT_IN_XML to USER_DELETED
                 ContentValues cv = new ContentValues();
-                cv.put(Telephony.Carriers.USER_EDITED, USER_EDITED_DELETED);
-                db.update(CARRIERS_TABLE, cv, "user_edited=" + USER_EDITED_DELETED_BUT_PRESENT,
+                cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_DELETED);
+                db.update(CARRIERS_TABLE, cv, "user_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, "user_edited=" + Telephony.Carriers.CARRIER_DELETED_BUT_PRESENT_IN_XML,
+                        null);
+
                 if (confreader != null) {
                     try {
                         confreader.close();
@@ -465,175 +470,7 @@
 
                 createCarriersTable(db, CARRIERS_TABLE_TMP);
 
-                // 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
-                        val = getValueFromCursor(c, Telephony.Carriers.NAME);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.NAME, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.NUMERIC);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.NUMERIC, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MCC);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MCC, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MNC);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MNC, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.APN);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.APN, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.USER);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.USER, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.SERVER);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.SERVER, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.PASSWORD);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.PASSWORD, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.PROXY);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.PROXY, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.PORT);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.PORT, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MMSPROXY);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MMSPROXY, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MMSPORT);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MMSPORT, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MMSC);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MMSC, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.TYPE);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.TYPE, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.PROTOCOL);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.PROTOCOL, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.ROAMING_PROTOCOL);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.ROAMING_PROTOCOL, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MVNO_TYPE);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MVNO_TYPE, val);
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MVNO_MATCH_DATA);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MVNO_MATCH_DATA, val);
-                        }
-
-                        // bool/int vals
-                        val = getValueFromCursor(c, Telephony.Carriers.AUTH_TYPE);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.AUTH_TYPE, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.CURRENT);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.CURRENT, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.CARRIER_ENABLED);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.CARRIER_ENABLED, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.BEARER);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.BEARER, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.SUBSCRIPTION_ID);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.SUBSCRIPTION_ID, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.PROFILE_ID);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.PROFILE_ID, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MODEM_COGNITIVE);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MODEM_COGNITIVE, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MAX_CONNS);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MAX_CONNS, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.WAIT_TIME);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.WAIT_TIME, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MAX_CONNS_TIME);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MAX_CONNS_TIME, new Integer(val));
-                        }
-                        val = getValueFromCursor(c, Telephony.Carriers.MTU);
-                        if (val != null) {
-                            cv.put(Telephony.Carriers.MTU, new Integer(val));
-                        }
-
-                        // New USER_EDITED column. Default value (USER_EDITED_UNTOUCHED) will
-                        // be used for all rows except for non-mvno entries for plmns indicated
-                        // by resource: those will be set to USER_EDITED_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)))) {
-                                cv.put(Telephony.Carriers.USER_EDITED, USER_EDITED_EDITED);
-                                break;
-                            }
-                        }
-
-                        try {
-                            db.insertWithOnConflict(CARRIERS_TABLE_TMP, null, cv,
-                                    SQLiteDatabase.CONFLICT_ABORT);
-                            if (VDBG) {
-                                log("dbh.onUpgrade: db.insert returned >= 0; insert "
-                                        + "successful for cv " + cv);
-                            }
-                        } catch (SQLException e) {
-                            if (VDBG) log("dbh.onUpgrade insertWithOnConflict 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_TMP, cv);
-                            if (oldRow != null) {
-                                ContentValues mergedValues = new ContentValues();
-                                mergeFieldsAndUpdateDb(db, CARRIERS_TABLE_TMP, oldRow, cv,
-                                        mergedValues, true);
-                                oldRow.close();
-                            }
-                        }
-                    }
-                    c.close();
-                }
+                populateNewTable(db, c);
 
                 db.execSQL("DROP TABLE IF EXISTS " + CARRIERS_TABLE);
 
@@ -647,15 +484,15 @@
                     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, "user_edited=" + USER_EDITED_UNTOUCHED, null,
+                    c = db.query(CARRIERS_TABLE, proj, "user_edited=" + Telephony.Carriers.UNEDITED, null,
                             null, null, null);
                     log("dbh.onUpgrade:- after upgrading total number of rows with user_edited="
-                            + USER_EDITED_UNTOUCHED + ": " + c.getCount());
+                            + Telephony.Carriers.UNEDITED + ": " + c.getCount());
                     c.close();
-                    c = db.query(CARRIERS_TABLE, proj, "user_edited!=" + USER_EDITED_UNTOUCHED,
+                    c = db.query(CARRIERS_TABLE, proj, "user_edited!=" + Telephony.Carriers.UNEDITED,
                             null, null, null, null);
                     log("dbh.onUpgrade:- after upgrading total number of rows with user_edited!="
-                            + USER_EDITED_UNTOUCHED + ": " + c.getCount());
+                            + Telephony.Carriers.UNEDITED + ": " + c.getCount());
                     c.close();
                 }
             }
@@ -664,9 +501,103 @@
             }
         }
 
-        private String getValueFromCursor(Cursor c, String key) {
+        private void populateNewTable(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);
+
+                    // 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)))) {
+                            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.populateNewTable: db.insert returned >= 0; insert "
+                                    + "successful for cv " + cv);
+                        }
+                    } catch (SQLException e) {
+                        if (VDBG) log("dbh.populateNewTable insertWithOnConflict 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_TMP, cv);
+                        if (oldRow != null) {
+                            ContentValues mergedValues = new ContentValues();
+                            mergeFieldsAndUpdateDb(db, CARRIERS_TABLE_TMP, oldRow, cv,
+                                    mergedValues, true);
+                            oldRow.close();
+                        }
+                    }
+                }
+                c.close();
+            }
+        }
+
+        private void getStringValueFromCursor(ContentValues cv, Cursor c, String key) {
             String fromCursor = c.getString(c.getColumnIndex(key));
-            return !TextUtils.isEmpty(fromCursor) ? fromCursor : null;
+            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)) {
+                cv.put(key, new Integer(fromCursor));
+            }
         }
 
         /**
@@ -692,80 +623,29 @@
             map.put(Telephony.Carriers.NAME, parser.getAttributeValue(null, "carrier"));
 
             // do not add NULL to the map so that default values can be inserted in db
-            String apn = parser.getAttributeValue(null, "apn");
-            if (apn != null) {
-                map.put(Telephony.Carriers.APN, apn);
-            }
+            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 user = parser.getAttributeValue(null, "user");
-            if (user != null) {
-                map.put(Telephony.Carriers.USER, user);
-            }
+            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 server = parser.getAttributeValue(null, "server");
-            if (server != null) {
-                map.put(Telephony.Carriers.SERVER, server);
-            }
-
-            String password = parser.getAttributeValue(null, "password");
-            if (password != null) {
-                map.put(Telephony.Carriers.PASSWORD, password);
-            }
-
-            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);
-            }
-
-            String mmsc = parser.getAttributeValue(null, "mmsc");
-            if (mmsc != null) {
-                map.put(Telephony.Carriers.MMSC, mmsc);
-            }
-
-            String type = parser.getAttributeValue(null, "type");
-            if (type != null) {
-                map.put(Telephony.Carriers.TYPE, type);
-            }
-
-            String auth = parser.getAttributeValue(null, "authtype");
-            if (auth != null) {
-                map.put(Telephony.Carriers.AUTH_TYPE, Integer.parseInt(auth));
-            }
-
-            String protocol = parser.getAttributeValue(null, "protocol");
-            if (protocol != null) {
-                map.put(Telephony.Carriers.PROTOCOL, protocol);
-            }
-
-            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));
-            }
+            addBoolAttribute(parser, "carrier_enabled", map, Telephony.Carriers.CARRIER_ENABLED);
+            addBoolAttribute(parser, "modem_cognitive", map, Telephony.Carriers.MODEM_COGNITIVE);
 
             String mvno_type = parser.getAttributeValue(null, "mvno_type");
             if (mvno_type != null) {
@@ -776,39 +656,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
          *
@@ -863,24 +737,28 @@
                 // Insertion failed which could be due to a conflict. Check if that is the case and
                 // update user_edited field accordingly.
                 // Search for the exact same entry and update user_edited field.
-                // If it is USER_EDITED_EDITED change it to USER_EDITED_UNTOUCHED,
-                // and if USER_EDITED_DELETED change it to USER_EDITED_DELETED_BUT_PRESENT.
+                // 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 user_edited = oldRow.getInt(oldRow.getColumnIndex(
-                            Telephony.Carriers.USER_EDITED));
+                            Telephony.Carriers.EDITED));
                     int old_user_edited = user_edited;
-                    if (user_edited != USER_EDITED_UNTOUCHED) {
-                        if (user_edited == USER_EDITED_EDITED) {
-                            user_edited = USER_EDITED_UNTOUCHED;
-                        } else if (user_edited == USER_EDITED_DELETED) {
-                            // user_edited 3 indicates entry has been deleted by user but present in
-                            // apn xml file.
-                            user_edited = USER_EDITED_DELETED_BUT_PRESENT;
+                    if (user_edited != Telephony.Carriers.UNEDITED) {
+                        if (user_edited == Telephony.Carriers.USER_EDITED || user_edited == Telephony.Carriers.CARRIER_EDITED) {
+                            user_edited = Telephony.Carriers.UNEDITED;
+                        } else if (user_edited == Telephony.Carriers.USER_DELETED) {
+                            // USER_DELETED_BUT_PRESENT_IN_XML indicates entry has been deleted
+                            // by user but present in apn xml file.
+                            user_edited = Telephony.Carriers.USER_DELETED_BUT_PRESENT_IN_XML;
+                        } else if (user_edited == Telephony.Carriers.CARRIER_DELETED) {
+                            // CARRIER_DELETED_BUT_PRESENT_IN_XML indicates entry has been deleted
+                            // by user but present in apn xml file.
+                            user_edited = Telephony.Carriers.CARRIER_DELETED_BUT_PRESENT_IN_XML;
                         }
-                        mergedValues.put(Telephony.Carriers.USER_EDITED, user_edited);
+                        mergedValues.put(Telephony.Carriers.EDITED, user_edited);
                     }
 
                     mergeFieldsAndUpdateDb(db, CARRIERS_TABLE, oldRow, row, mergedValues, false);
@@ -944,7 +822,7 @@
                 return null;
             }
 
-            String[] columns = { "_id", Telephony.Carriers.TYPE, Telephony.Carriers.USER_EDITED };
+            String[] columns = { "_id", Telephony.Carriers.TYPE, Telephony.Carriers.EDITED };
             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=?";
@@ -981,17 +859,17 @@
             Cursor c = db.query(table, columns, selection, selectionArgs, null, null, null);
 
             if (c != null) {
-                if (c.getCount() > 0) {
+                if (c.getCount() == 1) {
                     if (VDBG) log("dbh.selectConflictingRow: " + c.getCount() + " conflicting " +
-                            "row(s) found");
+                            "row found");
                     if (c.moveToFirst()) {
                         return c;
                     } else {
                         loge("dbh.selectConflictingRow: moveToFirst() failed");
                     }
                 } else {
-                    loge("dbh.selectConflictingRow: " + c.getCount() + " matching row found for " +
-                            "cv " + row);
+                    loge("dbh.selectConflictingRow: Expected 1 but found " + c.getCount() +
+                            " matching rows found for cv " + row);
                 }
                 c.close();
             } else {
@@ -1021,6 +899,23 @@
             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);
@@ -1035,7 +930,6 @@
     }
 
     private void setPreferredApnId(Long id, int subId) {
-        //todo: remove old PREF_FILE+subId SharedPreferences
         SharedPreferences sp = getContext().getSharedPreferences(
                 PREF_FILE, Context.MODE_PRIVATE);
         SharedPreferences.Editor editor = sp.edit();
@@ -1058,7 +952,7 @@
     }
 
     @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);
@@ -1174,8 +1068,10 @@
                 } else {
                     selection += " and ";
                 }
-                selection += "user_edited!=" + USER_EDITED_DELETED + " and user_edited!="
-                        + USER_EDITED_DELETED_BUT_PRESENT;
+                selection += "user_edited!=" + Telephony.Carriers.USER_DELETED + " and user_edited!="
+                        + Telephony.Carriers.USER_DELETED_BUT_PRESENT_IN_XML + " and user_edited!="
+                        + Telephony.Carriers.CARRIER_DELETED + " and user_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);
@@ -1210,7 +1106,7 @@
     }
 
     @Override
-    public Uri insert(Uri url, ContentValues initialValues)
+    public synchronized Uri insert(Uri url, ContentValues initialValues)
     {
         Uri result = null;
         int subId = SubscriptionManager.getDefaultSubId();
@@ -1245,12 +1141,14 @@
                 }
 
                 values = DatabaseHelper.setDefaultValue(values);
-                values.put(Telephony.Carriers.USER_EDITED, USER_EDITED_EDITED);
+                if (!values.containsKey(Telephony.Carriers.EDITED)) {
+                    values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                }
 
                 try {
                     // Replace on conflict so that if same APN is present in db with user_edited
-                    // as USER_EDITED_UNTOUCHED or USER_EDITED_DELETED, it is replaced with
-                    // user_edited USER_EDITED_EDITED
+                    // as Telephony.Carriers.UNEDITED or USER/CARRIER_DELETED, it is replaced with
+                    // user_edited USER/CARRIER_EDITED
                     long rowID = db.insertWithOnConflict(CARRIERS_TABLE, null, values,
                             SQLiteDatabase.CONFLICT_REPLACE);
                     if (rowID >= 0) {
@@ -1349,12 +1247,12 @@
     }
 
     @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();
         ContentValues cv = new ContentValues();
-        cv.put(Telephony.Carriers.USER_EDITED, USER_EDITED_DELETED);
+        cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_DELETED);
 
         checkPermission();
 
@@ -1474,7 +1372,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;
@@ -1502,11 +1400,13 @@
 
             case URL_TELEPHONY:
             {
-                values.put(Telephony.Carriers.USER_EDITED, USER_EDITED_EDITED);
+                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 user_edited
-                // as USER_EDITED_UNTOUCHED or USER_EDITED_DELETED, it is replaced with
-                // user_edited USER_EDITED_EDITED
+                // as Telephony.Carriers.UNEDITED or USER/CARRIER_DELETED, it is replaced with
+                // user_edited USER/CARRIER_EDITED
                 count = db.updateWithOnConflict(CARRIERS_TABLE, values, where, whereArgs,
                         SQLiteDatabase.CONFLICT_REPLACE);
                 break;
@@ -1528,10 +1428,12 @@
 
             case URL_CURRENT:
             {
-                values.put(Telephony.Carriers.USER_EDITED, USER_EDITED_EDITED);
+                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 user_edited
-                // as USER_EDITED_UNTOUCHED or USER_EDITED_DELETED, it is replaced with
-                // user_edited USER_EDITED_EDITED
+                // as Telephony.Carriers.UNEDITED or USER/CARRIER_DELETED, it is replaced with
+                // user_edited USER/CARRIER_EDITED
                 count = db.updateWithOnConflict(CARRIERS_TABLE, values, where, whereArgs,
                         SQLiteDatabase.CONFLICT_REPLACE);
                 break;
@@ -1543,10 +1445,12 @@
                     throw new UnsupportedOperationException(
                             "Cannot update URL " + url + " with a where clause");
                 }
-                values.put(Telephony.Carriers.USER_EDITED, USER_EDITED_EDITED);
+                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 user_edited
-                // as USER_EDITED_UNTOUCHED or USER_EDITED_DELETED, it is replaced with
-                // user_edited USER_EDITED_EDITED
+                // as Telephony.Carriers.UNEDITED or USER/CARRIER_DELETED, it is replaced with
+                // user_edited USER/CARRIER_EDITED
                 count = db.updateWithOnConflict(CARRIERS_TABLE, values,
                         Telephony.Carriers._ID + "=?", new String[] { url.getLastPathSegment() },
                         SQLiteDatabase.CONFLICT_REPLACE);
@@ -1642,33 +1546,26 @@
         mOpenHelper.initDatabase(db);
     }
 
-    private void updateApnDb() {
+    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 user_edited=USER_EDITED_UNTOUCHED entries");
-            db.delete(CARRIERS_TABLE, "user_edited=" + USER_EDITED_UNTOUCHED, null);
+            if (VDBG) log("updateApnDb: deleting user_edited=Telephony.Carriers.UNEDITED entries");
+            db.delete(CARRIERS_TABLE, "user_edited=" + Telephony.Carriers.UNEDITED, null);
         } catch (SQLException e) {
             loge("got exception when deleting to update: " + e);
         }
 
-        // Delete preferred APN for all subIds
-        long currentPreferredApnId = getPreferredApnId(SubscriptionManager.getDefaultSubId());
-        Cursor c = db.query(CARRIERS_TABLE, null, "_id=" + currentPreferredApnId, null, null, null,
-                null);
-        if (VDBG) {
-            log("updateApnDb: currentPreferredApnId = " + currentPreferredApnId);
-            if (c != null && c.getCount() != 0) {
-                c.moveToNext();
-                log("updateApnDb: NAME=" + c.getString(c.getColumnIndex(Telephony.Carriers.NAME)));
-            }
-        }
-        deletePreferredApnId();
-
         mOpenHelper.initDatabase(db);
 
-        // TODO: restore preference APN ID
-        c.close();
+        // Notify listereners of DB change since DB has been updated
+        getContext().getContentResolver().notifyChange(
+                Telephony.Carriers.CONTENT_URI, null, true, UserHandle.USER_ALL);
+
     }
 
     /**
