diff --git a/res/values/config.xml b/res/values/config.xml
index 23c08b8..e4be55f 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -14,4 +14,11 @@
          If this value is empty or unparsable, we will apply APNs from the APN
          conf xml file.  -->
     <string name="apn_source_service" translatable="false"></string>
+
+    <!-- Countries, in iso country code format, where wfc entitlement is
+         required-->
+    <string-array name="wfc_entitlement_required_countries">
+        <item>us</item>
+        <item>ca</item>
+    </string-array>
 </resources>
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 7d4bc6f..e9740c4 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -394,6 +394,12 @@
                 Telephony.SimInfo.COLUMN_VT_IMS_ENABLED, Cursor.FIELD_TYPE_INTEGER);
         SIM_INFO_COLUMNS_TO_BACKUP.put(
                 Telephony.SimInfo.COLUMN_D2D_STATUS_SHARING, Cursor.FIELD_TYPE_INTEGER);
+        SIM_INFO_COLUMNS_TO_BACKUP.put(
+                Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED, Cursor.FIELD_TYPE_INTEGER);
+        SIM_INFO_COLUMNS_TO_BACKUP.put(
+                Telephony.SimInfo.COLUMN_WFC_IMS_MODE, Cursor.FIELD_TYPE_INTEGER);
+        SIM_INFO_COLUMNS_TO_BACKUP.put(
+                Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE, Cursor.FIELD_TYPE_INTEGER);
     }
 
     @VisibleForTesting
@@ -3179,7 +3185,8 @@
                         Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
                         Telephony.SimInfo.COLUMN_ICC_ID,
                         Telephony.SimInfo.COLUMN_NUMBER,
-                        Telephony.SimInfo.COLUMN_CARRIER_ID},
+                        Telephony.SimInfo.COLUMN_CARRIER_ID,
+                        Telephony.SimInfo.COLUMN_ISO_COUNTRY_CODE},
                 selection,
                 selectionArgs,
                 ORDER_BY_SUB_ID)) {
@@ -3198,6 +3205,10 @@
         int backupDataFormatVersion = backedUpDataBundle
                 .getInt(KEY_BACKUP_DATA_FORMAT_VERSION, -1);
 
+        Resources r = getContext().getResources();
+        List<String> wfcEntitlementRequiredCountries = Arrays.asList(r.getStringArray(
+                    R.array.wfc_entitlement_required_countries));
+
         while (cursor != null && cursor.moveToNext()) {
             // Get all the possible matching criteria.
             int subIdColumnIndex = cursor.getColumnIndex(
@@ -3218,6 +3229,11 @@
             int carrierIdColumnIndex = cursor.getColumnIndex(Telephony.SimInfo.COLUMN_CARRIER_ID);
             int currCarrierIdFromDb = cursor.getInt(carrierIdColumnIndex);
 
+            int isoCountryCodeColumnIndex= cursor.getColumnIndex(
+                    Telephony.SimInfo.COLUMN_ISO_COUNTRY_CODE);
+            String isoCountryCodeFromDb = cursor.getString(isoCountryCodeColumnIndex);
+
+
             // Find the best match from backed up data.
             SimRestoreMatch bestRestoreMatch = null;
             for (int rowNum = 0; true; rowNum++) {
@@ -3228,7 +3244,8 @@
                 }
 
                 SimRestoreMatch currSimRestoreMatch = new SimRestoreMatch(
-                        currIccIdFromDb, currCarrierIdFromDb, currPhoneNumberFromDb, currRow,
+                        currIccIdFromDb, currCarrierIdFromDb, currPhoneNumberFromDb,
+                        isoCountryCodeFromDb, wfcEntitlementRequiredCountries, currRow,
                         backupDataFormatVersion);
 
                 if (currSimRestoreMatch == null) {
@@ -3315,8 +3332,9 @@
         private static final int CARRIER_ID_MATCH = 3;
 
         public SimRestoreMatch(String iccIdFromDb, int carrierIdFromDb,
-                String phoneNumberFromDb, PersistableBundle backedUpSimInfoEntry,
-                int backupDataFormatVersion) {
+                String phoneNumberFromDb, String isoCountryCodeFromDb,
+                List<String> wfcEntitlementRequiredCountries,
+                PersistableBundle backedUpSimInfoEntry, int backupDataFormatVersion) {
             subId = backedUpSimInfoEntry.getInt(
                 Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
                 DEFAULT_INT_COLUMN_VALUE);
@@ -3344,7 +3362,8 @@
             }
 
             contentValues = convertBackedUpDataToContentValues(
-                    backedUpSimInfoEntry, backupDataFormatVersion);
+                    backedUpSimInfoEntry, backupDataFormatVersion, isoCountryCodeFromDb,
+                    wfcEntitlementRequiredCountries);
             matchScore = calculateMatchScore();
             matchingCriteria = calculateMatchingCriteria();
         }
@@ -3398,7 +3417,9 @@
         }
 
         private ContentValues convertBackedUpDataToContentValues(
-                PersistableBundle backedUpSimInfoEntry, int backupDataFormatVersion) {
+                PersistableBundle backedUpSimInfoEntry, int backupDataFormatVersion,
+                String isoCountryCodeFromDb,
+                List<String> wfcEntitlementRequiredCountries) {
             if (DATABASE_VERSION != 50 << 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 "
@@ -3435,6 +3456,7 @@
              *     contentValues.put(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED,
              *               backedUpSimInfoEntry.getString(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED,
              *               ""));
+             *     ...
              *   }
              *
              * Also make sure to add necessary removal of sensitive settings in
@@ -3456,6 +3478,24 @@
                     backedUpSimInfoEntry.getInt(
                             Telephony.SimInfo.COLUMN_D2D_STATUS_SHARING,
                             DEFAULT_INT_COLUMN_VALUE));
+            if (isoCountryCodeFromDb != null
+                    && !wfcEntitlementRequiredCountries
+                            .contains(isoCountryCodeFromDb.toLowerCase())) {
+                // Don't restore COLUMN_WFC_IMS_ENABLED if the sim is from one of the countries that
+                // requires WFC entitlement.
+                contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED,
+                        backedUpSimInfoEntry.getInt(
+                                Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED,
+                                DEFAULT_INT_COLUMN_VALUE));
+            }
+            contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_MODE,
+                    backedUpSimInfoEntry.getInt(
+                            Telephony.SimInfo.COLUMN_WFC_IMS_MODE,
+                            DEFAULT_INT_COLUMN_VALUE));
+            contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE,
+                    backedUpSimInfoEntry.getInt(
+                            Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE,
+                            DEFAULT_INT_COLUMN_VALUE));
 
             return polishContentValues(contentValues);
         }
