diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a2d80b9..f0b3271 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1164,6 +1164,8 @@
         <activity android:name="ChooseLockPassword" android:exported="false"
             android:windowSoftInputMode="stateVisible|adjustResize"/>
 
+        <activity android:name=".EncryptionInterstitial"/>
+
         <!-- Runs in the phone process since it needs access to the Phone object -->
         <activity android:name=".deviceinfo.Status"
                 android:label="@string/device_status_activity_title"
diff --git a/res/layout/encryption_interstitial.xml b/res/layout/encryption_interstitial.xml
new file mode 100644
index 0000000..362ff82
--- /dev/null
+++ b/res/layout/encryption_interstitial.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ 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
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        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">
+
+    <TextView
+            android:id="@+id/encryption_message"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
+            android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
+            android:textAppearance="?android:attr/textAppearanceMedium" />
+
+    <RadioGroup
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:layout_marginStart="?android:attr/listPreferredItemPaddingStart"
+            android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
+            android:checkedButton="@+id/encrypt_require_password">
+
+        <RadioButton
+                android:id="@+id/encrypt_require_password"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp" />
+
+        <RadioButton
+                android:id="@+id/encrypt_dont_require_password"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp" />
+
+    </RadioGroup>
+
+</LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3262068..ca39374 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5910,4 +5910,31 @@
     <!-- [CHAR LIMIT=70] Don't rotate when screen is turned option -->
     <string name="display_auto_rotate_stay_in_current">Stay in current orientation</string>
 
+    <!-- Encryption interstitial title [CHAR LIMIT=30] -->
+    <string name="encryption_interstitial_header">Encryption</string>
+
+    <!-- Encryption interstitial button to continue with the shown setting.  Appears on screen that asks the user to opt in/out of encrypting device with a pin/pattern/password. [CHAR LIMIT=NONE] -->
+    <string name="encryption_continue_button">Continue</string>
+
+    <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a PIN to encrypt the device. [CHAR LIMIT=NONE] -->
+    <string name="encryption_interstitial_message_pin">Because your device is encrypted, you can further protect it by requiring that you enter your PIN before your device starts up.</string>
+    <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a pattern to encrypt the device. [CHAR LIMIT=NONE] -->
+    <string name="encryption_interstitial_message_pattern">Because your device is encrypted, you can further protect it by requiring that you enter your pattern before your device starts up.</string>
+    <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a password to encrypt the device. [CHAR LIMIT=NONE] -->
+    <string name="encryption_interstitial_message_password">Because your device is encrypted, you can further protect it by requiring that you enter your password before your device starts up.</string>
+
+    <!-- Radio button text that require a PIN to start device [CHAR LIMIT=NONE] -->
+    <string name="encrypt_require_pin">Require PIN to start device</string>
+    <!-- Radio button text that require a pattern to start device [CHAR LIMIT=NONE] -->
+    <string name="encrypt_require_pattern">Require pattern to start device</string>
+    <!-- Radio button text that require a password to start device [CHAR LIMIT=NONE] -->
+    <string name="encrypt_require_password">Require password to start device</string>
+
+    <!-- Radio button text that doesn't require a PIN to decrypt [CHAR LIMIT=NONE] -->
+    <string name="encrypt_dont_require_pin">No thanks</string>
+    <!-- Radio button text that doesn't require a pattern to decrypt [CHAR LIMIT=NONE] -->
+    <string name="encrypt_dont_require_pattern">No thanks</string>
+    <!-- Radio button text that doesn't require a password to decrypt [CHAR LIMIT=NONE] -->
+    <string name="encrypt_dont_require_password">No thanks</string>
+
 </resources>
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index c65aa21..89ba20b 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -18,12 +18,16 @@
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Activity;
+import android.app.ActivityManagerNative;
 import android.app.PendingIntent;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.UserInfo;
 import android.os.Bundle;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.preference.Preference;
 import android.preference.PreferenceScreen;
@@ -69,11 +73,14 @@
         private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
         private static final int CONFIRM_EXISTING_REQUEST = 100;
         private static final int FALLBACK_REQUEST = 101;
