diff --git a/res/values/strings.xml b/res/values/strings.xml
index 74b8d7f..2263141 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -883,6 +883,9 @@
     <!-- Note: Update FingerprintEnrollParentalConsent.CONSENT_STRING_RESOURCES when any _consent_ strings are added or removed. -->
     <!-- Title shown for menu item that launches fingerprint settings or enrollment [CHAR LIMIT=22] -->
     <string name="security_settings_fingerprint_preference_title">Fingerprint</string>
+    <!-- Fingerprint enrollment and settings --><skip />
+    <!-- Title shown for work menu item that launches fingerprint settings or enrollment [CHAR LIMIT=22] -->
+    <string name="security_settings_work_fingerprint_preference_title">Fingerprint for work</string>
     <!-- Fingerprint managment category title - configuration options for managing enrolled fingerprints [CHAR LIMIT=22] -->
     <string name="fingerprint_manage_category_title">Manage fingerprints</string>
     <!-- Fingerprint category title - configuration options for managing fingerprint enrollment [CHAR LIMIT=22] -->
diff --git a/res/xml/adb_wireless_settings.xml b/res/xml/adb_wireless_settings.xml
index 8a9cfe6..7d37207 100644
--- a/res/xml/adb_wireless_settings.xml
+++ b/res/xml/adb_wireless_settings.xml
@@ -42,7 +42,8 @@
     <!-- Pairing methods category -->
     <PreferenceCategory
         android:key="adb_pairing_methods_category"
-        android:layout="@layout/preference_category_no_label">
+        android:layout="@layout/preference_category_no_label"
+        settings:allowDividerAbove="true">
         <!-- qrcode scanner -->
         <Preference
             android:key="adb_pair_method_qrcode_pref"
@@ -52,6 +53,7 @@
             settings:controller="com.android.settings.development.AdbQrCodePreferenceController"/>
         <Preference
             android:key="adb_pair_method_code_pref"
+            android:icon="@drawable/ic_password"
             android:title="@string/adb_pair_method_code_title"
             android:summary="@string/adb_pair_method_code_summary"/>
     </PreferenceCategory>
@@ -59,7 +61,8 @@
     <!-- Paired devices list -->
     <PreferenceCategory
         android:key="adb_paired_devices_category"
-        android:title="@string/adb_paired_devices_title"/>
+        android:title="@string/adb_paired_devices_title"
+        settings:allowDividerAbove="true"/>
 
     <!-- Off message: Shown only in the off state -->
     <PreferenceCategory
diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml
index 23d2b6b..5b687af 100644
--- a/res/xml/security_dashboard_settings.xml
+++ b/res/xml/security_dashboard_settings.xml
@@ -155,7 +155,7 @@
 
         <com.android.settingslib.RestrictedPreference
             android:key="fingerprint_settings_profile"
-            android:title="@string/security_settings_fingerprint_preference_title"
+            android:title="@string/security_settings_work_fingerprint_preference_title"
             android:summary="@string/summary_placeholder" />
 
         <com.android.settingslib.RestrictedPreference
