diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 82b135f..4360443 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1109,6 +1109,9 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".SetupRedactionInterstitial"
+            android:theme="@style/SetupWizardDisableAppStartingTheme"/>
+
         <activity android:name=".notification.RedactionInterstitial"/>
 
         <activity android:name=".notification.RedactionSettingsStandalone"
@@ -1173,6 +1176,9 @@
         <activity android:name="ChooseLockPassword" android:exported="false"
             android:windowSoftInputMode="stateVisible|adjustResize"/>
 
+        <activity android:name=".SetupEncryptionInterstitial"
+            android:theme="@style/SetupWizardDisableAppStartingTheme"/>
+
         <activity android:name=".EncryptionInterstitial"/>
 
         <!-- Runs in the phone process since it needs access to the Phone object -->
diff --git a/res/layout/encryption_interstitial.xml b/res/layout/encryption_interstitial.xml
index 362ff82..162ad0e 100644
--- a/res/layout/encryption_interstitial.xml
+++ b/res/layout/encryption_interstitial.xml
@@ -20,8 +20,8 @@
         android:orientation="vertical"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:paddingStart="@dimen/settings_side_margin"
-        android:paddingEnd="@dimen/settings_side_margin">
+        android:paddingStart="?attr/side_margin"
+        android:paddingEnd="?attr/side_margin">
 
     <TextView
             android:id="@+id/encryption_message"
diff --git a/res/layout/redaction_interstitial.xml b/res/layout/redaction_interstitial.xml
index edcf5b8..c56db11 100644
--- a/res/layout/redaction_interstitial.xml
+++ b/res/layout/redaction_interstitial.xml
@@ -20,8 +20,8 @@
         android:orientation="vertical"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:paddingStart="@dimen/settings_side_margin"
-        android:paddingEnd="@dimen/settings_side_margin">
+        android:paddingStart="?attr/side_margin"
+        android:paddingEnd="?attr/side_margin">
 
     <TextView
             android:layout_width="wrap_content"
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 83618cb..d4875e2 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -19,6 +19,7 @@
     <attr name="ic_menu_moreoverflow" format="reference" />
     <attr name="ic_wps" format="reference" />
     <attr name="setup_divider_color" format="reference" />
+    <attr name="side_margin" format="reference|dimension" />
     <attr name="wifi_signal_color" format="reference" />
     <attr name="wifi_signal" format="reference" />
 
@@ -40,6 +41,7 @@
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
         <item name="ic_wps">@drawable/ic_wps_dark</item>
         <item name="setup_divider_color">@color/setup_divider_color_dark</item>
+        <item name="side_margin">0dip</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
         <item name="wifi_signal">@drawable/wifi_signal_teal</item>
         <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
@@ -57,6 +59,7 @@
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
         <item name="ic_wps">@drawable/ic_wps_light</item>
         <item name="setup_divider_color">@color/setup_divider_color_light</item>
+        <item name="side_margin">0dip</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
         <item name="wifi_signal">@drawable/wifi_signal_teal</item>
         <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
@@ -98,6 +101,7 @@
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_holo_dark</item>
         <item name="ic_wps">@drawable/ic_wps_dark</item>
         <item name="wifi_signal">@drawable/wifi_signal_teal</item>
+        <item name="side_margin">@dimen/settings_side_margin</item>
 
         <!-- Redefine the ActionBar style for contentInsetStart -->
         <item name="android:actionBarStyle">@style/Theme.ActionBar</item>
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index 1f2f2b3..3cbcbb4 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -189,13 +189,13 @@
             if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) {
                 mEncryptionRequestQuality = quality;
                 mEncryptionRequestDisabled = disabled;
+                final Context context = getActivity();
                 // If accessibility is enabled and the user hasn't seen this dialog before, set the
                 // default state to agree with that which is compatible with accessibility
                 // (password not required).
-                final boolean accEn = AccessibilityManager.getInstance(getActivity()).isEnabled();
+                final boolean accEn = AccessibilityManager.getInstance(context).isEnabled();
                 final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
-                Intent intent = EncryptionInterstitial.createStartIntent(
-                        getActivity(), quality, required);
+                Intent intent = getEncryptionInterstitialIntent(context, quality, required);
                 startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
             } else {
                 mRequirePassword = false; // device encryption not enabled or not device owner.
@@ -414,6 +414,11 @@
                     confirmCredentials);
         }
 
