diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 2c7df08..a77fa7c 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -17,6 +17,7 @@
 
 package com.android.providers.telephony;
 
+import static android.provider.Telephony.Carriers.ALWAYS_ON;
 import static android.provider.Telephony.Carriers.APN;
 import static android.provider.Telephony.Carriers.APN_SET_ID;
 import static android.provider.Telephony.Carriers.AUTH_TYPE;
@@ -31,8 +32,8 @@
 import static android.provider.Telephony.Carriers.CURRENT;
 import static android.provider.Telephony.Carriers.DEFAULT_SORT_ORDER;
 import static android.provider.Telephony.Carriers.EDITED_STATUS;
+import static android.provider.Telephony.Carriers.LINGERING_NETWORK_TYPE_BITMASK;
 import static android.provider.Telephony.Carriers.MAX_CONNECTIONS;
-import static android.provider.Telephony.Carriers.TIME_LIMIT_FOR_MAX_CONNECTIONS;
 import static android.provider.Telephony.Carriers.MCC;
 import static android.provider.Telephony.Carriers.MMSC;
 import static android.provider.Telephony.Carriers.MMSPORT;
@@ -40,6 +41,8 @@
 import static android.provider.Telephony.Carriers.MNC;
 import static android.provider.Telephony.Carriers.MODEM_PERSIST;
 import static android.provider.Telephony.Carriers.MTU;
+import static android.provider.Telephony.Carriers.MTU_V4;
+import static android.provider.Telephony.Carriers.MTU_V6;
 import static android.provider.Telephony.Carriers.MVNO_MATCH_DATA;
 import static android.provider.Telephony.Carriers.MVNO_TYPE;
 import static android.provider.Telephony.Carriers.NAME;
@@ -59,6 +62,7 @@
 import static android.provider.Telephony.Carriers.SKIP_464XLAT;
 import static android.provider.Telephony.Carriers.SKIP_464XLAT_DEFAULT;
 import static android.provider.Telephony.Carriers.SUBSCRIPTION_ID;
+import static android.provider.Telephony.Carriers.TIME_LIMIT_FOR_MAX_CONNECTIONS;
 import static android.provider.Telephony.Carriers.TYPE;
 import static android.provider.Telephony.Carriers.UNEDITED;
 import static android.provider.Telephony.Carriers.USER;
@@ -155,7 +159,7 @@
     private static final boolean DBG = true;
     private static final boolean VDBG = false; // STOPSHIP if true
 
-    private static final int DATABASE_VERSION = 54 << 16;
+    private static final int DATABASE_VERSION = 55 << 16;
     private static final int URL_UNKNOWN = 0;
     private static final int URL_TELEPHONY = 1;
     private static final int URL_CURRENT = 2;
@@ -191,7 +195,7 @@
     private static final int URL_SIMINFO_SIM_INSERTED_RESTORE = 29;
 
     /**
-     * Default value for mtu if it's not set. Moved from PhoneConstants.
+     * Default value for mtu_v4 and mtu_v6 if it's not set. Moved from PhoneConstants.
      */
     private static final int UNSPECIFIED_INT = -1;
 
@@ -370,8 +374,8 @@
     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, network_type_bitmask,
-        // skip_464xlat
+        // wait_time, max_conns_time, mtu, mtu_v4, mtu_v6, bearer_bitmask, user_visible,
+        // network_type_bitmask, skip_464xlat, lingering_network_type_bitmask, always_on
         CARRIERS_UNIQUE_FIELDS_DEFAULTS.put(NUMERIC, "");
         CARRIERS_UNIQUE_FIELDS_DEFAULTS.put(MCC, "");
         CARRIERS_UNIQUE_FIELDS_DEFAULTS.put(MNC, "");
@@ -470,6 +474,7 @@
                 BEARER + " INTEGER DEFAULT 0," +
                 BEARER_BITMASK + " INTEGER DEFAULT 0," +
                 NETWORK_TYPE_BITMASK + " INTEGER DEFAULT 0," +
