diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
index 090d4be..96ede4d 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
@@ -36,7 +36,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.RemoteException;
-import android.os.UserHandle;
 import android.os.UserManager;
 import android.view.View;
 import android.view.ViewGroup;
@@ -224,7 +223,7 @@
     }
 
     protected boolean isProfileChallenge() {
-        return UserHandle.myUserId() != mEffectiveUserId;
+        return Utils.isManagedProfile(UserManager.get(getContext()));
     }
 
     protected void reportSuccessfullAttempt() {
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 8966974..5537926 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -228,7 +228,7 @@
         final int resid = getResIdForLockUnlockScreen(getActivity(), mLockPatternUtils, MY_USER_ID);
         addPreferencesFromResource(resid);
 
-        mProfileChallengeUserId = getManagedProfileId(mUm);
+        mProfileChallengeUserId = Utils.getManagedProfileId(mUm, MY_USER_ID);
         if (mProfileChallengeUserId != UserHandle.USER_NULL
                 && mLockPatternUtils.isSeparateProfileChallengeAllowed(mProfileChallengeUserId)) {
             addPreferencesFromResource(R.xml.security_settings_profile);
@@ -726,21 +726,6 @@
         return R.string.help_url_security;
     }
 
-    private static int getManagedProfileId(UserManager um) {
-        List<UserInfo> profiles = um.getProfiles(MY_USER_ID);
-        int numProfiles = profiles.size();
-        if (numProfiles == 1) {
-            return UserHandle.USER_NULL;
-        }
-        for (int i = 0; i < numProfiles; ++i) {
-            UserInfo profile = profiles.get(i);
-            if (profile.id != MY_USER_ID) {
-                return profile.id;
-            }
-        }
-        return UserHandle.USER_NULL;
-    }
-
     /**
      * For Search. Please keep it in sync when updating "createPreferenceHierarchy()"
      */
@@ -764,7 +749,7 @@
             result.add(sir);
 
             final UserManager um = UserManager.get(context);
-            final int profileUserId = getManagedProfileId(um);
+            final int profileUserId = Utils.getManagedProfileId(um, MY_USER_ID);
             if (profileUserId != UserHandle.USER_NULL
                     && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)) {
                 sir = new SearchIndexableResource(context);
@@ -847,7 +832,7 @@
             }
 
             final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