+        protected Intent getEncryptionInterstitialIntent(Context context, int quality,
+                boolean required) {
+            return EncryptionInterstitial.createStartIntent(context, quality, required);
+        }
+
         /**
          * Invokes an activity to change the user's pattern, password or PIN based on given quality
          * and minimum quality specified by DevicePolicyManager. If quality is
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index dbf6d2f..2c05986 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -299,6 +299,10 @@
             }
         }
 
+        protected Intent getRedactionInterstitialIntent(Context context) {
+            return RedactionInterstitial.createStartIntent(context);
+        }
+
         protected void updateStage(Stage stage) {
             final Stage previousStage = mUiStage;
             mUiStage = stage;
@@ -441,7 +445,7 @@
                     getActivity().finish();
                     mDone = true;
                     if (!wasSecureBefore) {
-                        startActivity(RedactionInterstitial.createStartIntent(getActivity()));
+                        startActivity(getRedactionInterstitialIntent(getActivity()));
                     }
                 } else {
                     CharSequence tmp = mPasswordEntry.getText();
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index d055184..85694b1 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -386,6 +386,10 @@
             mDone = false;
         }
 
+        protected Intent getRedactionInterstitialIntent(Context context) {
+            return RedactionInterstitial.createStartIntent(context);
+        }
+
         public void onClick(View v) {
             if (v == mFooterLeftButton) {
                 if (mUiStage.leftMode == LeftButtonMode.Retry) {
@@ -562,7 +566,7 @@
             getActivity().finish();
             mDone = true;
             if (!wasSecureBefore) {
-                startActivity(RedactionInterstitial.createStartIntent(getActivity()));
+                startActivity(getRedactionInterstitialIntent(getActivity()));
             }
         }
     }
diff --git a/src/com/android/settings/SetupChooseLockGeneric.java b/src/com/android/settings/SetupChooseLockGeneric.java
index def8593..2894f85 100644
--- a/src/com/android/settings/SetupChooseLockGeneric.java
+++ b/src/com/android/settings/SetupChooseLockGeneric.java
@@ -28,6 +28,13 @@
 import android.view.ViewGroup;
 import android.widget.ListView;
 
+/**
+ * Setup Wizard's version of ChooseLockGeneric screen. It inherits the logic and basic structure
+ * from ChooseLockGeneric class, and should remain similar to that behaviorally. This class should
+ * only overload base methods for minor theme and behavior differences specific to Setup Wizard.
+ * Other changes should be done to ChooseLockGeneric class instead and let this class inherit
+ * those changes.
+ */
 public class SetupChooseLockGeneric extends ChooseLockGeneric
         implements SetupWizardNavBar.NavigationBarListener {
 
@@ -101,5 +108,14 @@
             SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
             return intent;
         }
+
+        @Override
+        protected Intent getEncryptionInterstitialIntent(Context context, int quality,
+                boolean required) {
+            Intent intent = SetupEncryptionInterstitial.createStartIntent(context, quality,
+                    required);
+            SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            return intent;
+        }
     }
 }
