diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 19927a2..2325408 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -102,6 +102,7 @@
     <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />
     <uses-permission android:name="android.permission.RESTART_WIFI_SUBSYSTEM" />
     <uses-permission android:name="android.permission.MANAGE_FINGERPRINT" />
+    <uses-permission android:name="android.permission.RECOVERY"/>
     <uses-permission android:name="android.permission.USE_BIOMETRIC" />
     <uses-permission android:name="android.permission.USE_BIOMETRIC_INTERNAL" />
     <uses-permission android:name="android.permission.USER_ACTIVITY" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 01f2525..f0f3a52 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -11605,7 +11605,23 @@
     <!-- Developer Settings: Search keywords for the Profile HWUI rendering. [CHAR_LIMIT=NONE] -->
     <string name="track_frame_time_keywords">GPU</string>
 
+    <!-- setting Checkbox title whether to boot with 16K page size [CHAR_LIMIT=35] -->
+    <string name="enable_16k_pages">Boot with 16K page size</string>
+    <!-- setting Checkbox summary whether to boot with 16K page size[CHAR_LIMIT=50] -->
+    <string name="enable_16k_pages_summary">Boot device using 16K page size supported kernel</string>
+    <!-- Confirmation dialog title to ensure user wishes to enable 16K page size -->
+    <string name="confirm_enable_16k_pages_title">Reboot with 16KB pages compatible kernel?</string>
+    <!-- Warning dialog message to confirm user wishes to enable 16K page size -->
+    <string name="confirm_enable_16k_pages_text">WARNING: Some applications may not be compatible with this mode. Device will reboot after confirmation.</string>
+    <!-- dialog title to confirm user wishes to revert to 4k page size kernel -->
+    <string name="confirm_enable_4k_pages_title">Reboot with 4KB pages compatible kernel?</string>
+    <!-- dialog message to confirm user wishes to enable 4K page size -->
+    <string name="confirm_enable_4k_pages_text">Device will reboot after confirmation.</string>
+    <!-- Toast message when 16k OTA update fails -->
+    <string name="toast_16k_update_failed_text">Failed to update kernel to 16KB pages compatible kernel.</string>
+    <string name="progress_16k_ota_title">Applying change</string>
     <!-- DSU Loader. Do not translate. -->
+
     <string name="dsu_loader_title" translatable="false">DSU Loader</string>
     <!-- DSU Loader Description. Do not translate. -->
     <string name="dsu_loader_description" translatable="false">Load a Dynamic System Update Image</string>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index f0a2881..0f1732e 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -107,6 +107,12 @@
             android:summary="@string/oem_unlock_enable_summary"
             settings:useAdditionalSummary="true" />
 
+        <SwitchPreference
+            android:key="enable_16k_pages"
+            android:title="@string/enable_16k_pages"
+            android:summary="@string/enable_16k_pages_summary"
+            settings:useAdditionalSummary="true" />
+
         <Preference
             android:key="running_apps"
             android:title="@string/runningservices_settings_title"
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index 3e6feb7..c10e885 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -348,6 +348,10 @@
             }
             return;
         }
+        if (mUm.getUserProperties(userInfo.getUserHandle()).getShowInSettings()
+                == UserProperties.SHOW_IN_SETTINGS_NO) {
+            return;
+        }
         final Context context = mContext;
         final ProfileData profileData = new ProfileData();
         profileData.userInfo = userInfo;
diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
index 80d3947..371326c 100644
--- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
+++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
@@ -30,6 +30,7 @@
 import android.content.pm.UserInfo;
 import android.location.LocationManager;
 import android.os.RemoteException;
+import android.os.SystemConfigManager;
 import android.os.UserManager;
 import android.service.euicc.EuiccService;
 import android.telecom.DefaultDialerManager;
@@ -54,6 +55,8 @@
     private final IPackageManager mPms;
     private final DevicePolicyManager mDpm;
     private final UserManager mUm;
