diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index aa52a2a..e373ccc 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -100,9 +100,12 @@
     public static class LocalePickerActivity extends SettingsActivity { /* empty */ }
     public static class LanguageSettingsActivity extends SettingsActivity { /* empty */ }
     /** Activity for the regional preferences settings. */
+    public static class RegionSettingsActivity extends SettingsActivity { /* empty */ }
     public static class RegionalPreferencesActivity extends SettingsActivity { /* empty */ }
     public static class TemperatureUnitSettingsActivity extends SettingsActivity { /* empty */ }
     public static class FirstDayOfWeekSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class MeasurementSystemSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class NumberingSystemSettingsActivity extends SettingsActivity { /* empty */ }
     public static class KeyboardSettingsActivity extends SettingsActivity { /* empty */ }
     /** Activity for the navigation mode settings. */
     public static class NavigationModeSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index eeecdd5..bc2ab68 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -183,6 +183,9 @@
 import com.android.settings.privatespace.delete.PrivateSpaceDeletionProgressFragment;
 import com.android.settings.privatespace.onelock.PrivateSpaceBiometricSettings;
 import com.android.settings.regionalpreferences.FirstDayOfWeekItemFragment;
+import com.android.settings.regionalpreferences.MeasurementSystemItemFragment;
+import com.android.settings.regionalpreferences.NumberingSystemLocaleListFragment;
+import com.android.settings.regionalpreferences.RegionPickerFragment;
 import com.android.settings.regionalpreferences.RegionalPreferencesEntriesFragment;
 import com.android.settings.regionalpreferences.TemperatureUnitFragment;
 import com.android.settings.safetycenter.MoreSecurityPrivacyFragment;
@@ -396,9 +399,12 @@
             ColorAndMotionFragment.class.getName(),
             ColorContrastFragment.class.getName(),
             LongBackgroundTasksDetails.class.getName(),
+            RegionPickerFragment.class.getName(),
             RegionalPreferencesEntriesFragment.class.getName(),
             TemperatureUnitFragment.class.getName(),
             FirstDayOfWeekItemFragment.class.getName(),
+            MeasurementSystemItemFragment.class.getName(),
+            NumberingSystemLocaleListFragment.class.getName(),
             BatteryInfoFragment.class.getName(),
             UserAspectRatioDetails.class.getName(),
             ScreenTimeoutSettings.class.getName(),
diff --git a/src/com/android/settings/regionalpreferences/NumberingPreferencesFragment.java b/src/com/android/settings/regionalpreferences/NumberingPreferencesFragment.java
index 1c5015f..8a9840f 100644
--- a/src/com/android/settings/regionalpreferences/NumberingPreferencesFragment.java
+++ b/src/com/android/settings/regionalpreferences/NumberingPreferencesFragment.java
@@ -32,8 +32,14 @@
 import java.util.List;
 import java.util.Locale;
 