diff --git a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
index 826f51a..4adf0bc 100644
--- a/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
+++ b/tests/src/com/android/providers/telephony/TelephonyProviderTest.java
@@ -45,6 +45,7 @@
 import android.telephony.TelephonyManager;
 import android.test.mock.MockContentResolver;
 import android.test.mock.MockContext;
+import android.test.mock.MockResources;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.text.TextUtils;
 import android.util.Log;
@@ -55,6 +56,8 @@
 
 import org.junit.Test;
 import org.mockito.MockitoAnnotations;
+import org.mockito.Mock;
+import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -81,6 +84,8 @@
     private MockContextWithProvider mContext;
     private MockContentResolver mContentResolver;
     private TelephonyProviderTestable mTelephonyProviderTestable;
+    @Mock
+    private Resources mockContextResources;
 
     private int notifyChangeCount;
     private int notifyChangeRestoreCount;
@@ -119,120 +124,96 @@
     private static final String ENFORCED_KEY = "enforced";
 
 
-    private static final int MATCHING_SUB_ID = 987654321;
     private static final String MATCHING_ICCID = "MATCHING_ICCID";
     private static final String MATCHING_PHONE_NUMBER = "MATCHING_PHONE_NUMBER";
     private static final int MATCHING_CARRIER_ID = 123456789;
 
     // Represents an entry in the SimInfoDb
-    private static final ContentValues TEST_SIM_INFO_VALUES = new ContentValues();
+    private static final ContentValues TEST_SIM_INFO_VALUES_US;
+    private static final ContentValues TEST_SIM_INFO_VALUES_FR;
     private static final int ARBITRARY_SIMINFO_DB_TEST_INT_VALUE = 999999;
     private static final String ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE
             = "ARBITRARY_TEST_STRING_VALUE";
 
-    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID
-            = new ContentValues();
+    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID;
     private static final int ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1 = 111111;
     private static final String ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1
             = "ARBITRARY_TEST_STRING_VALUE_1";
 
-    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID
-            = new ContentValues();
+    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID;
     private static final int ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2 = 222222;
     private static final String ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2
             = "ARBITRARY_TEST_STRING_VALUE_2";
 
