diff --git a/tests/robotests/src/com/android/customization/picker/clock/data/repository/FakeClockPickerRepository.kt b/tests/robotests/src/com/android/customization/picker/clock/data/repository/FakeClockPickerRepository.kt
index 3055f1f..7728218 100644
--- a/tests/robotests/src/com/android/customization/picker/clock/data/repository/FakeClockPickerRepository.kt
+++ b/tests/robotests/src/com/android/customization/picker/clock/data/repository/FakeClockPickerRepository.kt
@@ -32,7 +32,6 @@
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.update
 
 /** By default [FakeClockPickerRepository] uses [fakeClocks]. */
 open class FakeClockPickerRepository(clocks: List<ClockMetadataModel> = fakeClocks) :
@@ -44,15 +43,16 @@
     private val colorTone: MutableStateFlow<Int> =
         MutableStateFlow(ClockMetadataModel.DEFAULT_COLOR_TONE_PROGRESS)
     @ColorInt private val seedColor: MutableStateFlow<Int?> = MutableStateFlow(null)
-    private val axisPresetConfig: MutableStateFlow<AxisPresetConfig?> = MutableStateFlow(null)
+    private val clockListFlow: MutableStateFlow<List<ClockMetadataModel>> =
+        MutableStateFlow(fakeClocks)
     override val selectedClock: Flow<ClockMetadataModel> =