+                LINGERING_NETWORK_TYPE_BITMASK + " INTEGER DEFAULT 0," +
                 MVNO_TYPE + " TEXT DEFAULT ''," +
                 MVNO_MATCH_DATA + " TEXT DEFAULT ''," +
                 SUBSCRIPTION_ID + " INTEGER DEFAULT " +
@@ -480,18 +485,21 @@
                 WAIT_TIME_RETRY + " INTEGER DEFAULT 0," +
                 TIME_LIMIT_FOR_MAX_CONNECTIONS + " INTEGER DEFAULT 0," +
                 MTU + " INTEGER DEFAULT 0," +
+                MTU_V4 + " INTEGER DEFAULT " + UNSPECIFIED_INT + "," +
+                MTU_V6 + " INTEGER DEFAULT " + UNSPECIFIED_INT + "," +
                 EDITED_STATUS + " INTEGER DEFAULT " + UNEDITED + "," +
                 USER_VISIBLE + " BOOLEAN DEFAULT 1," +
                 USER_EDITABLE + " BOOLEAN DEFAULT 1," +
                 OWNED_BY + " INTEGER DEFAULT " + OWNED_BY_OTHERS + "," +
                 APN_SET_ID + " INTEGER DEFAULT " + NO_APN_SET_ID + "," +
                 SKIP_464XLAT + " INTEGER DEFAULT " + SKIP_464XLAT_DEFAULT + "," +
+                ALWAYS_ON + " INTEGER DEFAULT 0," +
                 // 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, sub_id, modem_cognitive, max_conns,
-                // wait_time, max_conns_time, mtu, bearer_bitmask, user_visible,
-                // network_type_bitmask, skip_464xlat.
+                // wait_time, max_conns_time, mtu, mtu_v4, mtu_v6, bearer_bitmask, user_visible,
+                // network_type_bitmask, skip_464xlat, lingering_network_type_bitmask, always_on.
                 "UNIQUE (" + TextUtils.join(", ", CARRIERS_UNIQUE_FIELDS) + "));";
     }
 
@@ -1741,6 +1749,31 @@
                 oldVersion = 54 << 16 | 6;
             }
 
+            if (oldVersion < (55 << 16 | 6)) {
+                try {
+                    // Try to add new fields LINGERING_NETWORK_TYPE_BITMASK, ALWAYS_ON,
+                    // MTU_V4, and MTU_V6
+                    db.execSQL("ALTER TABLE " + CARRIERS_TABLE + " ADD COLUMN "
+                            + LINGERING_NETWORK_TYPE_BITMASK + " INTEGER DEFAULT 0;");
+                    db.execSQL("ALTER TABLE " + CARRIERS_TABLE + " ADD COLUMN "
+                            + ALWAYS_ON + " INTEGER DEFAULT 0;");
+                    db.execSQL("ALTER TABLE " + CARRIERS_TABLE + " ADD COLUMN "
+                            + MTU_V4 + " INTEGER DEFAULT " + UNSPECIFIED_INT + ";");
+                    db.execSQL("ALTER TABLE " + CARRIERS_TABLE + " ADD COLUMN "
+                            + MTU_V6 + " INTEGER DEFAULT " + UNSPECIFIED_INT + ";");
+                    // Populate MTU_V4 with MTU values, using default value -1 instead of 0
+                    db.execSQL("UPDATE " + CARRIERS_TABLE + " SET " + MTU_V4 + " = "
+                            + MTU + " WHERE " + MTU + " != 0;");
+                } catch (SQLiteException e) {
+                    if (DBG) {
+                        log("onUpgrade failed to update " + CARRIERS_TABLE
+                                + " to add lingering network type bitmask, always on flag,"
+                                + " and MTU v4 and v6 values.");
+                    }
+                }
+                oldVersion = 55 << 16 | 6;
+            }
+
             if (DBG) {
                 log("dbh.onUpgrade:- db=" + db + " oldV=" + oldVersion + " newV=" + newVersion);
             }
@@ -1986,8 +2019,10 @@
                     queryValOrNull(MAX_CONNECTIONS) +
                     queryValOrNull(WAIT_TIME_RETRY) +
                     queryValOrNull(TIME_LIMIT_FOR_MAX_CONNECTIONS) +