diff --git a/src/com/android/settings/network/MobileNetworkListFragment.java b/src/com/android/settings/network/MobileNetworkListFragment.java
index 1767c1c..03e5a01 100644
--- a/src/com/android/settings/network/MobileNetworkListFragment.java
+++ b/src/com/android/settings/network/MobileNetworkListFragment.java
@@ -65,14 +65,12 @@
 
         if (Utils.isProviderModelEnabled(getContext())) {
             NetworkProviderSimsCategoryController simCategoryPrefCtrl =
-                    new NetworkProviderSimsCategoryController(context, KEY_PREFERENCE_CATEGORY_SIM);
-            simCategoryPrefCtrl.init(getSettingsLifecycle());
+                    new NetworkProviderSimsCategoryController(context, KEY_PREFERENCE_CATEGORY_SIM,
+                            getSettingsLifecycle());
             controllers.add(simCategoryPrefCtrl);
-
             NetworkProviderDownloadedSimsCategoryController downloadedSimsCategoryCtrl =
                     new NetworkProviderDownloadedSimsCategoryController(context,
-                            KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM);
-            downloadedSimsCategoryCtrl.init(getSettingsLifecycle());
+                            KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM, getSettingsLifecycle());
             controllers.add(downloadedSimsCategoryCtrl);
         } else {
             controllers.add(new MobileNetworkListController(getContext(), getLifecycle()));
diff --git a/src/com/android/settings/network/NetworkProviderDownloadedSimsCategoryController.java b/src/com/android/settings/network/NetworkProviderDownloadedSimsCategoryController.java
index f7c70f2..f5176b0 100644
--- a/src/com/android/settings/network/NetworkProviderDownloadedSimsCategoryController.java
+++ b/src/com/android/settings/network/NetworkProviderDownloadedSimsCategoryController.java
@@ -1,8 +1,8 @@
 package com.android.settings.network;
 
 import android.content.Context;
+import android.util.Log;
 
-import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceScreen;
@@ -15,23 +15,17 @@
 public class NetworkProviderDownloadedSimsCategoryController extends
         PreferenceCategoryController implements LifecycleObserver {
 
+    private static final String LOG_TAG = "NetworkProviderDownloadedSimsCategoryController";
     private static final String KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM =
             "provider_model_downloaded_sim_category";
     private PreferenceCategory mPreferenceCategory;
     private NetworkProviderDownloadedSimListController mNetworkProviderDownloadedSimListController;
 
-    public NetworkProviderDownloadedSimsCategoryController(Context context, String key) {
-        super(context, key);
-    }
-
-    public void init(Lifecycle lifecycle) {
-        mNetworkProviderDownloadedSimListController = createDownloadedSimListController(lifecycle);
-    }
-
-    @VisibleForTesting
-    protected NetworkProviderDownloadedSimListController createDownloadedSimListController(
+    public NetworkProviderDownloadedSimsCategoryController(Context context, String key,
             Lifecycle lifecycle) {
-        return new NetworkProviderDownloadedSimListController(mContext, lifecycle);
+        super(context, key);
+        mNetworkProviderDownloadedSimListController =
+                new NetworkProviderDownloadedSimListController(mContext, lifecycle);
     }
 
     @Override
@@ -47,15 +41,23 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
+        mNetworkProviderDownloadedSimListController.displayPreference(screen);
         mPreferenceCategory = screen.findPreference(
                 KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM);
+        if (mPreferenceCategory == null) {
+            Log.d(LOG_TAG, "displayPreference(), Can not find the category.");
+            return;
+        }
         mPreferenceCategory.setVisible(isAvailable());
-        mNetworkProviderDownloadedSimListController.displayPreference(screen);
     }
 
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
+        if (mPreferenceCategory == null) {
+            Log.d(LOG_TAG, "updateState(), Can not find the category.");
+            return;
+        }
         int count = mPreferenceCategory.getPreferenceCount();
         String title = mContext.getString(count > 1
                 ? R.string.downloaded_sims_category_title
diff --git a/src/com/android/settings/network/NetworkProviderSimListController.java b/src/com/android/settings/network/NetworkProviderSimListController.java
index 814a461..8fb6cb6 100644
--- a/src/com/android/settings/network/NetworkProviderSimListController.java
+++ b/src/com/android/settings/network/NetworkProviderSimListController.java
@@ -172,7 +172,6 @@
         for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mContext)) {
             if (!info.isEmbedded()) {
                 subList.add(info);
-                break;
             }
         }
         return subList;
diff --git a/src/com/android/settings/network/NetworkProviderSimsCategoryController.java b/src/com/android/settings/network/NetworkProviderSimsCategoryController.java
index e27575a..06035a9 100644
--- a/src/com/android/settings/network/NetworkProviderSimsCategoryController.java
+++ b/src/com/android/settings/network/NetworkProviderSimsCategoryController.java
@@ -17,33 +17,28 @@
 package com.android.settings.network;
 
 import android.content.Context;
+import android.util.Log;
 
-import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceScreen;
 
+import com.android.settings.R;
 import com.android.settings.widget.PreferenceCategoryController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 
 public class NetworkProviderSimsCategoryController extends PreferenceCategoryController implements
         LifecycleObserver {
-
+    private static final String LOG_TAG = "NetworkProviderSimsCategoryController";
     private static final String KEY_PREFERENCE_CATEGORY_SIM = "provider_model_sim_category";
     private NetworkProviderSimListController mNetworkProviderSimListController;
+    private PreferenceCategory mPreferenceCategory;
 
-    public NetworkProviderSimsCategoryController(Context context, String key) {
+    public NetworkProviderSimsCategoryController(Context context, String key, Lifecycle lifecycle) {
         super(context, key);
-    }
-
-    public void init(Lifecycle lifecycle) {
-        mNetworkProviderSimListController = createSimListController(lifecycle);
-    }
-
-    @VisibleForTesting
-    protected NetworkProviderSimListController createSimListController(
-            Lifecycle lifecycle) {
-        return new NetworkProviderSimListController(mContext, lifecycle);
+        mNetworkProviderSimListController =
+                new NetworkProviderSimListController(mContext, lifecycle);
     }
 
     @Override
@@ -59,8 +54,26 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        PreferenceCategory preferenceCategory = screen.findPreference(KEY_PREFERENCE_CATEGORY_SIM);
-        preferenceCategory.setVisible(isAvailable());
         mNetworkProviderSimListController.displayPreference(screen);
+        mPreferenceCategory = screen.findPreference(KEY_PREFERENCE_CATEGORY_SIM);
+        if (mPreferenceCategory == null) {
+            Log.d(LOG_TAG, "displayPreference(), Can not find the category.");
+            return;
+        }
+        mPreferenceCategory.setVisible(isAvailable());
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        if (mPreferenceCategory == null) {
+            Log.d(LOG_TAG, "updateState(), Can not find the category.");
+            return;
+        }
+        int count = mPreferenceCategory.getPreferenceCount();
+        String title = mContext.getString(count > 1
+                ? R.string.provider_network_settings_title
+                : R.string.sim_category_title);
+        mPreferenceCategory.setTitle(title);
     }
 }
diff --git a/tests/unit/src/com/android/settings/network/NetworkProviderDownloadedSimsCategoryControllerTest.java b/tests/unit/src/com/android/settings/network/NetworkProviderDownloadedSimsCategoryControllerTest.java
index e34b489..9045502 100644
--- a/tests/unit/src/com/android/settings/network/NetworkProviderDownloadedSimsCategoryControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/NetworkProviderDownloadedSimsCategoryControllerTest.java
@@ -26,9 +26,12 @@
 
 import android.content.Context;
 import android.os.Looper;
+import android.telephony.SubscriptionInfo;
 
+import com.android.settings.testutils.ResourcesUtils;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
+import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
@@ -41,38 +44,39 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+
 @RunWith(AndroidJUnit4.class)
 public class NetworkProviderDownloadedSimsCategoryControllerTest {
 
     private static final String KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM =
             "provider_model_downloaded_sim_category";
+    private static final String KEY_ADD_MORE = "add_more";
+    private static final String SUB_1 = "SUB_1";
+    private static final String SUB_2 = "SUB_2";
+    private static final int SUB_ID_1 = 1;
+    private static final int SUB_ID_2 = 2;
 
     @Mock
-    private NetworkProviderDownloadedSimListController mNetworkProviderDownloadedSimListController;
-    @Mock
-    private PreferenceCategory mPreferenceCategory;
-    @Mock
     private Lifecycle mLifecycle;
+    @Mock
+    private SubscriptionInfo mSubscriptionInfo1;
+    @Mock
+    private SubscriptionInfo mSubscriptionInfo2;
 
     private Context mContext;
     private NetworkProviderDownloadedSimsCategoryController mCategoryController;
-
+    private PreferenceCategory mPreferenceCategory;
     private PreferenceManager mPreferenceManager;
     private PreferenceScreen mPreferenceScreen;
+    private Preference mAddMorePreference;
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
 
         mContext = spy(ApplicationProvider.getApplicationContext());
-        mCategoryController = new NetworkProviderDownloadedSimsCategoryController(
-                mContext, KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM) {
-            @Override
-            protected NetworkProviderDownloadedSimListController createDownloadedSimListController(
-                    Lifecycle lifecycle) {
-                return mNetworkProviderDownloadedSimListController;
-            }
-        };
 
         if (Looper.myLooper() == null) {
             Looper.prepare();
@@ -80,14 +84,21 @@
 
         mPreferenceManager = new PreferenceManager(mContext);
         mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
-        when(mPreferenceCategory.getKey()).thenReturn(KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM);
-        when(mPreferenceCategory.getPreferenceCount()).thenReturn(1);
+        mPreferenceCategory = new PreferenceCategory(mContext);
+        mPreferenceCategory.setKey(KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM);
+        mAddMorePreference = new Preference(mContext);
+        mAddMorePreference.setKey(KEY_ADD_MORE);
+        mAddMorePreference.setVisible(true);
         mPreferenceScreen.addPreference(mPreferenceCategory);
+        mPreferenceScreen.addPreference(mAddMorePreference);
+
+        mCategoryController = new NetworkProviderDownloadedSimsCategoryController(mContext,
+                KEY_PREFERENCE_CATEGORY_DOWNLOADED_SIM, mLifecycle);
     }
 
     @Test
     public void getAvailabilityStatus_returnUnavailable() {
-        mNetworkProviderDownloadedSimListController = null;
+        SubscriptionUtil.setAvailableSubscriptionsForTesting(new ArrayList<>());
 
         assertThat(mCategoryController.getAvailabilityStatus()).isEqualTo(
                 CONDITIONALLY_UNAVAILABLE);
@@ -95,10 +106,46 @@
 
     @Test
     public void displayPreference_isVisible() {
-        when(mNetworkProviderDownloadedSimListController.isAvailable()).thenReturn(true);
-        mCategoryController.init(mLifecycle);
+        setUpSubscriptionInfoForDownloadedSim(SUB_ID_1, SUB_1, mSubscriptionInfo1);
+        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscriptionInfo1));
         mCategoryController.displayPreference(mPreferenceScreen);
 
         assertEquals(mPreferenceCategory.isVisible(), true);
     }
+
+
+    @Test
+    public void updateState_setTitle_withTwoDownloadedSims_returnDownloadedSims() {
+        setUpSubscriptionInfoForDownloadedSim(SUB_ID_1, SUB_1, mSubscriptionInfo1);
+        setUpSubscriptionInfoForDownloadedSim(SUB_ID_2, SUB_2, mSubscriptionInfo2);
+        SubscriptionUtil.setAvailableSubscriptionsForTesting(
+                Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
+
+        mCategoryController.displayPreference(mPreferenceScreen);
+        mCategoryController.updateState(mPreferenceCategory);
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+        assertThat(mPreferenceCategory.getTitle()).isEqualTo(
+                ResourcesUtils.getResourcesString(mContext, "downloaded_sims_category_title"));
+    }
+
+    @Test
+    public void updateState_setTitle_withOneDownloadedSim_returnDownloadedSim() {
+        setUpSubscriptionInfoForDownloadedSim(SUB_ID_1, SUB_1, mSubscriptionInfo1);
+        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscriptionInfo1));
+
+        mCategoryController.displayPreference(mPreferenceScreen);
+        mCategoryController.updateState(mPreferenceCategory);
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceCategory.getTitle()).isEqualTo(
+                ResourcesUtils.getResourcesString(mContext, "downloaded_sim_category_title"));
+    }
+
+    private void setUpSubscriptionInfoForDownloadedSim(int subId, String displayName,
+            SubscriptionInfo subscriptionInfo) {
+        when(subscriptionInfo.isEmbedded()).thenReturn(true);
+        when(subscriptionInfo.getSubscriptionId()).thenReturn(subId);
+        when(subscriptionInfo.getDisplayName()).thenReturn(displayName);
+    }
 }
