diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index f4e3c4e..51614a6 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -94,6 +94,7 @@
         private int mEncryptionRequestQuality;
         private boolean mEncryptionRequestDisabled;
         private boolean mRequirePassword;
+        private String mUserPassword;
         private LockPatternUtils mLockPatternUtils;
         private FingerprintManager mFingerprintManager;
         private RemovalCallback mRemovalCallback = new RemovalCallback() {
@@ -146,7 +147,7 @@
                 ChooseLockSettingsHelper helper =
                         new ChooseLockSettingsHelper(this.getActivity(), this);
                 if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
-                        getString(R.string.unlock_set_unlock_launch_picker_title))) {
+                        getString(R.string.unlock_set_unlock_launch_picker_title), true)) {
                     mPasswordConfirmed = true; // no password set, so no need to confirm
                     updatePreferencesOrFinish();
                 } else {
@@ -177,6 +178,8 @@
          * @param quality
          * @param disabled
          */
+        // TODO: why does this take disabled, its always called with a quality higher than
+        // what makes sense with disabled == true
         private void maybeEnableEncryption(int quality, boolean disabled) {
             if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) {
                 mEncryptionRequestQuality = quality;
@@ -201,6 +204,7 @@
             mWaitingForConfirmation = false;
             if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
                 mPasswordConfirmed = true;
+                mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
                 updatePreferencesOrFinish();
             } else if (requestCode == ENABLE_ENCRYPTION_REQUEST
                     && resultCode == Activity.RESULT_OK) {
@@ -385,12 +389,27 @@
                     maxLength, requirePasswordToDecrypt, confirmCredentials);
         }
 
+        // SetupWizard version will not need this as they will never be changing a password
+        // TODO: confirm
+        private Intent getLockPasswordIntent(Context context, int quality, int minLength,
+                final int maxLength, boolean requirePasswordToDecrypt, String password) {
+            return ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
+                    requirePasswordToDecrypt, password);
+        }
+
         protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
                 final boolean confirmCredentials) {
             return ChooseLockPattern.createIntent(context, requirePassword,
                     confirmCredentials);
         }
 
+        // SetupWizard version will not need this as they will never be changing a password
+        // TODO: confirm
+        private Intent getLockPatternIntent(Context context, final boolean requirePassword,
+                final String pattern) {
+            return ChooseLockPattern.createIntent(context, requirePassword, pattern);
+        }
+
         protected Intent getEncryptionInterstitialIntent(Context context, int quality,
                 boolean required) {
             return EncryptionInterstitial.createStartIntent(context, quality, required);
@@ -421,11 +440,11 @@
                 }
                 final int maxLength = mDPM.getPasswordMaximumLength(quality);
                 Intent intent = getLockPasswordIntent(context, quality, minLength,
-                        maxLength, mRequirePassword,  /* confirm credentials */false);
+                        maxLength, mRequirePassword, mUserPassword);
                 startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
             } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
                 Intent intent = getLockPatternIntent(context, mRequirePassword,
-                        /* confirm credentials */false);
+                        mUserPassword);
                 startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
             } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
                 mChooseLockSettingsHelper.utils().clearLock();
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 8838286..7ef044a 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -76,6 +76,14 @@
         return intent;
     }
 
+    public static Intent createIntent(Context context, int quality,
+            int minLength, final int maxLength, boolean requirePasswordToDecrypt, String password) {
+        Intent intent = createIntent(context, quality, minLength, maxLength, requirePasswordToDecrypt,
+                false);
+        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password);
+        return intent;
+    }
+
     @Override
     protected boolean isValidFragment(String fragmentName) {
         if (ChooseLockPasswordFragment.class.getName().equals(fragmentName)) return true;
@@ -101,6 +109,9 @@
             implements OnClickListener, OnEditorActionListener,  TextWatcher {
         private static final String KEY_FIRST_PIN = "first_pin";
         private static final String KEY_UI_STAGE = "ui_stage";
+        private static final String KEY_CURRENT_PASSWORD = "current_password";
+
+        private String mCurrentPassword;
         private TextView mPasswordEntry;
         private int mPasswordMinLength = LockPatternUtils.MIN_LOCK_PASSWORD_SIZE;
         private int mPasswordMaxLength = 16;
@@ -239,19 +250,25 @@
 
             Intent intent = getActivity().getIntent();
             final boolean confirmCredentials = intent.getBooleanExtra("confirm_credentials", true);
+            mCurrentPassword = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
             if (savedInstanceState == null) {
                 updateStage(Stage.Introduction);
                 if (confirmCredentials) {
                     mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
-                            getString(R.string.unlock_set_unlock_launch_picker_title));
+                            getString(R.string.unlock_set_unlock_launch_picker_title), true);
                 }
             } else {
+                // restore from previous state
                 mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN);
                 final String state = savedInstanceState.getString(KEY_UI_STAGE);
                 if (state != null) {
                     mUiStage = Stage.valueOf(state);
                     updateStage(mUiStage);
                 }