+    private final SystemConfigManager mSystemConfigManager;
+
     /** Flags to use when querying PackageManager for Euicc component implementations. */
     private static final int EUICC_QUERY_FLAGS =
             PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DEBUG_TRIAGED_MISSING
@@ -66,6 +69,7 @@
         mPms = pms;
         mDpm = dpm;
         mUm = UserManager.get(mContext);
+        mSystemConfigManager = context.getSystemService(SystemConfigManager.class);
     }
 
     @Override
@@ -167,6 +171,7 @@
         if (locationHistoryPackage != null) {
             keepEnabledPackages.add(locationHistoryPackage);
         }
+        keepEnabledPackages.addAll(mSystemConfigManager.getPreventUserDisablePackages());
         return keepEnabledPackages;
     }
 
diff --git a/src/com/android/settings/development/ClearAdbKeysPreferenceController.java b/src/com/android/settings/development/ClearAdbKeysPreferenceController.java
index b39d874..69e6c69 100644
--- a/src/com/android/settings/development/ClearAdbKeysPreferenceController.java
+++ b/src/com/android/settings/development/ClearAdbKeysPreferenceController.java
@@ -52,6 +52,9 @@
 
     @Override
     public boolean isAvailable() {
+        // If the build is insecure (any -user build, 'ro.adb.secure=0'), adbd does not
+        // requests/store authorizations. There is no need for a "revoke authorizations"
+        // button.
         return AdbProperties.secure().orElse(false);
     }
 
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index b52409d..09b0889 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -625,6 +625,7 @@
         controllers.add(new BluetoothSnoopLogFilterProfilePbapPreferenceController(context));
         controllers.add(new BluetoothSnoopLogFilterProfileMapPreferenceController(context));
         controllers.add(new OemUnlockPreferenceController(context, activity, fragment));
+        controllers.add(new Enable16kPagesPreferenceController(context, fragment));
         controllers.add(new PictureColorModePreferenceController(context, lifecycle));
         controllers.add(new WebViewAppPreferenceController(context));
         controllers.add(new CoolColorTemperaturePreferenceController(context));
