diff --git a/res/values/strings.xml b/res/values/strings.xml
index c05626e..971e40e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -833,6 +833,8 @@
     <string name="security_settings_face_preference_summary">Face added</string>
     <!-- Message shown in summary field when Face Unlock is not set up. [CHAR LIMIT=54] -->
     <string name="security_settings_face_preference_summary_none">Setup needed</string>
+    <!-- Message shown in summary field when Face Unlock is not set up. [CHAR LIMIT=54] -->
+    <string name="security_settings_face_preference_summary_none_new">Add face</string>
     <!-- Title shown for menu item that launches face settings or enrollment. [CHAR LIMIT=32] -->
     <string name="security_settings_face_preference_title_new">Face</string>
     <!-- Title shown for menu item that launches face settings or enrollment, for work profile. [CHAR LIMIT=50] -->
@@ -1006,6 +1008,8 @@
         }</string>
     <!-- message shown in summary field when no fingerprints are registered -->
     <string name="security_settings_fingerprint_preference_summary_none">Setup needed</string>
+    <!-- message shown in summary field when no fingerprints are registered -->
+    <string name="security_settings_fingerprint_preference_summary_none_new">Add fingerprint</string>
     <!-- Introduction title shown in fingerprint enrollment to introduce the fingerprint feature [CHAR LIMIT=29] -->
     <string name="security_settings_fingerprint_enroll_introduction_title">Set up your fingerprint</string>
     <!-- Introduction title shown in fingerprint enrollment when asking for parental consent for fingerprint unlock [CHAR LIMIT=29] -->
@@ -1771,6 +1775,8 @@
 
     <!-- Summary for "Configure lockscreen" when lock screen is off [CHAR LIMIT=45] -->
     <string name="unlock_set_unlock_mode_off">None</string>
+    <!-- Summary for "Configure lockscreen" when lock screen is off [CHAR LIMIT=45] -->
+    <string name="unlock_set_unlock_mode_off_new">Add PIN, pattern, password, or swipe</string>
     <!-- Summary for "Configure lockscreen" when security is disabled [CHAR LIMIT=45] -->
     <string name="unlock_set_unlock_mode_none">Swipe</string>
     <!-- Summary for "Configure lockscreen" when security pattern is enabled [CHAR LIMIT=45] -->
diff --git a/src/com/android/settings/biometrics/face/FaceStatusUtils.java b/src/com/android/settings/biometrics/face/FaceStatusUtils.java
index 302d677..ee5277e 100644
--- a/src/com/android/settings/biometrics/face/FaceStatusUtils.java
+++ b/src/com/android/settings/biometrics/face/FaceStatusUtils.java
@@ -98,11 +98,14 @@
             return mContext.getString(
                     com.android.settingslib.widget.restricted.R.string.disabled_by_admin);
         } else {
+            int summaryNoneResId = Flags.biometricsOnboardingEducation()
+                    ? R.string.security_settings_face_preference_summary_none_new
+                    : R.string.security_settings_face_preference_summary_none;
             return mContext.getResources()
                     .getString(
                             hasEnrolled()
                                     ? R.string.security_settings_face_preference_summary
-                                    : R.string.security_settings_face_preference_summary_none);
+                                    : summaryNoneResId);
         }
     }
 
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java
index 1ca564c..b7ca3aa 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java
@@ -108,7 +108,9 @@
                     R.string.security_settings_fingerprint_preference_summary);
         } else {
             return mContext.getString(
-                    R.string.security_settings_fingerprint_preference_summary_none);
+                    Flags.biometricsOnboardingEducation()
+                            ? R.string.security_settings_fingerprint_preference_summary_none_new
+                            : R.string.security_settings_fingerprint_preference_summary_none);
         }
     }
 
diff --git a/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java b/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java
index b168568..e74db34 100644
--- a/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java
+++ b/src/com/android/settings/security/ScreenLockPreferenceDetailsUtils.java
@@ -178,7 +178,9 @@
         if (!mLockPatternUtils.isSecure(userId)) {
             if (userId == mProfileChallengeUserId
                     || mLockPatternUtils.isLockScreenDisabled(userId)) {
-                return R.string.unlock_set_unlock_mode_off;
+                return com.android.settings.flags.Flags.biometricsOnboardingEducation()
+                        ? R.string.unlock_set_unlock_mode_off_new
+                        : R.string.unlock_set_unlock_mode_off;
             } else {
                 return R.string.unlock_set_unlock_mode_none;
             }
diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceStatusPreferenceControllerTest.java
index c426f94..8f56514 100644
--- a/tests/robotests/src/com/android/settings/biometrics/face/FaceStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceStatusPreferenceControllerTest.java
@@ -36,6 +36,9 @@
 import android.hardware.face.Face;
 import android.hardware.face.FaceManager;
 import android.os.UserManager;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 
 import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.Preference;
@@ -50,6 +53,7 @@
 
 import org.junit.Before;
 import org.junit.Ignore;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -67,6 +71,8 @@
 
     private static final String TEST_PREF_KEY = "baz";
 
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
     @Mock
     private LockPatternUtils mLockPatternUtils;
     @Mock
@@ -125,7 +131,8 @@
     }
 
     @Test
