diff --git a/res/layout/theme_icon_option.xml b/res/layout/theme_icon_option.xml
new file mode 100644
index 0000000..4872ffc
--- /dev/null
+++ b/res/layout/theme_icon_option.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2019 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="wrap_content"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/option_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginBottom="@dimen/theme_option_label_margin"
+        android:textAppearance="@style/OptionTitleTextAppearance"/>
+    <FrameLayout
+        android:id="@+id/option_tile"
+        android:layout_width="@dimen/option_tile_width"
+        android:layout_height="@dimen/option_tile_width"
+        android:layout_gravity="center_horizontal"
+        android:paddingHorizontal="@dimen/option_tile_padding_horizontal"
+        android:paddingVertical="@dimen/option_tile_padding_vertical"
+        android:background="@drawable/option_border">
+        <ImageView
+            android:id="@+id/option_icon"
+            android:layout_width="@dimen/component_icon_thumb_size"
+            android:layout_height="@dimen/component_icon_thumb_size"
+            android:layout_gravity="center"/>
+    </FrameLayout>
+</LinearLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d78e3e9..c81742b 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -70,4 +70,6 @@
 
     <!-- Note, using dp instead of sp as this is just the font thumbnail, not text -->
     <dimen name="font_comonent_option_thumbnail_size">32dp</dimen>
+
+    <dimen name="component_icon_thumb_size">40dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0a981f9..78a8f1f 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -108,6 +108,13 @@
     <!-- Title of a page allowing the user to choose a font for a custom theme -->
     <string name="font_component_title">Choose font</string>
 
+    <!-- Title of a page allowing the user to choose an icon set for a custom theme -->
+    <string name="icon_component_title">Choose icons</string>
+
+    <!-- Title of a set of icons that the user can chose for their custom style (eg, "Icons 2") -->
+    <string name="icon_component_label">Icons <xliff:g name="component_number" example="1">%1$d</xliff:g></string>
+
+
     <string name="font_component_option_thumbnail" translatable="false">A</string>
 
     <!-- Text explaining what the current step is in setting a custom theme, eg: "1 of 4".
diff --git a/src/com/android/customization/model/ResourceConstants.java b/src/com/android/customization/model/ResourceConstants.java
index ad16881..f4c48c0 100644
--- a/src/com/android/customization/model/ResourceConstants.java
+++ b/src/com/android/customization/model/ResourceConstants.java
@@ -60,4 +60,12 @@
     String THEME_SETTING = Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES;
     String CONFIG_BODY_FONT_FAMILY = "config_bodyFontFamily";
     String CONFIG_HEADLINE_FONT_FAMILY = "config_headlineFontFamily";
+    String ICON_PREVIEW_DRAWABLE_NAME = "ic_wifi_signal_3";
+    String[] SYSUI_ICONS_FOR_PREVIEW = {
+            "ic_qs_bluetooth_on",
+            "ic_dnd",
+            "ic_signal_flashlight",
+            "ic_qs_auto_rotate",
+            "ic_signal_airplane"
+    };
 }
diff --git a/src/com/android/customization/model/theme/DefaultThemeProvider.java b/src/com/android/customization/model/theme/DefaultThemeProvider.java
index a841f87..4d3b90b 100644
--- a/src/com/android/customization/model/theme/DefaultThemeProvider.java
+++ b/src/com/android/customization/model/theme/DefaultThemeProvider.java
@@ -17,7 +17,9 @@
 
 import static com.android.customization.model.ResourceConstants.ANDROID_PACKAGE;
 import static com.android.customization.model.ResourceConstants.CONFIG_ICON_MASK;
+import static com.android.customization.model.ResourceConstants.ICON_PREVIEW_DRAWABLE_NAME;
 import static com.android.customization.model.ResourceConstants.SETTINGS_PACKAGE;
+import static com.android.customization.model.ResourceConstants.SYSUI_ICONS_FOR_PREVIEW;
 import static com.android.customization.model.ResourceConstants.SYSUI_PACKAGE;
 
 import android.content.Context;
