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);
 
     }
 