diff --git a/tests/unit/src/com/android/settings/network/NetworkProviderSimListControllerTest.java b/tests/unit/src/com/android/settings/network/NetworkProviderSimListControllerTest.java
index 3b0a40a..066cf6b 100644
--- a/tests/unit/src/com/android/settings/network/NetworkProviderSimListControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/NetworkProviderSimListControllerTest.java
@@ -16,10 +16,14 @@
 
 package com.android.settings.network;
 
+import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
+import static com.google.common.truth.Truth.assertThat;
+
 import static androidx.lifecycle.Lifecycle.Event;
 
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
@@ -170,7 +174,6 @@
         assertTrue(TextUtils.equals(mController.getSummary(SUB_ID_1, DISPLAY_NAME_1), summary));
     }
 
-
     @Test
     @UiThreadTest
     public void getSummary_inactivePSim() {
@@ -227,4 +230,18 @@
         assertTrue(TextUtils.equals(mController.getSummary(SUB_ID_1, DISPLAY_NAME_1), summary));
     }
 
+    @Test
+    @UiThreadTest
+    public void getAvailablePhysicalSubscription_withTwoPhysicalSims_returnTwo() {
+        final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
+        when(info1.isEmbedded()).thenReturn(false);
+        final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
+        when(info2.isEmbedded()).thenReturn(false);
+        when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(
+                Arrays.asList(info1,  info2));
+        displayPreferenceWithLifecycle();
+
+        assertThat(mController.getAvailablePhysicalSubscription().size()).isEqualTo(2);
+    }
+
 }