-    public void updateState_noFace_shouldShowDefaultSummary() {
+    @DisableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void updateState_noFace_flagOff_shouldShowDefaultSummary() {
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
 
         mController.updateState(mPreference);
@@ -136,6 +143,18 @@
     }
 
     @Test
+    @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void updateState_noFace_flagOn_shouldShowDefaultSummary() {
+        when(mFaceManager.isHardwareDetected()).thenReturn(true);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.security_settings_face_preference_summary_none_new));
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+
+    @Test
     public void updateState_hasFace_shouldShowSummary() {
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.getEnrolledFaces(anyInt()))
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceControllerTest.java
index 000ee933..de8c070 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceControllerTest.java
@@ -36,6 +36,9 @@
 import android.hardware.fingerprint.Fingerprint;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.UserManager;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 
 import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.Preference;
@@ -51,6 +54,7 @@
 
 import org.junit.Before;
 import org.junit.Ignore;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -66,6 +70,8 @@
 @Config(shadows = {ShadowRestrictedLockUtilsInternal.class})
 public class FingerprintStatusPreferenceControllerTest {
 
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
     @Mock
     private LockPatternUtils mLockPatternUtils;
     @Mock
@@ -125,7 +131,8 @@
     }
 
     @Test
-    public void updateState_noFingerprint_shouldShowDefaultSummary() {
+    @DisableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void updateState_noFingerprint_flagOff_shouldShowDefaultSummary() {
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
 
         mController.updateState(mPreference);
@@ -136,6 +143,19 @@
     }
 
     @Test
+    @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void updateState_noFingerprint_flagOn_shouldShowDefaultSummary() {
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(
+                        R.string.security_settings_fingerprint_preference_summary_none_new));
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+
+    @Test
     public void updateState_hasFingerprint_shouldShowSummary() {
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
diff --git a/tests/unit/src/com/android/settings/biometrics/face/FaceStatusUtilsTest.java b/tests/unit/src/com/android/settings/biometrics/face/FaceStatusUtilsTest.java
index f5d090a..87c43ac 100644
--- a/tests/unit/src/com/android/settings/biometrics/face/FaceStatusUtilsTest.java
+++ b/tests/unit/src/com/android/settings/biometrics/face/FaceStatusUtilsTest.java
@@ -172,7 +172,8 @@
     }
 
     @Test
-    public void getSummary_whenNotEnrolled_returnsSummaryNone() {
+    @DisableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void getSummary_whenNotEnrolled_flagOff_returnsSummaryNone() {
         when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
 
         assertThat(mFaceStatusUtils.getSummary())
@@ -182,6 +183,17 @@
     }
 
     @Test
+    @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void getSummary_whenNotEnrolled_flagOn_returnsSummaryNone() {
+        when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
+
+        assertThat(mFaceStatusUtils.getSummary())
+                .isEqualTo(ResourcesUtils.getResourcesString(
+                        mApplicationContext,
+                        "security_settings_face_preference_summary_none_new"));
+    }
+
+    @Test
     public void getSummary_whenEnrolled_returnsSummary() {
         when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
 
diff --git a/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtilsTest.java b/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtilsTest.java
index 375c1ff..b603f4b 100644
--- a/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtilsTest.java
+++ b/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtilsTest.java
@@ -179,7 +179,8 @@
     }
 
     @Test
-    public void getSummary_whenNotEnrolled_returnsSummaryNone() {
+    @DisableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void getSummary_whenNotEnrolled_flagOff_returnsSummaryNone() {
         when(mFingerprintManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
 
         assertThat(mFingerprintStatusUtils.getSummary())
@@ -189,6 +190,17 @@
     }
 
     @Test
+    @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void getSummary_whenNotEnrolled_flagOn_returnsSummaryNone() {
+        when(mFingerprintManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
+
+        assertThat(mFingerprintStatusUtils.getSummary())
+                .isEqualTo(ResourcesUtils.getResourcesString(
+                        mApplicationContext,
+                        "security_settings_fingerprint_preference_summary_none_new"));
+    }
+
+    @Test
     public void getSummary_whenEnrolled_returnsSummary() {
         final int enrolledFingerprintsCount = 2;
         final int stringResId = ResourcesUtils.getResourcesId(
diff --git a/tests/unit/src/com/android/settings/safetycenter/FaceSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/FaceSafetySourceTest.java
index 9a162ae..9335ced 100644
--- a/tests/unit/src/com/android/settings/safetycenter/FaceSafetySourceTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/FaceSafetySourceTest.java
@@ -187,7 +187,7 @@
 
         assertSafetySourceDisabledDataSetWithSingularSummary(
                 "security_settings_face_preference_title_new",
-                "security_settings_face_preference_summary_none");
+                "security_settings_face_preference_summary_none_new");
     }
 
     @Test
@@ -205,7 +205,7 @@
 
         assertSafetySourceDisabledDataSetWithSingularSummary(
                 "security_settings_face_preference_title_new",
-                "security_settings_face_preference_summary_none");
+                "security_settings_face_preference_summary_none_new");
     }
 
     @Test
@@ -220,7 +220,7 @@
 
         assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_face_preference_title_new",
-                "security_settings_face_preference_summary_none",
+                "security_settings_face_preference_summary_none_new",
                 FaceEnrollIntroductionInternal.class.getName());
     }
 
diff --git a/tests/unit/src/com/android/settings/safetycenter/FingerprintSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/FingerprintSafetySourceTest.java
index fd109f6..91e7953 100644
--- a/tests/unit/src/com/android/settings/safetycenter/FingerprintSafetySourceTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/FingerprintSafetySourceTest.java
@@ -203,7 +203,7 @@
 
         assertSafetySourceDisabledDataSetWithSingularSummary(
                 "security_settings_fingerprint",
-                "security_settings_fingerprint_preference_summary_none");
+                "security_settings_fingerprint_preference_summary_none_new");
     }
 
     @Test