diff --git a/src/com/android/settings/development/Enable16kPagesPreferenceController.java b/src/com/android/settings/development/Enable16kPagesPreferenceController.java
new file mode 100644
index 0000000..37357fe
--- /dev/null
+++ b/src/com/android/settings/development/Enable16kPagesPreferenceController.java
@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2024 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.development;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.ParcelFileDescriptor;
+import android.os.PersistableBundle;
+import android.os.PowerManager;
+import android.os.SystemProperties;
+import android.os.SystemUpdateManager;
+import android.os.UpdateEngine;
+import android.os.UpdateEngineStable;
+import android.os.UpdateEngineStableCallback;
+import android.provider.Settings;
+import android.util.Log;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AlertDialog;
+import androidx.core.content.ContextCompat;
+import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+/** Controller for 16K pages developer option */
+public class Enable16kPagesPreferenceController extends DeveloperOptionsPreferenceController
+        implements Preference.OnPreferenceChangeListener,
+                PreferenceControllerMixin,
+                Enable16kbPagesDialogHost {
+
+    private static final String TAG = "Enable16kPages";
+    private static final String REBOOT_REASON = "toggle16k";
+    private static final String ENABLE_16K_PAGES = "enable_16k_pages";
+
+    @VisibleForTesting
+    static final String DEV_OPTION_PROPERTY = "ro.product.build.16k_page.enabled";
+
+    private static final int ENABLE_4K_PAGE_SIZE = 0;
+    private static final int ENABLE_16K_PAGE_SIZE = 1;
+
+    private static final String OTA_16K_PATH = "/system/boot_otas/boot_ota_16k.zip";
+    private static final String OTA_4K_PATH = "/system/boot_otas/boot_ota_4k.zip";
+    private static final String PAYLOAD_BINARY_FILE_NAME = "payload.bin";
+    private static final String PAYLOAD_PROPERTIES_FILE_NAME = "payload_properties.txt";
+    private static final int OFFSET_TO_FILE_NAME = 30;
+    public static final String EXPERIMENTAL_UPDATE_TITLE = "Android 16K Kernel Experimental Update";
+
+    private @Nullable DevelopmentSettingsDashboardFragment mFragment = null;
+    private boolean mEnable16k;
+
+    private final ListeningExecutorService mExecutorService =
+            MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
+
+    private AlertDialog mProgressDialog;
+
+    public Enable16kPagesPreferenceController(
+            @NonNull Context context, @Nullable DevelopmentSettingsDashboardFragment fragment) {
+        super(context);
+        mFragment = fragment;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return SystemProperties.getBoolean(DEV_OPTION_PROPERTY, false);
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return ENABLE_16K_PAGES;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        mEnable16k = (Boolean) newValue;
+        Enable16kPagesWarningDialog.show(mFragment, this, mEnable16k);
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        final int optionValue =
+                Settings.Global.getInt(
+                        mContext.getContentResolver(),
+                        Settings.Global.ENABLE_16K_PAGES,
+                        ENABLE_4K_PAGE_SIZE /* default */);
+
+        ((SwitchPreference) mPreference).setChecked(optionValue == ENABLE_16K_PAGE_SIZE);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        // TODO(295035851) : Revert kernel when dev option turned off
+        super.onDeveloperOptionsSwitchDisabled();
+        Settings.Global.putInt(
+                mContext.getContentResolver(),
+                Settings.Global.ENABLE_16K_PAGES,
+                ENABLE_4K_PAGE_SIZE);
+        ((SwitchPreference) mPreference).setChecked(false);
+    }
+
+    /** Called when user confirms reboot dialog */
+    @Override
+    public void on16kPagesDialogConfirmed() {
+        // Show progress bar
+        mProgressDialog = makeProgressDialog();
+        mProgressDialog.show();
+
+        // Apply update in background
+        ListenableFuture future = mExecutorService.submit(() -> installUpdate());
+        Futures.addCallback(
+                future,
+                new FutureCallback<>() {
+
+                    @Override
+                    public void onSuccess(@NonNull Object result) {
+                        // This means UpdateEngineStable is working on applying update in
+                        // background.
+                        // Result of that operation will be provided by separate callback.
+                        Log.i(TAG, "applyPayload call to UpdateEngineStable succeeded.");
+                    }
+
+                    @Override
+                    public void onFailure(Throwable t) {
+                        hideProgressDialog();
+                        Log.e(TAG, "Failed to call applyPayload of UpdateEngineStable!");
+                        displayToast(mContext.getString(R.string.toast_16k_update_failed_text));
+                    }
+                },
+                ContextCompat.getMainExecutor(mContext));
+    }
+
+    /** Called when user dismisses to reboot dialog */
+    @Override
+    public void on16kPagesDialogDismissed() {}
+
+    private void installUpdate() {
+        SystemUpdateManager manager = mContext.getSystemService(SystemUpdateManager.class);
+        Bundle data = manager.retrieveSystemUpdateInfo();
+        int status = data.getInt(SystemUpdateManager.KEY_STATUS);
+        if (status != SystemUpdateManager.STATUS_UNKNOWN
+                && status != SystemUpdateManager.STATUS_IDLE) {
+            throw new RuntimeException("System has pending update!");
+        }
+
+        String updateFilePath = mEnable16k ? OTA_16K_PATH : OTA_4K_PATH;
+        try {
+            File updateFile = new File(updateFilePath);
+            applyUpdateFile(updateFile);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @VisibleForTesting
+    void applyUpdateFile(@NonNull File updateFile) throws IOException, FileNotFoundException {
+        boolean payloadFound = false;
+        boolean propertiesFound = false;
+        long payloadOffset = 0;
+        long payloadSize = 0;
+
+        List<String> properties = new ArrayList<>();
+        try (ZipFile zip = new ZipFile(updateFile)) {
+            Enumeration<? extends ZipEntry> entries = zip.entries();
+            long offset = 0;
+            while (entries.hasMoreElements()) {
+                ZipEntry zipEntry = entries.nextElement();
+                String fileName = zipEntry.getName();
+                long extraSize = zipEntry.getExtra() == null ? 0 : zipEntry.getExtra().length;
+                offset += OFFSET_TO_FILE_NAME + fileName.length() + extraSize;
+
+                if (zipEntry.isDirectory()) {
+                    continue;
+                }
+
+                long length = zipEntry.getCompressedSize();
+                if (PAYLOAD_BINARY_FILE_NAME.equals(fileName)) {
+                    if (zipEntry.getMethod() != ZipEntry.STORED) {
+                        throw new IOException("Unknown compression method.");
+                    }
+                    payloadFound = true;
+                    payloadOffset = offset;
+                    payloadSize = length;
+                } else if (PAYLOAD_PROPERTIES_FILE_NAME.equals(fileName)) {
+                    propertiesFound = true;
+                    InputStream inputStream = zip.getInputStream(zipEntry);
+                    if (inputStream != null) {
+                        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
+                        String line;
+                        while ((line = br.readLine()) != null) {
+                            properties.add(line);
+                        }
+                    }
+                }
+                offset += length;
+            }
+        }
+
+        if (!payloadFound) {
+            throw new FileNotFoundException(
+                    "Failed to find payload in zip: " + updateFile.getAbsolutePath());
+        }
+
+        if (!propertiesFound) {
+            throw new FileNotFoundException(
+                    "Failed to find payload properties in zip: " + updateFile.getAbsolutePath());
+        }
+
+        if (payloadSize == 0) {
+            throw new IOException("Found empty payload in zip: " + updateFile.getAbsolutePath());
+        }
+
+        applyPayload(updateFile, payloadOffset, payloadSize, properties);
+    }
+
+    private void hideProgressDialog() {
+        // Hide progress bar
+        if (mProgressDialog != null && mProgressDialog.isShowing()) {
+            mProgressDialog.hide();
+        }
+    }
+
+    @VisibleForTesting
+    void applyPayload(
+            @NonNull File updateFile,
+            long payloadOffset,
+            long payloadSize,
+            @NonNull List<String> properties)
+            throws FileNotFoundException {
+        String[] header = properties.stream().toArray(String[]::new);
+        UpdateEngineStable updateEngineStable = new UpdateEngineStable();
+        try {
+            ParcelFileDescriptor pfd =
+                    ParcelFileDescriptor.open(updateFile, ParcelFileDescriptor.MODE_READ_ONLY);
+            updateEngineStable.bind(
+                    new OtaUpdateCallback(updateEngineStable),
+                    new Handler(mContext.getMainLooper()));
+            updateEngineStable.applyPayloadFd(pfd, payloadOffset, payloadSize, header);
+        } finally {
+            Log.e(TAG, "Failure while applying an update using update engine");
+        }
+    }
+
+    private void displayToast(String message) {
+        Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
+    }
+
+    private class OtaUpdateCallback extends UpdateEngineStableCallback {
+        UpdateEngineStable mUpdateEngineStable;
+
+        OtaUpdateCallback(@NonNull UpdateEngineStable engine) {
+            mUpdateEngineStable = engine;
+        }
+
+        @Override
+        public void onStatusUpdate(int status, float percent) {}
+
+        @Override
+        public void onPayloadApplicationComplete(int errorCode) {
+            Log.i(TAG, "Callback from update engine stable received. unbinding..");
+            // unbind the callback from update engine
+            mUpdateEngineStable.unbind();
+
+            // Hide progress bar
+            hideProgressDialog();
+
+            if (errorCode == UpdateEngine.ErrorCodeConstants.SUCCESS) {
+                Log.i(TAG, "applyPayload successful");
+
+                // Save changed preference
+                Settings.Global.putInt(
+                        mContext.getContentResolver(),
+                        Settings.Global.ENABLE_16K_PAGES,
+                        mEnable16k ? ENABLE_16K_PAGE_SIZE : ENABLE_4K_PAGE_SIZE);
+
+                // Publish system update info
+                SystemUpdateManager manager =
+                        (SystemUpdateManager)
+                                mContext.getSystemService(Context.SYSTEM_UPDATE_SERVICE);
+                manager.updateSystemUpdateInfo(getUpdateInfo());
+
+                // Restart device to complete update
+                PowerManager pm = mContext.getSystemService(PowerManager.class);
+                pm.reboot(REBOOT_REASON);
+            } else {
+                Log.e(TAG, "applyPayload failed, error code: " + errorCode);
+                displayToast(mContext.getString(R.string.toast_16k_update_failed_text));
+            }
+        }
+    }
+
+    private AlertDialog makeProgressDialog() {
+        AlertDialog.Builder builder = new AlertDialog.Builder(mFragment.getActivity());
+        builder.setTitle(R.string.progress_16k_ota_title);
+
+        final ProgressBar progressBar = new ProgressBar(mFragment.getActivity());
+        LinearLayout.LayoutParams params =
+                new LinearLayout.LayoutParams(
+                        LinearLayout.LayoutParams.WRAP_CONTENT,
+                        LinearLayout.LayoutParams.WRAP_CONTENT);
+        progressBar.setLayoutParams(params);
+        builder.setView(progressBar);
+        builder.setCancelable(false);
+        return builder.create();
+    }
+
+    private PersistableBundle getUpdateInfo() {
+        PersistableBundle infoBundle = new PersistableBundle();
+        infoBundle.putInt(
+                SystemUpdateManager.KEY_STATUS, SystemUpdateManager.STATUS_WAITING_REBOOT);
+        infoBundle.putBoolean(SystemUpdateManager.KEY_IS_SECURITY_UPDATE, false);
+        infoBundle.putString(SystemUpdateManager.KEY_TITLE, EXPERIMENTAL_UPDATE_TITLE);
+        return infoBundle;
+    }
+}
diff --git a/src/com/android/settings/development/Enable16kPagesWarningDialog.java b/src/com/android/settings/development/Enable16kPagesWarningDialog.java
new file mode 100644
index 0000000..5c27b3f
--- /dev/null
+++ b/src/com/android/settings/development/Enable16kPagesWarningDialog.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2024 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.development;
+
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+
+/** Dialog when user interacts 16K pages developer option */
+public class Enable16kPagesWarningDialog extends InstrumentedDialogFragment
+        implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
+
+    public static final String TAG = "Enable16KDialog";
+    private static final String DIALOG_BUNDLE_KEY = "SHOW_16K_DIALOG";
+
+    private Enable16kbPagesDialogHost mHost;
+
+    private void setHost(@NonNull Enable16kbPagesDialogHost host) {
+        mHost = host;
+    }
+
+    /** This method is used to show warning dialog to apply 16K update and reboot */
+    public static void show(
+            @NonNull Fragment hostFragment,
+            @NonNull Enable16kbPagesDialogHost dialogHost,
+            boolean enable16k) {
+        final FragmentManager manager = hostFragment.getActivity().getSupportFragmentManager();
+        Fragment existingFragment = manager.findFragmentByTag(TAG);
+        if (existingFragment == null) {
+            existingFragment = new Enable16kPagesWarningDialog();
+        }
+
+        if (existingFragment instanceof Enable16kPagesWarningDialog) {
+            Bundle bundle = new Bundle();
+            bundle.putBoolean(DIALOG_BUNDLE_KEY, enable16k);
+            existingFragment.setArguments(bundle);
+            existingFragment.setTargetFragment(hostFragment, 0 /* requestCode */);
+            ((Enable16kPagesWarningDialog) existingFragment).setHost(dialogHost);
+            ((Enable16kPagesWarningDialog) existingFragment).show(manager, TAG);
+        }
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.DIALOG_ENABLE_16K_PAGES;
+    }
+
+    @NonNull
+    @Override
+    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        final Bundle bundle = getArguments();
+        boolean is16kDialog = bundle.getBoolean(DIALOG_BUNDLE_KEY);
+        return new AlertDialog.Builder(getActivity())
+                .setTitle(
+                        is16kDialog
+                                ? R.string.confirm_enable_16k_pages_title
+                                : R.string.confirm_enable_4k_pages_title)
+                .setMessage(
+                        is16kDialog
+                                ? R.string.confirm_enable_16k_pages_text
+                                : R.string.confirm_enable_4k_pages_text)
+                .setPositiveButton(android.R.string.ok, this /* onClickListener */)
+                .setNegativeButton(android.R.string.cancel, this /* onClickListener */)
+                .create();
+    }
+
+    @Override
+    public void onClick(@NonNull DialogInterface dialog, int buttonId) {
+        if (buttonId == DialogInterface.BUTTON_POSITIVE) {
+            mHost.on16kPagesDialogConfirmed();
+        } else {
+            mHost.on16kPagesDialogDismissed();
+        }
+    }
+
+    @Override
+    public void onDismiss(@NonNull DialogInterface dialog) {
+        super.onDismiss(dialog);
+        mHost.on16kPagesDialogDismissed();
+    }
+}
diff --git a/src/com/android/settings/development/Enable16kbPagesDialogHost.java b/src/com/android/settings/development/Enable16kbPagesDialogHost.java
new file mode 100644
index 0000000..fc54bd4
--- /dev/null
+++ b/src/com/android/settings/development/Enable16kbPagesDialogHost.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024 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.development;
+
+/** Interface for Enable16kbPagesDialogHost callbacks. */
+public interface Enable16kbPagesDialogHost {
+    /** Callback when the user presses ok the warning dialog. */
+    void on16kPagesDialogConfirmed();
+
+    /** Callback when the user cancels or dismisses the warning dialog. */
+    void on16kPagesDialogDismissed();
+}
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index d96ec39..6cf3061 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -183,6 +183,12 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        if (!isTaskRoot() && !isSingleTask()) {
+            Log.i(TAG, "Not task root nor single task, finish");
+            finish();
+            return;
+        }
+
         mIsEmbeddingActivityEnabled = ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this);
         if (mIsEmbeddingActivityEnabled) {
             final UserManager um = getSystemService(UserManager.class);
@@ -308,6 +314,12 @@
         updateHomepageUI();
     }
 