diff --git a/tests/unit/src/com/android/settings/network/NetworkProviderSimsCategoryControllerTest.java b/tests/unit/src/com/android/settings/network/NetworkProviderSimsCategoryControllerTest.java
index cfa376b..c8d750c 100644
--- a/tests/unit/src/com/android/settings/network/NetworkProviderSimsCategoryControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/NetworkProviderSimsCategoryControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.network;
 
 import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertEquals;
@@ -25,7 +26,10 @@
 
 import android.content.Context;
 import android.os.Looper;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
 
+import com.android.settings.testutils.ResourcesUtils;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import androidx.preference.PreferenceCategory;
@@ -40,37 +44,35 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+
 @RunWith(AndroidJUnit4.class)
 public class NetworkProviderSimsCategoryControllerTest {
 
     private static final String KEY_PREFERENCE_CATEGORY_SIM = "provider_model_sim_category";
+    private static final String SUB_1 = "SUB_1";
+    private static final String SUB_2 = "SUB_2";
+    private static final int SUB_ID_1 = 1;
+    private static final int SUB_ID_2 = 2;
 
     @Mock
-    private NetworkProviderSimListController mNetworkProviderSimListController;
-    @Mock
-    private PreferenceCategory mPreferenceCategory;
-    @Mock
     private Lifecycle mLifecycle;
+    @Mock
+    private SubscriptionInfo mSubscriptionInfo1;
+    @Mock
+    private SubscriptionInfo mSubscriptionInfo2;
 
     private Context mContext;
     private NetworkProviderSimsCategoryController mCategoryController;
-
     private PreferenceManager mPreferenceManager;
     private PreferenceScreen mPreferenceScreen;
+    private PreferenceCategory mPreferenceCategory;
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-
         mContext = spy(ApplicationProvider.getApplicationContext());
-        mCategoryController = new NetworkProviderSimsCategoryController(
-                mContext, KEY_PREFERENCE_CATEGORY_SIM) {
-            @Override
-            protected NetworkProviderSimListController createSimListController(
-                    Lifecycle lifecycle) {
-                return mNetworkProviderSimListController;
-            }
-        };
 
         if (Looper.myLooper() == null) {
             Looper.prepare();
@@ -78,14 +80,17 @@
 
         mPreferenceManager = new PreferenceManager(mContext);
         mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
-        when(mPreferenceCategory.getKey()).thenReturn(KEY_PREFERENCE_CATEGORY_SIM);
-        when(mPreferenceCategory.getPreferenceCount()).thenReturn(1);
+        mPreferenceCategory = new PreferenceCategory(mContext);
+        mPreferenceCategory.setKey(KEY_PREFERENCE_CATEGORY_SIM);
         mPreferenceScreen.addPreference(mPreferenceCategory);
+
+        mCategoryController = new NetworkProviderSimsCategoryController(
+                mContext, KEY_PREFERENCE_CATEGORY_SIM, mLifecycle);
     }
 
     @Test
     public void getAvailabilityStatus_returnUnavailable() {
-        mNetworkProviderSimListController = null;
+        SubscriptionUtil.setAvailableSubscriptionsForTesting(new ArrayList<>());
 
         assertThat(mCategoryController.getAvailabilityStatus()).isEqualTo(
                 CONDITIONALLY_UNAVAILABLE);
@@ -93,10 +98,46 @@
 
     @Test
     public void displayPreference_isVisible() {
-        when(mNetworkProviderSimListController.isAvailable()).thenReturn(true);
-        mCategoryController.init(mLifecycle);
+        setUpSubscriptionInfoForPhysicalSim(SUB_ID_1, SUB_1, mSubscriptionInfo1);
+        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscriptionInfo1));
         mCategoryController.displayPreference(mPreferenceScreen);
 
         assertEquals(mPreferenceCategory.isVisible(), true);
     }
