diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index 7032fda..3fb88c5 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -16,6 +16,7 @@
 
 package com.android.providers.telephony;
 
+import android.annotation.NonNull;
 import android.app.AppOpsManager;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
@@ -393,12 +394,44 @@
     }
 
     @Override
+    public int bulkInsert(@NonNull Uri url, @NonNull ContentValues[] values) {
+        final int callerUid = Binder.getCallingUid();
+        final String callerPkg = getCallingPackage();
+        long token = Binder.clearCallingIdentity();
+        try {
+            int messagesInserted = 0;
+            for (ContentValues initialValues : values) {
+                Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg);
+                if (insertUri != null) {
+                    messagesInserted++;
+                }
+            }
+
+            // The raw table is used by the telephony layer for storing an sms before
+            // sending out a notification that an sms has arrived. We don't want to notify
+            // the default sms app of changes to this table.
+            final boolean notifyIfNotDefault = sURLMatcher.match(url) != SMS_RAW_MESSAGE;
+            notifyChange(notifyIfNotDefault, url, callerPkg);
+            return messagesInserted;
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+    }
+
+    @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, callerPkg);
+            Uri insertUri = insertInner(url, initialValues, callerUid, callerPkg);
+
+            // The raw table is used by the telephony layer for storing an sms before
+            // sending out a notification that an sms has arrived. We don't want to notify
+            // the default sms app of changes to this table.
+            final boolean notifyIfNotDefault = sURLMatcher.match(url) != SMS_RAW_MESSAGE;
+            notifyChange(notifyIfNotDefault, insertUri, callerPkg);
+            return insertUri;
         } finally {
             Binder.restoreCallingIdentity(token);
         }
@@ -589,7 +622,6 @@
             if (Log.isLoggable(TAG, Log.VERBOSE)) {
                 Log.d(TAG, "insert " + uri + " succeeded");
             }
-            notifyChange(notifyIfNotDefault, uri, callerPkg);
             return uri;
         } else {
             Log.e(TAG,"insert: failed!");
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 0de0e79..808a660 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -35,9 +35,9 @@
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Environment;
+import android.os.FileUtils;
 import android.os.SystemProperties;
 import android.os.UserHandle;
-import android.provider.Telephony;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
@@ -55,12 +55,13 @@
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
-import java.lang.NumberFormatException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
+import static android.provider.Telephony.Carriers.*;
+
 public class TelephonyProvider extends ContentProvider
 {
     private static final String DATABASE_NAME = "telephony.db";
@@ -89,7 +90,7 @@
     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 PREF_FILE_APN = "preferred-apn";
     private static final String COLUMN_APN_ID = "apn_id";
 
     private static final String PREF_FILE_FULL_APN = "preferred-full-apn";
@@ -98,6 +99,9 @@
     private static final String BUILD_ID_FILE = "build-id";
     private static final String RO_BUILD_ID = "ro_build_id";
 
+    private static final String PREF_FILE = "telephonyprovider";
+    private static final String APN_CONF_CHECKSUM = "apn_conf_checksum";
+
     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";
@@ -108,27 +112,44 @@
     private static final ContentValues s_currentNullMap;
     private static final ContentValues s_currentSetMap;
 
+    private static final String IS_UNEDITED = EDITED + "=" + UNEDITED;
+    private static final String IS_EDITED = EDITED + "!=" + UNEDITED;
+    private static final String IS_USER_EDITED = EDITED + "=" + USER_EDITED;
+    private static final String IS_USER_DELETED = EDITED + "=" + USER_DELETED;
+    private static final String IS_NOT_USER_DELETED = EDITED + "!=" + USER_DELETED;
+    private static final String IS_USER_DELETED_BUT_PRESENT_IN_XML =
+            EDITED + "=" + USER_DELETED_BUT_PRESENT_IN_XML;
+    private static final String IS_NOT_USER_DELETED_BUT_PRESENT_IN_XML =
+            EDITED + "!=" + USER_DELETED_BUT_PRESENT_IN_XML;
+    private static final String IS_CARRIER_EDITED = EDITED + "=" + CARRIER_EDITED;
+    private static final String IS_CARRIER_DELETED = EDITED + "=" + CARRIER_DELETED;
+    private static final String IS_NOT_CARRIER_DELETED = EDITED + "!=" + CARRIER_DELETED;
+    private static final String IS_CARRIER_DELETED_BUT_PRESENT_IN_XML =
+            EDITED + "=" + CARRIER_DELETED_BUT_PRESENT_IN_XML;
+    private static final String IS_NOT_CARRIER_DELETED_BUT_PRESENT_IN_XML =
+            EDITED + "!=" + CARRIER_DELETED_BUT_PRESENT_IN_XML;
+
     private static final int INVALID_APN_ID = -1;
     private static final List<String> CARRIERS_UNIQUE_FIELDS = new ArrayList<String>();
 
     static {
         // 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, user_visible
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.NUMERIC);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.MCC);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.MNC);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.APN);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.PROXY);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.PORT);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.MMSPROXY);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.MMSPORT);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.MMSC);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.CARRIER_ENABLED);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.BEARER);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.MVNO_TYPE);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.MVNO_MATCH_DATA);
-        CARRIERS_UNIQUE_FIELDS.add(Telephony.Carriers.PROFILE_ID);
+        // authtype, type, protocol, roaming_protocol, sub_id, modem_cognitive, max_conns,
+        // wait_time, max_conns_time, mtu, bearer_bitmask, user_visible
+        CARRIERS_UNIQUE_FIELDS.add(NUMERIC);
+        CARRIERS_UNIQUE_FIELDS.add(MCC);
+        CARRIERS_UNIQUE_FIELDS.add(MNC);
+        CARRIERS_UNIQUE_FIELDS.add(APN);
+        CARRIERS_UNIQUE_FIELDS.add(PROXY);
+        CARRIERS_UNIQUE_FIELDS.add(PORT);
+        CARRIERS_UNIQUE_FIELDS.add(MMSPROXY);
+        CARRIERS_UNIQUE_FIELDS.add(MMSPORT);
+        CARRIERS_UNIQUE_FIELDS.add(MMSC);
+        CARRIERS_UNIQUE_FIELDS.add(CARRIER_ENABLED);
+        CARRIERS_UNIQUE_FIELDS.add(BEARER);
+        CARRIERS_UNIQUE_FIELDS.add(MVNO_TYPE);
+        CARRIERS_UNIQUE_FIELDS.add(MVNO_MATCH_DATA);
+        CARRIERS_UNIQUE_FIELDS.add(PROFILE_ID);
     }
 
     static {
@@ -151,10 +172,10 @@
         s_urlMatcher.addURI("telephony", "carriers/update_db", URL_UPDATE_DB);
 
         s_currentNullMap = new ContentValues(1);
-        s_currentNullMap.put(Telephony.Carriers.CURRENT, "0");
+        s_currentNullMap.put(CURRENT, "0");
 
         s_currentSetMap = new ContentValues(1);
-        s_currentSetMap.put(Telephony.Carriers.CURRENT, "1");
+        s_currentSetMap.put(CURRENT, "1");
     }
 
     private static class DatabaseHelper extends SQLiteOpenHelper {
@@ -261,49 +282,103 @@
             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 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 DEFAULT 0," +
-                    "edited INTEGER DEFAULT " + Telephony.Carriers.UNEDITED + "," +
-                    "user_visible BOOLEAN DEFAULT 1," +
+                    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 ''," +
+                    AUTH_TYPE + " INTEGER DEFAULT -1," +
+                    TYPE + " TEXT DEFAULT ''," +
+                    CURRENT + " INTEGER," +
+                    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 ''," +
+                    SUBSCRIPTION_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 DEFAULT 0," +
+                    EDITED + " INTEGER DEFAULT " + UNEDITED + "," +
+                    USER_VISIBLE + " BOOLEAN DEFAULT 1," +
                     // 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,
                     // user_visible
-                    "UNIQUE (numeric, mcc, mnc, apn, proxy, port, mmsproxy, mmsport, mmsc," +
-                    "carrier_enabled, bearer, mvno_type, mvno_match_data, profile_id));");
+                    "UNIQUE (" + TextUtils.join(", ", CARRIERS_UNIQUE_FIELDS) + "));");
             if (DBG) log("dbh.createCarriersTable:-");
         }
 
