diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8e62c45..4c7446b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1447,6 +1447,16 @@
                 <action android:name="android.settings.ACCESSIBILITY_SETTINGS_FOR_SUW" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.accessibility.AccessibilitySettingsForSetupWizard" />
+            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                android:value="true" />
+        </activity>
+
+        <activity-alias
+            android:name=".FontSizeSettingsForSetupWizardActivity"
+            android:exported="true"
+            android:targetActivity=".accessibility.AccessibilitySettingsForSetupWizardActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="com.android.settings.suggested.category.DISPLAY_SETTINGS" />
@@ -1457,9 +1467,7 @@
                 android:value="true" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.accessibility.AccessibilitySettingsForSetupWizard" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                android:value="true" />
-        </activity>
+        </activity-alias>
 
         <activity
             android:name="Settings$AccessibilityDaltonizerSettingsActivity"
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 4edd943..ce4eaaf 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -231,4 +231,17 @@
         <item name="android:textColorSecondary">@*android:color/secondary_text_light</item>
     </style>
 
+    <!-- Light theme for those pages inherit SubSettings and launched during setup flow -->
+    <style name="LightTheme.SubSettings.SetupWizard" parent="@android:style/Theme.DeviceDefault.Light">
+        <item name="android:windowLightStatusBar">true</item>
+        <item name="android:statusBarColor">@android:color/white</item>
+        <item name="android:navigationBarColor">@android:color/white</item>
+        <item name="android:windowLightNavigationBar">true</item>
+        <item name="android:windowBackground">@android:color/white</item>
+        <item name="android:navigationBarDividerColor">@*android:color/navigation_bar_divider_device_default_settings</item>
+
+        <item name="android:colorPrimary">@android:color/white</item>
+        <item name="android:colorPrimaryDark">@android:color/white</item>
+        <item name="android:colorAccent">@color/material_blue_700</item>
+    </style>
 </resources>
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 4ac4be4..383585c 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -51,7 +51,6 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.settings.Settings.WifiSettingsActivity;
 import com.android.settings.applications.manageapplications.ManageApplications;
-import com.android.settings.backup.BackupSettingsHelper;
 import com.android.settings.backup.UserBackupSettingsActivity;
 import com.android.settings.core.OnActivityResultListener;
 import com.android.settings.core.SettingsBaseActivity;
@@ -67,6 +66,8 @@
 import com.android.settingslib.development.DevelopmentSettingsEnabler;
 import com.android.settingslib.drawer.DashboardCategory;
 
+import com.google.android.setupcompat.util.WizardManagerHelper;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -243,8 +244,10 @@
                 intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);
 
         // If this is a sub settings, then apply the SubSettings Theme for the ActionBar content
