diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index bd46456..3def151 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -172,7 +172,7 @@
                     !mLockPatternUtils.isSeparateProfileChallengeAllowed(targetUser)) {
                 // Always use parent if explicitely requested or if profile challenge is not
                 // supported
-                mUserId = Utils.getSameOwnerUserId(getContext(), getArguments());
+                mUserId = Utils.getUserIdFromBundle(getContext(), getArguments());
             } else {
                 mUserId = targetUser;
             }
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 6739475..86b6a52 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -238,7 +238,7 @@
                 throw new SecurityException("Fragment contained in wrong activity");
             }
             // Only take this argument into account if it belongs to the current profile.
-            mUserId = Utils.getSameOwnerUserId(getActivity(), intent.getExtras());
+            mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
             mRequestedQuality = Math.max(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY,
                     mRequestedQuality), mLockPatternUtils.getRequestedPasswordQuality(
                     mUserId));
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 93ffa95..dbbe08c 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -370,7 +370,7 @@
             }
             Intent intent = getActivity().getIntent();
             // Only take this argument into account if it belongs to the current profile.
-            mUserId = Utils.getSameOwnerUserId(getActivity(), intent.getExtras());
+            mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
         }
 
         @Override
diff --git a/src/com/android/settings/ChooseLockSettingsHelper.java b/src/com/android/settings/ChooseLockSettingsHelper.java
index b88dea2..70ecdfd 100644
--- a/src/com/android/settings/ChooseLockSettingsHelper.java
+++ b/src/com/android/settings/ChooseLockSettingsHelper.java
@@ -90,7 +90,7 @@
     boolean launchConfirmationActivity(int request, CharSequence title, boolean returnCredentials,
             int userId) {
         return launchConfirmationActivity(request, title, null, null,
-                returnCredentials, false, false, 0, Utils.getSameOwnerUserId(mActivity, userId));
+                returnCredentials, false, false, 0, Utils.enforceSameOwner(mActivity, userId));
     }
 
     /**
@@ -110,7 +110,7 @@
             @Nullable CharSequence header, @Nullable CharSequence description,
             boolean returnCredentials, boolean external) {
         return launchConfirmationActivity(request, title, header, description,
-                returnCredentials, external, false, 0, Utils.getEffectiveUserId(mActivity));
+                returnCredentials, external, false, 0, Utils.getCredentialOwnerUserId(mActivity));
     }
 
     /**
@@ -131,7 +131,7 @@
             @Nullable CharSequence header, @Nullable CharSequence description,
             boolean returnCredentials, boolean external, int userId) {
         return launchConfirmationActivity(request, title, header, description,
-                returnCredentials, external, false, 0, Utils.getSameOwnerUserId(mActivity, userId));
+                returnCredentials, external, false, 0, Utils.enforceSameOwner(mActivity, userId));
     }
 
     /**
@@ -147,7 +147,7 @@
             @Nullable CharSequence header, @Nullable CharSequence description,
             long challenge) {
         return launchConfirmationActivity(request, title, header, description,
-                false, false, true, challenge, Utils.getEffectiveUserId(mActivity));
+                false, false, true, challenge, Utils.getCredentialOwnerUserId(mActivity));
     }
 
     private boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
diff --git a/src/com/android/settings/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/ConfirmDeviceCredentialActivity.java
index c4587eb..28c0515 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialActivity.java
@@ -64,12 +64,12 @@
         Intent intent = getIntent();
         String title = intent.getStringExtra(KeyguardManager.EXTRA_TITLE);
         String details = intent.getStringExtra(KeyguardManager.EXTRA_DESCRIPTION);
-        int userId = Utils.getEffectiveUserId(this);
+        int userId = Utils.getCredentialOwnerUserId(this);
         if (isInternalActivity()) {
-            int givenUserId = intent.getIntExtra(Intent.EXTRA_USER_ID, userId);
-            UserManager userManager = UserManager.get(this);
-            if (userManager.isSameProfileGroup(givenUserId, userId)) {
-                userId = givenUserId;
+            try {
+                userId = Utils.getUserIdFromBundle(this, intent.getExtras());
+            } catch (SecurityException se) {
+                Log.e(TAG, "Invalid intent extra", se);
             }
         }
         ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java b/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java
index d9af800..e6dd5e0 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java
@@ -18,8 +18,10 @@
 
 import android.app.Fragment;
 import android.app.KeyguardManager;
+import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.UserManager;
 import android.view.MenuItem;
 import android.view.WindowManager;
 
@@ -33,7 +35,12 @@
 
     @Override
     protected void onCreate(Bundle savedState) {
-        if (getIntent().getBooleanExtra(ConfirmDeviceCredentialBaseFragment.DARK_THEME, false)) {
+        int credentialOwnerUserId = Utils.getCredentialOwnerUserId(this,
+                Utils.getUserIdFromBundle(this, getIntent().getExtras()));
+        if (Utils.isManagedProfile(UserManager.get(this), credentialOwnerUserId)) {
+            setTheme(R.style.Theme_ConfirmDeviceCredentialsWork);
+        } else if (getIntent().getBooleanExtra(
+                ConfirmDeviceCredentialBaseFragment.DARK_THEME, false)) {
             setTheme(R.style.Theme_ConfirmDeviceCredentialsDark);
             mDark = true;
         }
diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
index 0a22d45..d1ea8be 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
@@ -24,10 +24,16 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentSender;
+import android.graphics.Point;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.RemoteException;
+import android.os.UserManager;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.Button;
+import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -80,6 +86,14 @@
                 getActivity().finish();
             }
         });
+        int credentialOwnerUserId = Utils.getCredentialOwnerUserId(
+                getActivity(),
+                Utils.getUserIdFromBundle(
+                        getActivity(),
+                        getActivity().getIntent().getExtras()));
+        if (Utils.isManagedProfile(UserManager.get(getActivity()), credentialOwnerUserId)) {
+            setWorkChallengeBackground(view);
+        }
     }
 
     @Override
@@ -155,4 +169,20 @@
             }
         }
     }
+
+    private void setWorkChallengeBackground(View baseView) {
+        ImageView imageView = (ImageView) baseView.findViewById(R.id.background_image);
+        if (imageView != null) {
+            Drawable image = getResources().getDrawable(R.drawable.work_challenge_background);
+            image.setColorFilter(
+                    getResources().getColor(R.color.confirm_device_credential_transparent_black),
+                    PorterDuff.Mode.DARKEN);
+            imageView.setImageDrawable(image);
+            Point screenSize = new Point();
+            getActivity().getWindowManager().getDefaultDisplay().getSize(screenSize);
+            imageView.setLayoutParams(new FrameLayout.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    screenSize.y));
+        }
+    }
 }
diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java
index 53555e0..00a68bf 100644
--- a/src/com/android/settings/ConfirmLockPassword.java
+++ b/src/com/android/settings/ConfirmLockPassword.java
@@ -111,7 +111,7 @@
             mLockPatternUtils = new LockPatternUtils(getActivity());
             Intent intent = getActivity().getIntent();
             // Only take this argument into account if it belongs to the current profile.
-            mEffectiveUserId = Utils.getSameOwnerUserId(getActivity(), intent.getExtras());
+            mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
         }
 
         @Override
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
index 6331290..087a0b9 100644
--- a/src/com/android/settings/ConfirmLockPattern.java
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -116,7 +116,7 @@
             mLockPatternUtils = new LockPatternUtils(getActivity());
             Intent intent = getActivity().getIntent();
             // Only take this argument into account if it belongs to the current profile.
-            mEffectiveUserId = Utils.getSameOwnerUserId(getActivity(), intent.getExtras());
+            mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
         }
 
         @Override
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 4afa1d9..56795ae 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.app.ActivityManagerNative;
@@ -181,6 +182,19 @@
     }
 
     /**
+     * Returns the UserManager for a given context
+     *
+     * @throws IllegalStateException if no UserManager could be retrieved.
+     */
+    public static UserManager getUserManager(Context context) {
+        UserManager um = UserManager.get(context);
+        if (um == null) {
+            throw new IllegalStateException("Unable to load UserManager");
+        }
+        return um;
+    }
+
+    /**
      * Returns true if Monkey is running.
      */
     public static boolean isMonkeyRunning() {
@@ -569,10 +583,24 @@
 
     /**
      * Returns true if the current profile is a managed one.
+     *
+     * @throws IllegalArgumentException if userManager is null.
      */
-    public static boolean isManagedProfile(UserManager userManager) {
-        UserInfo currentUser = userManager.getUserInfo(userManager.getUserHandle());
-        return currentUser.isManagedProfile();
+    public static boolean isManagedProfile(@NonNull UserManager userManager) {
+        return isManagedProfile(userManager, UserHandle.myUserId());
+    }
+
+    /**
+     * Returns true if the userId passed in is a managed profile.
+     *
+     * @throws IllegalArgumentException if userManager is null.
+     */
+    public static boolean isManagedProfile(@NonNull UserManager userManager, int userId) {
+        if (userManager == null) {
+            throw new IllegalArgumentException("userManager must not be null");
+        }
+        UserInfo userInfo = userManager.getUserInfo(userId);
+        return (userInfo != null) ? userInfo.isManagedProfile() : false;
     }
 
     /**
@@ -932,17 +960,17 @@
     }
 
     /**
-     * Returns the user id present in the bundle with {@link ChooseLockGeneric#KEY_USER_ID} if it
+     * Returns the user id present in the bundle with {@link Intent#EXTRA_USER_ID} if it
      * belongs to the current user.
      *
      * @throws SecurityException if the given userId does not belong to the current user group.
      */
-    public static int getSameOwnerUserId(Context context, Bundle bundle) {
+    public static int getUserIdFromBundle(Context context, Bundle bundle) {
         if (bundle == null) {
-            return getEffectiveUserId(context);
+            return getCredentialOwnerUserId(context);
         }
         int userId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId());
-        return getSameOwnerUserId(context, userId);
+        return enforceSameOwner(context, userId);
     }
 
     /**
@@ -950,27 +978,28 @@
      *
      * @throws SecurityException if the given userId does not belong to the current user group.
      */
-    public static int getSameOwnerUserId(Context context, int userId) {
-        UserManager um = UserManager.get(context);
-        if (um != null) {
-            if (um.getUserProfiles().contains(new UserHandle(userId))) {
-                return userId;
-            } else {
-                throw new SecurityException("Given user id " + userId + " does not belong to user "
-                        + UserHandle.myUserId());
-            }
+    public static int enforceSameOwner(Context context, int userId) {
+        UserManager um = getUserManager(context);
+        if (!um.getUserProfiles().contains(new UserHandle(userId))) {
+            throw new SecurityException("Given user id " + userId + " does not belong to user "
+                    + UserHandle.myUserId());
         }
-        return getEffectiveUserId(context);
+        return userId;
     }
 
-    public static int getEffectiveUserId(Context context) {
-        UserManager um = UserManager.get(context);
-        if (um != null) {
-            return um.getCredentialOwnerProfile(UserHandle.myUserId());
-        } else {
-            Log.e(TAG, "Unable to acquire UserManager");
-            return UserHandle.myUserId();
-        }
+    /**
+     * Returns the effective credential owner of the calling user.
+     */
+    public static int getCredentialOwnerUserId(Context context) {
+        return getCredentialOwnerUserId(context, UserHandle.myUserId());
+    }
+
+    /**
+     * Returns the user id of the credential owner of the given user id.
+     */
+    public static int getCredentialOwnerUserId(Context context, int userId) {
+        UserManager um = getUserManager(context);
+        return um.getCredentialOwnerProfile(userId);
     }
 
     public static int resolveResource(Context context, int attr) {
