diff --git a/res/drawable/one_handed_guideline.xml b/res/drawable/one_handed_guideline.xml
new file mode 100644
index 0000000..2c1a158
--- /dev/null
+++ b/res/drawable/one_handed_guideline.xml
@@ -0,0 +1,45 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="412dp"
+    android:height="264dp"
+    android:viewportWidth="412"
+    android:viewportHeight="264">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v264h-412z"/>
+    <path
+        android:pathData="M126,-246C109.431,-246 96,-232.569 96,-216V195C96,211.569 109.431,225 126,225H284.5C301.069,225 314.5,211.569 314.5,195V-216C314.5,-232.569 301.069,-246 284.5,-246H126ZM122,-235C110.954,-235 102,-226.046 102,-215V189.5C102,200.546 110.954,209.5 122,209.5H288C299.046,209.5 308,200.546 308,189.5V-215C308,-226.046 299.046,-235 288,-235H122Z"
+        android:fillColor="#000000"
+        android:fillType="evenOdd"/>
+    <path
+        android:pathData="M122.12,-233L288.12,-233A20,20 0,0 1,308.12 -213L308.12,191.5A20,20 0,0 1,288.12 211.5L122.12,211.5A20,20 0,0 1,102.12 191.5L102.12,-213A20,20 0,0 1,122.12 -233z"
+        android:fillColor="#EAF1FF"/>
+    <path
+        android:pathData="M102.16,193.12H308.08C308.08,203.326 299.806,211.6 289.6,211.6H120.64C110.434,211.6 102.16,203.326 102.16,193.12Z"
+        android:fillColor="#B5CFFC"/>
+    <path
+        android:pathData="M187.5,202.72L222.5,202.72A0.5,0.5 0,0 1,223 203.22L223,203.22A0.5,0.5 0,0 1,222.5 203.72L187.5,203.72A0.5,0.5 0,0 1,187 203.22L187,203.22A0.5,0.5 0,0 1,187.5 202.72z"
+        android:fillColor="#666666"/>
+    <path
+        android:pathData="M197,115h36v94.684h-36z"
+        android:strokeAlpha="0.8"
+        android:fillAlpha="0.8">
+      <aapt:attr name="android:fillColor">
+        <gradient 
+            android:startY="189.19"
+            android:startX="212.951"
+            android:endY="168.637"
+            android:endX="212.447"
+            android:type="linear">
+          <item android:offset="0" android:color="#FF4285F4"/>
+          <item android:offset="1" android:color="#004385F5"/>
+        </gradient>
+      </aapt:attr>
+    </path>
+    <path
+        android:pathData="M197,206.899a18,18.101 0,1 0,36 0a18,18.101 0,1 0,-36 0z"
+        android:strokeAlpha="0.8"
+        android:fillColor="#3B7BE4"
+        android:fillAlpha="0.8"/>
+  </group>
+</vector>
diff --git a/res/layout/one_handed_header.xml b/res/layout/one_handed_header.xml
new file mode 100644
index 0000000..2104e40
--- /dev/null
+++ b/res/layout/one_handed_header.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="match_parent"
+             android:layout_height="wrap_content">
+
+    <ImageView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:scaleType="centerCrop"
+        android:cropToPadding="true"
+        android:src="@drawable/one_handed_guideline"
+        android:contentDescription="@null" />
+
+</FrameLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9bae3a5..9fe106b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10496,8 +10496,6 @@
     <string name="disabled_by_policy_title_suspend_packages">Can’t open this app</string>
     <!-- Dialog title. This dialog lets a user know that a specific setting is blocked by their credit provider. Since the user purchased the device from the credit provider, the credit provider controls what they can access. [CHAR LIMIT=50] -->
     <string name="disabled_by_policy_title_financed_device">Blocked by your credit provider</string>
-    <!-- Shown when the user tries to change a settings locked by an admin [CHAR LIMIT=200] -->
-    <string name="default_admin_support_msg">If you have questions, contact your IT admin</string>
     <!-- Shown in dialog to allow user to see more information about the device admin [CHAR LIMIT=30] -->
     <string name="admin_support_more_info">More details</string>
     <!-- Shown in admin details page to warn user about policies the admin can set in a work profile. [CHAR LIMIT=NONE] -->