-/** Provides options of numbering system to each language. */
-public class NumberingPreferencesFragment  extends DashboardFragment {
+/**
+ * Provides options of numbering system to each language.
+ *
+ * @deprecated Use {@link NumberingSystemLocaleListFragment} instead.
+ */
+@Deprecated
+public class NumberingPreferencesFragment extends DashboardFragment {
+
     /** Initializes variables. */
     @VisibleForTesting
     String initTitle() {
diff --git a/src/com/android/settings/regionalpreferences/NumberingSystemFormatSelectionFragment.java b/src/com/android/settings/regionalpreferences/NumberingSystemFormatSelectionFragment.java
new file mode 100644
index 0000000..bbe14b6
--- /dev/null
+++ b/src/com/android/settings/regionalpreferences/NumberingSystemFormatSelectionFragment.java
@@ -0,0 +1,82 @@
+/*
+ * 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.regionalpreferences;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.app.LocaleHelper;
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+/** Provides options of numbering system to each language. */
+public class NumberingSystemFormatSelectionFragment extends DashboardFragment {
+
+    @Override
+    public void onCreate(@NonNull Bundle icicle) {
+        super.onCreate(icicle);
+        getActivity().setTitle(initTitle());
+    }
+
+    /**
+     * Get a list of {@link AbstractPreferenceController} for this fragment.
+     */
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        NumberingSystemItemController controller =
+                new NumberingSystemItemController(context, getArguments());
+        controller.setParentFragment(this);
+        List<AbstractPreferenceController> listControllers = new ArrayList<>();
+        listControllers.add(controller);
+        return listControllers;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.regional_preference_numbering_system_page;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return NumberingSystemFormatSelectionFragment.class.getSimpleName();
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.NUMBERING_SYSTEM_NUMBER_FORMAT_SELECTION_PREFERENCE;
+    }
+
+    private String initTitle() {
+        String selectedLanguage = getArguments().getString(
+                NumberingSystemItemController.KEY_SELECTED_LANGUAGE, "");
+        if (selectedLanguage.isEmpty()) {
+            Log.w(getLogTag(), "No selected language.");
+            return "";
+        }
+        Locale locale = Locale.forLanguageTag(selectedLanguage);
+        return LocaleHelper.getDisplayName(locale.stripExtensions(), locale, true);
+    }
+}
diff --git a/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java b/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java
index 9f0c404..fe0a088 100644
--- a/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java
+++ b/src/com/android/settings/regionalpreferences/NumberingSystemItemController.java
@@ -34,6 +34,7 @@
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.flags.Flags;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.widget.SelectorWithWidgetPreference;
@@ -158,10 +159,15 @@
         extra.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE,
                 ARG_VALUE_NUMBERING_SYSTEM_SELECT);
         extra.putString(KEY_SELECTED_LANGUAGE, selectedLanguage);
+
+        String destinationFragment = NumberingPreferencesFragment.class.getName();
+        if (Flags.regionalPreferencesApiEnabled()) {
+            destinationFragment = NumberingSystemFormatSelectionFragment.class.getName();
+        }
         new SubSettingLauncher(preference.getContext())
-                .setDestination(NumberingPreferencesFragment.class.getName())
+                .setDestination(destinationFragment)
                 .setSourceMetricsCategory(
-                        SettingsEnums.NUMBERING_SYSTEM_LANGUAGE_SELECTION_PREFERENCE)
+                    SettingsEnums.NUMBERING_SYSTEM_LANGUAGE_SELECTION_PREFERENCE)
                 .setArguments(extra)
                 .launch();
     }
diff --git a/src/com/android/settings/regionalpreferences/NumberingSystemLocaleListFragment.java b/src/com/android/settings/regionalpreferences/NumberingSystemLocaleListFragment.java
new file mode 100644
index 0000000..6a39b23
--- /dev/null
+++ b/src/com/android/settings/regionalpreferences/NumberingSystemLocaleListFragment.java
@@ -0,0 +1,107 @@
+/*
+ * 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.regionalpreferences;
+
+import static android.provider.Settings.ACTION_NUMBERING_SYSTEM_SETTINGS;
+
+import android.app.Activity;
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.LocaleList;
+
+import androidx.annotation.NonNull;
+
+import com.android.internal.app.LocaleStore;
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+/** Provides locale list for numbering system settings. */
+public class NumberingSystemLocaleListFragment extends DashboardFragment {
+
+    @Override
+    public void onCreate(@NonNull Bundle icicle) {
+        super.onCreate(icicle);
+
+        if (isEmptyNumberingSystemLocale()) {
+            getActivity().setResult(Activity.RESULT_CANCELED);
+            finish();
+        }
+
+        if (getIntent().getAction().equals(ACTION_NUMBERING_SYSTEM_SETTINGS)) {
+          // TODO: Generically log action.
+        }
+
+        getActivity().setTitle(R.string.numbers_preferences_title);
+        getActivity().setResult(Activity.RESULT_OK);
+    }
+
+    /**
+     * Get a list of {@link AbstractPreferenceController} for this fragment.
+     */
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        NumberingSystemItemController controller =
+                new NumberingSystemItemController(context, getExtraData());
+        controller.setParentFragment(this);
+        List<AbstractPreferenceController> listControllers = new ArrayList<>();
+        listControllers.add(controller);
+        return listControllers;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.regional_preference_numbering_system_page;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return NumberingSystemLocaleListFragment.class.getSimpleName();
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.NUMBERING_SYSTEM_LANGUAGE_SELECTION_PREFERENCE;
+    }
+
+    private static boolean isEmptyNumberingSystemLocale() {
+        LocaleList localeList = LocaleList.getDefault();
+        Set<Locale> localesHasNumberingSystems = new HashSet<>();
+        for (int i = 0; i < localeList.size(); i++) {
+            Locale locale = localeList.get(i);
+            LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(locale);
+            if (localeInfo.hasNumberingSystems()) {
+                localesHasNumberingSystems.add(locale);
+            }
+        }
+        return localesHasNumberingSystems.isEmpty();
+    }
+
+    private static Bundle getExtraData() {
+        Bundle extra = new Bundle();
+        extra.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE,
+                NumberingSystemItemController.ARG_VALUE_LANGUAGE_SELECT);
+        return extra;
+    }
+}
