diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1825423..e4abbca 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1042,6 +1042,8 @@
 
     <!-- Title of the dialog shown when the user removes the device lock [CHAR LIMIT=NONE] -->
     <string name="unlock_disable_frp_warning_title">Remove device protection?</string>
+    <!-- Title of the dialog shown when the user removes the profile lock [CHAR LIMIT=NONE] -->
+    <string name="unlock_disable_frp_warning_title_profile">Remove profile protection?</string>
 
     <!-- Content of the dialog shown when the user removes the device lock pattern [CHAR LIMIT=NONE] -->
     <string name="unlock_disable_frp_warning_content_pattern">"Device protection features will not work without your pattern."</string>
@@ -1060,6 +1062,23 @@
     <!-- Content of the dialog shown when the user removes the device lock of unknown type and the user has fingerprints enrolled [CHAR LIMIT=NONE] -->
     <string name="unlock_disable_frp_warning_content_unknown_fingerprint">"Device protection features will not work without your screen lock.<xliff:g id="empty_line">\n\n</xliff:g>Your saved fingerprints will also be removed from this device and you won't be able to unlock your phone, authorize purchases, or sign in to apps with them."</string>
 
+    <!-- Content of the dialog shown when the user removes the profile lock pattern [CHAR LIMIT=NONE] -->
+    <string name="unlock_disable_frp_warning_content_pattern_profile">"Profile protection features will not work without your pattern."</string>
+    <!-- Content of the dialog shown when the user removes the profile lock pattern and the user has fingerprints enrolled [CHAR LIMIT=NONE] -->
+    <string name="unlock_disable_frp_warning_content_pattern_fingerprint_profile">"Profile protection features will not work without your pattern.<xliff:g id="empty_line">\n\n</xliff:g>Your saved fingerprints will also be removed from this profile and you won't be able to unlock your profile, authorize purchases, or sign in to apps with them."</string>
+    <!-- Content of the dialog shown when the user removes the profile lock PIN [CHAR LIMIT=NONE] -->
+    <string name="unlock_disable_frp_warning_content_pin_profile">"Profile protection features will not work without your PIN."</string>
+    <!-- Content of the dialog shown when the user removes the profile lock PIN and the user has fingerprints enrolled [CHAR LIMIT=NONE] -->
+    <string name="unlock_disable_frp_warning_content_pin_fingerprint_profile">"Profile protection features will not work without your PIN.<xliff:g id="empty_line">\n\n</xliff:g>Your saved fingerprints will also be removed from this profile and you won't be able to unlock your profile, authorize purchases, or sign in to apps with them."</string>
+    <!-- Content of the dialog shown when the user removes the profile lock password [CHAR LIMIT=NONE] -->
+    <string name="unlock_disable_frp_warning_content_password_profile">"Profile protection features will not work without your password."</string>
+    <!-- Content of the dialog shown when the user removes the profile lock password and the user has fingerprints enrolled [CHAR LIMIT=NONE] -->
+    <string name="unlock_disable_frp_warning_content_password_fingerprint_profile">"Profile protection features will not work without your password.<xliff:g id="empty_line">\n\n</xliff:g>Your saved fingerprints will also be removed from this profile and you won't be able to unlock your profile, authorize purchases, or sign in to apps with them."</string>
+    <!-- Content of the dialog shown when the user removes the profile lock of unknown type [CHAR LIMIT=NONE] -->
+    <string name="unlock_disable_frp_warning_content_unknown_profile">"Profile protection features will not work without your screen lock."</string>
+    <!-- Content of the dialog shown when the user removes the profile lock of unknown type and the user has fingerprints enrolled [CHAR LIMIT=NONE] -->
+    <string name="unlock_disable_frp_warning_content_unknown_fingerprint_profile">"Profile protection features will not work without your screen lock.<xliff:g id="empty_line">\n\n</xliff:g>Your saved fingerprints will also be removed from this profile and you won't be able to unlock your profile, authorize purchases, or sign in to apps with them."</string>
+
     <!-- Affirmative action of the dialog shown when the user removes the device lock [CHAR LIMIT=25] -->
     <string name="unlock_disable_frp_warning_ok">Yes, remove</string>
 