@@ -68,7 +70,6 @@
     private static final String ICON_LAUNCHER_PREFIX = "theme_overlay_icon_launcher_";
     private static final String ICON_SETTINGS_PREFIX = "theme_overlay_icon_settings_";
     private static final String ICON_SYSUI_PREFIX = "theme_overlay_icon_sysui_";
-    private static final String ICON_PREVIEW_DRAWABLE_NAME = "ic_wifi_signal_3";
     private static final String PREVIEW_COLOR_PREFIX = "theme_preview_color_";
     private static final String PREVIEW_SHAPE_PREFIX = "theme_preview_shape_";
     private static final String WALLPAPER_PREFIX = "theme_wallpaper_";
@@ -80,13 +81,6 @@
 
     private static final String ACCENT_COLOR_LIGHT_NAME = "accent_device_default_light";
     private static final String ACCENT_COLOR_DARK_NAME = "accent_device_default_dark";
-    private static final String[] SYSUI_ICONS_FOR_PREVIEW = {
-            "ic_qs_bluetooth_on",
-            "ic_dnd",
-            "ic_signal_flashlight",
-            "ic_qs_auto_rotate",
-            "ic_signal_airplane"
-    };
 
     private List<ThemeBundle> mThemes;
     private Map<String, OverlayInfo> mOverlayInfos;