-            final int profileUserId = getManagedProfileId(um);
+            final int profileUserId = Utils.getManagedProfileId(um, MY_USER_ID);
             if (profileUserId != UserHandle.USER_NULL
                     && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)) {
                 if (lockPatternUtils.getKeyguardStoredPasswordQuality(profileUserId)
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index c6af8fb..e719291 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -596,6 +596,23 @@
     }
 
     /**
+     * Retrieves the id for the given user's managed profile.
+     *
+     * @return the managed profile id or UserHandle.USER_NULL if there is none.
+     */
+    public static int getManagedProfileId(UserManager um, int parentUserId) {
+        List<UserInfo> profiles = um.getProfiles(parentUserId);
+        int numProfiles = profiles.size();
+        for (int i = 0; i < numProfiles; ++i) {
+            UserInfo profile = profiles.get(i);
+            if (profile.id != parentUserId) {
+                return profile.id;
+            }
+        }
+        return UserHandle.USER_NULL;
+    }
+
+    /**
      * Returns true if the userId passed in is a managed profile.
      *
      * @throws IllegalArgumentException if userManager is null.
diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java
index 842b06f..7a47891 100644
--- a/src/com/android/settings/notification/ConfigureNotificationSettings.java
+++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java
@@ -23,6 +23,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
@@ -34,6 +35,7 @@
 import com.android.settings.R;
 import com.android.settings.RestrictedListPreference.RestrictedItem;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
 import com.android.settingslib.RestrictedLockUtils;
 
 import java.util.ArrayList;
@@ -48,6 +50,8 @@
 
     private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
     private static final String KEY_LOCK_SCREEN_NOTIFICATIONS = "lock_screen_notifications";
+    private static final String KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS =
+            "lock_screen_notifications_profile";
 
     private final SettingsObserver mSettingsObserver = new SettingsObserver();
 
@@ -55,8 +59,12 @@
 
     private TwoStatePreference mNotificationPulse;
     private NotificationLockscreenPreference mLockscreen;
+    private NotificationLockscreenPreference mLockscreenProfile;
     private boolean mSecure;
+    private boolean mSecureProfile;
     private int mLockscreenSelectedValue;
+    private int mLockscreenSelectedValueProfile;
+    private int mProfileChallengeUserId;
 
     @Override
     protected int getMetricsCategory() {
@@ -67,13 +75,22 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mContext = getActivity();
+        mProfileChallengeUserId = Utils.getManagedProfileId(
+                UserManager.get(mContext), UserHandle.myUserId());
         mSecure = new LockPatternUtils(getActivity()).isSecure(UserHandle.myUserId());
+        mSecureProfile = (mProfileChallengeUserId != UserHandle.USER_NULL)
+                && new LockPatternUtils(getActivity()).isSecure(mProfileChallengeUserId);
 
         addPreferencesFromResource(R.xml.configure_notification_settings);
 
         initPulse();
         initLockscreenNotifications();
 
+        if (mProfileChallengeUserId != UserHandle.USER_NULL) {
+            addPreferencesFromResource(R.xml.configure_notification_settings_profile);
+            initLockscreenNotificationsForProfile();
+        }
+
     }
 
     @Override
@@ -126,8 +143,6 @@
         }
     }
 
-    // === Lockscreen (public / private) notifications ===
-
     private void initLockscreenNotifications() {
         mLockscreen = (NotificationLockscreenPreference) getPreferenceScreen().findPreference(
                 KEY_LOCK_SCREEN_NOTIFICATIONS);
@@ -187,6 +202,71 @@
         }
     }
 
+    // === Lockscreen (public / private) notifications ===
+    private void initLockscreenNotificationsForProfile() {
+        mLockscreenProfile = (NotificationLockscreenPreference) getPreferenceScreen()
+                .findPreference(KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS);
+        if (mLockscreenProfile == null) {
+            Log.i(TAG, "Preference not found: " + KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS);
+            return;
+        }
+
+        ArrayList<CharSequence> entries = new ArrayList<>();
+        ArrayList<CharSequence> values = new ArrayList<>();
+        entries.add(getString(R.string.lock_screen_notifications_summary_disable_profile));
+        values.add(Integer.toString(R.string.lock_screen_notifications_summary_disable_profile));
+
+        String summaryShowEntry = getString(
+                R.string.lock_screen_notifications_summary_show_profile);
+        String summaryShowEntryValue = Integer.toString(
+                R.string.lock_screen_notifications_summary_show_profile);
+        entries.add(summaryShowEntry);
+        values.add(summaryShowEntryValue);
+        setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue,
+                KEYGUARD_DISABLE_SECURE_NOTIFICATIONS | KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
+
+        if (mSecureProfile) {
+            String summaryHideEntry = getString(
+                    R.string.lock_screen_notifications_summary_hide_profile);
+            String summaryHideEntryValue = Integer.toString(
+                    R.string.lock_screen_notifications_summary_hide_profile);
+            entries.add(summaryHideEntry);
+            values.add(summaryHideEntryValue);
+            setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue,
+                    KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
+        }
+
+        mLockscreenProfile.setEntries(entries.toArray(new CharSequence[entries.size()]));
+        mLockscreenProfile.setEntryValues(values.toArray(new CharSequence[values.size()]));
+        updateLockscreenNotificationsForProfile();
+        if (mLockscreenProfile.getEntries().length > 1) {
+            mLockscreenProfile.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    final int val = Integer.parseInt((String) newValue);
+                    if (val == mLockscreenSelectedValueProfile) {
+                        return false;
+                    }
+                    final boolean enabled =
+                            val != R.string.lock_screen_notifications_summary_disable_profile;
+                    final boolean show =
+                            val == R.string.lock_screen_notifications_summary_show_profile;
+                    Settings.Secure.putIntForUser(getContentResolver(),
+                            Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
+                            show ? 1 : 0, mProfileChallengeUserId);
+                    Settings.Secure.putIntForUser(getContentResolver(),
+                            Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS,
+                            enabled ? 1 : 0, mProfileChallengeUserId);
+                    mLockscreenSelectedValueProfile = val;
+                    return true;
+                }
+            });
+        } else {
+            // There is one or less option for the user, disable the drop down.
+            mLockscreenProfile.setEnabled(false);
+        }
+    }
+
     private void setRestrictedIfNotificationFeaturesDisabled(CharSequence entry,
             CharSequence entryValue, int keyguardNotificationFeatures) {
         EnforcedAdmin admin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
@@ -195,28 +275,54 @@
             RestrictedItem item = new RestrictedItem(entry, entryValue, admin);
             mLockscreen.addRestrictedItem(item);
         }
+        if (mProfileChallengeUserId != UserHandle.USER_NULL) {
+            EnforcedAdmin profileAdmin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+                    mContext, keyguardNotificationFeatures, mProfileChallengeUserId);
+            if (profileAdmin != null) {
+                RestrictedItem item = new RestrictedItem(entry, entryValue, profileAdmin);
+                mLockscreenProfile.addRestrictedItem(item);
+            }
+        }
     }
 
     private void updateLockscreenNotifications() {
         if (mLockscreen == null) {
             return;
         }
-        final boolean enabled = getLockscreenNotificationsEnabled();
-        final boolean allowPrivate = !mSecure || getLockscreenAllowPrivateNotifications();
+        final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
+        final boolean allowPrivate = !mSecure
+                || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
         mLockscreenSelectedValue = !enabled ? R.string.lock_screen_notifications_summary_disable :
                 allowPrivate ? R.string.lock_screen_notifications_summary_show :
                 R.string.lock_screen_notifications_summary_hide;
         mLockscreen.setValue(Integer.toString(mLockscreenSelectedValue));
     }
 
-    private boolean getLockscreenNotificationsEnabled() {
-        return Settings.Secure.getInt(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0;
+    private void updateLockscreenNotificationsForProfile() {
+        if (mProfileChallengeUserId == UserHandle.USER_NULL) {
+            return;
+        }
+        if (mLockscreenProfile == null) {
+            return;
+        }
+        final boolean enabled = getLockscreenNotificationsEnabled(mProfileChallengeUserId);
+        final boolean allowPrivate = !mSecureProfile
+                || getLockscreenAllowPrivateNotifications(mProfileChallengeUserId);
+        mLockscreenSelectedValueProfile = !enabled
+                ? R.string.lock_screen_notifications_summary_disable_profile
+                        : (allowPrivate ? R.string.lock_screen_notifications_summary_show_profile
+                                : R.string.lock_screen_notifications_summary_hide_profile);
+        mLockscreenProfile.setValue(Integer.toString(mLockscreenSelectedValueProfile));
     }
 
-    private boolean getLockscreenAllowPrivateNotifications() {
-        return Settings.Secure.getInt(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0) != 0;
+    private boolean getLockscreenNotificationsEnabled(int userId) {
+        return Settings.Secure.getIntForUser(getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, userId) != 0;
+    }
+
+    private boolean getLockscreenAllowPrivateNotifications(int userId) {
+        return Settings.Secure.getIntForUser(getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, userId) != 0;
     }
 
 
@@ -253,6 +359,9 @@
             }
             if (LOCK_SCREEN_PRIVATE_URI.equals(uri) || LOCK_SCREEN_SHOW_URI.equals(uri)) {
                 updateLockscreenNotifications();
+                if (mProfileChallengeUserId != UserHandle.USER_NULL) {
+                    updateLockscreenNotificationsForProfile();
+                }
             }
         }
     }