@@ -12725,10 +12723,8 @@
     <string name="view_airplane_safe_networks">View airplane mode networks</string>
     <!-- Text of message for viewing the networks that are available in airplane mode. [CHAR LIMIT=60] -->
     <string name="viewing_airplane_mode_networks">Viewing airplane mode networks</string>
-    <!-- Slice title text for turning on networks (e.g. Wi-Fi). [CHAR LIMIT=40] -->
-    <string name="turn_on_networks">Turn on networks</string>
-    <!-- Slice title text for turning off networks (e.g. Wi-Fi). [CHAR LIMIT=40] -->
-    <string name="turn_off_networks">Turn off networks</string>
+    <!-- Slice title text for turning on the Wi-Fi networks. [CHAR LIMIT=40] -->
+    <string name="turn_on_wifi">Turn on Wi\u2011Fi</string>
     <!-- Title for interrupting the voice call alert. [CHAR_LIMIT=NONE] -->
     <string name="reset_your_internet_title">Reset your internet?</string>
     <!-- Description for interrupting the voice call alert. [CHAR_LIMIT=NONE] -->
diff --git a/res/xml/one_handed_settings.xml b/res/xml/one_handed_settings.xml
index 3508d8a..9382657 100644
--- a/res/xml/one_handed_settings.xml
+++ b/res/xml/one_handed_settings.xml
@@ -21,6 +21,14 @@
     android:persistent="false"
     android:title="@string/one_handed_title">
 
+    <com.android.settingslib.widget.LayoutPreference
+        android:key="one_handed_header"
+        android:layout="@layout/one_handed_header"
+        android:persistent="false"
+        android:selectable="false"
+        settings:allowDividerBelow="false"
+        settings:searchable="false"/>
+
     <SwitchPreference
         android:key="gesture_one_handed_mode_enabled"
         android:title="@string/one_handed_mode_enabled"
diff --git a/src/com/android/settings/applications/AppDashboardFragment.java b/src/com/android/settings/applications/AppDashboardFragment.java
index fc4bcd0..3b1a977 100644
--- a/src/com/android/settings/applications/AppDashboardFragment.java
+++ b/src/com/android/settings/applications/AppDashboardFragment.java
@@ -48,7 +48,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return SettingsEnums.SETTINGS_APP_NOTIF_CATEGORY;
+        return SettingsEnums.MANAGE_APPLICATIONS;
     }
 
     @Override
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index c90fe48..95c94ce 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -30,6 +30,7 @@
 import android.util.Log;
 
 import androidx.annotation.Nullable;
+import androidx.lifecycle.LifecycleObserver;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
@@ -38,6 +39,7 @@
 import com.android.settings.slices.SliceData;
 import com.android.settings.slices.Sliceable;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.search.SearchIndexableRaw;
 
 import java.lang.annotation.Retention;
@@ -50,6 +52,9 @@
  * Abstract class to consolidate utility between preference controllers and act as an interface
  * for Slices. The abstract classes that inherit from this class will act as the direct interfaces
  * for each type when plugging into Slices.
+ * <p>
+ * Controllers defined in xml are automatically {@link Lifecycle#addObserver(LifecycleObserver)
+ * wired up} to the settings lifecycle if they implement {@link LifecycleObserver}.
  */
 public abstract class BasePreferenceController extends AbstractPreferenceController implements
         Sliceable {
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 1b2be80..7acbd19 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -27,6 +27,7 @@
 
 import androidx.annotation.CallSuper;
 import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.LifecycleObserver;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 import androidx.preference.PreferenceManager;
@@ -44,7 +45,6 @@
 import com.android.settings.widget.PrimarySwitchPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.ProviderTile;
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index 15b5466..f9bb99e 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -85,6 +85,12 @@
     @VisibleForTesting
     AdaptiveSleepPreferenceController mAdaptiveSleepController;
 
+    public ScreenTimeoutSettings() {
+        super();
+        mMetricsFeatureProvider = FeatureFactory.getFactory(getContext())
+                .getMetricsFeatureProvider();
+    }
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -105,7 +111,6 @@
         mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy);
         mPrivacyPreference.setSelectable(false);
         mPrivacyPreference.setLayoutResource(R.layout.preference_footer);