-        combine(selectedClockId, selectedColorId, colorTone, seedColor, axisPresetConfig) {
+        combine(clockListFlow, selectedClockId, selectedColorId, colorTone, seedColor) {
+            clockList,
             selectedClockId,
             selectedColor,
             colorTone,
-            seedColor,
-            axisPresetConfig ->
-            val selectedClock = fakeClocks.find { clock -> clock.clockId == selectedClockId }
+            seedColor ->
+            val selectedClock = clockList.find { clock -> clock.clockId == selectedClockId }
             checkNotNull(selectedClock)
             ClockMetadataModel(
                 clockId = selectedClock.clockId,
@@ -60,7 +60,7 @@
                 description = "description",
                 thumbnail = ColorDrawable(0),
                 isReactiveToTone = selectedClock.isReactiveToTone,
-                axisPresetConfig = axisPresetConfig,
+                axisPresetConfig = selectedClock.axisPresetConfig,
                 selectedColorId = selectedColor,
                 colorToneProgress = colorTone,
                 seedColor = seedColor,
@@ -89,29 +89,30 @@
     }
 
     override suspend fun setClockAxisStyle(axisStyle: ClockAxisStyle) {
-        val config = axisPresetConfig.value
-        if (config == null) {
-            axisPresetConfig.value =
-                AxisPresetConfig(
-                    groups =
-                        listOf(
-                            Group(presets = listOf(axisStyle), icon = ColorDrawable(Color.YELLOW))
-                        ),
-                    current = AxisPresetConfig.IndexedStyle(0, 0, axisStyle),
-                )
-        } else {
-            axisPresetConfig.update { axisPresetConfig ->
-                axisPresetConfig?.let { it.copy(current = it.findStyle(axisStyle)) }
+        val clockList = clockListFlow.value
+        val newClockList = clockList.toMutableList()
+        for ((index, clock) in clockList.withIndex()) {
+            val presetConfig = clock.axisPresetConfig
+            val style = presetConfig?.findStyle(axisStyle)
+            if (presetConfig != null && style != null) {
+                newClockList[index] =
+                    clock.copy(axisPresetConfig = presetConfig.copy(current = style))
             }
         }
+
+        clockListFlow.value = newClockList.toList()
     }
 
     override fun isReactiveToTone(clockId: ClockId): Boolean? = true
 
     companion object {
-        fun buildFakeAxis(i: Int): ClockFontAxis {
+        fun buildFakeClockAxisStyle(i: Int): ClockAxisStyle {
+            return ClockAxisStyle(listOf(buildFakeAxis(i)))
+        }
+
+        private fun buildFakeAxis(i: Int): ClockFontAxis {
             return ClockFontAxis(
-                key = "key",
+                key = "key#$i",
                 type = AxisType.Float,
                 maxValue = 0f,
                 minValue = 1000f,
@@ -121,10 +122,36 @@
             )
         }
 
+        private val fakeClockAxisStyle0 = ClockAxisStyle(listOf(buildFakeAxis(0)))
+        val fakeClockAxisStyle1 = ClockAxisStyle(listOf(buildFakeAxis(1)))
+        private val fakeClockAxisStyle2 = ClockAxisStyle(listOf(buildFakeAxis(2)))
+        private val fakeClockAxisStyle3 = ClockAxisStyle(listOf(buildFakeAxis(3)))
+        private val fakeAxisPresetConfig: AxisPresetConfig =
+            AxisPresetConfig(
+                groups =
+                    listOf(
+                        AxisPresetConfig.Group(
+                            presets = listOf(fakeClockAxisStyle0, fakeClockAxisStyle1),
+                            icon = ColorDrawable(Color.BLUE),
+                        ),
+                        AxisPresetConfig.Group(
+                            presets = listOf(fakeClockAxisStyle2, fakeClockAxisStyle3),
+                            icon = ColorDrawable(Color.YELLOW),
+                        ),
+                    ),
+                current =
+                    AxisPresetConfig.IndexedStyle(
+                        groupIndex = 0,
+                        presetIndex = 0,
+                        style = fakeClockAxisStyle0,
+                    ),
+            )
+
         const val CLOCK_ID_0 = "clock0"
         const val CLOCK_ID_1 = "clock1"
         const val CLOCK_ID_2 = "clock2"
         const val CLOCK_ID_3 = "clock3"
+
         val fakeClocks =
             listOf(
                 ClockMetadataModel(
@@ -133,7 +160,7 @@
                     "description0",
                     ColorDrawable(0),
                     true,
-                    null,
+                    fakeAxisPresetConfig,
                     null,
                     50,
                     null,
diff --git a/tests/robotests/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractorTest.kt b/tests/robotests/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractorTest.kt
index 484d810..67c2e46 100644
--- a/tests/robotests/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractorTest.kt
+++ b/tests/robotests/src/com/android/customization/picker/clock/domain/interactor/ClockPickerInteractorTest.kt
@@ -3,7 +3,6 @@
 import androidx.test.filters.SmallTest
 import com.android.customization.picker.clock.data.repository.FakeClockPickerRepository
 import com.android.customization.picker.clock.shared.ClockSize
-import com.android.systemui.plugins.clocks.ClockAxisStyle
 import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient
 import com.android.wallpaper.picker.customization.data.repository.CustomizationRuntimeValuesRepository
 import com.android.wallpaper.testing.FakeSnapshotStore
@@ -89,7 +88,7 @@
     @Test
     fun setFontAxisSettings() = runTest {
         val axisSettings = collectLastValue(underTest.axisSettings)
-        val fakeSettings = ClockAxisStyle(listOf(FakeClockPickerRepository.buildFakeAxis(10)))
+        val fakeSettings = FakeClockPickerRepository.fakeClockAxisStyle1
 
         underTest.setClockFontAxes(fakeSettings)
 
diff --git a/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModelTest.kt b/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModelTest.kt
index 315f071..2b71342 100644
--- a/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModelTest.kt
+++ b/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModelTest.kt
@@ -28,6 +28,7 @@
 import com.android.customization.picker.clock.ui.viewmodel.ClockSettingsViewModel
 import com.android.customization.picker.color.data.repository.FakeColorPickerRepository2
 import com.android.customization.picker.color.domain.interactor.ColorPickerInteractor2
+import com.android.systemui.plugins.clocks.AxisPresetConfig.IndexedStyle
 import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient
 import com.android.themepicker.R
 import com.android.wallpaper.customization.ui.viewmodel.ClockPickerViewModel.Tab
@@ -114,26 +115,7 @@
         Dispatchers.resetMain()
     }
 
-    @Test
-    fun selectedTab_whenClickOnTabStyle() = runTest {
-        val tabs = collectLastValue(underTest.tabs)
-        val selectedTab = collectLastValue(underTest.selectedTab)
-
-        tabs()?.get(0)?.onClick?.invoke()
-
-        assertThat(selectedTab()).isEqualTo(Tab.STYLE)
-    }
-
-    @Test
-    fun selectedTab_whenClickOnTabColor() = runTest {
-        val tabs = collectLastValue(underTest.tabs)
-        val selectedTab = collectLastValue(underTest.selectedTab)
-
-        tabs()?.get(1)?.onClick?.invoke()
-
-        assertThat(selectedTab()).isEqualTo(Tab.COLOR)
-    }
-
+    //// Tabs
     @Test
     fun tabs_whenInitialState() = runTest {
         val tabs = collectLastValue(underTest.tabs)
@@ -204,6 +186,37 @@
     }
 
     @Test
+    fun selectedTab_whenClickOnTabStyle() = runTest {
+        val tabs = collectLastValue(underTest.tabs)
+        val selectedTab = collectLastValue(underTest.selectedTab)
+
+        tabs()?.get(0)?.onClick?.invoke()
+
+        assertThat(selectedTab()).isEqualTo(Tab.STYLE)
+    }
+
+    @Test
+    fun selectedTab_whenClickOnTabColor() = runTest {
+        val tabs = collectLastValue(underTest.tabs)
+        val selectedTab = collectLastValue(underTest.selectedTab)
+
+        tabs()?.get(1)?.onClick?.invoke()
+
+        assertThat(selectedTab()).isEqualTo(Tab.COLOR)
+    }
+
+    @Test
+    fun selectedTab_whenClickOnTabSize() = runTest {
+        val tabs = collectLastValue(underTest.tabs)
+        val selectedTab = collectLastValue(underTest.selectedTab)
+
+        tabs()?.get(2)?.onClick?.invoke()
+
+        assertThat(selectedTab()).isEqualTo(Tab.SIZE)
+    }
+
+    //// Clock style
+    @Test
     fun selectedClock_whenClickOnStyleOptions() = runTest {
         val selectedClock = collectLastValue(underTest.selectedClock)
 
@@ -249,6 +262,94 @@
         assertThat(option1OnClicked()).isNull()
     }
 
+    //// Clock font
+    @Test
+    fun previewingClockPresetIndexedStyle_whenInitialState() = runTest {
+        val previewingClockPresetIndexedStyle =
+            collectLastValue(underTest.previewingClockPresetIndexedStyle)
+
+        assertThat(previewingClockPresetIndexedStyle())
+            .isEqualTo(FakeClockPickerRepository.fakeClocks[0].axisPresetConfig?.current)
+    }
+
+    @Test
+    fun previewingClockPresetIndexedStyle_whenClickOnSliderStep() = runTest {
+        val previewingClockPresetIndexedStyle =
+            collectLastValue(underTest.previewingClockPresetIndexedStyle)
+        val axisPresetsSliderViewModel = collectLastValue(underTest.axisPresetsSliderViewModel)
+        val onSlierStopTrackingTouch = axisPresetsSliderViewModel()?.onSliderStopTrackingTouch
+        checkNotNull(onSlierStopTrackingTouch)
+
+        onSlierStopTrackingTouch.invoke(1F)
+
+        assertThat(previewingClockPresetIndexedStyle())
+            .isEqualTo(
+                IndexedStyle(
+                    groupIndex = 0,
+                    presetIndex = 1,
+                    style = FakeClockPickerRepository.fakeClockAxisStyle1,
+                )
+            )
+    }
+
+    @Test
+    fun shouldShowPresetSlider_true_whenDefault() = runTest {
+        val shouldShowPresetSlider = collectLastValue(underTest.shouldShowPresetSlider)
+
+        assertThat(shouldShowPresetSlider()).isTrue()
+    }
+
+    @Test
+    fun shouldShowPresetSlider_false_whenSelectClockWithNullAxisPresetConfig() = runTest {
+        val shouldShowPresetSlider = collectLastValue(underTest.shouldShowPresetSlider)
+        val clockStyleOptions = collectLastValue(underTest.clockStyleOptions)
+        // Advance CLOCKS_EVENT_UPDATE_DELAY_MILLIS since there is a delay from clockStyleOptions
+        advanceTimeBy(ClockPickerViewModel.CLOCKS_EVENT_UPDATE_DELAY_MILLIS)
+        val onClockOption1Clicked =
+            clockStyleOptions()?.get(1)?.onClicked?.let { collectLastValue(it) }
+        checkNotNull(onClockOption1Clicked)
+
+        onClockOption1Clicked()?.invoke()
+
+        assertThat(shouldShowPresetSlider()).isFalse()
+    }
+
+    @Test
+    fun axisPresetsSliderViewModel_initialState() = runTest {
+        val axisPresetsSliderViewModel = collectLastValue(underTest.axisPresetsSliderViewModel)
+
+        val expectedPresetSize =
+            FakeClockPickerRepository.fakeClocks[0].axisPresetConfig?.groups?.get(0)?.presets?.size
+        checkNotNull(expectedPresetSize)
+        val resultAxisPresetsSliderViewModel = axisPresetsSliderViewModel()
+        assertThat(resultAxisPresetsSliderViewModel?.valueFrom).isEqualTo(0F)
+        assertThat(resultAxisPresetsSliderViewModel?.valueTo)
+            .isEqualTo((expectedPresetSize - 1).toFloat())
+        assertThat(resultAxisPresetsSliderViewModel?.stepSize).isEqualTo(1F)
+    }
+
+    @Test
+    fun axisPresetsSliderSelectedValue_update_whenClickOnSliderStep() = runTest {
+        val axisPresetsSliderSelectedValue =
+            collectLastValue(underTest.axisPresetsSliderSelectedValue)
+        val axisPresetsSliderViewModel = collectLastValue(underTest.axisPresetsSliderViewModel)
+        val onSlierStopTrackingTouch = axisPresetsSliderViewModel()?.onSliderStopTrackingTouch
+        checkNotNull(onSlierStopTrackingTouch)
+
+        onSlierStopTrackingTouch.invoke(1F)
+
+        val expectedResult =
+            FakeClockPickerRepository.fakeClocks[0]
+                .axisPresetConfig
+                ?.groups
+                ?.get(0)
+                ?.presets
+                ?.get(1)
+        checkNotNull(expectedResult)
+        assertThat(axisPresetsSliderSelectedValue()).isEqualTo(1F)
+    }
+
+    //// Clock size
     @Test
     fun previewingClockSize_whenCallingOnClockSizeSwitchChecked() = runTest {
         val previewingClockSize = collectLastValue(underTest.previewingClockSize)
@@ -262,6 +363,7 @@
         assertThat(previewingClockSize()).isEqualTo(ClockSize.SMALL)
     }
 
+    //// Clock color
     @Test
     fun sliderProgress_whenOnSliderProgressChanged() = runTest {
         val sliderProgress = collectLastValue(underTest.previewingSliderProgress)