@@ -222,7 +222,7 @@
 
         assertSafetySourceDisabledDataSetWithSingularSummary(
                 "security_settings_fingerprint",
-                "security_settings_fingerprint_preference_summary_none");
+                "security_settings_fingerprint_preference_summary_none_new");
     }
 
     @Test
@@ -238,7 +238,7 @@
 
         assertSafetySourceEnabledDataSetWithSingularSummary(
                 "security_settings_fingerprint",
-                "security_settings_fingerprint_preference_summary_none",
+                "security_settings_fingerprint_preference_summary_none_new",
                 FingerprintSettings.class.getName());
     }
 
diff --git a/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java b/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java
index 2535870..2e674e0 100644
--- a/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java
+++ b/tests/unit/src/com/android/settings/security/ScreenLockPreferenceDetailsUtilsTest.java
@@ -32,10 +32,13 @@
 import android.content.res.Resources;
 import android.os.UserManager;
 import android.os.storage.StorageManager;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.RequiresFlagsDisabled;
 import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.platform.test.flag.junit.SetFlagsRule;
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -65,6 +68,8 @@
     private static final int USER_ID = 11;
 
     @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+    @Rule
     public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
     @Mock
     private LockPatternUtils mLockPatternUtils;
@@ -118,7 +123,8 @@
     }
 
     @Test
-    public void getSummary_unsecureAndDisabledPattern_shouldReturnUnlockModeOff() {
+    @DisableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void getSummary_unsecureAndDisabledPattern_flagOff_shouldReturnUnlockModeOff() {
         final String summary = prepareString("unlock_set_unlock_mode_off", "unlockModeOff");
 
         when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(false);
@@ -128,6 +134,17 @@
     }
 
     @Test
+    @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION)
+    public void getSummary_unsecureAndDisabledPattern_flagOn_shouldReturnUnlockModeOff() {
+        final String summary = prepareString("unlock_set_unlock_mode_off_new", "unlockModeOff");
+
+        when(mLockPatternUtils.isSecure(USER_ID)).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true);
+
+        assertThat(mScreenLockPreferenceDetailsUtils.getSummary(USER_ID)).isEqualTo(summary);
+    }
+
+    @Test
     public void getSummary_unsecurePattern_shouldReturnUnlockModeNone() {
         final String summary =
                 prepareString("unlock_set_unlock_mode_none", "unlockModeNone");