-    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID
-            = new ContentValues();
+    private static final ContentValues BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID;
     private static final int ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3 = 333333;
     private static final String ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3
             = "ARBITRARY_TEST_STRING_VALUE_3";
 
     static {
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
-                MATCHING_SUB_ID);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_ICC_ID, MATCHING_ICCID);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_NUMBER, MATCHING_PHONE_NUMBER);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_CARD_ID,
+        TEST_SIM_INFO_VALUES_US = populateContentValues(
+                MATCHING_ICCID,
+                MATCHING_PHONE_NUMBER,
+                MATCHING_CARRIER_ID,
+                "us",
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
                 ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_CARRIER_ID, MATCHING_CARRIER_ID);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED,
-            ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
-        TEST_SIM_INFO_VALUES.put(Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
-        TEST_SIM_INFO_VALUES.put(SimInfo.COLUMN_D2D_STATUS_SHARING,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
 
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_ICC_ID, MATCHING_ICCID);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_NUMBER, ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_CARD_ID, ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_CARRIER_ID, ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_VT_IMS_ENABLED, ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID.put(
-                SimInfo.COLUMN_D2D_STATUS_SHARING,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE);
-
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_ICC_ID, ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_NUMBER, MATCHING_PHONE_NUMBER);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_CARD_ID, ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_CARRIER_ID, MATCHING_CARRIER_ID);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_VT_IMS_ENABLED, ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID.put(
-                SimInfo.COLUMN_D2D_STATUS_SHARING,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2);
-
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(
-                Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_ICC_ID,
-                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_NUMBER,
-                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_CARD_ID,
+        TEST_SIM_INFO_VALUES_FR = populateContentValues(
+                MATCHING_ICCID,
+                MATCHING_PHONE_NUMBER,
+                MATCHING_CARRIER_ID,
+                "fr",
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
                 ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_CARRIER_ID,
-                MATCHING_CARRIER_ID);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(
-                Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(
-                Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
-        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID.put(
-                SimInfo.COLUMN_D2D_STATUS_SHARING,
-                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3);
+
+        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID = populateContentValues(
+                MATCHING_ICCID,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1,
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                null,
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_1);
+
+        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID = populateContentValues(
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2,
+                MATCHING_PHONE_NUMBER,
+                MATCHING_CARRIER_ID,
+                null,
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_2);
+
+        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID = populateContentValues(
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3,
+                MATCHING_CARRIER_ID,
+                null,
+                ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3,
+                ARBITRARY_SIMINFO_DB_TEST_STRING_VALUE_3);
+    }
+
+    private static ContentValues populateContentValues(
+            String iccId, String phoneNumber, int carrierId, String isoCountryCode,
+            int arbitraryIntVal, String arbitraryStringVal) {
+            ContentValues contentValues = new ContentValues();
+
+        contentValues.put(Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_ICC_ID, iccId);
+        contentValues.put(Telephony.SimInfo.COLUMN_NUMBER, phoneNumber);
+        contentValues.put(Telephony.SimInfo.COLUMN_CARD_ID, arbitraryStringVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_CARRIER_ID, carrierId);
+        contentValues.put(Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_VT_IMS_ENABLED, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_MODE, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE, arbitraryIntVal);
+        contentValues.put(Telephony.SimInfo.COLUMN_D2D_STATUS_SHARING, arbitraryIntVal);
+        if (isoCountryCode != null) {
+            contentValues.put(Telephony.SimInfo.COLUMN_ISO_COUNTRY_CODE, isoCountryCode);
+        }
+
+        return contentValues;
     }
 
     /**
@@ -317,8 +298,7 @@
 
         @Override
         public Resources getResources() {
-            Log.d(TAG, "getResources: returning null");
-            return null;
+            return mockContextResources;
         }
 
         @Override
@@ -365,6 +345,7 @@
         super.setUp();
         MockitoAnnotations.initMocks(this);
         mTelephonyProviderTestable = new TelephonyProviderTestable();
+        when(mockContextResources.getStringArray(anyInt())).thenReturn(new String[]{"ca", "us"});
         notifyChangeCount = 0;
         notifyChangeRestoreCount = 0;
     }
@@ -775,23 +756,23 @@
                         BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID,
                         BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
         createInternalBackupFile(simSpecificSettingsData);
-        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES);
+        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES_US);
 
         mContext.getContentResolver().call(
-            SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
-            SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
-            MATCHING_ICCID, null);
+                SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
+                SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
+                MATCHING_ICCID, null);
 
         Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
-            null, null, null, null);
+                null, null, null, null);
         assertEquals(1, cursor.getCount());
         cursor.moveToFirst();
 
         // Make sure SubId didn't get overridden.
         assertEquals(
-            (int)TEST_SIM_INFO_VALUES.getAsInteger(
-                    Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
-            getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+                (int)TEST_SIM_INFO_VALUES_US.getAsInteger(
+                        Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
         // Ensure all other values got updated.
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED));
@@ -799,6 +780,12 @@
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_VT_IMS_ENABLED));
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_MODE));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE));
 
         assertRestoredSubIdIsRemembered();
     }
@@ -807,26 +794,26 @@
     public void testFullRestoreOnMatchingNumberAndCid() {
         byte[] simSpecificSettingsData = getBackupData(
                 new ContentValues[]{
-                    BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID,
-                    BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID,
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
         createInternalBackupFile(simSpecificSettingsData);
-        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES);
+        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES_US);
 
         mContext.getContentResolver().call(
-            SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
-            SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
-            MATCHING_ICCID, null);
+                SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
+                SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
+                MATCHING_ICCID, null);
 
         Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
-            null, null, null, null);
+                null, null, null, null);
         assertEquals(1, cursor.getCount());
         cursor.moveToFirst();
 
         // Make sure SubId didn't get overridden.
         assertEquals(
-            (int) TEST_SIM_INFO_VALUES.getAsInteger(
-                    Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
-            getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+                (int) TEST_SIM_INFO_VALUES_US.getAsInteger(
+                        Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
         // Ensure all other values got updated.
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED));
@@ -834,6 +821,12 @@
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_VT_IMS_ENABLED));
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_MODE));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_2,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE));
 
         assertRestoredSubIdIsRemembered();
     }
@@ -841,26 +834,26 @@
     @Test
     public void testFullRestoreOnMatchingCidOnly() {
         byte[] simSpecificSettingsData = getBackupData(
-            new ContentValues[]{
-                BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
+                new ContentValues[]{
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
         createInternalBackupFile(simSpecificSettingsData);
-        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES);
+        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES_US);
 
         mContext.getContentResolver().call(
-            SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
-            SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
-            MATCHING_ICCID, null);
+                SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
+                SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
+                MATCHING_ICCID, null);
 
         Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
-            null, null, null, null);
+                null, null, null, null);
         assertEquals(1, cursor.getCount());
         cursor.moveToFirst();
 
         // Make sure SubId didn't get overridden.
         assertEquals(
-            (int) TEST_SIM_INFO_VALUES.getAsInteger(
-                    Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
-            getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+                (int) TEST_SIM_INFO_VALUES_US.getAsInteger(
+                        Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
         // Ensure sensitive settings did not get updated.
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED));
@@ -869,6 +862,54 @@
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED));
         assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3,
                 getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_VT_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_MODE));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_3,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE));
+
+        assertRestoredSubIdIsRemembered();
+    }
+
+    @Test
+    public void testFullRestoreOnMatchingIccIdWithFranceISO() {
+        byte[] simSpecificSettingsData = getBackupData(
+                new ContentValues[]{
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_ICCID,
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_NUMBER_AND_CID,
+                        BACKED_UP_SIM_INFO_VALUES_WITH_MATCHING_CID});
+        createInternalBackupFile(simSpecificSettingsData);
+        mContentResolver.insert(SubscriptionManager.CONTENT_URI, TEST_SIM_INFO_VALUES_FR);
+
+        mContext.getContentResolver().call(
+                SubscriptionManager.SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
+                SubscriptionManager.RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
+                MATCHING_ICCID, null);
+
+        Cursor cursor = mContentResolver.query(SubscriptionManager.CONTENT_URI,
+                null, null, null, null);
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+
+        // Make sure SubId didn't get overridden.
+        assertEquals(
+                (int) TEST_SIM_INFO_VALUES_FR.getAsInteger(
+                        Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID),
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID));
+        // Ensure all other values got updated.
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_ENHANCED_4G_MODE_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_VT_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_IMS_RCS_UCE_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ENABLED));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_MODE));
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE_1,
+                getIntValueFromCursor(cursor, Telephony.SimInfo.COLUMN_WFC_IMS_ROAMING_MODE));
 
         assertRestoredSubIdIsRemembered();
     }
@@ -878,7 +919,7 @@
         int[] previouslyRestoredSubIds =
                 bundle.getIntArray(TelephonyProvider.KEY_PREVIOUSLY_RESTORED_SUB_IDS);
         assertNotNull(previouslyRestoredSubIds);
-        assertEquals(MATCHING_SUB_ID, previouslyRestoredSubIds[0]);
+        assertEquals(ARBITRARY_SIMINFO_DB_TEST_INT_VALUE, previouslyRestoredSubIds[0]);
     }
 
     private PersistableBundle getPersistableBundleFromInternalStorageFile() {
