diff --git a/res/values/strings.xml b/res/values/strings.xml
index e28206d..856bd21 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10666,13 +10666,11 @@
     <string-array name="game_driver_all_apps_preference_values">
         <item>@string/game_driver_app_preference_default</item>
         <item>@string/game_driver_app_preference_game_driver</item>
-        <item>@string/game_driver_app_preference_prerelease_driver</item>
     </string-array>
     <!-- All the values for Game Driver app preference [CHAR LIMIT=50] -->
     <string-array name="game_driver_app_preference_values">
         <item>@string/game_driver_app_preference_default</item>
         <item>@string/game_driver_app_preference_game_driver</item>
-        <item>@string/game_driver_app_preference_prerelease_driver</item>
         <item>@string/game_driver_app_preference_system</item>
     </string-array>
 
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index 14a6aed..0df3984 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -182,8 +182,7 @@
     void showFinalConfirmation() {
         final Bundle args = new Bundle();
         args.putBoolean(ERASE_EXTERNAL_EXTRA, mExternalStorage.isChecked());
-        args.putBoolean(ERASE_ESIMS_EXTRA,
-            mEsimStorageContainer.getVisibility() == View.VISIBLE && mEsimStorage.isChecked());
+        args.putBoolean(ERASE_ESIMS_EXTRA, mEsimStorage.isChecked());
         new SubSettingLauncher(getContext())
                 .setDestination(MasterClearConfirm.class.getName())
                 .setArguments(args)
diff --git a/src/com/android/settings/RegulatoryInfoDisplayActivity.java b/src/com/android/settings/RegulatoryInfoDisplayActivity.java
index 8bc1cef..4c7515d 100644
--- a/src/com/android/settings/RegulatoryInfoDisplayActivity.java
+++ b/src/com/android/settings/RegulatoryInfoDisplayActivity.java
@@ -119,7 +119,8 @@
         }
     }
 
-    private int getResourceId() {
+    @VisibleForTesting
+    int getResourceId() {
         // Use regulatory_info by default.
         int resId = getResources().getIdentifier(
                 REGULATORY_INFO_RESOURCE, "drawable", getPackageName());
@@ -134,6 +135,18 @@
                 resId = id;
             }
         }
+
+        // When hardware coo property exists, use regulatory_info_<sku>_<coo> resource if valid.
+        final String coo = getCoo();
+        if (!TextUtils.isEmpty(coo) && !TextUtils.isEmpty(sku)) {
+            final String regulatory_info_coo_res =
+                    REGULATORY_INFO_RESOURCE + "_" + sku.toLowerCase() + "_" + coo.toLowerCase();
+            final int id = getResources().getIdentifier(
+                    regulatory_info_coo_res, "drawable", getPackageName());
+            if (id != 0) {
+                resId = id;
+            }
+        }
         return resId;
     }
 
@@ -142,13 +155,15 @@
         finish();   // close the activity
     }
 