@@ -2973,6 +2992,15 @@
     <!-- Message to be used to explain the user that he needs to enter his password to continue a
          particular operation. [CHAR LIMIT=70]-->
     <string name="lockpassword_confirm_your_password_generic">Enter your device password to continue.</string>
+    <!-- Message to be used to explain the user that he needs to enter his profile pattern to continue a
+         particular operation. [CHAR LIMIT=70]-->
+    <string name="lockpassword_confirm_your_pattern_generic_profile">Use your profile pattern to continue.</string>
+    <!-- Message to be used to explain the user that he needs to enter his profile PIN to continue a
+         particular operation. [CHAR LIMIT=70]-->
+    <string name="lockpassword_confirm_your_pin_generic_profile">Enter your profile PIN to continue.</string>
+    <!-- Message to be used to explain the user that he needs to enter his profile password to continue a
+         particular operation. [CHAR LIMIT=70]-->
+    <string name="lockpassword_confirm_your_password_generic_profile">Enter your profile password to continue.</string>
 
     <!-- Security & location settings screen, change security method screen instruction if user
          enters incorrect PIN [CHAR LIMIT=30] -->
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index c576897..0e6cf3b 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -581,28 +581,62 @@
             return R.string.help_url_choose_lockscreen;
         }
 
+        private int getResIdForFactoryResetProtectionWarningTitle() {
+            boolean isProfile = Utils.isManagedProfile(UserManager.get(getActivity()), mUserId);
+            return isProfile ? R.string.unlock_disable_frp_warning_title_profile
+                    : R.string.unlock_disable_frp_warning_title;
+        }
+
         private int getResIdForFactoryResetProtectionWarningMessage() {
             boolean hasFingerprints = mFingerprintManager.hasEnrolledFingerprints();
+            boolean isProfile = Utils.isManagedProfile(UserManager.get(getActivity()), mUserId);
             switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
                 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
-                    return hasFingerprints
-                            ? R.string.unlock_disable_frp_warning_content_pattern_fingerprint
-                            : R.string.unlock_disable_frp_warning_content_pattern;
+                    if (hasFingerprints && isProfile) {
+                        return R.string
+                                .unlock_disable_frp_warning_content_pattern_fingerprint_profile;
+                    } else if (hasFingerprints && !isProfile) {
+                        return R.string.unlock_disable_frp_warning_content_pattern_fingerprint;
+                    } else if (isProfile) {
+                        return R.string.unlock_disable_frp_warning_content_pattern_profile;
+                    } else {
+                        return R.string.unlock_disable_frp_warning_content_pattern;
+                    }
                 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
                 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
-                    return hasFingerprints
-                            ? R.string.unlock_disable_frp_warning_content_pin_fingerprint
-                            : R.string.unlock_disable_frp_warning_content_pin;
+                    if (hasFingerprints && isProfile) {
+                        return R.string.unlock_disable_frp_warning_content_pin_fingerprint_profile;
+                    } else if (hasFingerprints && !isProfile) {
+                        return R.string.unlock_disable_frp_warning_content_pin_fingerprint;
+                    } else if (isProfile) {
+                        return R.string.unlock_disable_frp_warning_content_pin_profile;
+                    } else {
+                        return R.string.unlock_disable_frp_warning_content_pin;
+                    }
                 case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
                 case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
                 case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
-                    return hasFingerprints
-                            ? R.string.unlock_disable_frp_warning_content_password_fingerprint
-                            : R.string.unlock_disable_frp_warning_content_password;
+                    if (hasFingerprints && isProfile) {
+                        return R.string
+                                .unlock_disable_frp_warning_content_password_fingerprint_profile;
+                    } else if (hasFingerprints && !isProfile) {
+                        return R.string.unlock_disable_frp_warning_content_password_fingerprint;
+                    } else if (isProfile) {
+                        return R.string.unlock_disable_frp_warning_content_password_profile;
+                    } else {
+                        return R.string.unlock_disable_frp_warning_content_password;
+                    }
                 default:
-                    return hasFingerprints
-                            ? R.string.unlock_disable_frp_warning_content_unknown_fingerprint
-                            : R.string.unlock_disable_frp_warning_content_unknown;
+                    if (hasFingerprints && isProfile) {
+                        return R.string
+                                .unlock_disable_frp_warning_content_unknown_fingerprint_profile;
+                    } else if (hasFingerprints && !isProfile) {
+                        return R.string.unlock_disable_frp_warning_content_unknown_fingerprint;
+                    } else if (isProfile) {
+                        return R.string.unlock_disable_frp_warning_content_unknown_profile;
+                    } else {
+                        return R.string.unlock_disable_frp_warning_content_unknown;
+                    }
             }
         }
 