-        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
index 685da03..cf23c94 100644
--- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
+++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
@@ -233,8 +233,6 @@
         final TextView textView = root.findViewById(R.id.admin_support_msg);
         if (supportMessage != null) {
             textView.setText(supportMessage);
-        } else if (!isFinancedDevice()) {
-            textView.setText(R.string.default_admin_support_msg);
         }
     }
 
diff --git a/src/com/android/settings/network/AirplaneSafeNetworksSlice.java b/src/com/android/settings/network/AirplaneSafeNetworksSlice.java
deleted file mode 100644
index 763e0c7..0000000
--- a/src/com/android/settings/network/AirplaneSafeNetworksSlice.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (C) 2020 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.network;
-
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.net.wifi.WifiManager;
-import android.util.Log;
-
-import androidx.annotation.IntDef;
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.slice.Slice;
-import androidx.slice.builders.ListBuilder;
-import androidx.slice.builders.ListBuilder.RowBuilder;
-import androidx.slice.builders.SliceAction;
-import androidx.slice.core.SliceHints;
-
-import com.android.settings.AirplaneModeEnabler;
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.slices.CustomSliceRegistry;
-import com.android.settings.slices.CustomSliceable;
-import com.android.settings.slices.SliceBackgroundWorker;
-import com.android.settings.slices.SliceBroadcastReceiver;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * {@link CustomSliceable} for airplane-safe networks, used by generic clients.
- */
-public class AirplaneSafeNetworksSlice implements CustomSliceable,
-        AirplaneModeEnabler.OnAirplaneModeChangedListener {
-
-    private static final String TAG = "AirplaneSafeNetworksSlice";
-
-    public static final String ACTION_INTENT_EXTRA = "action";
-
-    /**
-     * Annotation for different action of the slice.
-     *
-     * {@code TURN_ON_NETWORKS} for action of turning on Wi-Fi networks.
-     * {@code TURN_OFF_NETWORKS} for action of turning off Wi-Fi networks.
-     */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(value = {
-            Action.TURN_ON_NETWORKS,
-            Action.TURN_OFF_NETWORKS,
-    })
-    public @interface Action {
-        int TURN_ON_NETWORKS = 1;
-        int TURN_OFF_NETWORKS = 2;
-    }
-
-    private final Context mContext;
-    private final AirplaneModeEnabler mAirplaneModeEnabler;
-    private final WifiManager mWifiManager;
-
-    private boolean mIsAirplaneModeOn;
-
-    public AirplaneSafeNetworksSlice(Context context) {
-        mContext = context;
-        mAirplaneModeEnabler = new AirplaneModeEnabler(context, this);
-        mIsAirplaneModeOn = mAirplaneModeEnabler.isAirplaneModeOn();
-        mWifiManager = mContext.getSystemService(WifiManager.class);
-    }
-
-    private static void logd(String s) {
-        Log.d(TAG, s);
-    }
-
-    @Override
-    public Slice getSlice() {
-        final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY);
-        if (mIsAirplaneModeOn) {
-            listBuilder.addRow(new RowBuilder()
-                    .setTitle(getTitle())
-                    .addEndItem(getEndIcon(), SliceHints.ICON_IMAGE)
-                    .setPrimaryAction(getSliceAction()));
-        }
-        return listBuilder.build();
-    }
-
-    @Override
-    public Uri getUri() {
-        return CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI;
-    }
-
-    @Override
-    public void onNotifyChange(Intent intent) {
-        final int action = intent.getIntExtra(ACTION_INTENT_EXTRA, 0);
-        if (action == Action.TURN_ON_NETWORKS) {
-            if (!mWifiManager.isWifiEnabled()) {
-                logd("Action: turn on Wi-Fi networks");
-                mWifiManager.setWifiEnabled(true);
-            }
-        } else if (action == Action.TURN_OFF_NETWORKS) {
-            if (mWifiManager.isWifiEnabled()) {
-                logd("Action: turn off Wi-Fi networks");
-                mWifiManager.setWifiEnabled(false);
-            }
-        }
-    }
-
-    @Override
-    public void onAirplaneModeChanged(boolean isAirplaneModeOn) {
-        mIsAirplaneModeOn = isAirplaneModeOn;
-        final AirplaneSafeNetworksWorker worker = SliceBackgroundWorker.getInstance(getUri());
-        if (worker != null) {
-            worker.updateSlice();
-        }
-    }
-
-    @Override
-    public Intent getIntent() {
-        return new Intent(getUri().toString())
-                .setData(getUri())
-                .setClass(mContext, SliceBroadcastReceiver.class)
-                .putExtra(ACTION_INTENT_EXTRA, getAction());
-    }
-
-    @Action
-    private int getAction() {
-        return mWifiManager.isWifiEnabled()
-                ? Action.TURN_OFF_NETWORKS
-                : Action.TURN_ON_NETWORKS;
-    }
-
-    private String getTitle() {
-        return mContext.getText(
-                (getAction() == Action.TURN_ON_NETWORKS)
-                        ? R.string.turn_on_networks
-                        : R.string.turn_off_networks).toString();
-    }
-
-    private IconCompat getEndIcon() {
-        final Drawable drawable = mContext.getDrawable(
-                (getAction() == Action.TURN_ON_NETWORKS) ? R.drawable.ic_airplane_safe_networks_24dp
-                        : R.drawable.ic_airplanemode_active);
-        if (drawable == null) {
-            return Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT));
-        }
-        drawable.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorAccent));
-        return Utils.createIconWithDrawable(drawable);
-    }
-
-    private SliceAction getSliceAction() {
-        final PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
-                0 /* requestCode */, getIntent(),
-                PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
-        final IconCompat icon = Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT));
-        return SliceAction.create(pendingIntent, icon, ListBuilder.ACTION_WITH_LABEL, getTitle());
-    }
-
-    @Override
-    public Class getBackgroundWorkerClass() {
-        return AirplaneSafeNetworksWorker.class;
-    }
-
-    public static class AirplaneSafeNetworksWorker extends SliceBackgroundWorker {
-
-        private final IntentFilter mIntentFilter;
-        private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
-                    notifySliceChange();
-                }
-            }
-        };
-
-        public AirplaneSafeNetworksWorker(Context context, Uri uri) {
-            super(context, uri);
-            mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
-        }
-
-        @Override
-        protected void onSlicePinned() {
-            getContext().registerReceiver(mBroadcastReceiver, mIntentFilter);
-        }
-
-        @Override
-        protected void onSliceUnpinned() {
-            getContext().unregisterReceiver(mBroadcastReceiver);
-        }
-
-        @Override
-        public void close() {
-            // Do nothing.
-        }
-
-        public void updateSlice() {
-            notifySliceChange();
-        }
-    }
-}
diff --git a/src/com/android/settings/network/TurnOnWifiSlice.java b/src/com/android/settings/network/TurnOnWifiSlice.java
new file mode 100644
index 0000000..05a873f
--- /dev/null
+++ b/src/com/android/settings/network/TurnOnWifiSlice.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2021 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.network;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.util.Log;
+
+import androidx.core.graphics.drawable.IconCompat;
+import androidx.slice.Slice;
+import androidx.slice.builders.ListBuilder;
+import androidx.slice.builders.ListBuilder.RowBuilder;
+import androidx.slice.builders.SliceAction;
+import androidx.slice.core.SliceHints;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.slices.CustomSliceRegistry;
+import com.android.settings.slices.CustomSliceable;
+import com.android.settings.slices.SliceBackgroundWorker;
+import com.android.settings.slices.SliceBroadcastReceiver;
+
+/**
+ * {@link CustomSliceable} for turning on Wi-Fi, used by generic clients.
+ */
+public class TurnOnWifiSlice implements CustomSliceable {
+
+    private static final String TAG = "TurnOnWifiSlice";
+
+    private final Context mContext;
+    private final WifiManager mWifiManager;
+
+    public TurnOnWifiSlice(Context context) {
+        mContext = context;
+        mWifiManager = mContext.getSystemService(WifiManager.class);
+    }
+
+    private static void logd(String s) {
+        Log.d(TAG, s);
+    }
+
+    @Override
+    public Slice getSlice() {
+        if (mWifiManager.isWifiEnabled()) {
+            return null;
+        }
+        final String title = mContext.getText(R.string.turn_on_wifi).toString();
+        final SliceAction primaryAction = SliceAction.create(getBroadcastIntent(mContext),
+                getEndIcon(), ListBuilder.ICON_IMAGE, title);
+        final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
+                .addRow(new RowBuilder()
+                        .setTitle(title)
+                        .addEndItem(getEndIcon(), SliceHints.ICON_IMAGE)
+                        .setPrimaryAction(primaryAction));
+        return listBuilder.build();
+    }
+
+    @Override
+    public Uri getUri() {
+        return CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI;
+    }
+
+    @Override
+    public void onNotifyChange(Intent intent) {
+        logd("Action: turn on Wi-Fi networks");
+        mWifiManager.setWifiEnabled(true);
+    }
+
+    @Override
+    public Intent getIntent() {
+        return new Intent(getUri().toString())
+                .setData(getUri())
+                .setClass(mContext, SliceBroadcastReceiver.class);
+    }
+
+    private IconCompat getEndIcon() {
+        final Drawable drawable = mContext.getDrawable(R.drawable.ic_settings_wireless);
+        if (drawable == null) {
+            return Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT));
+        }
+        drawable.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorAccent));
+        return Utils.createIconWithDrawable(drawable);
+    }
+
+    @Override
+    public Class getBackgroundWorkerClass() {
+        return TurnOnWifiWorker.class;
+    }
+
+    /**
+     * The Slice background worker {@link SliceBackgroundWorker} is used to listen the Wi-Fi
+     * status change, and then notifies the Slice {@link Uri} to update.
+     */
+    public static class TurnOnWifiWorker extends SliceBackgroundWorker {
+
+        private final IntentFilter mIntentFilter;
+        private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
+                    notifySliceChange();
+                }
+            }
+        };
+
+        public TurnOnWifiWorker(Context context, Uri uri) {
+            super(context, uri);
+            mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
+        }
+
+        @Override
+        protected void onSlicePinned() {
+            getContext().registerReceiver(mBroadcastReceiver, mIntentFilter);
+        }
+
+        @Override
+        protected void onSliceUnpinned() {
+            getContext().unregisterReceiver(mBroadcastReceiver);
+        }
+
+        @Override
+        public void close() {
+            // Do nothing.
+        }
+    }
+}
diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java
index bdaa849..46843b0 100644
--- a/src/com/android/settings/panel/InternetConnectivityPanel.java
+++ b/src/com/android/settings/panel/InternetConnectivityPanel.java
@@ -113,7 +113,7 @@
         final List<Uri> uris = new ArrayList<>();
         if (mIsProviderModelEnabled) {
             uris.add(CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI);
-            uris.add(CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI);
+            uris.add(CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI);
         } else {
             uris.add(CustomSliceRegistry.WIFI_SLICE_URI);
             uris.add(CustomSliceRegistry.MOBILE_DATA_SLICE_URI);
diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java
index e40b164..713d61a 100644
--- a/src/com/android/settings/slices/CustomSliceRegistry.java
+++ b/src/com/android/settings/slices/CustomSliceRegistry.java
@@ -39,8 +39,8 @@
 import com.android.settings.location.LocationSlice;
 import com.android.settings.media.MediaOutputIndicatorSlice;
 import com.android.settings.media.RemoteMediaSlice;
-import com.android.settings.network.AirplaneSafeNetworksSlice;
 import com.android.settings.network.ProviderModelSlice;
+import com.android.settings.network.TurnOnWifiSlice;
 import com.android.settings.network.telephony.MobileDataSlice;
 import com.android.settings.notification.zen.ZenModeButtonPreferenceController;
 import com.android.settings.wifi.calling.WifiCallingSliceHelper;
@@ -307,13 +307,13 @@
             .build();
 
     /**
-     * Backing Uri for the Always On Slice.
+     * Backing Uri for the Turn on Wi-Fi Slice.
      */
-    public static final Uri AIRPLANE_SAFE_NETWORKS_SLICE_URI = new Uri.Builder()
+    public static final Uri TURN_ON_WIFI_SLICE_URI = new Uri.Builder()
             .scheme(ContentResolver.SCHEME_CONTENT)
             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
-            .appendPath("airplane_safe_networks")
+            .appendPath("turn_on_wifi")
             .build();
 
     @VisibleForTesting
@@ -337,7 +337,7 @@
         sUriToSlice.put(DARK_THEME_SLICE_URI, DarkThemeSlice.class);
         sUriToSlice.put(REMOTE_MEDIA_SLICE_URI, RemoteMediaSlice.class);
         sUriToSlice.put(ALWAYS_ON_SLICE_URI, AlwaysOnDisplaySlice.class);
-        sUriToSlice.put(AIRPLANE_SAFE_NETWORKS_SLICE_URI, AirplaneSafeNetworksSlice.class);
+        sUriToSlice.put(TURN_ON_WIFI_SLICE_URI, TurnOnWifiSlice.class);
     }
 
     public static Class<? extends CustomSliceable> getSliceClassByUri(Uri uri) {
diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
index f0bf95c..771a863 100644
--- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
@@ -40,6 +40,7 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
+import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.RestrictedLockUtils;
 
 import org.junit.Before;
@@ -78,6 +79,7 @@
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
+        FakeFeatureFactory.setupForTest();
         mContext = spy(getApplicationContext());
         mSettings = spy(new ScreenTimeoutSettings());
         mContentResolver = mContext.getContentResolver();
diff --git a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
index 1ff1d79..b245017 100644
--- a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
@@ -195,6 +195,27 @@
     }
 
     @Test