+    private boolean isSingleTask() {
+        ActivityInfo info = getIntent().resolveActivityInfo(getPackageManager(),
+                PackageManager.MATCH_DEFAULT_ONLY);
+        return info.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK;
+    }
+
     private void updateSplitLayout() {
         if (!mIsEmbeddingActivityEnabled) {
             return;
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
index 2a299c5..4a760ad 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
@@ -417,7 +417,7 @@
             // the profile user using verifyTiedProfileChallenge. Biometrics can still be used if
             // the user is stopped with delayed locking (i.e., with storage unlocked), so the user
             // state (whether the user is in the RUNNING_UNLOCKED state) should not be relied upon.
-            return !StorageManager.isUserKeyUnlocked(userId);
+            return !StorageManager.isCeStorageUnlocked(userId);
         }
         return !mUserManager.isUserUnlocked(userId);
     }
diff --git a/tests/robotests/assets/empty_payload_ota.zip b/tests/robotests/assets/empty_payload_ota.zip
new file mode 100644
index 0000000..c28b5df
--- /dev/null
+++ b/tests/robotests/assets/empty_payload_ota.zip
Binary files differ
diff --git a/tests/robotests/assets/no_payload_ota.zip b/tests/robotests/assets/no_payload_ota.zip
new file mode 100644
index 0000000..00add65
--- /dev/null
+++ b/tests/robotests/assets/no_payload_ota.zip
Binary files differ
diff --git a/tests/robotests/assets/no_properties_ota.zip b/tests/robotests/assets/no_properties_ota.zip
new file mode 100644
index 0000000..4ca60e0
--- /dev/null
+++ b/tests/robotests/assets/no_properties_ota.zip
Binary files differ
diff --git a/tests/robotests/assets/valid_ota.zip b/tests/robotests/assets/valid_ota.zip
new file mode 100644
index 0000000..20fa2da
--- /dev/null
+++ b/tests/robotests/assets/valid_ota.zip
Binary files differ
diff --git a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
index 6bed1bc..83592e7 100644
--- a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
@@ -35,6 +35,7 @@
 import android.content.pm.UserInfo;
 import android.location.LocationManager;
 import android.os.Build;