@@ -637,22 +671,26 @@
         }
 
         private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) {
+            int title = getResIdForFactoryResetProtectionWarningTitle();
             int message = getResIdForFactoryResetProtectionWarningMessage();
             FactoryResetProtectionWarningDialog dialog =
-                    FactoryResetProtectionWarningDialog.newInstance(message, unlockMethodToSet);
+                    FactoryResetProtectionWarningDialog.newInstance(
+                            title, message, unlockMethodToSet);
             dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG);
         }
 
         public static class FactoryResetProtectionWarningDialog extends DialogFragment {
 
+            private static final String ARG_TITLE_RES = "titleRes";
             private static final String ARG_MESSAGE_RES = "messageRes";
             private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet";
 
-            public static FactoryResetProtectionWarningDialog newInstance(int messageRes,
-                    String unlockMethodToSet) {
+            public static FactoryResetProtectionWarningDialog newInstance(
+                    int titleRes, int messageRes, String unlockMethodToSet) {
                 FactoryResetProtectionWarningDialog frag =
                         new FactoryResetProtectionWarningDialog();
                 Bundle args = new Bundle();
+                args.putInt(ARG_TITLE_RES, titleRes);
                 args.putInt(ARG_MESSAGE_RES, messageRes);
                 args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet);
                 frag.setArguments(args);
@@ -672,7 +710,7 @@
                 final Bundle args = getArguments();
 
                 return new AlertDialog.Builder(getActivity())
-                        .setTitle(R.string.unlock_disable_frp_warning_title)
+                        .setTitle(args.getInt(ARG_TITLE_RES))
                         .setMessage(args.getInt(ARG_MESSAGE_RES))
                         .setPositiveButton(R.string.unlock_disable_frp_warning_ok,
                                 new DialogInterface.OnClickListener() {
diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java
index 00a68bf..f6347c1 100644
--- a/src/com/android/settings/ConfirmLockPassword.java
+++ b/src/com/android/settings/ConfirmLockPassword.java
@@ -26,6 +26,7 @@
 import android.os.CountDownTimer;
 import android.os.Handler;
 import android.os.SystemClock;
+import android.os.UserManager;
 import android.os.storage.StorageManager;
 import android.text.InputType;
 import android.text.TextUtils;
@@ -180,8 +181,16 @@
         }
 
         private int getDefaultDetails() {
-            return mIsAlpha ? R.string.lockpassword_confirm_your_password_generic
-                    : R.string.lockpassword_confirm_your_pin_generic;
+            boolean isProfile = Utils.isManagedProfile(
+                    UserManager.get(getActivity()), mEffectiveUserId);
+            if (mIsAlpha && !isProfile) {
+                return R.string.lockpassword_confirm_your_password_generic;
+            } else if (mIsAlpha && isProfile) {
+                return R.string.lockpassword_confirm_your_password_generic_profile;
+            } else if (!isProfile) {
+                return R.string.lockpassword_confirm_your_pin_generic;
+            }
+            return R.string.lockpassword_confirm_your_pin_generic_profile;
         }
 
         private int getErrorMessage() {
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
index 087a0b9..5c72bd1 100644
--- a/src/com/android/settings/ConfirmLockPattern.java
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -23,6 +23,7 @@
 import android.os.Bundle;
 import android.os.CountDownTimer;
 import android.os.SystemClock;
+import android.os.UserManager;
 import android.os.storage.StorageManager;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -279,9 +280,13 @@
                     }
                     if (mDetailsText != null) {
                         mDetailsTextView.setText(mDetailsText);
-                    } else {
+                    } else if (!Utils.isManagedProfile(
+                            UserManager.get(getActivity()), mEffectiveUserId)) {
                         mDetailsTextView.setText(
                                 R.string.lockpassword_confirm_your_pattern_generic);
+                    } else {
+                        mDetailsTextView.setText(
+                                R.string.lockpassword_confirm_your_pattern_generic_profile);
                     }
                     mErrorTextView.setText("");
 
diff --git a/src/com/android/settings/ProfileChallengePreferenceFragment.java b/src/com/android/settings/ProfileChallengePreferenceFragment.java
index 676f61f..4b57552 100644
--- a/src/com/android/settings/ProfileChallengePreferenceFragment.java
+++ b/src/com/android/settings/ProfileChallengePreferenceFragment.java
@@ -60,7 +60,8 @@
     public static final String TAG_UNIFICATION_DIALOG = "unification_dialog";
 
     private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
-    private static final int UNIFY_LOCK_METHOD_REQUEST = 124;
+    private static final int UNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 124;
+    private static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 125;
 
     // Not all preferences make sense for the Work Challenge, this is a whitelist.
     private static final Set<String> ALLOWED_PREFERENCE_KEYS = new HashSet<>();
@@ -77,6 +78,9 @@
     private LockPatternUtils mLockPatternUtils;
     private int mProfileUserId;
 
+    private String mCurrentDevicePassword;
+    private String mCurrentProfilePassword;
+
     private SwitchPreference mVisiblePattern;
 
     @Override
@@ -127,15 +131,58 @@
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
-        if (requestCode == UNIFY_LOCK_METHOD_REQUEST && resultCode == Activity.RESULT_OK) {
+        if (requestCode == UNIFY_LOCK_CONFIRM_DEVICE_REQUEST && resultCode == Activity.RESULT_OK) {
+            mCurrentDevicePassword =
+                    data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
+            launchConfirmProfileLockForUnification();
+            return;
+        } else if (requestCode == UNIFY_LOCK_CONFIRM_PROFILE_REQUEST
+                && resultCode == Activity.RESULT_OK) {
+            mCurrentProfilePassword =
+                    data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
             unifyLocks();
             return;
         }
     }
 
+    private void launchConfirmDeviceLockForUnification() {
+        final String title = getActivity().getString(
+                R.string.lock_settings_profile_screen_lock_title);
+        final ChooseLockSettingsHelper helper =
+                new ChooseLockSettingsHelper(getActivity(), this);
+        if (!helper.launchConfirmationActivity(
+                UNIFY_LOCK_CONFIRM_DEVICE_REQUEST, title, true, UserHandle.myUserId())) {
+            launchConfirmProfileLockForUnification();
+        }
+    }
+
+    private void launchConfirmProfileLockForUnification() {
+        final String title = getActivity().getString(
+                R.string.lock_settings_profile_screen_lock_title);
+        final ChooseLockSettingsHelper helper =
+                new ChooseLockSettingsHelper(getActivity(), this);
+        if (!helper.launchConfirmationActivity(
+                UNIFY_LOCK_CONFIRM_PROFILE_REQUEST, title, true, mProfileUserId)) {
+            unifyLocks();
+            createPreferenceHierarchy();
+        }
+    }
+
     private void unifyLocks() {
+        int profileQuality = mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileUserId);
         mLockPatternUtils.clearLock(mProfileUserId);
         mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileUserId, false);
+        if (profileQuality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
+            mLockPatternUtils.saveLockPattern(
+                    LockPatternUtils.stringToPattern(mCurrentProfilePassword),
+                    mCurrentDevicePassword, UserHandle.myUserId());
+        } else {
+            mLockPatternUtils.saveLockPassword(
+                    mCurrentProfilePassword, mCurrentDevicePassword,
+                    profileQuality, UserHandle.myUserId());
+        }
+        mCurrentDevicePassword = null;
+        mCurrentProfilePassword = null;
     }
 
     @Override
@@ -172,7 +219,7 @@
                 root.findPreference(KEY_SECURITY_CATEGORY);
         if (securityCategory != null) {
             if (mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileUserId)) {
-                addUnificationPreference(securityCategory);
+                maybeAddUnificationPreference(securityCategory);
             } else {
                 Preference lockPreference =
                         securityCategory.findPreference(KEY_UNLOCK_SET_OR_CHANGE);
@@ -183,12 +230,15 @@
         }
     }
 