-        // insets
-        if (isSubSettings) {
+        // insets.
+        // If this is in setup flow, don't apply theme. Because light theme needs to be applied
+        // in SettingsBaseActivity#onCreate().
+        if (isSubSettings && !WizardManagerHelper.isAnySetupWizard(getIntent())) {
             setTheme(R.style.Theme_SubSettings);
         }
 
diff --git a/src/com/android/settings/SetupWizardUtils.java b/src/com/android/settings/SetupWizardUtils.java
index 077d94c..bce6f3f 100644
--- a/src/com/android/settings/SetupWizardUtils.java
+++ b/src/com/android/settings/SetupWizardUtils.java
@@ -16,12 +16,18 @@
 
 package com.android.settings;
 
+import static com.google.android.setupcompat.util.WizardManagerHelper.EXTRA_IS_FIRST_RUN;
+import static com.google.android.setupcompat.util.WizardManagerHelper.EXTRA_IS_SETUP_FLOW;
+
 import android.content.Intent;
+import android.os.Bundle;
 import android.sysprop.SetupWizardProperties;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
 import com.google.android.setupdesign.util.ThemeHelper;
 
+import java.util.Arrays;
+
 
 public class SetupWizardUtils {
 
@@ -90,4 +96,14 @@
     public static void copySetupExtras(Intent fromIntent, Intent toIntent) {
         WizardManagerHelper.copyWizardManagerExtras(fromIntent, toIntent);
     }
+
+    public static Bundle copyLifecycleExtra(Bundle srcBundle, Bundle dstBundle) {
+        for (String key :
+                Arrays.asList(
+                        EXTRA_IS_FIRST_RUN,
+                        EXTRA_IS_SETUP_FLOW)) {
+            dstBundle.putBoolean(key, srcBundle.getBoolean(key, false));
+        }
+        return dstBundle;
+    }
 }
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
index fc68d2c..0ed1644 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
@@ -16,23 +16,35 @@
 
 package com.android.settings.accessibility;
 
+import android.content.ComponentName;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.Menu;
 import android.view.accessibility.AccessibilityEvent;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceFragmentCompat;
 
 import com.android.settings.SettingsActivity;
+import com.android.settings.SetupWizardUtils;
 import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.display.FontSizePreferenceFragmentForSetupWizard;
 import com.android.settings.search.actionbar.SearchMenuController;
 import com.android.settings.support.actionbar.HelpResourceProvider;
 import com.android.settingslib.core.instrumentation.Instrumentable;
 
+import com.google.android.setupcompat.util.WizardManagerHelper;
+
 public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivity {
 
+    private static final String LOG_TAG = "A11ySettingsForSUW";
     private static final String SAVE_KEY_TITLE = "activity_title";
 
+    @VisibleForTesting
+    static final String CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW =
+            "com.android.settings.FontSizeSettingsForSetupWizardActivity";
+
     @Override
     protected void onSaveInstanceState(Bundle savedState) {
         savedState.putCharSequence(SAVE_KEY_TITLE, getTitle());
@@ -79,4 +91,33 @@
                 .launch();
         return true;
     }
+
+    @Override
+    protected void onCreate(Bundle savedState) {
+        super.onCreate(savedState);
+
+        tryLaunchFontSizeSettings();
+    }
+
+    @VisibleForTesting
+    void tryLaunchFontSizeSettings() {
+        if (WizardManagerHelper.isAnySetupWizard(getIntent())
+                && new ComponentName(getPackageName(),
+                CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW).equals(
+                getIntent().getComponent())) {
+            final Bundle args = new Bundle();
+            args.putInt(HelpResourceProvider.HELP_URI_RESOURCE_KEY, 0);
+            args.putBoolean(SearchMenuController.NEED_SEARCH_ICON_IN_ACTION_BAR, false);
+            final SubSettingLauncher subSettingLauncher = new SubSettingLauncher(this)
+                    .setDestination(FontSizePreferenceFragmentForSetupWizard.class.getName())
+                    .setArguments(args)
+                    .setSourceMetricsCategory(Instrumentable.METRICS_CATEGORY_UNKNOWN)
+                    .setExtras(SetupWizardUtils.copyLifecycleExtra(getIntent().getExtras(),
+                            new Bundle()));
+
+            Log.d(LOG_TAG, "Launch font size settings");
+            subSettingLauncher.launch();
+            finish();
+        }
+    }
 }
diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java
index cd13654..5ff81d5 100644
--- a/src/com/android/settings/core/SettingsBaseActivity.java
+++ b/src/com/android/settings/core/SettingsBaseActivity.java
@@ -37,8 +37,11 @@
 import androidx.fragment.app.FragmentActivity;
 
 import com.android.settings.R;
+import com.android.settings.SubSettings;
 import com.android.settings.dashboard.CategoryManager;
 
+import com.google.android.setupcompat.util.WizardManagerHelper;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -65,6 +68,10 @@
         if (!theme.getBoolean(android.R.styleable.Theme_windowNoTitle, false)) {
             requestWindowFeature(Window.FEATURE_NO_TITLE);
         }
+        // Apply SetupWizard light theme during setup flow. This is for SubSettings pages.
+        if (WizardManagerHelper.isAnySetupWizard(getIntent()) && this instanceof SubSettings) {
+            setTheme(R.style.LightTheme_SubSettings_SetupWizard);
+        }
         super.setContentView(R.layout.settings_base_layout);
 
         final Toolbar toolbar = findViewById(R.id.action_bar);
diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java
index 39ecd78..5d9a528 100644
--- a/src/com/android/settings/core/SubSettingLauncher.java
+++ b/src/com/android/settings/core/SubSettingLauncher.java
@@ -19,6 +19,7 @@
 import android.annotation.StringRes;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.text.TextUtils;
@@ -89,6 +90,11 @@
         return this;
     }
 
+    public SubSettingLauncher setExtras(Bundle extras) {
+        mLaunchRequest.extras = extras;
+        return this;
+    }
+
     public SubSettingLauncher setSourceMetricsCategory(int sourceMetricsCategory) {
         mLaunchRequest.sourceMetricsCategory = sourceMetricsCategory;
         return this;
@@ -136,6 +142,7 @@
 
     public Intent toIntent() {
         final Intent intent = new Intent(Intent.ACTION_MAIN);
+        copyExtras(intent);
         intent.setClass(mContext, SubSettings.class);
         if (TextUtils.isEmpty(mLaunchRequest.destinationName)) {
             throw new IllegalArgumentException("Destination fragment must be set");
@@ -180,6 +187,11 @@
         listener.startActivityForResult(intent, requestCode);
     }
 
+    private void copyExtras(Intent intent) {
+        if (mLaunchRequest.extras != null) {
+            intent.replaceExtras(mLaunchRequest.extras);
+        }
+    }
     /**
      * Simple container that has information about how to launch a subsetting.
      */
@@ -194,5 +206,6 @@
         int mRequestCode;
         UserHandle userHandle;
         Bundle arguments;
+        Bundle extras;
     }
 }
