diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java
index f07c66c..b0c3b65 100644
--- a/src/com/android/settings/applications/AppStorageSettings.java
+++ b/src/com/android/settings/applications/AppStorageSettings.java
@@ -315,10 +315,7 @@
                         .setButton1Text(R.string.clear_user_data_text)
                         .setButton1Icon(R.drawable.ic_settings_delete);
             }
-            mButtonsPref
-                    .setButton1Text(R.string.clear_user_data_text)
-                    .setButton1Icon(R.drawable.ic_settings_delete)
-                    .setButton1OnClickListener(v -> handleClearDataClick());
+            mButtonsPref.setButton1OnClickListener(v -> handleClearDataClick());
         }
 
         if (mAppsControlDisallowedBySystem) {
diff --git a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
index 1078a21..6a13a96 100644
--- a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
+++ b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
@@ -97,7 +97,7 @@
             // New version - uses a separate screen.
             new SubSettingLauncher(mFragment.getContext())
                     .setDestination(UsbDetailsFragment.class.getName())
-                    .setTitleRes(R.string.device_details_title)
+                    .setTitleRes(R.string.usb_preference)
                     .setSourceMetricsCategory(mFragment.getMetricsCategory())
                     .launch();
             return true;
diff --git a/src/com/android/settings/datetime/timezone/OWNERS b/src/com/android/settings/datetime/timezone/OWNERS
index 02cf23c..7ad770a 100644
--- a/src/com/android/settings/datetime/timezone/OWNERS
+++ b/src/com/android/settings/datetime/timezone/OWNERS
@@ -1,6 +1,5 @@
 # Default reviewers for this and subdirectories.
 vichang@google.com
-tobiast@google.com
 nfuller@google.com
 
 # Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
index 626390a..2eda9d9 100644
--- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
@@ -176,7 +176,11 @@
 
     private void dismissProgressBar() {
         if (mProgressDialog != null && mProgressDialog.isShowing()) {
-            mProgressDialog.dismiss();
+            try {
+                mProgressDialog.dismiss();
+            } catch (IllegalArgumentException e) {
+                // Ignore exception since the dialog will be gone anyway.
+            }
         }
     }
 
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index 14450a3..fbb2c41 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -156,8 +156,13 @@
 
     private void createPanelContent() {
         final FragmentActivity activity = getActivity();
+        if (activity == null) {
+            return;
+        }
+
         if (mLayoutView == null) {
             activity.finish();
+            return;
         }
 
         mPanelSlices = mLayoutView.findViewById(R.id.panel_parent_layout);
@@ -183,6 +188,7 @@
 
         if (mPanel == null) {
             activity.finish();
+            return;
         }
 
         mPanel.registerCallback(new LocalPanelCallback());
diff --git a/src/com/android/settings/users/EditUserInfoController.java b/src/com/android/settings/users/EditUserInfoController.java
index 373d6a9..afa7cdd 100644
--- a/src/com/android/settings/users/EditUserInfoController.java
+++ b/src/com/android/settings/users/EditUserInfoController.java
@@ -95,8 +95,7 @@
     }
 
     public void onSaveInstanceState(Bundle outState) {
-        if (mEditUserInfoDialog != null && mEditUserInfoDialog.isShowing()
-                && mEditUserPhotoController != null) {
+        if (mEditUserInfoDialog != null && mEditUserPhotoController != null) {
             // Bitmap cannot be stored into bundle because it may exceed parcel limit
             // Store it in a temporary file instead
             File file = mEditUserPhotoController.saveNewUserPhotoBitmap();
diff --git a/src/com/android/settings/vpn2/ConfigDialog.java b/src/com/android/settings/vpn2/ConfigDialog.java
index a0aac19..4c50b74 100644
--- a/src/com/android/settings/vpn2/ConfigDialog.java
+++ b/src/com/android/settings/vpn2/ConfigDialog.java
@@ -342,14 +342,14 @@
         mView.findViewById(R.id.vpn_proxy_fields).setVisibility(visible);
     }
 
-    private boolean hasAdvancedOptionsEnabled() {
+    private boolean isAdvancedOptionsEnabled() {
         return mSearchDomains.getText().length() > 0 || mDnsServers.getText().length() > 0 ||
                     mRoutes.getText().length() > 0 || mProxyHost.getText().length() > 0
                     || mProxyPort.getText().length() > 0;
     }
 
     private void configureAdvancedOptionsVisibility() {
-        if (mShowOptions.isChecked() || hasAdvancedOptionsEnabled()) {
+        if (mShowOptions.isChecked() || isAdvancedOptionsEnabled()) {
             mView.findViewById(R.id.options).setVisibility(View.VISIBLE);
             mShowOptions.setVisibility(View.GONE);
 
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index 735fecc..a59f137 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -34,6 +34,7 @@
 import android.telephony.ims.ImsMmTelManager;
 import android.telephony.ims.ProvisioningManager;
 import android.text.TextUtils;
+import android.text.util.Linkify;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -183,6 +184,7 @@
 
         mEmptyView = getView().findViewById(android.R.id.empty);
         setEmptyView(mEmptyView);
+        mEmptyView.setAutoLinkMask(Linkify.WEB_URLS);
         final Resources res = getResourcesForSubId();
         final String emptyViewText = res.getString(R.string.wifi_calling_off_explanation,
                 res.getString(R.string.wifi_calling_off_explanation_2));
diff --git a/tests/perftests/AndroidManifest.xml b/tests/perftests/AndroidManifest.xml
index 4ce6a54..8aae24a 100644
--- a/tests/perftests/AndroidManifest.xml
+++ b/tests/perftests/AndroidManifest.xml
@@ -22,7 +22,7 @@
     </application>
 
     <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="com.android.settings"
+        android:targetPackage="com.android.settings.tests.perf"
         android:label="Settings Performance Test Cases">
     </instrumentation>
 
diff --git a/tests/perftests/src/com/android/settings/tests/perf/LaunchSettingsTest.java b/tests/perftests/src/com/android/settings/tests/perf/LaunchSettingsTest.java
index 5140be2..ec2a311 100644
--- a/tests/perftests/src/com/android/settings/tests/perf/LaunchSettingsTest.java
+++ b/tests/perftests/src/com/android/settings/tests/perf/LaunchSettingsTest.java
@@ -15,8 +15,17 @@
  */
 package com.android.settings.tests.perf;
 
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static junit.framework.TestCase.fail;
+
 import android.app.Instrumentation;
 import android.os.Bundle;
+import android.util.Log;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiSelector;
+import android.support.test.uiautomator.Until;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
@@ -26,23 +35,119 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Collections;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 @RunWith(AndroidJUnit4.class)
 public class LaunchSettingsTest {
+    private static class Page {
+        String action;
+        String displayName;
+        String title;
+
+        Page(String action, String displayName, String title) {
+            this.action = action;
+            this.displayName = displayName;
+            this.title = title;
+        }
+    }
+
+    private static final int TIME_OUT = 5000;
+    private static final int TEST_TIME = 10;
+    private static final Pattern PATTERN = Pattern.compile("TotalTime:\\s[0-9]*");
+    private static final Page[] PAGES;
+
+    static {
+        PAGES = new Page[]{
+                new Page("android.settings.SETTINGS", "Search settings", "Settings"),
+                new Page("android.settings.WIFI_SETTINGS", "Use Wi‑Fi", "Wi-Fi"),
+                new Page("android.settings.BLUETOOTH_SETTINGS", "Connected devices", "BlueTooth"),
+                new Page("android.settings.APPLICATION_SETTINGS", "App info", "Application"),
+                new Page("android.intent.action.POWER_USAGE_SUMMARY", "Battery", "Battery")
+        };
+    }
+
+    private Bundle mBundle;
+    private UiDevice mDevice;
+    private Instrumentation mInstrumentation;
+    private Map<String, ArrayList<Integer>> mResult;
 
     @Before
     public void setUp() throws Exception {
+        mBundle = new Bundle();
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
+        mResult = new LinkedHashMap<>();
+        mDevice.pressHome();
+        mDevice.waitForIdle(TIME_OUT);
+
+        for (Page page : PAGES) {
+            mResult.put(page.title, new ArrayList<Integer>());
+        }
     }
 
     @After
     public void tearDown() throws Exception {
+        putResultToBundle();
+        mInstrumentation.sendStatus(0, mBundle);
     }
 
     @Test
-    public void testReportMetrics() throws Exception {
-        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
-        final Bundle result = new Bundle();
-        result.putString("LaunchSettingsTest_metric_key1", "1000");
-        result.putString("LaunchSettingsTest_metric_key2", "5000");
-        instrumentation.sendStatus(0, result);
+    public void settingsPerformanceTest() throws Exception {
+        for (int i = 0; i < TEST_TIME; i++) {
+            for (Page page : PAGES) {
+                executePreformanceTest(page.action, page.displayName, page.title);
+            }
+        }
     }
-}
+
+    private void executePreformanceTest(String action, String displayName, String title)
+            throws Exception {
+        final String mString = mDevice.executeShellCommand("am start -W -a" + action);
+        mDevice.wait(Until.findObject(By.text(displayName)), TIME_OUT);
+        handleLaunchResult(title, mString);
+        closeApp();
+        mDevice.waitForIdle(TIME_OUT);
+    }
+
+    private void handleLaunchResult(String title, String s) {
+        Matcher mMatcher = PATTERN.matcher(s);
+        if (mMatcher.find()) {
+            mResult.get(title).add(Integer.valueOf(mMatcher.group().split("\\s")[1]));
+        } else {
+            fail("Some pages can't be found");
+        }
+    }
+
+    private void closeApp() throws Exception {
+        mDevice.executeShellCommand("am force-stop com.android.settings");
+        Thread.sleep(1000);
+    }
+
+    private void putResultToBundle() {
+        for (String string : mResult.keySet()) {
+            mBundle.putString(String.format("LaunchSettingsTest_%s_%s", string, "max"),
+                    getMax(mResult.get(string)));
+            mBundle.putString(String.format("LaunchSettingsTest_%s_%s", string, "min"),
+                    getMin(mResult.get(string)));
+            mBundle.putString(String.format("LaunchSettingsTest_%s_%s", string, "avg"),
+                    getAvg(mResult.get(string)));
+        }
+    }
+
+    private String getMax(ArrayList<Integer> launchResult) {
+        return String.format("%s", launchResult.isEmpty() ? "null" : Collections.max(launchResult));
+    }
+
+    private String getMin(ArrayList<Integer> launchResult) {
+        return String.format("%s", launchResult.isEmpty() ? "null" : Collections.min(launchResult));
+    }
+
+    private String getAvg(ArrayList<Integer> launchResult) {
+        return String.valueOf((int) launchResult.stream().mapToInt(i -> i).average().orElse(0));
+    }
+}
\ No newline at end of file