+import android.os.SystemConfigManager;
 import android.os.UserHandle;
 import android.os.UserManager;
 
@@ -79,6 +80,9 @@
 
     private final String PERMISSION = "some.permission";
 
+    private final List<String> PREVENT_USER_DISABLE_PACKAGES = List.of(
+            "prevent.disable.package1", "prevent.disable.package2", "prevent.disable.package3");
+
     @Mock
     private UserManager mUserManager;
     @Mock
@@ -91,6 +95,8 @@
     private DevicePolicyManager mDevicePolicyManager;
     @Mock
     private LocationManager mLocationManager;
+    @Mock
+    private SystemConfigManager mSystemConfigManager;
 
     private ApplicationFeatureProvider mProvider;
 
@@ -104,6 +110,7 @@
         when(mContext.getApplicationContext()).thenReturn(mContext);
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
         when(mContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager);
+        when(mContext.getSystemService(SystemConfigManager.class)).thenReturn(mSystemConfigManager);
 
         mProvider = new ApplicationFeatureProviderImpl(mContext, mPackageManager,
                 mPackageManagerService, mDevicePolicyManager);
@@ -363,6 +370,16 @@
         assertThat(allowlist).contains("com.android.packageinstaller");
     }
 
+    @Test
+    public void getKeepEnabledPackages_shouldContainPreventUserDisablePackages() {
+        when(mSystemConfigManager.getPreventUserDisablePackages())
+                .thenReturn(PREVENT_USER_DISABLE_PACKAGES);
+
+        final Set<String> keepEnabledPackages = mProvider.getKeepEnabledPackages();
+
+        assertThat(keepEnabledPackages).containsAtLeastElementsIn(PREVENT_USER_DISABLE_PACKAGES);
+    }
+
     private void setUpUsersAndInstalledApps() {
         when(mUserManager.getProfiles(UserHandle.myUserId())).thenReturn(Arrays.asList(
                 new UserInfo(MAIN_USER_ID, "main", UserInfo.FLAG_ADMIN),
diff --git a/tests/robotests/src/com/android/settings/development/Enable16kPagesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/Enable16kPagesPreferenceControllerTest.java
new file mode 100644
index 0000000..0c9906c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/Enable16kPagesPreferenceControllerTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2024 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.development;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+import android.os.FileUtils;
+import android.os.SystemProperties;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+@RunWith(RobolectricTestRunner.class)
+public class Enable16kPagesPreferenceControllerTest {
+
+    @Mock private DevelopmentSettingsDashboardFragment mFragment;
+    private Context mContext;
+    private Enable16kPagesPreferenceController mController;
+
+    @Before
+    public void setup() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mController = spy(new Enable16kPagesPreferenceController(mContext, mFragment));
+        doNothing().when(mController).applyPayload(any(), anyLong(), anyLong(), anyList());
+    }
+
+    @Test
+    public void onSystemPropertyDisabled_shouldDisablePreference() {
+        SystemProperties.set(Enable16kPagesPreferenceController.DEV_OPTION_PROPERTY, "false");
+        assertThat(mController.isAvailable()).isEqualTo(false);
+    }
+
+    @Test
+    public void onSystemPropertyEnabled_shouldEnablePreference() {
+        SystemProperties.set(Enable16kPagesPreferenceController.DEV_OPTION_PROPERTY, "true");
+        assertThat(mController.isAvailable()).isEqualTo(true);
+    }
+
+    // TODO(b/303280163) : add tests to based on page size and whether preference is turned on/off
+
+    @Test
+    public void validateUpdateParsing_validFile() throws IOException {
+        // TODO(b/295573133) : Add tests to verify applyPayload arguments
+        String filename = "valid_ota.zip";
+        File updateFile = copyFromAssetToDataDir(filename);
+        mController.applyUpdateFile(updateFile);
+    }
+
+    @Test
+    public void validateUpdateParsing_emptyPayloadFile() {
+        String filename = "empty_payload_ota.zip";
+        File updateFile = copyFromAssetToDataDir(filename);
+        assertThrows(IOException.class, () -> mController.applyUpdateFile(updateFile));
+    }
+
+    @Test
+    public void validateUpdateParsing_noPayloadFile() {
+        String filename = "no_payload_ota.zip";
+        File updateFile = copyFromAssetToDataDir(filename);
+        assertThrows(FileNotFoundException.class, () -> mController.applyUpdateFile(updateFile));
+    }
+
+    @Test
+    public void validateUpdateParsing_noPropertiesFile() {
+        String filename = "no_properties_ota.zip";
+        File updateFile = copyFromAssetToDataDir(filename);
+        assertThrows(FileNotFoundException.class, () -> mController.applyUpdateFile(updateFile));
+    }
+
+    private File copyFromAssetToDataDir(String filename) {
+        try {
+            InputStream in = mContext.getAssets().open(filename);
+            File destination =
+                    File.createTempFile(
+                            "test_update", ".zip", new File(mContext.getDataDir().getPath()));
+            FileUtils.setPermissions(
+                    /* path= */ destination,
+                    /* mode= */ FileUtils.S_IRWXU | FileUtils.S_IRGRP | FileUtils.S_IROTH,
+                    /* uid= */ -1,
+                    /* gid= */ -1);
+            OutputStream out = new FileOutputStream(destination);
+            FileUtils.copy(in, out);
+            return destination;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
index c281dca..3857e64 100644
--- a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
@@ -29,6 +29,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -210,6 +211,28 @@
                 & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS).isEqualTo(0);
     }
 
+    @Test
+    public void onCreate_notTaskRoot_shouldFinishActivity() {
+        SettingsHomepageActivity activity =
+                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
+        doReturn(false).when(activity).isTaskRoot();
+
+        activity.onCreate(/* savedInstanceState */ null);
+
+        verify(activity).finish();
+    }
+
+    @Test
+    public void onCreate_singleTaskActivity_shouldNotFinishActivity() {
+        SettingsHomepageActivity activity =
+                spy(Robolectric.buildActivity(DeepLinkHomepageActivity.class).get());
+        doReturn(false).when(activity).isTaskRoot();
+
+        activity.onCreate(/* savedInstanceState */ null);
+
+        verify(activity, never()).finish();
+    }
+
     /** This test is for large screen devices Activity embedding. */
     @Test
     @Config(shadows = ShadowActivityEmbeddingUtils.class)
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/ResetAppPreferencesTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/ResetAppPreferencesTest.kt
index ffd5831..b63c281 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/ResetAppPreferencesTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/ResetAppPreferencesTest.kt
@@ -45,7 +45,7 @@
     }
 
     private fun setResetAppPreferences() {
-        val fakeMoreOptionsScope = object : MoreOptionsScope {
+        val fakeMoreOptionsScope = object : MoreOptionsScope() {
             override fun dismiss() {}
         }
         composeTestRule.setContent {