+    public void testSetAdminSupportDetails_shortSupportMessageIsNull() {
+        final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
+        final UserManager userManager = RuntimeEnvironment.application.getSystemService(
+                UserManager.class);
+        final ShadowUserManager userManagerShadow = Shadow.extract(userManager);
+        final ViewGroup view = new FrameLayout(mActivity);
+        final ComponentName component = new ComponentName("some.package.name",
+                "some.package.name.SomeClass");
+        final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
+        final TextView textView = createAdminSupportTextView(view, mActivity);
+        dpmShadow.setShortSupportMessageForUser(component, 123, null);
+        dpmShadow.setIsAdminActiveAsUser(true);
+        createShadowWorkProfile(userManagerShadow);
+
+        mHelper.setAdminSupportDetails(mActivity, view, admin);
+
+        assertNotNull(admin.component);
+        assertEquals("", Shadows.shadowOf(textView).innerText());
+    }
+
+    @Test
     public void testSetAdminSupportDetailsNotAdmin() {
         final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
         final UserManager userManager = RuntimeEnvironment.application.getSystemService(
@@ -212,27 +233,6 @@
         mHelper.setAdminSupportDetails(mActivity, textView, admin);
 
         assertNull(admin.component);
-        assertEquals(mActivity.getString(R.string.default_admin_support_msg),
-                Shadows.shadowOf(textView).innerText());
-    }
-
-    @Test
-    public void testSetAdminSupportDetailsForFinancedDevice_shortSupportMessageIsNull() {
-        final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
-        final UserManager userManager = RuntimeEnvironment.application.getSystemService(
-                UserManager.class);
-        final ShadowUserManager userManagerShadow = Shadow.extract(userManager);
-        final ViewGroup view = new FrameLayout(mActivity);
-        final ComponentName component = new ComponentName("some.package.name",
-                "some.package.name.SomeClass");
-        final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
-        final TextView textView = createAdminSupportTextView(view, mActivity);
-        setupFinancedDevice(dpmShadow);
-        createShadowWorkProfile(userManagerShadow);
-
-        mHelper.setAdminSupportDetails(mActivity, view, admin);
-
-        assertNotNull(admin.component);
         assertEquals("", Shadows.shadowOf(textView).innerText());
     }
 
diff --git a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java b/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java
deleted file mode 100644
index a90b89d..0000000
--- a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2020 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.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.wifi.WifiManager;
-
-import androidx.slice.Slice;
-import androidx.slice.SliceItem;
-import androidx.slice.SliceMetadata;
-import androidx.slice.SliceProvider;
-import androidx.slice.widget.SliceLiveData;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.testutils.ResourcesUtils;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-@RunWith(AndroidJUnit4.class)
-public class AirplaneSafeNetworksSliceTest {
-
-    @Rule
-    public MockitoRule mMocks = MockitoJUnit.rule();
-    @Mock
-    private WifiManager mWifiManager;
-
-    private Context mContext;
-    private AirplaneSafeNetworksSlice mAirplaneSafeNetworksSlice;
-
-    @Before
-    public void setUp() {
-        mContext = spy(ApplicationProvider.getApplicationContext());
-        when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
-
-        // Set-up specs for SliceMetadata.
-        SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
-
-        mAirplaneSafeNetworksSlice = new AirplaneSafeNetworksSlice(mContext);
-        mAirplaneSafeNetworksSlice.onAirplaneModeChanged(true);
-    }
-
-    @Test
-    public void getSlice_airplaneModeOff_shouldBeNotNull() {
-        mAirplaneSafeNetworksSlice.onAirplaneModeChanged(false);
-
-        assertThat(mAirplaneSafeNetworksSlice.getSlice()).isNotNull();
-    }
-
-    @Test
-    public void getSlice_wifiDisabled_shouldShowTurnOnNetworks() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(false);
-
-        final Slice slice = mAirplaneSafeNetworksSlice.getSlice();
-
-        assertThat(slice).isNotNull();
-        final SliceItem sliceTitle =
-                SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem();
-        assertThat(sliceTitle.getText()).isEqualTo(
-                ResourcesUtils.getResourcesString(mContext, "turn_on_networks"));
-    }
-
-    @Test
-    public void getSlice_wifiEnabled_shouldShowTurnOffNetworks() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(true);
-
-        final Slice slice = mAirplaneSafeNetworksSlice.getSlice();
-
-        assertThat(slice).isNotNull();
-        final SliceItem sliceTitle =
-                SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem();
-        assertThat(sliceTitle.getText()).isEqualTo(
-                ResourcesUtils.getResourcesString(mContext, "turn_off_networks"));
-    }
-
-    @Test
-    public void onNotifyChange_turnOnNetworks_shouldSetWifiEnabled() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(false);
-        Intent intent = mAirplaneSafeNetworksSlice.getIntent();
-
-        mAirplaneSafeNetworksSlice.onNotifyChange(intent);
-
-        verify(mWifiManager).setWifiEnabled(true);
-    }
-
-    @Test
-    public void onNotifyChange_turnOffNetworks_shouldSetWifiDisabled() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(true);
-        Intent intent = mAirplaneSafeNetworksSlice.getIntent();
-
-        mAirplaneSafeNetworksSlice.onNotifyChange(intent);
-
-        verify(mWifiManager).setWifiEnabled(false);
-    }
-}
diff --git a/tests/unit/src/com/android/settings/network/TurnOnWifiSliceTest.java b/tests/unit/src/com/android/settings/network/TurnOnWifiSliceTest.java
new file mode 100644
index 0000000..befa655
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/TurnOnWifiSliceTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2021 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.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+
+import androidx.slice.SliceProvider;
+import androidx.slice.widget.SliceLiveData;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class TurnOnWifiSliceTest {
+
+    @Rule
+    public MockitoRule mMocks = MockitoJUnit.rule();
+    @Mock
+    private WifiManager mWifiManager;
+
+    private Context mContext;
+    private TurnOnWifiSlice mSlice;
+
+    @Before
+    public void setUp() {
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
+
+        // Set-up specs for SliceMetadata.
+        SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
+        mSlice = new TurnOnWifiSlice(mContext);
+    }
+
+    @Test
+    public void getSlice_wifiEnabled_shouldBeNull() {
+        when(mWifiManager.isWifiEnabled()).thenReturn(true);
+
+        assertThat(mSlice.getSlice()).isNull();
+    }
+
+    @Test
+    public void getSlice_wifiDisabled_shouldBeNotNull() {
+        when(mWifiManager.isWifiEnabled()).thenReturn(false);
+
+        assertThat(mSlice.getSlice()).isNotNull();
+    }
+
+    @Test
+    public void onNotifyChange_shouldSetWifiEnabled() {
+        Intent intent = mSlice.getIntent();
+
+        mSlice.onNotifyChange(intent);
+
+        verify(mWifiManager).setWifiEnabled(true);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java
index 4b4ec32..5d95d9a 100644
--- a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java
+++ b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java
@@ -157,7 +157,7 @@
 
         assertThat(uris).containsExactly(
                 CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI,
-                CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI);
+                CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI);
     }
 
     @Test