+
+    @Test
+    public void updateState_setTitle_withTwoPhysicalSims_returnSims() {
+        setUpSubscriptionInfoForPhysicalSim(SUB_ID_1, SUB_1, mSubscriptionInfo1);
+        setUpSubscriptionInfoForPhysicalSim(SUB_ID_2, SUB_2, mSubscriptionInfo2);
+        SubscriptionUtil.setAvailableSubscriptionsForTesting(
+                Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
+
+        mCategoryController.displayPreference(mPreferenceScreen);
+        mCategoryController.updateState(mPreferenceCategory);
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+        assertThat(mPreferenceCategory.getTitle()).isEqualTo(
+                ResourcesUtils.getResourcesString(mContext, "provider_network_settings_title"));
+    }
+
+    @Test
+    public void updateState_setTitle_withOnePhysicalSim_returnSim() {
+        setUpSubscriptionInfoForPhysicalSim(SUB_ID_1, SUB_1, mSubscriptionInfo1);
+        SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscriptionInfo1));
+
+        mCategoryController.displayPreference(mPreferenceScreen);
+        mCategoryController.updateState(mPreferenceCategory);
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceCategory.getTitle()).isEqualTo(
+                ResourcesUtils.getResourcesString(mContext, "sim_category_title"));
+    }
+
+    private void setUpSubscriptionInfoForPhysicalSim(int subId, String displayName,
+            SubscriptionInfo subscriptionInfo) {
+        when(subscriptionInfo.isEmbedded()).thenReturn(false);
+        when(subscriptionInfo.getSubscriptionId()).thenReturn(subId);
+        when(subscriptionInfo.getDisplayName()).thenReturn(displayName);
+    }
+
 }