+        private static final int ENABLE_ENCRYPTION_REQUEST = 102;
         private static final String PASSWORD_CONFIRMED = "password_confirmed";
         private static final String CONFIRM_CREDENTIALS = "confirm_credentials";
         private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
         private static final String FINISH_PENDING = "finish_pending";
         public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
+        public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality";
+        public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled";
 
         private static final boolean ALWAY_SHOW_TUTORIAL = true;
 
@@ -83,6 +90,8 @@
         private boolean mPasswordConfirmed = false;
         private boolean mWaitingForConfirmation = false;
         private boolean mFinishPending = false;
+        private int mEncryptionRequestQuality;
+        private boolean mEncryptionRequestDisabled;
 
         @Override
         public void onCreate(Bundle savedInstanceState) {
@@ -103,6 +112,9 @@
                 mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
                 mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
                 mFinishPending = savedInstanceState.getBoolean(FINISH_PENDING);
+                mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY);
+                mEncryptionRequestDisabled = savedInstanceState.getBoolean(
+                        ENCRYPT_REQUESTED_DISABLED);
             }
 
             if (mPasswordConfirmed) {
@@ -143,16 +155,16 @@
                 updateUnlockMethodAndFinish(
                         DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false);
             } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) {
-                updateUnlockMethodAndFinish(
+                maybeEnableEncryption(
                         DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK, false);
             }else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
-                updateUnlockMethodAndFinish(
+                maybeEnableEncryption(
                         DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
             } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
-                updateUnlockMethodAndFinish(
+                maybeEnableEncryption(
                         DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
             } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
-                updateUnlockMethodAndFinish(
+                maybeEnableEncryption(
                         DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
             } else {
                 handled = false;
@@ -160,6 +172,24 @@
             return handled;
         }
 
+        /**
+         * If the device has encryption already enabled, then ask the user if they
+         * also want to encrypt the phone with this password.
+         *
+         * @param quality
+         * @param disabled
+         */
+        private void maybeEnableEncryption(int quality, boolean disabled) {
+            if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) {
+                mEncryptionRequestQuality = quality;
+                mEncryptionRequestDisabled = disabled;
+                Intent intent = EncryptionInterstitial.createStartIntent(getActivity(), quality);
+                startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
+            } else {
+                updateUnlockMethodAndFinish(quality, disabled);
+            }
+        }
+
         @Override
         public View onCreateView(LayoutInflater inflater, ViewGroup container,
                 Bundle savedInstanceState) {
@@ -182,10 +212,13 @@
             if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
                 mPasswordConfirmed = true;
                 updatePreferencesOrFinish();
-            } else if(requestCode == FALLBACK_REQUEST) {
+            } else if (requestCode == FALLBACK_REQUEST) {
                 mChooseLockSettingsHelper.utils().deleteTempGallery();
                 getActivity().setResult(resultCode);
                 finish();
+            } else if (requestCode == ENABLE_ENCRYPTION_REQUEST
+                    && resultCode == Activity.RESULT_OK) {
+                updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled);
             } else {
                 getActivity().setResult(Activity.RESULT_CANCELED);
                 finish();
@@ -199,6 +232,8 @@
             outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
             outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
             outState.putBoolean(FINISH_PENDING, mFinishPending);
+            outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
+            outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
         }
 
         private void updatePreferencesOrFinish() {
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index d04f6ac..0a703cf 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -24,11 +24,13 @@
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.admin.DevicePolicyManager;
+import android.content.ContentResolver;
 import android.content.Intent;
 import android.inputmethodservice.KeyboardView;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.provider.Settings;
 import android.text.Editable;
 import android.text.InputType;
 import android.text.Selection;
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index c218c8d..46bf94c 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -17,7 +17,6 @@
 package com.android.settings;
 
 import com.google.android.collect.Lists;
-
 import com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.LockPatternView;
@@ -28,8 +27,10 @@
 
 import android.app.Activity;
 import android.app.Fragment;
+import android.content.ContentResolver;
 import android.content.Intent;
 import android.os.Bundle;
+import android.provider.Settings;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java
new file mode 100644
index 0000000..8a62001
--- /dev/null
+++ b/src/com/android/settings/EncryptionInterstitial.java
@@ -0,0 +1,129 @@
+/*
+ * 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.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsPreferenceFragment;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.provider.Settings;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+public class EncryptionInterstitial extends SettingsActivity {
+
+    private static final String EXTRA_PASSWORD_QUALITY = "extra_password_quality";
+
+    @Override
+    public Intent getIntent() {
+        Intent modIntent = new Intent(super.getIntent());
+        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, EncryptionInterstitialFragment.class.getName());
+        return modIntent;
+    }
+
+    @Override
+    protected boolean isValidFragment(String fragmentName) {
+        return EncryptionInterstitialFragment.class.getName().equals(fragmentName);
+    }
+
+    public static Intent createStartIntent(Context ctx, int quality) {
+        return new Intent(ctx, EncryptionInterstitial.class)
+                .putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, true)
+                .putExtra(EXTRA_PREFS_SET_BACK_TEXT, (String) null)
+                .putExtra(EXTRA_PREFS_SET_NEXT_TEXT, ctx.getString(
+                        R.string.encryption_continue_button))
+                .putExtra(EXTRA_PASSWORD_QUALITY, quality)
+                .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, R.string.encryption_interstitial_header);
+    }
+
+    public static class EncryptionInterstitialFragment extends SettingsPreferenceFragment
+            implements View.OnClickListener {
+
+        private RadioButton mRequirePasswordToDecryptButton;
+        private RadioButton mDontRequirePasswordToDecryptButton;
+        private TextView mEncryptionMessage;
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            final int layoutId = R.layout.encryption_interstitial;
+            View view = inflater.inflate(layoutId, container, false);
+            mRequirePasswordToDecryptButton =
+                    (RadioButton) view.findViewById(R.id.encrypt_require_password);
+            mDontRequirePasswordToDecryptButton =
+                    (RadioButton) view.findViewById(R.id.encrypt_dont_require_password);
+            mEncryptionMessage =
+                    (TextView) view.findViewById(R.id.encryption_message);
+            int quality = getActivity().getIntent().getIntExtra(EXTRA_PASSWORD_QUALITY, 0);
+            final int msgId;
+            final int enableId;
+            final int disableId;
+            switch (quality) {
+                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
+                    msgId = R.string.encryption_interstitial_message_pattern;
+                    enableId = R.string.encrypt_require_pattern;
+                    disableId = R.string.encrypt_dont_require_pattern;
+                    break;
+                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
+                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
+                    msgId = R.string.encryption_interstitial_message_pin;
+                    enableId = R.string.encrypt_require_pin;
+                    disableId = R.string.encrypt_dont_require_pin;
+                    break;
+                default:
+                    msgId = R.string.encryption_interstitial_message_password;
+                    enableId = R.string.encrypt_require_password;
+                    disableId = R.string.encrypt_dont_require_password;
+                    break;
+            }
+            mEncryptionMessage.setText(msgId);
+            mRequirePasswordToDecryptButton.setOnClickListener(this);
+            mRequirePasswordToDecryptButton.setText(enableId);
+            mDontRequirePasswordToDecryptButton.setOnClickListener(this);
+            mDontRequirePasswordToDecryptButton.setText(disableId);
+            return view;
+        }
+
+        @Override
+        public void onResume() {
+            super.onResume();
+            loadFromSettings();
+        }
+
+        private void loadFromSettings() {
+            final boolean required = Settings.Global.getInt(getContentResolver(),
+                    Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, 1) == 1 ? true : false;
+            mRequirePasswordToDecryptButton.setChecked(required);
+            mDontRequirePasswordToDecryptButton.setChecked(!required);
+        }
+
+        @Override
+        public void onClick(View v) {
+            final boolean required = (v == mRequirePasswordToDecryptButton);
+            Settings.Global.putInt(getContentResolver(),
+                    Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, required ? 1 : 0);
+        }
+    }
+}