diff --git a/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java b/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java
index b965d78..5f4f31b 100644
--- a/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Intent;
+import android.os.Bundle;
 import android.sysprop.SetupWizardProperties;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
@@ -31,9 +32,6 @@
 @RunWith(RobolectricTestRunner.class)
 public class SetupWizardUtilsTest {
 
-    private static final String EXTRA_IS_SETUP_FLOW = "isSetupFlow";
-    private static final String EXTRA_IS_FIRST_RUN = "firstRun";
-
     @Test
     public void testCopySetupExtras() {
         Intent fromIntent = new Intent();
@@ -46,6 +44,25 @@
         assertThat(theme).isEqualTo(toIntent.getStringExtra(WizardManagerHelper.EXTRA_THEME));
         assertThat(toIntent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, false))
                 .isTrue();
+        assertThat(toIntent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true))
+                .isFalse();
+    }
+
+    @Test
+    public void testCopyLifecycleExtra() {
+        Intent fromIntent = new Intent();
+        final String theme = "TEST_THEME";
+        fromIntent.putExtra(WizardManagerHelper.EXTRA_THEME, theme);
+        fromIntent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true);
+        Bundle dstBundle = new Bundle();
+        dstBundle = SetupWizardUtils.copyLifecycleExtra(fromIntent.getExtras(), dstBundle);
+
+        assertThat(dstBundle).isNotNull();
+        assertThat(dstBundle.getString(WizardManagerHelper.EXTRA_THEME)).isNull();
+        assertThat(dstBundle.getBoolean(WizardManagerHelper.EXTRA_IS_SETUP_FLOW))
+                .isTrue();
+        assertThat(dstBundle.getBoolean(WizardManagerHelper.EXTRA_IS_FIRST_RUN))
+                .isFalse();
     }
 
     @Test
@@ -87,7 +104,7 @@
 
     private Intent createSetupWizardIntent() {
         return new Intent()
-                .putExtra(EXTRA_IS_SETUP_FLOW, true)
-                .putExtra(EXTRA_IS_FIRST_RUN, true);
+                .putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)
+                .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
index a0a9de9..c3a630b 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
@@ -16,18 +16,27 @@
 
 package com.android.settings.accessibility;
 
+import static com.android.settings.accessibility.AccessibilitySettingsForSetupWizardActivity.CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW;
+
 import static com.google.common.truth.Truth.assertThat;
 
+import android.content.ComponentName;
 import android.content.Intent;
 
 import androidx.test.filters.SmallTest;
 
 import com.android.settings.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.display.FontSizePreferenceFragmentForSetupWizard;
+
+import com.google.android.setupcompat.util.WizardManagerHelper;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 
 @RunWith(RobolectricTestRunner.class)
 @SmallTest
@@ -41,4 +50,37 @@
 
     assertThat(activity.getThemeResId()).isEqualTo(R.style.GlifV3Theme_Light);
   }
+
+  @Test
+  public void onCreate_hasFontSizeComponent_shouldGoToFontSizePreferenceDirectly() {
+    AccessibilitySettingsForSetupWizardActivity activity =
+            Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
+                    new Intent(Intent.ACTION_MAIN).setComponent(new ComponentName(
+                            RuntimeEnvironment.application, CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW)).
+                            putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true).
+                            putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get();
+
+    activity.tryLaunchFontSizeSettings();
+
+    final Intent launchIntent = Shadows.shadowOf(activity).getNextStartedActivity();
+    assertThat(launchIntent).isNotNull();
+    assertThat(launchIntent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo(
+            FontSizePreferenceFragmentForSetupWizard.class.getName());
+    assertThat(activity.isFinishing()).isTrue();
+  }
+
+  @Test
+  public void onCreate_noFontSizeComponent_shouldNotFinishCurrentActivity() {
+    AccessibilitySettingsForSetupWizardActivity activity =
+            Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
+                    new Intent(Intent.ACTION_MAIN).
+                            putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true).
+                            putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get();
+
+    activity.tryLaunchFontSizeSettings();
+
+    final Intent launchIntent = Shadows.shadowOf(activity).getNextStartedActivity();
+    assertThat(launchIntent).isNull();
+    assertThat(activity.isFinishing()).isFalse();
+  }
 }
