diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 6f4f59877814d77eaf19625fecff31be2573b3ed..d8a910233bcc367dd2b3b103729127e324548bc3 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4222,6 +4222,13 @@ public final class Settings {
         public static final String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED =
             "lock_pattern_tactile_feedback_enabled";
 
+        /**
+         * Whether to scramble a pin unlock layout
+         * @hide
+         */
+        public static final String LOCKSCREEN_PIN_SCRAMBLE_LAYOUT =
+                "lockscreen_scramble_pin_layout";
+
         /**
          * A formatted string of the next alarm that is set, or the empty string
          * if there is no alarm set.
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
index 1efda7edee2f846011c904c8980f6eca0bd89886..09d78c63aa06b18eafba9f49f51eae6e2642af66 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
@@ -34,6 +34,13 @@ import com.android.settingslib.animation.DisappearAnimationUtils;
 import com.android.systemui.R;
 import com.android.systemui.statusbar.policy.DevicePostureController.DevicePostureInt;
 
+import android.provider.Settings;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 /**
  * Displays a PIN pad for unlocking.
  */
@@ -46,6 +53,9 @@ public class KeyguardPINView extends KeyguardPinBasedInputView {
     private int mDisappearYTranslation;
     private View[][] mViews;
     @DevicePostureInt private int mLastDevicePosture = DEVICE_POSTURE_UNKNOWN;
+    private boolean mScramblePin;
+
+    private List<Integer> mNumbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
 
     public KeyguardPINView(Context context) {
         this(context, null);
@@ -159,6 +169,31 @@ public class KeyguardPINView extends KeyguardPinBasedInputView {
                 new View[]{
                         null, mEcaView, null
                 }};
+
+        mScramblePin = Settings.System.getInt(getContext().getContentResolver(),
+                Settings.System.LOCKSCREEN_PIN_SCRAMBLE_LAYOUT, 0) == 1;
+        if (mScramblePin) {
+            Collections.shuffle(mNumbers);
+            // get all children who are NumPadKeys
+            List<NumPadKey> views = new ArrayList<>();
+
+            // mView contains all Views that make up the PIN pad; row0 = the entry test field, then
+            // rows 1-4 contain the buttons. Iterate over all views that make up the buttons in the
+            // pad
+            for (int row = 1; row < 5; row++) {
+                for (int column = 0; column < 3; column++) {
+                    View key = mViews[row][column];
+                    if (key instanceof NumPadKey) {
+                        views.add((NumPadKey) key);
+                    }
+                }
+            }
+            // reset the digits in the views
+            for (int i = 0; i < mNumbers.size(); i++) {
+                NumPadKey view = views.get(i);
+                view.setDigit(mNumbers.get(i));
+            }
+        }
     }
 
     @Override
@@ -210,6 +245,14 @@ public class KeyguardPINView extends KeyguardPinBasedInputView {
         setClipChildren(enable);
     }
 
+    @Override
+    protected int getNumberIndex(int number) {
+        if (mScramblePin) {
+            return (mNumbers.indexOf(number) + 1) % mNumbers.size();
+        }
+        return super.getNumberIndex(number);
+    }
+
     @Override
     public boolean hasOverlappingRendering() {
         return false;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
index 0b8868f6d3c48ecddf129d6ceb0045887f2aa90e..883f680d84d2f67e5119d31bb76b80937200c9d9 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -120,9 +120,13 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView
         }
     }
 
+    protected int getNumberIndex(int number) {
+        return number;
+    }
+
     private void performNumberClick(int number) {
         if (number >= 0 && number <= 9) {
-            mButtons[number].performClick();
+            mButtons[getNumberIndex(number)].performClick();
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
index e79ea9a44843e313ceabba47b53b1df1eb714c11..c3a0381438bbccb28f2b02840a6d8c761252748a 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
@@ -37,6 +37,8 @@ import com.android.internal.widget.LockPatternUtils;
 import com.android.settingslib.Utils;
 import com.android.systemui.R;
 
+import android.provider.Settings;
+
 public class NumPadKey extends ViewGroup {
     // list of "ABC", etc per digit, starting with '0'
     static String sKlondike[];
@@ -114,30 +116,41 @@ public class NumPadKey extends ViewGroup {
         mDigitText.setText(Integer.toString(mDigit));
         mKlondikeText = (TextView) findViewById(R.id.klondike_text);
 
+        updateText();
+        setContentDescription(mDigitText.getText().toString());
+
+        Drawable background = getBackground();
+        if (background instanceof RippleDrawable) {
+            mAnimator = new NumPadAnimator(context, (RippleDrawable) background,
+                    R.style.NumPadKey);
+        } else {
+            mAnimator = null;
+        }
+    }
+
+    public void setDigit(int digit) {
+        mDigit = digit;
+        updateText();
+    }
+
+    private void updateText() {
+       boolean scramblePin = (Settings.System.getInt(getContext().getContentResolver(),
+                Settings.System.LOCKSCREEN_PIN_SCRAMBLE_LAYOUT, 0) == 1);
         if (mDigit >= 0) {
+            mDigitText.setText(Integer.toString(mDigit));
             if (sKlondike == null) {
                 sKlondike = getResources().getStringArray(R.array.lockscreen_num_pad_klondike);
             }
             if (sKlondike != null && sKlondike.length > mDigit) {
                 String klondike = sKlondike[mDigit];
                 final int len = klondike.length();
-                if (len > 0) {
+                if (len > 0 || scramblePin) {
                     mKlondikeText.setText(klondike);
                 } else if (mKlondikeText.getVisibility() != View.GONE) {
                     mKlondikeText.setVisibility(View.INVISIBLE);
                 }
             }
         }
-
-        setContentDescription(mDigitText.getText().toString());
-
-        Drawable background = getBackground();
-        if (background instanceof RippleDrawable) {
-            mAnimator = new NumPadAnimator(context, (RippleDrawable) background,
-                    R.style.NumPadKey);
-        } else {
-            mAnimator = null;
-        }
     }
 
     @Override