diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
index 893837c..d1614ca 100644
--- a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
@@ -64,7 +64,12 @@
     static final String RESET_KEY = "reset";
     private static final String PREVIEW_KEY = "preview";
     private static final String NEED_RESET_SETTINGS = "need_reset_settings";
+    private static final String LAST_PREVIEW_INDEX = "last_preview_index";
+    private static final int UNKNOWN_INDEX = -1;
+
     private FontWeightAdjustmentPreferenceController mFontWeightAdjustmentController;
+    private TextReadingPreviewController mPreviewController;
+    private int mLastPreviewIndex = UNKNOWN_INDEX;
     private int mEntryPoint = EntryPoint.UNKNOWN_ENTRY;
 
     /**
@@ -95,14 +100,20 @@
     boolean mNeedResetSettings;
 
     @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
 
         mNeedResetSettings = false;
         mResetStateListeners = getResetStateListeners();
 
-        if (icicle != null && icicle.getBoolean(NEED_RESET_SETTINGS)) {
-            mResetStateListeners.forEach(ResetStateListener::resetState);
+        if (savedInstanceState != null) {
+            if (savedInstanceState.getBoolean(NEED_RESET_SETTINGS)) {
+                mResetStateListeners.forEach(ResetStateListener::resetState);
+            }
+
+            if (savedInstanceState.containsKey(LAST_PREVIEW_INDEX)) {
+                mLastPreviewIndex = savedInstanceState.getInt(LAST_PREVIEW_INDEX);
+            }
         }
     }
 
@@ -139,19 +150,19 @@
         final FontSizeData fontSizeData = new FontSizeData(context);
         final DisplaySizeData displaySizeData = createDisplaySizeData(context);
 
-        final TextReadingPreviewController previewController = new TextReadingPreviewController(
-                context, PREVIEW_KEY, fontSizeData, displaySizeData);
-        previewController.setEntryPoint(mEntryPoint);
-        controllers.add(previewController);
+        mPreviewController = new TextReadingPreviewController(context, PREVIEW_KEY, fontSizeData,
+                displaySizeData);
+        mPreviewController.setEntryPoint(mEntryPoint);
+        controllers.add(mPreviewController);
 
         final PreviewSizeSeekBarController fontSizeController = new PreviewSizeSeekBarController(
                 context, FONT_SIZE_KEY, fontSizeData);
-        fontSizeController.setInteractionListener(previewController);
+        fontSizeController.setInteractionListener(mPreviewController);
         controllers.add(fontSizeController);
 
         final PreviewSizeSeekBarController displaySizeController = new PreviewSizeSeekBarController(
                 context, DISPLAY_SIZE_KEY, displaySizeData);
-        displaySizeController.setInteractionListener(previewController);
+        displaySizeController.setInteractionListener(mPreviewController);
         controllers.add(displaySizeController);
 
         mFontWeightAdjustmentController =
@@ -206,6 +217,17 @@
         if (mNeedResetSettings) {
             outState.putBoolean(NEED_RESET_SETTINGS, true);
         }
+
+        outState.putInt(LAST_PREVIEW_INDEX, mPreviewController.getCurrentItem());
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        if (mLastPreviewIndex != UNKNOWN_INDEX) {
+            mPreviewController.setCurrentItem(mLastPreviewIndex);
+        }
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/accessibility/TextReadingPreviewController.java b/src/com/android/settings/accessibility/TextReadingPreviewController.java
index 29faaaa..8fa8dc7 100644
--- a/src/com/android/settings/accessibility/TextReadingPreviewController.java
+++ b/src/com/android/settings/accessibility/TextReadingPreviewController.java
@@ -133,6 +133,14 @@
         postCommitDelayed(CHANGE_BY_SEEKBAR_DELAY_MS);
     }
 
+    void setCurrentItem(int index) {
+        mPreviewPreference.setCurrentItem(index);
+    }
+
+    int getCurrentItem() {
+        return mPreviewPreference.getCurrentItem();
+    }
+
     /**
      * The entry point is used for logging.
      *
diff --git a/src/com/android/settings/accessibility/TextReadingPreviewPreference.java b/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
index 4b8ca39..cef6f25 100644
--- a/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
+++ b/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
@@ -37,6 +37,24 @@
     private int mLastLayerIndex;
     private PreviewPagerAdapter mPreviewAdapter;
 
+    private final ViewPager.OnPageChangeListener mPageChangeListener =
+            new ViewPager.OnPageChangeListener() {
+        @Override
+        public void onPageScrolled(int i, float v, int i1) {
+            // Do nothing
+        }
+
+        @Override
+        public void onPageSelected(int i) {
+            mCurrentItem = i;
+        }
+
+        @Override
+        public void onPageScrollStateChanged(int i) {
+            // Do nothing
+        }
+    };
+
     TextReadingPreviewPreference(Context context) {
         super(context);
         init();
@@ -63,6 +81,7 @@
         super.onBindViewHolder(holder);
 
         final ViewPager viewPager = (ViewPager) holder.findViewById(R.id.preview_pager);
+        viewPager.addOnPageChangeListener(mPageChangeListener);
         final DotsPageIndicator pageIndicator =
                 (DotsPageIndicator) holder.findViewById(R.id.page_indicator);
         updateAdapterIfNeeded(viewPager, pageIndicator, mPreviewAdapter);
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
index 3dc82da..1688142 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
@@ -129,6 +129,17 @@
         verify(mPreviewPagerAdapter).setPreviewLayer(eq(index), anyInt(), anyInt(), anyBoolean());
     }
 
+    @Test
+    public void afterPagerChange_updateCurrentItem() {
+        final int currentItem = 2;
+        mTextReadingPreviewPreference.setPreviewAdapter(mPreviewPagerAdapter);
+        mTextReadingPreviewPreference.onBindViewHolder(mHolder);
+
+        mViewPager.setCurrentItem(currentItem);
+
+        assertThat(mTextReadingPreviewPreference.getCurrentItem()).isEqualTo(currentItem);
+    }
+
     private static Configuration[] createConfigurations(int count) {
         final Configuration[] configurations = new Configuration[count];
         for (int i = 0; i < count; i++) {