@@ -177,11 +171,13 @@
                 if (!TextUtils.isEmpty(iconAndroidOverlayPackage)) {
                     builder.addOverlayPackage(getOverlayCategory(iconAndroidOverlayPackage),
                                 iconAndroidOverlayPackage)
-                            .addIcon(loadIconPreviewDrawable(ICON_PREVIEW_DRAWABLE_NAME,
+                            .addIcon(loadIconPreviewDrawable(
+                                    ICON_PREVIEW_DRAWABLE_NAME,
                                     iconAndroidOverlayPackage));
                 } else {
                     builder.addIcon(mContext.getResources().getDrawable(
-                            Resources.getSystem().getIdentifier(ICON_PREVIEW_DRAWABLE_NAME,
+                            Resources.getSystem().getIdentifier(
+                                    ICON_PREVIEW_DRAWABLE_NAME,
                                     "drawable", ANDROID_PACKAGE), null));
                 }
 
@@ -327,7 +323,8 @@
         } catch (NameNotFoundException | NotFoundException e) {
             Log.d(TAG, "Didn't find Android icons overlay for default theme, using system default",
                     e);
-            builder.addIcon(system.getDrawable(system.getIdentifier(ICON_PREVIEW_DRAWABLE_NAME,
+            builder.addIcon(system.getDrawable(system.getIdentifier(
+                    ICON_PREVIEW_DRAWABLE_NAME,
                             "drawable", ANDROID_PACKAGE), null));
         }
 
diff --git a/src/com/android/customization/model/theme/custom/IconOptionsProvider.java b/src/com/android/customization/model/theme/custom/IconOptionsProvider.java
new file mode 100644
index 0000000..6c85fc8
--- /dev/null
+++ b/src/com/android/customization/model/theme/custom/IconOptionsProvider.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2019 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.customization.model.theme.custom;
+
+import static com.android.customization.model.ResourceConstants.ANDROID_PACKAGE;
+import static com.android.customization.model.ResourceConstants.DEFAULT_TARGET_PACKAGES;
+import static com.android.customization.model.ResourceConstants.ICON_PREVIEW_DRAWABLE_NAME;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_ICON_ANDROID;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_ICON_SETTINGS;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_ICON_SYSUI;
+import static com.android.customization.model.ResourceConstants.SYSUI_ICONS_FOR_PREVIEW;
+import static com.android.customization.model.ResourceConstants.SYSUI_PACKAGE;
+
+import android.content.Context;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.util.Log;
+
+import com.android.customization.model.theme.OverlayManagerCompat;
+import com.android.customization.model.theme.custom.ThemeComponentOption.IconOption;
+import com.android.wallpaper.R;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Implementation of {@link ThemeComponentOptionProvider} that reads {@link IconOption}s from
+ * icon overlays.
+ */
+public class IconOptionsProvider extends ThemeComponentOptionProvider<IconOption> {
+
+    private static final String TAG = "IconOptionsProvider";
+
+    private final List<String> mSysUiIconsOverlayPackages = new ArrayList<>();
+    private final List<String> mSettingsIconsOverlayPackages = new ArrayList<>();
+
+    public IconOptionsProvider(Context context, OverlayManagerCompat manager) {
+        super(context, manager, OVERLAY_CATEGORY_ICON_ANDROID);
+        mSysUiIconsOverlayPackages.addAll(manager.getOverlayPackagesForCategory(
+                OVERLAY_CATEGORY_ICON_SYSUI, UserHandle.myUserId(), DEFAULT_TARGET_PACKAGES));
+        mSettingsIconsOverlayPackages.addAll(manager.getOverlayPackagesForCategory(
+                OVERLAY_CATEGORY_ICON_SETTINGS, UserHandle.myUserId(), DEFAULT_TARGET_PACKAGES));
+    }
+
+    @Override
+    protected void loadOptions() {
+        addDefault();
+
+        Map<String, IconOption> optionsByPrefix = new HashMap<>();
+        for (String overlayPackage : mOverlayPackages) {
+            IconOption option = addOrUpdateOption(optionsByPrefix, overlayPackage,
+                    OVERLAY_CATEGORY_ICON_ANDROID);
+            try{
+                option.addIcon(loadIconPreviewDrawable(ICON_PREVIEW_DRAWABLE_NAME, overlayPackage));
+            } catch (NotFoundException | NameNotFoundException e) {
+                Log.w(TAG, String.format("Couldn't load icon overlay details for %s, will skip it",
+                        overlayPackage), e);
+            }
+        }
+
+        for (String overlayPackage : mSysUiIconsOverlayPackages) {
+            IconOption option = addOrUpdateOption(optionsByPrefix, overlayPackage,
+                    OVERLAY_CATEGORY_ICON_SYSUI);
+            try{
+                for (String iconName : SYSUI_ICONS_FOR_PREVIEW) {
+                    option.addIcon(loadIconPreviewDrawable(iconName, overlayPackage));
+                }
+            } catch (NotFoundException | NameNotFoundException e) {
+                Log.w(TAG, String.format("Couldn't load icon overlay details for %s, will skip it",
+                        overlayPackage), e);
+            }
+        }
+
+        for (String overlayPackage : mSettingsIconsOverlayPackages) {
+            addOrUpdateOption(optionsByPrefix, overlayPackage, OVERLAY_CATEGORY_ICON_SETTINGS);
+        }
+
+        for (IconOption option : optionsByPrefix.values()) {
+            if (option.isValid()) {
+                mOptions.add(option);
+                option.setLabel(mContext.getString(R.string.icon_component_label, mOptions.size()));
+            }
+        }
+    }
+
+    private IconOption addOrUpdateOption(Map<String, IconOption> optionsByPrefix,
+            String overlayPackage, String category) {
+        String prefix = overlayPackage.substring(0, overlayPackage.lastIndexOf("."));
+        IconOption option;
+        if (!optionsByPrefix.containsKey(prefix)) {
+            option = new IconOption();
+            optionsByPrefix.put(prefix, option);
+        } else {
+            option = optionsByPrefix.get(prefix);
+        }
+        option.addOverlayPackage(category, overlayPackage);
+        return option;
+    }
+
+    private Drawable loadIconPreviewDrawable(String drawableName, String packageName)
+            throws NameNotFoundException, NotFoundException {
+
+        Resources overlayRes = mContext.getPackageManager().getResourcesForApplication(packageName);
+        return overlayRes.getDrawable(
+                overlayRes.getIdentifier(drawableName, "drawable", packageName), null);
+    }
+
+    private void addDefault() {
+        Resources system = Resources.getSystem();
+        try {
+            IconOption option = new IconOption();
+            option.setLabel(mContext.getString(R.string.default_theme_title));
+
+            option.addIcon(system.getDrawable(system.getIdentifier(ICON_PREVIEW_DRAWABLE_NAME,
+                    "drawable", ANDROID_PACKAGE), null));
+
+            for (String iconName : SYSUI_ICONS_FOR_PREVIEW) {
+                option.addIcon(loadIconPreviewDrawable(iconName, SYSUI_PACKAGE));
+            }
+
+            mOptions.add(option);
+        } catch (NameNotFoundException | NotFoundException e) {
+            Log.w(TAG, "Didn't find SystemUi package icons, will skip option", e);
+        }
+
+    }
+
+}
diff --git a/src/com/android/customization/model/theme/custom/ThemeComponentOption.java b/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
index 53c9d37..f973ac5 100644
--- a/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
+++ b/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
@@ -15,16 +15,30 @@
  */
 package com.android.customization.model.theme.custom;
 
+import static com.android.customization.model.ResourceConstants.DEFAULT_TARGET_PACKAGES;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_COLOR;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_FONT;
+import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY_SHAPE;
+import static com.android.customization.model.ResourceConstants.SYSUI_ICONS_FOR_PREVIEW;
+
+import android.content.res.Resources;
 import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.android.customization.model.CustomizationManager;
 import com.android.customization.model.CustomizationOption;
 import com.android.wallpaper.R;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * Represents an option of a component of a custom Theme (for example, a possible color, or font,
  * shape, etc).
@@ -33,14 +47,14 @@
  */
 public abstract class ThemeComponentOption implements CustomizationOption<ThemeComponentOption> {
 
-    protected final String mOverlayPackageName;
+    protected final Map<String, String> mOverlayPackageNames = new HashMap<>();
 
-    ThemeComponentOption(String packageName) {
-        mOverlayPackageName = packageName;
+    protected void addOverlayPackage(String category, String packageName) {
+        mOverlayPackageNames.put(category, packageName);
     }
 
-    public String getOverlayPackageName() {
-        return mOverlayPackageName;
+    public Map<String, String> getOverlayPackageNames() {
+        return mOverlayPackageNames;
     }
 
     @Override
@@ -58,7 +72,7 @@
 
         public FontOption(String packageName, String label, Typeface headlineFont,
                 Typeface bodyFont) {
-            super(packageName);
+            addOverlayPackage(OVERLAY_CATEGORY_FONT, packageName);
             mLabel = label;
             mHeadlineFont = headlineFont;
             mBodyFont = bodyFont;
@@ -106,13 +120,22 @@
 
     public static class IconOption extends ThemeComponentOption {
 
-        IconOption(String packageName) {
-            super(packageName);
-        }
+        public static final int THUMBNAIL_ICON_POSITION = 0;
+        private static int[] mIconIds = {
+                R.id.preview_icon_0, R.id.preview_icon_1, R.id.preview_icon_2, R.id.preview_icon_3,
+                R.id.preview_icon_4, R.id.preview_icon_5
+        };
+
+        private List<Drawable> mIcons = new ArrayList<>();
+        private String mLabel;
 
         @Override
         public void bindThumbnailTile(View view) {
-
+            Resources res = view.getContext().getResources();
+            Drawable icon = mIcons.get(THUMBNAIL_ICON_POSITION).mutate();
+            icon.setTint(res.getColor(R.color.icon_thumbnail_color, null));
+            ((ImageView) view.findViewById(R.id.option_icon)).setImageDrawable(
+                    icon);
         }
 
         @Override
@@ -122,19 +145,44 @@
 
         @Override
         public int getLayoutResId() {
-            return 0;
+            return R.layout.theme_icon_option;
         }
 
         @Override
         public void bindPreview(ViewGroup container) {
+            TextView header = container.findViewById(R.id.theme_preview_card_header);
+            header.setText(mLabel);
+            header.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_wifi_24px, 0, 0);
 
+            ViewGroup cardBody = container.findViewById(R.id.theme_preview_card_body_container);
+            if (cardBody.getChildCount() == 0) {
+                LayoutInflater.from(container.getContext()).inflate(
+                        R.layout.preview_card_icon_content, cardBody, true);
+            }
+            for (int i = 0; i < mIconIds.length; i++) {
+                ((ImageView) container.findViewById(mIconIds[i])).setImageDrawable(
+                        mIcons.get(i));
+            }
+        }
+
+        public void addIcon(Drawable previewIcon) {
+            mIcons.add(previewIcon);
+        }
+
+        public boolean isValid() {
+            return getOverlayPackageNames().keySet().size() == DEFAULT_TARGET_PACKAGES.length
+                && mIcons.size() == SYSUI_ICONS_FOR_PREVIEW.length + 1;
+        }
+
+        public void setLabel(String label) {
+            mLabel = label;
         }
     }
 
     public static class ColorOption extends ThemeComponentOption {
 
         ColorOption(String packageName) {
-            super(packageName);
+            addOverlayPackage(OVERLAY_CATEGORY_COLOR, packageName);
         }
 
         @Override
@@ -161,7 +209,7 @@
     public static class ShapeOption extends ThemeComponentOption {
 
         ShapeOption(String packageName) {
-            super(packageName);
+            addOverlayPackage(OVERLAY_CATEGORY_SHAPE, packageName);
         }
 
         @Override
diff --git a/src/com/android/customization/picker/theme/CustomThemeActivity.java b/src/com/android/customization/picker/theme/CustomThemeActivity.java
index 0d97715..1b668d9 100644
--- a/src/com/android/customization/picker/theme/CustomThemeActivity.java
+++ b/src/com/android/customization/picker/theme/CustomThemeActivity.java
@@ -16,6 +16,7 @@
 package com.android.customization.picker.theme;
 
 import android.os.Bundle;
+import android.widget.TextView;
 
 import androidx.annotation.StringRes;
 import androidx.fragment.app.Fragment;
@@ -26,8 +27,10 @@
 import com.android.customization.model.theme.OverlayManagerCompat;
 import com.android.customization.model.theme.custom.CustomThemeManager;
 import com.android.customization.model.theme.custom.FontOptionsProvider;
+import com.android.customization.model.theme.custom.IconOptionsProvider;
 import com.android.customization.model.theme.custom.ThemeComponentOption;
 import com.android.customization.model.theme.custom.ThemeComponentOption.FontOption;
+import com.android.customization.model.theme.custom.ThemeComponentOption.IconOption;
 import com.android.customization.model.theme.custom.ThemeComponentOptionProvider;
 import com.android.customization.picker.theme.CustomThemeComponentFragment.CustomThemeComponentFragmentHost;
 import com.android.wallpaper.R;
@@ -43,6 +46,8 @@
 
     private UserEventLogger mUserEventLogger;
     private List<ComponentStep<?>> mSteps;
+    private int mCurrentStep;
+    private TextView mApplyButton;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -50,11 +55,12 @@
         Injector injector = InjectorProvider.getInjector();
         mUserEventLogger = injector.getUserEventLogger(this);
         setContentView(R.layout.activity_custom_theme);
+        mApplyButton = findViewById(R.id.next_button);
+        mApplyButton.setOnClickListener(view -> onNextOrApply());
         initSteps();
 
         FragmentManager fm = getSupportFragmentManager();
         Fragment fragment = fm.findFragmentById(R.id.fragment_container);
-
         if (fragment == null) {
             // Navigate to the first step
             navigateToStep(0);
@@ -62,21 +68,47 @@
     }
 
     private void navigateToStep(int i) {
-        final FragmentManager fragmentManager = getSupportFragmentManager();
+        FragmentManager fragmentManager = getSupportFragmentManager();
         ComponentStep step = mSteps.get(i);
         Fragment fragment = step.getFragment();
 
-        final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
+        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
         fragmentTransaction.replace(R.id.fragment_container, fragment);
-        fragmentTransaction.commitNow();
+        // Don't add step 0 to the back stack so that going back from it just finishes the Activity
+        if (i > 0) {
+            fragmentTransaction.addToBackStack("Step " + i);
+        }
+        fragmentTransaction.commit();
+        fragmentManager.executePendingTransactions();
+        updateApplyButtonLabel();
     }
 
     private void initSteps() {
         mSteps = new ArrayList<>();
         OverlayManagerCompat manager = new OverlayManagerCompat(this);
-        mSteps.add(new FontStep(new FontOptionsProvider(this, manager), 0, mSteps.size() + 1));
+        mSteps.add(new FontStep(new FontOptionsProvider(this, manager), 0, 2));
+        mSteps.add(new IconStep(new IconOptionsProvider(this, manager), 1, 2));
+        mCurrentStep = 0;
     }
 
+    private void onNextOrApply() {
+        if (mCurrentStep < mSteps.size() - 1) {
+            // TODO: gather current step's selection
+            navigateToStep(mCurrentStep + 1);
+        }
+        // TODO: handle Apply
+    }
+
+    @Override
+    public void setCurrentStep(int i) {
+        mCurrentStep = i;
+        updateApplyButtonLabel();
+    }
+
+    private void updateApplyButtonLabel() {
+        mApplyButton.setText((mCurrentStep < mSteps.size() -1) ? R.string.custom_theme_next
+                : R.string.apply_btn);
+    }
 
     @Override
     public void delete() {
@@ -148,4 +180,21 @@
                     titleResId);
         }
     }
+
+    private class IconStep extends ComponentStep<IconOption> {
+
+        protected IconStep(ThemeComponentOptionProvider<IconOption> provider,
+                int position, int totalSteps) {
+            super(R.string.icon_component_title, provider, position, totalSteps);
+        }
+
+        @Override
+        CustomThemeComponentFragment createFragment() {
+            return CustomThemeComponentFragment.newInstance(
+                    CustomThemeActivity.this.getString(R.string.custom_theme_fragment_title),
+                    position,
+                    totalSteps,
+                    titleResId);
+        }
+    }
 }
diff --git a/src/com/android/customization/picker/theme/CustomThemeComponentFragment.java b/src/com/android/customization/picker/theme/CustomThemeComponentFragment.java
index 5c74ca3..d2dcd61 100644
--- a/src/com/android/customization/picker/theme/CustomThemeComponentFragment.java
+++ b/src/com/android/customization/picker/theme/CustomThemeComponentFragment.java
@@ -39,6 +39,7 @@
     private static final String ARG_KEY_POSITION = "CustomThemeComponentFragment.position";
     private static final String ARG_KEY_TOTAL_STEPS = "CustomThemeComponentFragment.steps";
     private static final String ARG_KEY_TITLE_RES_ID = "CustomThemeComponentFragment.title_res";
+    private CustomThemeComponentFragmentHost mHost;
 
     public interface CustomThemeComponentFragmentHost {
         void delete();
@@ -47,6 +48,8 @@
                 int position);
 
         CustomThemeManager getCustomThemeManager();
+
+        void setCurrentStep(int step);
     }
 
     public static CustomThemeComponentFragment newInstance(CharSequence toolbarTitle, int position,
@@ -78,14 +81,14 @@
         mPosition = getArguments().getInt(ARG_KEY_POSITION);
         mTotalSteps = getArguments().getInt(ARG_KEY_TOTAL_STEPS);
         mTitleResId = getArguments().getInt(ARG_KEY_TITLE_RES_ID);
+        mProvider = mHost.getComponentOptionProvider(mPosition);
+        mCustomThemeManager = mHost.getCustomThemeManager();
     }
 
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        CustomThemeComponentFragmentHost host = (CustomThemeComponentFragmentHost) context;
-        mProvider = host.getComponentOptionProvider(mPosition);
-        mCustomThemeManager = host.getCustomThemeManager();
+        mHost = (CustomThemeComponentFragmentHost) context;
     }
 
     @Nullable
@@ -107,6 +110,12 @@
         return view;
     }
 
+    @Override
+    public void onResume() {
+        super.onResume();
+        mHost.setCurrentStep(mPosition);
+    }
+
     private void bindPreview() {
         mSelectedOption.bindPreview(mPreviewCard);
     }