-    private void addUnificationPreference(PreferenceGroup securityCategory) {
-        Preference unificationPreference = new Preference(securityCategory.getContext());
-        unificationPreference.setKey(KEY_UNIFICATION);
-        unificationPreference.setTitle(R.string.lock_settings_profile_unification_title);
-        unificationPreference.setSummary(R.string.lock_settings_profile_unification_summary);
-        securityCategory.addPreference(unificationPreference);
+    private void maybeAddUnificationPreference(PreferenceGroup securityCategory) {
+        if (mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileUserId)
+                >= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
+            Preference unificationPreference = new Preference(securityCategory.getContext());
+            unificationPreference.setKey(KEY_UNIFICATION);
+            unificationPreference.setTitle(R.string.lock_settings_profile_unification_title);
+            unificationPreference.setSummary(R.string.lock_settings_profile_unification_summary);
+            securityCategory.addPreference(unificationPreference);
+        }
     }
 
     private void removeNonWhitelistedItems(PreferenceGroup prefScreen) {
@@ -243,13 +293,9 @@
     }
 
     public static class UnificationConfirmationDialog extends DialogFragment {
-        private static final String ARG_USER_ID = "userId";
 
         public static UnificationConfirmationDialog newIntance(int userId) {
             UnificationConfirmationDialog dialog = new UnificationConfirmationDialog();
-            Bundle args = new Bundle();
-            args.putInt(ARG_USER_ID, userId);
-            dialog.setArguments(args);
             return dialog;
         }
 
@@ -263,7 +309,6 @@
 
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
-            final Bundle args = getArguments();
             final ProfileChallengePreferenceFragment parentFragment =
                     ((ProfileChallengePreferenceFragment) getParentFragment());
             return new AlertDialog.Builder(getActivity())
@@ -273,17 +318,7 @@
                             new DialogInterface.OnClickListener() {
                                 @Override
                                 public void onClick(DialogInterface dialog, int whichButton) {
-                                    String title = getContext().getString(
-                                            R.string.lock_settings_profile_screen_lock_title);
-                                    ChooseLockSettingsHelper helper =
-                                            new ChooseLockSettingsHelper(
-                                                    getActivity(), parentFragment);
-                                    if (!helper.launchConfirmationActivity(
-                                            UNIFY_LOCK_METHOD_REQUEST,
-                                            title, true, args.getInt(ARG_USER_ID))) {
-                                        parentFragment.unifyLocks();
-                                        parentFragment.createPreferenceHierarchy();
-                                    }
+                                    parentFragment.launchConfirmDeviceLockForUnification();
                                 }
                             }
                     )
diff --git a/tests/src/com/android/settings/UserCredentialsTests.java b/tests/unit/src/com/android/settings/UserCredentialsTests.java
similarity index 100%
rename from tests/src/com/android/settings/UserCredentialsTests.java
rename to tests/unit/src/com/android/settings/UserCredentialsTests.java