-    @VisibleForTesting
-    public static String getSku() {
+    private String getCoo() {
+        return SystemProperties.get("ro.boot.hardware.coo", "");
+    }
+
+    private String getSku() {
         return SystemProperties.get("ro.boot.hardware.sku", "");
     }
 
-    @VisibleForTesting
-    public static String getRegulatoryInfoImageFileName() {
+    private String getRegulatoryInfoImageFileName() {
         final String sku = getSku();
         if (TextUtils.isEmpty(sku)) {
             return DEFAULT_REGULATORY_INFO_FILEPATH;
diff --git a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
index c6fc23b..fdc5feb 100644
--- a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
@@ -20,10 +20,13 @@
 import android.os.storage.StorageManager;
 import android.text.format.Formatter;
 
+import androidx.preference.Preference;
+
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settingslib.deviceinfo.PrivateStorageInfo;
 import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
+import com.android.settingslib.utils.ThreadUtils;
 
 import java.text.NumberFormat;
 
@@ -44,14 +47,22 @@
     }
 
     @Override
-    public CharSequence getSummary() {
-        // TODO: Register listener.
-        final NumberFormat percentageFormat = NumberFormat.getPercentInstance();
-        final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo(
-                mStorageManagerVolumeProvider);
-        double privateUsedBytes = info.totalBytes - info.freeBytes;
-        return mContext.getString(R.string.storage_summary,
-                percentageFormat.format(privateUsedBytes / info.totalBytes),
-                Formatter.formatFileSize(mContext, info.freeBytes));
+    protected void refreshSummary(Preference preference) {
+        if (preference == null) {
+            return;
+        }
+
+        ThreadUtils.postOnBackgroundThread(() -> {
+            final NumberFormat percentageFormat = NumberFormat.getPercentInstance();
+            final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo(
+                    mStorageManagerVolumeProvider);
+            final double privateUsedBytes = info.totalBytes - info.freeBytes;
+
+            ThreadUtils.postOnMainThread(() -> {
+                preference.setSummary(mContext.getString(R.string.storage_summary,
+                        percentageFormat.format(privateUsedBytes / info.totalBytes),
+                        Formatter.formatFileSize(mContext, info.freeBytes)));
+            });
+        });
     }
 }
diff --git a/src/com/android/settings/password/BiometricFragment.java b/src/com/android/settings/password/BiometricFragment.java
index bd5a10d..66b665b 100644
--- a/src/com/android/settings/password/BiometricFragment.java
+++ b/src/com/android/settings/password/BiometricFragment.java
@@ -58,11 +58,13 @@
     private Bundle mBundle;
     private BiometricPrompt mBiometricPrompt;
     private CancellationSignal mCancellationSignal;
+    private boolean mAuthenticating;
 
     private AuthenticationCallback mAuthenticationCallback =
             new AuthenticationCallback() {
         @Override
         public void onAuthenticationError(int error, @NonNull CharSequence message) {
+            mAuthenticating = false;
             mClientExecutor.execute(() -> {
                 mClientCallback.onAuthenticationError(error, message);
             });
@@ -71,6 +73,7 @@
 
         @Override
         public void onAuthenticationSucceeded(AuthenticationResult result) {
+            mAuthenticating = false;
             mClientExecutor.execute(() -> {
                 mClientCallback.onAuthenticationSucceeded(result);
             });
@@ -134,6 +137,10 @@
         }
     }
 
+    boolean isAuthenticating() {
+        return mAuthenticating;
+    }
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -180,6 +187,7 @@
         mCancellationSignal = new CancellationSignal();
 
         // TODO: CC doesn't use crypto for now
+        mAuthenticating = true;
         mBiometricPrompt.authenticateUser(mCancellationSignal, mClientExecutor,
                 mAuthenticationCallback, mUserId, mCancelCallback);
     }
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
index 53841e8..8476f92 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
@@ -251,7 +251,10 @@
         if (!isChangingConfigurations()) {
             mGoingToBackground = true;
             if (mBiometricFragment != null) {
-                mBiometricFragment.cancel();
+                Log.d(TAG, "Authenticating: " + mBiometricFragment.isAuthenticating());
+                if (mBiometricFragment.isAuthenticating()) {
+                    mBiometricFragment.cancel();
+                }
             }
 
             if (mIsFallback && !mCCLaunched) {
diff --git a/tests/robotests/res/drawable/regulatory_info.png b/tests/robotests/res/drawable/regulatory_info.png
new file mode 100644
index 0000000..65de26c
--- /dev/null
+++ b/tests/robotests/res/drawable/regulatory_info.png
Binary files differ
diff --git a/tests/robotests/res/drawable/regulatory_info_sku.png b/tests/robotests/res/drawable/regulatory_info_sku.png
new file mode 100644
index 0000000..65de26c
--- /dev/null
+++ b/tests/robotests/res/drawable/regulatory_info_sku.png
Binary files differ
diff --git a/tests/robotests/res/drawable/regulatory_info_sku1_coo.png b/tests/robotests/res/drawable/regulatory_info_sku1_coo.png
new file mode 100644
index 0000000..65de26c
--- /dev/null
+++ b/tests/robotests/res/drawable/regulatory_info_sku1_coo.png
Binary files differ
diff --git a/tests/robotests/src/com/android/settings/MasterClearTest.java b/tests/robotests/src/com/android/settings/MasterClearTest.java
index 813e4aa..73adf93 100644
--- a/tests/robotests/src/com/android/settings/MasterClearTest.java
+++ b/tests/robotests/src/com/android/settings/MasterClearTest.java
@@ -163,7 +163,7 @@
         verify(context).startActivity(intent.capture());
         assertThat(intent.getValue().getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS)
             .getBoolean(MasterClear.ERASE_ESIMS_EXTRA, false))
-            .isFalse();
+            .isTrue();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/RegulatoryInfoDisplayActivityTest.java b/tests/robotests/src/com/android/settings/RegulatoryInfoDisplayActivityTest.java
new file mode 100644
index 0000000..d05d5d7
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/RegulatoryInfoDisplayActivityTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.SystemProperties;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+
+
+@RunWith(RobolectricTestRunner.class)
+public class RegulatoryInfoDisplayActivityTest {
+
+    private static final String SKU_PROP_KEY = "ro.boot.hardware.sku";
+    private static final String COO_PROP_KEY = "ro.boot.hardware.coo";
+
+    private RegulatoryInfoDisplayActivity mRegulatoryInfoDisplayActivity;
+
+    @Before
+    public void setUp() {
+        mRegulatoryInfoDisplayActivity = Robolectric.buildActivity(
+                RegulatoryInfoDisplayActivity.class).create().get();
+    }
+
+    @Test
+    public void getResourceId_noSkuProperty_shouldReturnDefaultLabel() {
+        SystemProperties.set(SKU_PROP_KEY, "");
+
+        final int expectedResId = getResourceId("regulatory_info");
+        assertThat(mRegulatoryInfoDisplayActivity.getResourceId()).isEqualTo(expectedResId);
+    }
+
+    @Test
+    public void getResourceId_noCooProperty_shouldReturnSkuLabel() {
+        SystemProperties.set(SKU_PROP_KEY, "sku");
+        SystemProperties.set(COO_PROP_KEY, "");
+
+        final int expectedResId = getResourceId("regulatory_info_sku");
+        assertThat(mRegulatoryInfoDisplayActivity.getResourceId()).isEqualTo(expectedResId);
+    }
+
+    @Test
+    public void getResourceId_hasSkuAndCooProperties_shouldReturnCooLabel() {
+        SystemProperties.set(SKU_PROP_KEY, "sku1");
+        SystemProperties.set(COO_PROP_KEY, "coo");
+
+        final int expectedResId = getResourceId("regulatory_info_sku1_coo");
+        assertThat(mRegulatoryInfoDisplayActivity.getResourceId()).isEqualTo(expectedResId);
+    }
+
+    @Test
+    public void getResourceId_noCorrespondingCooLabel_shouldReturnSkuLabel() {
+        SystemProperties.set(SKU_PROP_KEY, "sku");
+        SystemProperties.set(COO_PROP_KEY, "unknown");
+
+        final int expectedResId = getResourceId("regulatory_info_sku");
+        assertThat(mRegulatoryInfoDisplayActivity.getResourceId()).isEqualTo(expectedResId);
+    }
+
+    private int getResourceId(String resourceName) {
+        return mRegulatoryInfoDisplayActivity.getResources().getIdentifier(resourceName, "drawable",
+                mRegulatoryInfoDisplayActivity.getPackageName());
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverAppPreferenceControllerTest.java
index f007ce2..dd5af2b 100644
--- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverAppPreferenceControllerTest.java
@@ -56,8 +56,7 @@
 
     private static final int DEFAULT = 0;
     private static final int GAME_DRIVER = 1;
-    private static final int PRERELEASE_DRIVER = 2;
-    private static final int SYSTEM = 3;
+    private static final int SYSTEM = 2;
     private static final String TEST_APP_NAME = "testApp";
     private static final String TEST_PKG_NAME = "testPkg";
 
@@ -80,6 +79,7 @@
     private GameDriverAppPreferenceController mController;
     private CharSequence[] mValueList;
     private String mDialogTitle;
+    private String mPreferencePrereleaseDriver;
 
     @Before
     public void setUp() {
@@ -89,6 +89,8 @@
         mValueList =
                 mContext.getResources().getStringArray(R.array.game_driver_app_preference_values);
         mDialogTitle = mContext.getResources().getString(R.string.game_driver_app_preference_title);
+        mPreferencePrereleaseDriver =
+                mContext.getResources().getString(R.string.game_driver_app_preference_prerelease_driver);
     }
 
     @Test
@@ -207,9 +209,7 @@
         assertThat(preference.getDialogTitle()).isEqualTo(mDialogTitle);
         assertThat(preference.getEntries()).isEqualTo(mValueList);
         assertThat(preference.getEntryValues()).isEqualTo(mValueList);
-        assertThat(preference.getEntry()).isEqualTo(mValueList[PRERELEASE_DRIVER]);
-        assertThat(preference.getValue()).isEqualTo(mValueList[PRERELEASE_DRIVER]);
-        assertThat(preference.getSummary()).isEqualTo(mValueList[PRERELEASE_DRIVER]);
+        assertThat(preference.getSummary()).isEqualTo(mPreferencePrereleaseDriver);
     }
 
     @Test