diff --git a/src/com/android/settings/SetupChooseLockPassword.java b/src/com/android/settings/SetupChooseLockPassword.java
index 5366a55..ed6fab4 100644
--- a/src/com/android/settings/SetupChooseLockPassword.java
+++ b/src/com/android/settings/SetupChooseLockPassword.java
@@ -27,6 +27,13 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+/**
+ * Setup Wizard's version of ChooseLockPassword screen. It inherits the logic and basic structure
+ * from ChooseLockPassword class, and should remain similar to that behaviorally. This class should
+ * only overload base methods for minor theme and behavior differences specific to Setup Wizard.
+ * Other changes should be done to ChooseLockPassword class instead and let this class inherit
+ * those changes.
+ */
 public class SetupChooseLockPassword extends ChooseLockPassword
         implements SetupWizardNavBar.NavigationBarListener {
 
@@ -86,5 +93,12 @@
             super.onViewCreated(view, savedInstanceState);
             SetupWizardUtils.setHeaderText(getActivity(), getActivity().getTitle());
         }
+
+        @Override
+        protected Intent getRedactionInterstitialIntent(Context context) {
+            Intent intent = SetupRedactionInterstitial.createStartIntent(context);
+            SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            return intent;
+        }
     }
 }
diff --git a/src/com/android/settings/SetupChooseLockPattern.java b/src/com/android/settings/SetupChooseLockPattern.java
index 019f4340..b44dea1 100644
--- a/src/com/android/settings/SetupChooseLockPattern.java
+++ b/src/com/android/settings/SetupChooseLockPattern.java
@@ -27,6 +27,13 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+/**
+ * Setup Wizard's version of ChooseLockPattern screen. It inherits the logic and basic structure
+ * from ChooseLockPattern class, and should remain similar to that behaviorally. This class should
+ * only overload base methods for minor theme and behavior differences specific to Setup Wizard.
+ * Other changes should be done to ChooseLockPattern class instead and let this class inherit
+ * those changes.
+ */
 public class SetupChooseLockPattern extends ChooseLockPattern
         implements SetupWizardNavBar.NavigationBarListener {
 
@@ -84,5 +91,12 @@
             super.onViewCreated(view, savedInstanceState);
             SetupWizardUtils.setHeaderText(getActivity(), getActivity().getTitle());
         }
+
+        @Override
+        protected Intent getRedactionInterstitialIntent(Context context) {
+            Intent intent = SetupRedactionInterstitial.createStartIntent(context);
+            SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
+            return intent;
+        }
     }
 }