-                    queryValOrNull(MTU);
-            String[] whereArgs = new String[29];
+                    queryValOrNull(MTU) +
+                    queryValOrNull(MTU_V4) +
+                    queryValOrNull(MTU_V6);
+            String[] whereArgs = new String[31];
             int i = 0;
             whereArgs[i++] = values.getAsString(NUMERIC);
             whereArgs[i++] = values.getAsString(MCC);
@@ -2057,6 +2092,10 @@
                     values.getAsString(TIME_LIMIT_FOR_MAX_CONNECTIONS) : "0";
             whereArgs[i++] = values.containsKey(MTU) ?
                     values.getAsString(MTU) : "0";
+            whereArgs[i++] = values.containsKey(MTU_V4) ?
+                    values.getAsString(MTU_V4) : String.valueOf(UNSPECIFIED_INT);
+            whereArgs[i++] = values.containsKey(MTU_V6) ?
+                    values.getAsString(MTU_V6) : String.valueOf(UNSPECIFIED_INT);
 
             if (VDBG) {
                 log("deleteRow: where: " + where);
@@ -2171,7 +2210,10 @@
             getIntValueFromCursor(cv, c, WAIT_TIME_RETRY);
             getIntValueFromCursor(cv, c, TIME_LIMIT_FOR_MAX_CONNECTIONS);
             getIntValueFromCursor(cv, c, MTU);
+            getIntValueFromCursor(cv, c, MTU_V4);
+            getIntValueFromCursor(cv, c, MTU_V6);
             getIntValueFromCursor(cv, c, NETWORK_TYPE_BITMASK);
+            getIntValueFromCursor(cv, c, LINGERING_NETWORK_TYPE_BITMASK);
             getIntValueFromCursor(cv, c, BEARER_BITMASK);
             getIntValueFromCursor(cv, c, EDITED_STATUS);
             getIntValueFromCursor(cv, c, USER_VISIBLE);
@@ -2179,6 +2221,7 @@
             getIntValueFromCursor(cv, c, OWNED_BY);
             getIntValueFromCursor(cv, c, APN_SET_ID);
             getIntValueFromCursor(cv, c, SKIP_464XLAT);
+            getIntValueFromCursor(cv, c, ALWAYS_ON);
         }
 
         private void copyPreservedApnsToNewTable(SQLiteDatabase db, Cursor c) {
@@ -2190,9 +2233,9 @@
                     while (c.moveToNext()) {
                         ContentValues cv = new ContentValues();
                         String val;
-                        // Using V17 copy function for V15 upgrade. This should be fine since it handles
-                        // columns that may not exist properly (getStringValueFromCursor() and
-                        // getIntValueFromCursor() handle column index -1)
+                        // Using V17 copy function for V15 upgrade. This should be fine since it
+                        // handles columns that may not exist properly (getStringValueFromCursor()
+                        // and getIntValueFromCursor() handle column index -1)
                         copyApnValuesV17(cv, c);
                         // Change bearer to a bitmask
                         String bearerStr = c.getString(c.getColumnIndex(BEARER));
@@ -2390,6 +2433,8 @@
             addIntAttribute(parser, "wait_time", map, WAIT_TIME_RETRY);
             addIntAttribute(parser, "max_conns_time", map, TIME_LIMIT_FOR_MAX_CONNECTIONS);
             addIntAttribute(parser, "mtu", map, MTU);
+            addIntAttribute(parser, "mtu_v4", map, MTU_V4);
+            addIntAttribute(parser, "mtu_v6", map, MTU_V6);
             addIntAttribute(parser, "apn_set_id", map, APN_SET_ID);
             addIntAttribute(parser, "carrier_id", map, CARRIER_ID);
             addIntAttribute(parser, "skip_464xlat", map, SKIP_464XLAT);
@@ -2398,6 +2443,7 @@
             addBoolAttribute(parser, "modem_cognitive", map, MODEM_PERSIST);
             addBoolAttribute(parser, "user_visible", map, USER_VISIBLE);
             addBoolAttribute(parser, "user_editable", map, USER_EDITABLE);
+            addBoolAttribute(parser, "always_on", map, ALWAYS_ON);
 
             int networkTypeBitmask = 0;
             String networkTypeList = parser.getAttributeValue(null, "network_type_bitmask");
@@ -2406,6 +2452,14 @@
             }
             map.put(NETWORK_TYPE_BITMASK, networkTypeBitmask);
 
+            int lingeringNetworkTypeBitmask = 0;
+            String lingeringNetworkTypeList =
+                    parser.getAttributeValue(null, "lingering_network_type_bitmask");
+            if (lingeringNetworkTypeList != null) {
+                lingeringNetworkTypeBitmask = getBitmaskFromString(lingeringNetworkTypeList);
+            }
+            map.put(LINGERING_NETWORK_TYPE_BITMASK, lingeringNetworkTypeBitmask);
+
             int bearerBitmask = 0;
             if (networkTypeList != null) {
                 bearerBitmask = convertNetworkTypeBitmaskToBearerBitmask(networkTypeBitmask);
@@ -3545,7 +3599,7 @@
                 PersistableBundle backedUpSimInfoEntry, int backupDataFormatVersion,
                 String isoCountryCodeFromDb,
                 List<String> wfcRestoreBlockedCountries) {
-            if (DATABASE_VERSION != 54 << 16) {
+            if (DATABASE_VERSION != 55 << 16) {
                 throw new AssertionError("The database schema has been updated which might make "
                     + "the format of #BACKED_UP_SIM_SPECIFIC_SETTINGS_FILE outdated. Make sure to "
                     + "1) review whether any of the columns in #SIM_INFO_COLUMNS_TO_BACKUP have "
@@ -5117,7 +5171,7 @@
     private static int getMvnoTypeIntFromString(String mvnoType) {
         String mvnoTypeString = TextUtils.isEmpty(mvnoType) ? mvnoType : mvnoType.toLowerCase();
         Integer mvnoTypeInt = MVNO_TYPE_STRING_MAP.get(mvnoTypeString);
-        return  mvnoTypeInt == null ? UNSPECIFIED_INT : mvnoTypeInt;
+        return  mvnoTypeInt == null ? 0 : mvnoTypeInt;
     }
 
     private static int getBitmaskFromString(String bearerList) {
diff --git a/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java b/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
index 1726403..bb80f03 100644
--- a/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyDatabaseHelperTest.java
@@ -303,6 +303,25 @@
                 Telephony.SimInfo.COLUMN_PHONE_NUMBER_SOURCE_IMS));
     }
 
+    @Test
+    public void databaseHelperOnUpgrade_hasLingeringNetworkTypeAlwaysOnMtuFields() {
+        Log.d(TAG, "databaseHelperOnUpgrade_hasLingeringNetworkTypeAlwaysOnMtuFields");
+        // (5 << 16 | 6) is the first upgrade trigger in onUpgrade
+        SQLiteDatabase db = mInMemoryDbHelper.getWritableDatabase();
+        mHelper.onUpgrade(db, (4 << 16), TelephonyProvider.getVersion(mContext));
+
+        // The upgraded db must have the fields Telephony.Carrier.LINGERING_NETWORK_TYPE,
+        // Telephony.Carrier.ALWAYS_ON, Telephony.Carrier.MTU_V4, and Telephony.Carrier.MTU_V6
+        Cursor cursor = db.query("carriers", null, null, null, null, null, null);
+        String[] columns = cursor.getColumnNames();
+        Log.d(TAG, "carriers columns: " + Arrays.toString(columns));
+
+        assertTrue(Arrays.asList(columns).contains(Carriers.LINGERING_NETWORK_TYPE_BITMASK));
+        assertTrue(Arrays.asList(columns).contains(Carriers.ALWAYS_ON));
+        assertTrue(Arrays.asList(columns).contains(Carriers.MTU_V4));
+        assertTrue(Arrays.asList(columns).contains(Carriers.MTU_V6));
+    }
+
     /**
      * Helper for an in memory DB used to test the TelephonyProvider#DatabaseHelper.
      *