+        private long getChecksum(File file) {
+            long checksum = -1;
+            try {
+                checksum = FileUtils.checksumCrc32(file);
+                if (DBG) log("Checksum for " + file.getAbsolutePath() + " is " + checksum);
+            } catch (FileNotFoundException e) {
+                loge("FileNotFoundException for " + file.getAbsolutePath() + ":" + e);
+            } catch (IOException e) {
+                loge("IOException for " + file.getAbsolutePath() + ":" + e);
+            }
+            return checksum;
+        }
+
+        private long getApnConfChecksum() {
+            SharedPreferences sp = mContext.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
+            return sp.getLong(APN_CONF_CHECKSUM, -1);
+        }
+
+        private void setApnConfChecksum(long checksum) {
+            SharedPreferences sp = mContext.getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
+            SharedPreferences.Editor editor = sp.edit();
+            editor.putLong(APN_CONF_CHECKSUM, checksum);
+            editor.apply();
+        }
+
+        private File getApnConfFile() {
+            // 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);
+            File updatedConfFile = new File(Environment.getDataDirectory(), OTA_UPDATED_APNS_PATH);
+            confFile = getNewerFile(confFile, oemConfFile);
+            confFile = getNewerFile(confFile, updatedConfFile);
+            return confFile;
+        }
+
+        /**
+         * This function computes checksum for the file to be read and compares it against the
+         * last read file. DB needs to be updated only if checksum has changed, or old checksum does
+         * not exist.
+         * @return true if DB should be updated with new conf file, false otherwise
+         */
+        private boolean apnDbUpdateNeeded() {
+            File confFile = getApnConfFile();
+            long newChecksum = getChecksum(confFile);
+            long oldChecksum = getApnConfChecksum();
+            if (DBG) log("newChecksum: " + newChecksum);
+            if (DBG) log("oldChecksum: " + oldChecksum);
+            if (newChecksum == oldChecksum) {
+                return false;
+            } else {
+                return true;
+            }
+        }
+
         /**
          *  This function adds APNs from xml file(s) to db. The db may or may not be empty to begin
          *  with.
@@ -326,12 +401,7 @@
 
             // Read external APNS data (partner-provided)
             XmlPullParser confparser = null;
-            // 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);
-            File updatedConfFile = new File(Environment.getDataDirectory(), OTA_UPDATED_APNS_PATH);
-            confFile = getNewerFile(confFile, oemConfFile);
-            confFile = getNewerFile(confFile, updatedConfFile);
+            File confFile = getApnConfFile();
 
             FileReader confreader = null;
             if (DBG) log("confFile = " + confFile);
@@ -365,20 +435,17 @@
                 }
 
                 // Delete USER_DELETED
-                db.delete(CARRIERS_TABLE, "edited=" + Telephony.Carriers.USER_DELETED + " or " +
-                        "edited=" + Telephony.Carriers.CARRIER_DELETED, null);
+                db.delete(CARRIERS_TABLE, IS_USER_DELETED + " or " + IS_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);
+                cv.put(EDITED, USER_DELETED);
+                db.update(CARRIERS_TABLE, cv, IS_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);
+                cv.put(EDITED, CARRIER_DELETED);
+                db.update(CARRIERS_TABLE, cv, IS_CARRIER_DELETED_BUT_PRESENT_IN_XML, null);
 
                 if (confreader != null) {
                     try {
@@ -387,6 +454,9 @@
                         // do nothing
                     }
                 }
+
+                // Update the stored checksum
+                setApnConfChecksum(getChecksum(confFile));
             }
             if (VDBG) log("dbh.initDatabase:- db=" + db);
 
@@ -571,15 +641,13 @@
                     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 = db.query(CARRIERS_TABLE, proj, IS_UNEDITED, null, null, null, null);
+                    log("dbh.onUpgrade:- after upgrading total number of rows with " + IS_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 = db.query(CARRIERS_TABLE, proj, IS_EDITED, null, null, null, null);
+                    log("dbh.onUpgrade:- after upgrading total number of rows with " + IS_EDITED +
+                            ": " + c.getCount());
                     c.close();
                 }
 
@@ -627,13 +695,13 @@
                 try {
                     c = db.query(CARRIERS_TABLE, null, null, null, null, null, null,
                             String.valueOf(1));
-                    if (c == null || c.getColumnIndex(Telephony.Carriers.USER_VISIBLE) == -1) {
+                    if (c == null || c.getColumnIndex(USER_VISIBLE) == -1) {
                         db.execSQL("ALTER TABLE " + CARRIERS_TABLE + " ADD COLUMN " +
-                                Telephony.Carriers.USER_VISIBLE + " BOOLEAN DEFAULT 1;");
+                                USER_VISIBLE + " BOOLEAN DEFAULT 1;");
                     } else {
                         if (DBG) {
                             log("onUpgrade skipping " + CARRIERS_TABLE + " upgrade.  Column " +
-                                    Telephony.Carriers.USER_VISIBLE + " already exists.");
+                                    USER_VISIBLE + " already exists.");
                         }
                     }
                 } finally {
@@ -706,62 +774,87 @@
             }
         }
 
+        private String queryValFirst(String field) {
+            return field + "=?";
+        }
+
+        private String queryVal(String field) {
+            return " and " + field + "=?";
+        }
+
+        private String queryValOrNull(String field) {
+            return " and (" + field + "=? or " + field + " is null)";
+        }
+
+        private String queryVal2OrNull(String field) {
+            return " and (" + field + "=? or " + field + "=? or " + field + " is null)";
+        }
+
         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 where = queryValFirst(NUMERIC) +
+                    queryVal(MNC) +
+                    queryVal(MNC) +
+                    queryValOrNull(APN) +
+                    queryValOrNull(USER) +
+                    queryValOrNull(SERVER) +
+                    queryValOrNull(PASSWORD) +
+                    queryValOrNull(PROXY) +
+                    queryValOrNull(PORT) +
+                    queryValOrNull(MMSPROXY) +
+                    queryValOrNull(MMSPORT) +
+                    queryValOrNull(MMSC) +
+                    queryValOrNull(AUTH_TYPE) +
+                    queryValOrNull(TYPE) +
+                    queryValOrNull(PROTOCOL) +
+                    queryValOrNull(ROAMING_PROTOCOL) +
+                    queryVal2OrNull(CARRIER_ENABLED) +
+                    queryValOrNull(BEARER) +
+                    queryValOrNull(MVNO_TYPE) +
+                    queryValOrNull(MVNO_MATCH_DATA) +
+                    queryValOrNull(PROFILE_ID) +
+                    queryVal2OrNull(MODEM_COGNITIVE) +
+                    queryValOrNull(MAX_CONNS) +
+                    queryValOrNull(WAIT_TIME) +
+                    queryValOrNull(MAX_CONNS_TIME) +
+                    queryValOrNull(MTU);
             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";
+            whereArgs[i++] = values.getAsString(NUMERIC);
+            whereArgs[i++] = values.getAsString(MCC);
+            whereArgs[i++] = values.getAsString(MNC);
+            whereArgs[i++] = values.getAsString(NAME);
+            whereArgs[i++] = values.containsKey(APN) ?
+                    values.getAsString(APN) : "";
+            whereArgs[i++] = values.containsKey(USER) ?
+                    values.getAsString(USER) : "";
+            whereArgs[i++] = values.containsKey(SERVER) ?
+                    values.getAsString(SERVER) : "";
+            whereArgs[i++] = values.containsKey(PASSWORD) ?
+                    values.getAsString(PASSWORD) : "";
+            whereArgs[i++] = values.containsKey(PROXY) ?
+                    values.getAsString(PROXY) : "";
+            whereArgs[i++] = values.containsKey(PORT) ?
+                    values.getAsString(PORT) : "";
+            whereArgs[i++] = values.containsKey(MMSPROXY) ?
+                    values.getAsString(MMSPROXY) : "";
+            whereArgs[i++] = values.containsKey(MMSPORT) ?
+                    values.getAsString(MMSPORT) : "";
+            whereArgs[i++] = values.containsKey(MMSC) ?
+                    values.getAsString(MMSC) : "";
+            whereArgs[i++] = values.containsKey(AUTH_TYPE) ?
+                    values.getAsString(AUTH_TYPE) : "-1";
+            whereArgs[i++] = values.containsKey(TYPE) ?
+                    values.getAsString(TYPE) : "";
+            whereArgs[i++] = values.containsKey(PROTOCOL) ?
+                    values.getAsString(PROTOCOL) : "IP";
+            whereArgs[i++] = values.containsKey(ROAMING_PROTOCOL) ?
+                    values.getAsString(ROAMING_PROTOCOL) : "IP";
 
-            if (values.containsKey(Telephony.Carriers.CARRIER_ENABLED) &&
-                    (values.getAsString(Telephony.Carriers.CARRIER_ENABLED).
+            if (values.containsKey(CARRIER_ENABLED) &&
+                    (values.getAsString(CARRIER_ENABLED).
                             equalsIgnoreCase("false") ||
-                            values.getAsString(Telephony.Carriers.CARRIER_ENABLED).equals("0"))) {
+                            values.getAsString(CARRIER_ENABLED).equals("0"))) {
                 whereArgs[i++] = "false";
                 whereArgs[i++] = "0";
             } else {
@@ -769,19 +862,19 @@
                 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";
+            whereArgs[i++] = values.containsKey(BEARER) ?
+                    values.getAsString(BEARER) : "0";
+            whereArgs[i++] = values.containsKey(MVNO_TYPE) ?
+                    values.getAsString(MVNO_TYPE) : "";
+            whereArgs[i++] = values.containsKey(MVNO_MATCH_DATA) ?
+                    values.getAsString(MVNO_MATCH_DATA) : "";
+            whereArgs[i++] = values.containsKey(PROFILE_ID) ?
+                    values.getAsString(PROFILE_ID) : "0";
 
-            if (values.containsKey(Telephony.Carriers.MODEM_COGNITIVE) &&
-                    (values.getAsString(Telephony.Carriers.MODEM_COGNITIVE).
+            if (values.containsKey(MODEM_COGNITIVE) &&
+                    (values.getAsString(MODEM_COGNITIVE).
                             equalsIgnoreCase("true") ||
-                            values.getAsString(Telephony.Carriers.MODEM_COGNITIVE).equals("1"))) {
+                            values.getAsString(MODEM_COGNITIVE).equals("1"))) {
                 whereArgs[i++] = "true";
                 whereArgs[i++] = "1";
             } else {
@@ -789,14 +882,14 @@
                 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";
+            whereArgs[i++] = values.containsKey(MAX_CONNS) ?
+                    values.getAsString(MAX_CONNS) : "0";
+            whereArgs[i++] = values.containsKey(WAIT_TIME) ?
+                    values.getAsString(WAIT_TIME) : "0";
+            whereArgs[i++] = values.containsKey(MAX_CONNS_TIME) ?
+                    values.getAsString(MAX_CONNS_TIME) : "0";
+            whereArgs[i++] = values.containsKey(MTU) ?
+                    values.getAsString(MTU) : "0";
 
             if (VDBG) {
                 log("deleteRow: where: " + where);
@@ -824,74 +917,70 @@
                     // 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);
+                    getStringValueFromCursor(cv, c, NAME);
+                    getStringValueFromCursor(cv, c, NUMERIC);
+                    getStringValueFromCursor(cv, c, MCC);
+                    getStringValueFromCursor(cv, c, MNC);
+                    getStringValueFromCursor(cv, c, APN);
+                    getStringValueFromCursor(cv, c, USER);
+                    getStringValueFromCursor(cv, c, SERVER);
+                    getStringValueFromCursor(cv, c, PASSWORD);
+                    getStringValueFromCursor(cv, c, PROXY);
+                    getStringValueFromCursor(cv, c, PORT);
+                    getStringValueFromCursor(cv, c, MMSPROXY);
+                    getStringValueFromCursor(cv, c, MMSPORT);
+                    getStringValueFromCursor(cv, c, MMSC);
+                    getStringValueFromCursor(cv, c, TYPE);
+                    getStringValueFromCursor(cv, c, PROTOCOL);
+                    getStringValueFromCursor(cv, c, ROAMING_PROTOCOL);
+                    getStringValueFromCursor(cv, c, MVNO_TYPE);
+                    getStringValueFromCursor(cv, c, 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);
+                    getIntValueFromCursor(cv, c, AUTH_TYPE);
+                    getIntValueFromCursor(cv, c, CURRENT);
+                    getIntValueFromCursor(cv, c, CARRIER_ENABLED);
+                    getIntValueFromCursor(cv, c, BEARER);
+                    getIntValueFromCursor(cv, c, SUBSCRIPTION_ID);
+                    getIntValueFromCursor(cv, c, PROFILE_ID);
+                    getIntValueFromCursor(cv, c, MODEM_COGNITIVE);
+                    getIntValueFromCursor(cv, c, MAX_CONNS);
+                    getIntValueFromCursor(cv, c, WAIT_TIME);
+                    getIntValueFromCursor(cv, c, MAX_CONNS_TIME);
+                    getIntValueFromCursor(cv, c, MTU);
 
                     // Change bearer to a bitmask
-                    String bearerStr = c.getString(c.getColumnIndex(Telephony.Carriers.BEARER));
+                    String bearerStr = c.getString(c.getColumnIndex(BEARER));
                     if (!TextUtils.isEmpty(bearerStr)) {
                         int bearer_bitmask = ServiceState.getBitmaskForTech(
                                 Integer.parseInt(bearerStr));
-                        cv.put(Telephony.Carriers.BEARER_BITMASK, bearer_bitmask);
+                        cv.put(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));
+                            cv.put(EDITED, new Integer(user_edited));
                         }
                     } else {
-                        cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                        cv.put(EDITED, USER_EDITED);
                     }
 
-                    // New EDITED column. Default value (Telephony.Carriers.UNEDITED) will
+                    // New EDITED column. Default value (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));
+                    val = c.getString(c.getColumnIndex(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.containsKey(MVNO_TYPE) ||
+                                        TextUtils.isEmpty(cv.getAsString(MVNO_TYPE)))) {
                             if (userEditedColumnIdx == -1) {
-                                cv.put(Telephony.Carriers.EDITED,
-                                        Telephony.Carriers.CARRIER_EDITED);
+                                cv.put(EDITED, 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);
+                                if (cv.getAsInteger(EDITED) == USER_EDITED) {
+                                    cv.put(EDITED, CARRIER_EDITED);
                                 }
                             }
 
@@ -960,50 +1049,50 @@
             String mnc = parser.getAttributeValue(null, "mnc");
             String numeric = mcc + mnc;
 
-            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(NUMERIC, numeric);
+            map.put(MCC, mcc);
+            map.put(MNC, mnc);
+            map.put(NAME, parser.getAttributeValue(null, "carrier"));
 
             // 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);
+            addStringAttribute(parser, "apn", map, APN);
+            addStringAttribute(parser, "user", map, USER);
+            addStringAttribute(parser, "server", map, SERVER);
+            addStringAttribute(parser, "password", map, PASSWORD);
+            addStringAttribute(parser, "proxy", map, PROXY);
+            addStringAttribute(parser, "port", map, PORT);
+            addStringAttribute(parser, "mmsproxy", map, MMSPROXY);
+            addStringAttribute(parser, "mmsport", map, MMSPORT);
+            addStringAttribute(parser, "mmsc", map, MMSC);
+            addStringAttribute(parser, "type", map, TYPE);
+            addStringAttribute(parser, "protocol", map, PROTOCOL);
+            addStringAttribute(parser, "roaming_protocol", map, ROAMING_PROTOCOL);
 
-            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);
+            addIntAttribute(parser, "authtype", map, AUTH_TYPE);
+            addIntAttribute(parser, "bearer", map, BEARER);
+            addIntAttribute(parser, "profile_id", map, PROFILE_ID);
+            addIntAttribute(parser, "max_conns", map, MAX_CONNS);
+            addIntAttribute(parser, "wait_time", map, WAIT_TIME);
+            addIntAttribute(parser, "max_conns_time", map, MAX_CONNS_TIME);
+            addIntAttribute(parser, "mtu", map, MTU);
 
 
-            addBoolAttribute(parser, "carrier_enabled", map, Telephony.Carriers.CARRIER_ENABLED);
-            addBoolAttribute(parser, "modem_cognitive", map, Telephony.Carriers.MODEM_COGNITIVE);
-            addBoolAttribute(parser, "user_visible", map, Telephony.Carriers.USER_VISIBLE);
+            addBoolAttribute(parser, "carrier_enabled", map, CARRIER_ENABLED);
+            addBoolAttribute(parser, "modem_cognitive", map, MODEM_COGNITIVE);
+            addBoolAttribute(parser, "user_visible", map, USER_VISIBLE);
 
             String bearerList = parser.getAttributeValue(null, "bearer_bitmask");
             if (bearerList != null) {
                 int bearerBitmask = ServiceState.getBitmaskFromString(bearerList);
-                map.put(Telephony.Carriers.BEARER_BITMASK, bearerBitmask);
+                map.put(BEARER_BITMASK, bearerBitmask);
             }
 
             String mvno_type = parser.getAttributeValue(null, "mvno_type");
             if (mvno_type != null) {
                 String mvno_match_data = parser.getAttributeValue(null, "mvno_match_data");
                 if (mvno_match_data != null) {
-                    map.put(Telephony.Carriers.MVNO_TYPE, mvno_type);
-                    map.put(Telephony.Carriers.MVNO_MATCH_DATA, mvno_match_data);
+                    map.put(MVNO_TYPE, mvno_type);
+                    map.put(MVNO_MATCH_DATA, mvno_match_data);
                 }
             }
 
@@ -1068,9 +1157,9 @@
         }
 
         static public ContentValues setDefaultValue(ContentValues values) {
-            if (!values.containsKey(Telephony.Carriers.SUBSCRIPTION_ID)) {
+            if (!values.containsKey(SUBSCRIPTION_ID)) {
                 int subId = SubscriptionManager.getDefaultSubscriptionId();
-                values.put(Telephony.Carriers.SUBSCRIPTION_ID, subId);
+                values.put(SUBSCRIPTION_ID, subId);
             }
 
             return values;
@@ -1079,8 +1168,7 @@
         private void insertAddingDefaults(SQLiteDatabase db, ContentValues row) {
             row = setDefaultValue(row);
             try {
-                db.insertWithOnConflict(CARRIERS_TABLE, null, row,
-                        SQLiteDatabase.CONFLICT_ABORT);
+                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) {
@@ -1094,20 +1182,19 @@
                 if (oldRow != null) {
                     // Update the row
                     ContentValues mergedValues = new ContentValues();
-                    int edited = oldRow.getInt(oldRow.getColumnIndex(
-                            Telephony.Carriers.EDITED));
+                    int edited = oldRow.getInt(oldRow.getColumnIndex(EDITED));
                     int old_edited = edited;
-                    if (edited != Telephony.Carriers.UNEDITED) {
-                        if (edited == Telephony.Carriers.USER_DELETED) {
+                    if (edited != UNEDITED) {
+                        if (edited == 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) {
+                            edited = USER_DELETED_BUT_PRESENT_IN_XML;
+                        } else if (edited == 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;
+                            edited = CARRIER_DELETED_BUT_PRESENT_IN_XML;
                         }
-                        mergedValues.put(Telephony.Carriers.EDITED, edited);
+                        mergedValues.put(EDITED, edited);
                     }
 
                     mergeFieldsAndUpdateDb(db, CARRIERS_TABLE, oldRow, row, mergedValues, false,
@@ -1124,14 +1211,14 @@
         public static void mergeFieldsAndUpdateDb(SQLiteDatabase db, String table, Cursor oldRow,
                                                   ContentValues newRow, ContentValues mergedValues,
                                                   boolean onUpgrade, Context context) {
-            if (newRow.containsKey(Telephony.Carriers.TYPE)) {
+            if (newRow.containsKey(TYPE)) {
                 // Merge the types
-                String oldType = oldRow.getString(oldRow.getColumnIndex(Telephony.Carriers.TYPE));
-                String newType = newRow.getAsString(Telephony.Carriers.TYPE);
+                String oldType = oldRow.getString(oldRow.getColumnIndex(TYPE));
+                String newType = newRow.getAsString(TYPE);
 
                 if (!oldType.equalsIgnoreCase(newType)) {
                     if (oldType.equals("") || newType.equals("")) {
-                        newRow.put(Telephony.Carriers.TYPE, "");
+                        newRow.put(TYPE, "");
                     } else {
                         String[] oldTypes = oldType.toLowerCase().split(",");
                         String[] newTypes = newType.toLowerCase().split(",");
@@ -1139,9 +1226,9 @@
                         if (VDBG) {
                             log("mergeFieldsAndUpdateDb: Calling separateRowsNeeded() oldType=" +
                                     oldType + " old bearer=" + oldRow.getInt(oldRow.getColumnIndex(
-                                    Telephony.Carriers.BEARER_BITMASK)) +
+                                    BEARER_BITMASK)) +
                                     " old profile_id=" + oldRow.getInt(oldRow.getColumnIndex(
-                                    Telephony.Carriers.PROFILE_ID)) +
+                                    PROFILE_ID)) +
                                     " newRow " + newRow);
                         }
 
@@ -1165,26 +1252,24 @@
                         for (int i = 0; i < mergedTypes.size(); i++) {
                             mergedType.append((i == 0 ? "" : ",") + mergedTypes.get(i));
                         }
-                        newRow.put(Telephony.Carriers.TYPE, mergedType.toString());
+                        newRow.put(TYPE, mergedType.toString());
                     }
                 }
-                mergedValues.put(Telephony.Carriers.TYPE, newRow.getAsString(
-                        Telephony.Carriers.TYPE));
+                mergedValues.put(TYPE, newRow.getAsString(
+                        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 (newRow.containsKey(BEARER_BITMASK)) {
+                int oldBearer = oldRow.getInt(oldRow.getColumnIndex(BEARER_BITMASK));
+                int newBearer = newRow.getAsInteger(BEARER_BITMASK);
                 if (oldBearer != newBearer) {
                     if (oldBearer == 0 || newBearer == 0) {
-                        newRow.put(Telephony.Carriers.BEARER_BITMASK, 0);
+                        newRow.put(BEARER_BITMASK, 0);
                     } else {
-                        newRow.put(Telephony.Carriers.BEARER_BITMASK, (oldBearer | newBearer));
+                        newRow.put(BEARER_BITMASK, (oldBearer | newBearer));
                     }
                 }
-                mergedValues.put(Telephony.Carriers.BEARER_BITMASK, newRow.getAsInteger(
-                        Telephony.Carriers.BEARER_BITMASK));
+                mergedValues.put(BEARER_BITMASK, newRow.getAsInteger(BEARER_BITMASK));
             }
 
             if (!onUpgrade) {
@@ -1212,8 +1297,7 @@
             String[] persistApnsForPlmns = context.getResources().getStringArray(
                     R.array.persist_apns_for_plmn);
             for (String s : persistApnsForPlmns) {
-                if (s.equalsIgnoreCase(newRow.getAsString(Telephony.Carriers.
-                        NUMERIC))) {
+                if (s.equalsIgnoreCase(newRow.getAsString(NUMERIC))) {
                     match = true;
                     break;
                 }
@@ -1224,10 +1308,8 @@
             // 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> 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;
@@ -1242,8 +1324,7 @@
                 return false;
             }
 
-            if (listWithDun.contains("dun") &&
-                    !listWithoutDun.contains("dun")) {
+            if (listWithDun.contains("dun") && !listWithoutDun.contains("dun")) {
                 listWithoutDun.add("dun");
                 if (!listWithDun.containsAll(listWithoutDun)) {
                     return false;
@@ -1252,8 +1333,7 @@
                 // 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 (oldRow.getInt(oldRow.getColumnIndex(PROFILE_ID)) == 0) {
                     if (dunInOld) {
                         // Update oldRow to remove dun from its type field
                         ContentValues updateOldRow = new ContentValues();
@@ -1267,18 +1347,16 @@
                         }
                         String updatedType = sb.toString();
                         if (VDBG) {
-                            log("separateRowsNeeded: updating type in oldRow to " +
-                                    updatedType);
+                            log("separateRowsNeeded: updating type in oldRow to " + updatedType);
                         }
-                        updateOldRow.put(Telephony.Carriers.TYPE, updatedType);
+                        updateOldRow.put(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));
+                        newRow.put(PROFILE_ID, new Integer(1));
                     }
                 } else {
                     return false;
@@ -1287,13 +1365,11 @@
                 // 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);
+                    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");
+                    loge("Exception on trying to add new row after updating profile_id");
                 }
             }
 
@@ -1304,50 +1380,37 @@
                                                   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)) {
+            if (!row.containsKey(NUMERIC) || !row.containsKey(MCC) || !row.containsKey(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=?";
+                    TYPE,
+                    EDITED,
+                    BEARER_BITMASK,
+                    PROFILE_ID };
+            String selection = TextUtils.join("=? AND ", CARRIERS_UNIQUE_FIELDS) + "=?";
             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")) ?
+            selectionArgs[i++] = row.getAsString(NUMERIC);
+            selectionArgs[i++] = row.getAsString(MCC);
+            selectionArgs[i++] = row.getAsString(MNC);
+            selectionArgs[i++] = row.containsKey(APN) ? row.getAsString(APN) : "";
+            selectionArgs[i++] = row.containsKey(PROXY) ? row.getAsString(PROXY) : "";
+            selectionArgs[i++] = row.containsKey(PORT) ? row.getAsString(PORT) : "";
+            selectionArgs[i++] = row.containsKey(MMSPROXY) ? row.getAsString(MMSPROXY) : "";
+            selectionArgs[i++] = row.containsKey(MMSPORT) ? row.getAsString(MMSPORT) : "";
+            selectionArgs[i++] = row.containsKey(MMSC) ? row.getAsString(MMSC) : "";
+            selectionArgs[i++] = row.containsKey(CARRIER_ENABLED) &&
+                    (row.getAsString(CARRIER_ENABLED).equals("0") ||
+                            row.getAsString(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";
+            selectionArgs[i++] = row.containsKey(BEARER) ? row.getAsString(BEARER) : "0";
+            selectionArgs[i++] = row.containsKey(MVNO_TYPE) ? row.getAsString(MVNO_TYPE) : "";
+            selectionArgs[i++] = row.containsKey(MVNO_MATCH_DATA) ?
+                    row.getAsString(MVNO_MATCH_DATA) : "";
+            selectionArgs[i++] = row.containsKey(PROFILE_ID) ? row.getAsString(PROFILE_ID) : "0";
 
             Cursor c = db.query(table, columns, selection, selectionArgs, null, null, null);
 
@@ -1399,7 +1462,7 @@
                     List<SubscriptionInfo> subInfoList = sm.getAllSubscriptionInfoList();
                     for (SubscriptionInfo subInfo : subInfoList) {
                         SharedPreferences spPrefFile = getContext().getSharedPreferences(
-                                PREF_FILE + subInfo.getSubscriptionId(), Context.MODE_PRIVATE);
+                                PREF_FILE_APN + subInfo.getSubscriptionId(), Context.MODE_PRIVATE);
                         if (spPrefFile != null) {
                             SharedPreferences.Editor editor = spPrefFile.edit();
                             editor.clear();
@@ -1423,7 +1486,8 @@
     }
 
     private void setPreferredApnId(Long id, int subId) {
-        SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
+        SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE_APN,
+                Context.MODE_PRIVATE);
         SharedPreferences.Editor editor = sp.edit();
         editor.putLong(COLUMN_APN_ID + subId, id != null ? id.longValue() : INVALID_APN_ID);
         editor.apply();
@@ -1434,7 +1498,8 @@
     }
 
     private long getPreferredApnId(int subId, boolean checkApnSp) {
-        SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
+        SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE_APN,
+                Context.MODE_PRIVATE);
         long apnId = sp.getLong(COLUMN_APN_ID + subId, INVALID_APN_ID);
         if (apnId == INVALID_APN_ID && checkApnSp) {
             apnId = getPreferredApnIdFromApn(subId);
@@ -1447,7 +1512,8 @@
     }
 
     private void deletePreferredApnId() {
-        SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
+        SharedPreferences sp = getContext().getSharedPreferences(PREF_FILE_APN,
+                Context.MODE_PRIVATE);
         // before deleting, save actual preferred apns (not the ids) in a separate SP
         Map<String, ?> allPrefApnId = sp.getAll();
         for (String key : allPrefApnId.keySet()) {
@@ -1511,7 +1577,8 @@
             }
             i++;
         }
-        Cursor c = db.query(CARRIERS_TABLE, new String[]{"_id"}, where, whereArgs, null, null, null);
+        Cursor c = db.query(CARRIERS_TABLE, new String[]{"_id"}, where, whereArgs, null, null,
+                null);
         if (c != null) {
             if (c.getCount() == 1) {
                 c.moveToFirst();
@@ -1567,7 +1634,7 @@
                     return null;
                 }
                 if (DBG) log("subIdString = " + subIdString + " subId = " + subId);
-                qb.appendWhere("numeric = '" + mTelephonyManager.getSimOperator(subId)+"'");
+                qb.appendWhere(NUMERIC + " = '" + mTelephonyManager.getSimOperator(subId) + "'");
                 // FIXME alter the selection to pass subId
                 // selection = selection + "and subId = "
             }
@@ -1633,11 +1700,11 @@
         if (match != URL_SIMINFO) {
             if (projectionIn != null) {
                 for (String column : projectionIn) {
-                    if (Telephony.Carriers.TYPE.equals(column) ||
-                            Telephony.Carriers.MMSC.equals(column) ||
-                            Telephony.Carriers.MMSPROXY.equals(column) ||
-                            Telephony.Carriers.MMSPORT.equals(column) ||
-                            Telephony.Carriers.APN.equals(column)) {
+                    if (TYPE.equals(column) ||
+                            MMSC.equals(column) ||
+                            MMSPROXY.equals(column) ||
+                            MMSPORT.equals(column) ||
+                            APN.equals(column)) {
                         // noop
                     } else {
                         checkPermission();
@@ -1660,10 +1727,10 @@
                 } 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;
+                selection += IS_NOT_USER_DELETED + " and " +
+                        IS_NOT_USER_DELETED_BUT_PRESENT_IN_XML + " and " +
+                        IS_NOT_CARRIER_DELETED + " and " +
+                        IS_NOT_CARRIER_DELETED_BUT_PRESENT_IN_XML;
                 if (VDBG) log("query: selection modified to " + selection);
             }
             ret = qb.query(db, projectionIn, selection, selectionArgs, null, null, sort);
@@ -1733,18 +1800,18 @@
                 }
 
                 values = DatabaseHelper.setDefaultValue(values);
-                if (!values.containsKey(Telephony.Carriers.EDITED)) {
-                    values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                if (!values.containsKey(EDITED)) {
+                    values.put(EDITED, USER_EDITED);
                 }
 
                 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
+                    // as 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);
+                        result = ContentUris.withAppendedId(CONTENT_URI, rowID);
                         notify = true;
                     }
                     if (VDBG) log("insert: inserted " + values.toString() + " rowID = " + rowID);
@@ -1782,11 +1849,11 @@
             case URL_CURRENT:
             {
                 // zero out the previous operator
-                db.update(CARRIERS_TABLE, s_currentNullMap, "current!=0", null);
+                db.update(CARRIERS_TABLE, s_currentNullMap, CURRENT + "!=0", null);
 
-                String numeric = initialValues.getAsString(Telephony.Carriers.NUMERIC);
+                String numeric = initialValues.getAsString(NUMERIC);
                 int updated = db.update(CARRIERS_TABLE, s_currentSetMap,
-                        "numeric = '" + numeric + "'", null);
+                        NUMERIC + " = '" + numeric + "'", null);
 
                 if (updated > 0)
                 {
@@ -1832,7 +1899,7 @@
         }
 
         if (notify) {
-            getContext().getContentResolver().notifyChange(Telephony.Carriers.CONTENT_URI, null,
+            getContext().getContentResolver().notifyChange(CONTENT_URI, null,
                     true, UserHandle.USER_ALL);
         }
 
@@ -1845,13 +1912,13 @@
         int count = 0;
         int subId = SubscriptionManager.getDefaultSubscriptionId();
         String userOrCarrierEdited = ") and (" +
-                Telephony.Carriers.EDITED + "=" + Telephony.Carriers.USER_EDITED +  " or " +
-                Telephony.Carriers.EDITED + "=" + Telephony.Carriers.CARRIER_EDITED + ")";
+                EDITED + "=" + USER_EDITED +  " or " +
+                EDITED + "=" + CARRIER_EDITED + ")";
         String notUserOrCarrierEdited = ") and (" +
-                Telephony.Carriers.EDITED + "!=" + Telephony.Carriers.USER_EDITED +  " and " +
-                Telephony.Carriers.EDITED + "!=" + Telephony.Carriers.CARRIER_EDITED + ")";
+                EDITED + "!=" + USER_EDITED +  " and " +
+                EDITED + "!=" + CARRIER_EDITED + ")";
         ContentValues cv = new ContentValues();
-        cv.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_DELETED);
+        cv.put(EDITED, USER_DELETED);
 
         checkPermission();
 
@@ -1910,12 +1977,12 @@
             {
                 // Delete user/carrier edited entries
                 count = db.delete(CARRIERS_TABLE,
-                        "(" + Telephony.Carriers._ID + "=?" + userOrCarrierEdited,
+                        "(" + _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() });
+                        "(" + _ID + "=?" + notUserOrCarrierEdited,
+                        new String[]{url.getLastPathSegment() });
                 break;
             }
 
@@ -1952,7 +2019,7 @@
             case URL_PREFERAPN:
             case URL_PREFERAPN_NO_UPDATE:
             {
-                setPreferredApnId((long)-1, subId);
+                setPreferredApnId((long)INVALID_APN_ID, subId);
                 if ((match == URL_PREFERAPN) || (match == URL_PREFERAPN_USING_SUBID)) count = 1;
                 break;
             }
@@ -1974,7 +2041,7 @@
         }
 
         if (count > 0) {
-            getContext().getContentResolver().notifyChange(Telephony.Carriers.CONTENT_URI, null,
+            getContext().getContentResolver().notifyChange(CONTENT_URI, null,
                     true, UserHandle.USER_ALL);
         }
 
@@ -2010,12 +2077,12 @@
 
             case URL_TELEPHONY:
             {
-                if (!values.containsKey(Telephony.Carriers.EDITED)) {
-                    values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                if (!values.containsKey(EDITED)) {
+                    values.put(EDITED, 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
+                // as UNEDITED or USER/CARRIER_DELETED, it is replaced with
                 // edited USER/CARRIER_EDITED
                 count = db.updateWithOnConflict(CARRIERS_TABLE, values, where, whereArgs,
                         SQLiteDatabase.CONFLICT_REPLACE);
@@ -2038,11 +2105,11 @@
 
             case URL_CURRENT:
             {
-                if (!values.containsKey(Telephony.Carriers.EDITED)) {
-                    values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                if (!values.containsKey(EDITED)) {
+                    values.put(EDITED, 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
+                // as UNEDITED or USER/CARRIER_DELETED, it is replaced with
                 // edited USER/CARRIER_EDITED
                 count = db.updateWithOnConflict(CARRIERS_TABLE, values, where, whereArgs,
                         SQLiteDatabase.CONFLICT_REPLACE);
@@ -2055,14 +2122,14 @@
                     throw new UnsupportedOperationException(
                             "Cannot update URL " + url + " with a where clause");
                 }
-                if (!values.containsKey(Telephony.Carriers.EDITED)) {
-                    values.put(Telephony.Carriers.EDITED, Telephony.Carriers.USER_EDITED);
+                if (!values.containsKey(EDITED)) {
+                    values.put(EDITED, 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
+                // as 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() },
+                        _ID + "=?", new String[] { url.getLastPathSegment() },
                         SQLiteDatabase.CONFLICT_REPLACE);
                 break;
             }
@@ -2114,7 +2181,7 @@
                     break;
                 default:
                     getContext().getContentResolver().notifyChange(
-                            Telephony.Carriers.CONTENT_URI, null, true, UserHandle.USER_ALL);
+                            CONTENT_URI, null, true, UserHandle.USER_ALL);
             }
         }
 
@@ -2152,11 +2219,16 @@
         } catch (SQLException e) {
             loge("got exception when deleting to restore: " + e);
         }
-        setPreferredApnId((long)-1, subId);
+        setPreferredApnId((long) INVALID_APN_ID, subId);
         mOpenHelper.initDatabase(db);
     }
 
     private synchronized void updateApnDb() {
+        if (!mOpenHelper.apnDbUpdateNeeded()) {
+            log("Skipping apn db update since apn-conf has not changed.");
+            return;
+        }
+
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
 
         // Delete preferred APN for all subIds
@@ -2164,8 +2236,8 @@
 
         // Delete entries in db
         try {
-            if (VDBG) log("updateApnDb: deleting edited=Telephony.Carriers.UNEDITED entries");
-            db.delete(CARRIERS_TABLE, "edited=" + Telephony.Carriers.UNEDITED, null);
+            if (VDBG) log("updateApnDb: deleting edited=UNEDITED entries");
+            db.delete(CARRIERS_TABLE, IS_UNEDITED, null);
         } catch (SQLException e) {
             loge("got exception when deleting to update: " + e);
         }
@@ -2174,7 +2246,7 @@
 
         // Notify listereners of DB change since DB has been updated
         getContext().getContentResolver().notifyChange(
-                Telephony.Carriers.CONTENT_URI, null, true, UserHandle.USER_ALL);
+                CONTENT_URI, null, true, UserHandle.USER_ALL);
 
     }
 