diff --git a/src/com/android/settings/SetupEncryptionInterstitial.java b/src/com/android/settings/SetupEncryptionInterstitial.java
new file mode 100644
index 0000000..53548bd
--- /dev/null
+++ b/src/com/android/settings/SetupEncryptionInterstitial.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2014 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;
+
+import com.android.setupwizard.navigationbar.SetupWizardNavBar;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Setup Wizard's version of EncryptionInterstitial screen. It inherits the logic and basic
+ * structure from EncryptionInterstitial class, and should remain similar to that behaviorally. This
+ * class should only overload base methods for minor theme and behavior differences specific to
+ * Setup Wizard. Other changes should be done to EncryptionInterstitial class instead and let this
+ * class inherit those changes.
+ */
+public class SetupEncryptionInterstitial extends EncryptionInterstitial
+        implements SetupWizardNavBar.NavigationBarListener{
+
+    public static Intent createStartIntent(Context ctx, int quality,
+            boolean requirePasswordDefault) {
+        Intent startIntent = EncryptionInterstitial.createStartIntent(ctx, quality,
+                requirePasswordDefault);
+        startIntent.setClass(ctx, SetupEncryptionInterstitial.class);
+        startIntent.putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false)
+                .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, -1);
+        return startIntent;
+    }
+
+    @Override
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT,
+                SetupEncryptionInterstitialFragment.class.getName());
+        return modIntent;
+    }
+
+    @Override
+    protected boolean isValidFragment(String fragmentName) {
+        return SetupEncryptionInterstitialFragment.class.getName().equals(fragmentName);
+    }
+
+    @Override
+    protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
+        resid = SetupWizardUtils.getTheme(getIntent(), resid);
+        super.onApplyThemeResource(theme, resid, first);
+    }
+
+    @Override
+    public void onNavigationBarCreated(SetupWizardNavBar bar) {
+        SetupWizardUtils.setImmersiveMode(this, bar);
+    }
+
+    @Override
+    public void onNavigateBack() {
+        onBackPressed();
+    }
+
+    @Override
+    public void onNavigateNext() {
+        setResult(RESULT_OK, getResultIntentData());
+        finish();
+    }
+
+    public static class SetupEncryptionInterstitialFragment extends EncryptionInterstitialFragment {
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            View view = inflater.inflate(R.layout.setup_template, container, false);
+            ViewGroup setupContent = (ViewGroup) view.findViewById(R.id.setup_content);
+            View content = super.onCreateView(inflater, setupContent, savedInstanceState);
+            setupContent.addView(content);
+            return view;
+        }
+
+        @Override
+        public void onViewCreated(View view, Bundle savedInstanceState) {
+            super.onViewCreated(view, savedInstanceState);
+            SetupWizardUtils.setHeaderText(getActivity(), R.string.encryption_interstitial_header);
+        }
+    }
+}
diff --git a/src/com/android/settings/SetupRedactionInterstitial.java b/src/com/android/settings/SetupRedactionInterstitial.java
new file mode 100644
index 0000000..96f4dff
--- /dev/null
+++ b/src/com/android/settings/SetupRedactionInterstitial.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2014 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;
+
+import com.android.settings.notification.RedactionInterstitial;
+import com.android.setupwizard.navigationbar.SetupWizardNavBar;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Setup Wizard's version of RedactionInterstitial screen. It inherits the logic and basic structure
+ * from RedactionInterstitial class, and should remain similar to that behaviorally. This class
+ * should only overload base methods for minor theme and behavior differences specific to Setup
+ * Wizard. Other changes should be done to RedactionInterstitial class instead and let this class
+ * inherit those changes.
+ */
+public class SetupRedactionInterstitial extends RedactionInterstitial
+        implements SetupWizardNavBar.NavigationBarListener{
+
+    public static Intent createStartIntent(Context ctx) {
+        Intent startIntent = RedactionInterstitial.createStartIntent(ctx);
+        startIntent.setClass(ctx, SetupRedactionInterstitial.class);
+        startIntent.putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false)
+                .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, -1);
+        return startIntent;
+    }
+
+    @Override
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT,
+                SetupEncryptionInterstitialFragment.class.getName());
+        return modIntent;
+    }
+
+    @Override
+    protected boolean isValidFragment(String fragmentName) {
+        return SetupEncryptionInterstitialFragment.class.getName().equals(fragmentName);
+    }
+
+    @Override
+    protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
+        resid = SetupWizardUtils.getTheme(getIntent(), resid);
+        super.onApplyThemeResource(theme, resid, first);
+    }
+
+    @Override
+    public void onNavigationBarCreated(SetupWizardNavBar bar) {
+        SetupWizardUtils.setImmersiveMode(this, bar);
+    }
+
+    @Override
+    public void onNavigateBack() {
+        onBackPressed();
+    }
+
+    @Override
+    public void onNavigateNext() {
+        setResult(RESULT_OK, getResultIntentData());
+        finish();
+    }
+
+    public static class SetupEncryptionInterstitialFragment extends RedactionInterstitialFragment {
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            View view = inflater.inflate(R.layout.setup_template, container, false);
+            ViewGroup setupContent = (ViewGroup) view.findViewById(R.id.setup_content);
+            View content = super.onCreateView(inflater, setupContent, savedInstanceState);
+            setupContent.addView(content);
+            return view;
+        }
+
+        @Override
+        public void onViewCreated(View view, Bundle savedInstanceState) {
+            super.onViewCreated(view, savedInstanceState);
+            SetupWizardUtils.setHeaderText(getActivity(), R.string.notification_section_header);
+        }
+    }
+}