+
+                if (mCurrentPassword == null) {
+                    mCurrentPassword = savedInstanceState.getString(KEY_CURRENT_PASSWORD);
+                }
             }
             mDone = false;
             if (activity instanceof SettingsActivity) {
@@ -287,6 +304,7 @@
             super.onSaveInstanceState(outState);
             outState.putString(KEY_UI_STAGE, mUiStage.name());
             outState.putString(KEY_FIRST_PIN, mFirstPin);
+            outState.putString(KEY_CURRENT_PASSWORD, mCurrentPassword);
         }
 
         @Override
@@ -298,6 +316,9 @@
                     if (resultCode != Activity.RESULT_OK) {
                         getActivity().setResult(RESULT_FINISHED);
                         getActivity().finish();
+                    } else {
+                        mCurrentPassword = data.getStringExtra(
+                                ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
                     }
                     break;
             }
@@ -441,7 +462,7 @@
                     final boolean required = getActivity().getIntent().getBooleanExtra(
                             EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
                     mLockPatternUtils.setCredentialRequiredToDecrypt(required);
-                    mLockPatternUtils.saveLockPassword(pin, mRequestedQuality);
+                    mLockPatternUtils.saveLockPassword(pin, mCurrentPassword, mRequestedQuality);
                     getActivity().setResult(RESULT_FINISHED);
                     getActivity().finish();
                     mDone = true;
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 8892346..c516ad0 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -77,6 +77,13 @@
         return intent;
     }
 
+    public static Intent createIntent(Context context,
+            boolean requirePassword, String pattern) {
+        Intent intent = createIntent(context, requirePassword, false);
+        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pattern);
+        return intent;
+    }
+
     @Override
     protected boolean isValidFragment(String fragmentName) {
         if (ChooseLockPatternFragment.class.getName().equals(fragmentName)) return true;
@@ -115,6 +122,7 @@
 
         private static final int ID_EMPTY_MESSAGE = -1;
 
+        private String mCurrentPattern;
         protected TextView mHeaderText;
         protected LockPatternView mLockPatternView;
         protected TextView mFooterText;
@@ -142,7 +150,11 @@
                     if (resultCode != Activity.RESULT_OK) {
                         getActivity().setResult(RESULT_FINISHED);
                         getActivity().finish();
+                    } else {
+                        mCurrentPattern = data.getStringExtra(
+                                ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
                     }
+
                     updateStage(Stage.Introduction);
                     break;
             }
@@ -329,6 +341,7 @@
 
         private static final String KEY_UI_STAGE = "uiStage";
         private static final String KEY_PATTERN_CHOICE = "chosenPattern";
+        private static final String KEY_CURRENT_PATTERN = "currentPattern";
 
         @Override
         public void onCreate(Bundle savedInstanceState) {
@@ -371,6 +384,8 @@
 
             final boolean confirmCredentials = getActivity().getIntent()
                     .getBooleanExtra("confirm_credentials", true);
+            mCurrentPattern = getActivity().getIntent()
+                    .getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
 
             if (savedInstanceState == null) {
                 if (confirmCredentials) {
@@ -380,7 +395,7 @@
                     boolean launchedConfirmationActivity =
                         mChooseLockSettingsHelper.launchConfirmationActivity(
                                 CONFIRM_EXISTING_REQUEST,
-                                getString(R.string.unlock_set_unlock_launch_picker_title));
+                                getString(R.string.unlock_set_unlock_launch_picker_title), true);
                     if (!launchedConfirmationActivity) {
                         updateStage(Stage.Introduction);
                     }
@@ -393,6 +408,10 @@
                 if (patternString != null) {
                     mChosenPattern = LockPatternUtils.stringToPattern(patternString);
                 }
+
+                if (mCurrentPattern == null) {
+                    mCurrentPattern = savedInstanceState.getString(KEY_CURRENT_PATTERN);
+                }
                 updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]);
             }
             mDone = false;
@@ -472,6 +491,11 @@
                 outState.putString(KEY_PATTERN_CHOICE,
                         LockPatternUtils.patternToString(mChosenPattern));
             }
+
+            if (mCurrentPattern != null) {
+                outState.putString(KEY_CURRENT_PATTERN,
+                        mCurrentPattern);
+            }
         }
 
         /**
@@ -571,8 +595,9 @@
 
             final boolean required = getActivity().getIntent().getBooleanExtra(
                     EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
+
             utils.setCredentialRequiredToDecrypt(required);
-            utils.saveLockPattern(mChosenPattern);
+            utils.saveLockPattern(mChosenPattern, mCurrentPattern);
 
             if (lockVirgin) {
                 utils.setVisiblePatternEnabled(true);
