diff --git a/res/values/strings.xml b/res/values/strings.xml
index dd980f9..094f44f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5030,15 +5030,15 @@
     <!-- Notifications on lockscreen -->
     <!-- Label for checkbox controlling the contents of notifications shown on
          the secure lockscreen [CHAR LIMIT=25] -->
-    <string name="lock_screen_notifications">Show on lock screen</string>
+    <string name="lock_screen_notifications">When device is locked</string>
     <!-- Summary for lock_screen_notifications: sensitive information will be
          hidden or redacted from notifications shown on a secure lock screen
          [CHAR LIMIT=50] -->
-    <string name="lock_screen_notifications_summary_off">Unless content is sensitive</string>
+    <string name="lock_screen_notifications_summary_hide">Hide sensitive notification content</string>
     <!-- Summary for lock_screen_notifications: all information will be
          shown in notifications shown on a secure lock screen
          [CHAR LIMIT=50] -->
-    <string name="lock_screen_notifications_summary_on">All notifications</string>
+    <string name="lock_screen_notifications_summary_show">Show all notification content</string>
 
     <!-- [CHAR LIMIT=30] Notification settings screen, setting option name -->
     <string name="title_zen_mode">Do not disturb</string>
diff --git a/res/xml/notification_settings.xml b/res/xml/notification_settings.xml
index 51b153e..8cc1069 100644
--- a/res/xml/notification_settings.xml
+++ b/res/xml/notification_settings.xml
@@ -36,11 +36,9 @@
             android:title="@string/heads_up_enabled_title"
             android:persistent="false" />
 
-    <CheckBoxPreference
+    <com.android.settings.notification.DropDownPreference
             android:key="toggle_lock_screen_notifications"
             android:title="@string/lock_screen_notifications"
-            android:summaryOff="@string/lock_screen_notifications_summary_off"
-            android:summaryOn="@string/lock_screen_notifications_summary_on"
             android:persistent="false" />
 
     <PreferenceScreen
diff --git a/src/com/android/settings/notification/DropDownPreference.java b/src/com/android/settings/notification/DropDownPreference.java
new file mode 100644
index 0000000..15452a1
--- /dev/null
+++ b/src/com/android/settings/notification/DropDownPreference.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import android.content.Context;
+import android.preference.Preference;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Spinner;
+import android.widget.AdapterView.OnItemSelectedListener;
+
+public class DropDownPreference extends Preference {
+    private final Context mContext;
+    private final ArrayAdapter<String> mAdapter;
+    private final Spinner mSpinner;
+
+    private Callback mCallback;
+
+    public DropDownPreference(Context context) {
+        this(context, null);
+    }
+
+    public DropDownPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mContext = context;
+        mAdapter = new ArrayAdapter<String>(mContext,
+                android.R.layout.simple_spinner_dropdown_item);
+
+        mSpinner = new Spinner(mContext);
+
+        mSpinner.setVisibility(View.INVISIBLE);
+        mSpinner.setAdapter(mAdapter);
+        mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
+                setSelectedItem(position);
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+                // noop
+            }
+        });
+        setPersistent(false);
+        setOnPreferenceClickListener(new OnPreferenceClickListener() {
+            @Override
+            public boolean onPreferenceClick(Preference preference) {
+                mSpinner.performClick();
+                return true;
+            }
+        });
+    }
+
+    public void setDropDownWidth(int dimenResId) {
+        mSpinner.setDropDownWidth(mContext.getResources().getDimensionPixelSize(dimenResId));
+    }
+
+    public void setCallback(Callback callback) {
+        mCallback = callback;
+    }
+
+    public void setSelectedItem(int position) {
+        if (mCallback != null && !mCallback.onItemSelected(position)) {
+            return;
+        }
+        mSpinner.setSelection(position);
+        setSummary(mAdapter.getItem(position));
+        final boolean disableDependents = position == 0;
+        notifyDependencyChange(disableDependents);
+    }
+
+    public void addItem(int resId) {
+        mAdapter.add(mContext.getResources().getString(resId));
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+        if (view.equals(mSpinner.getParent())) return;
+        if (mSpinner.getParent() != null) {
+            ((ViewGroup)mSpinner.getParent()).removeView(mSpinner);
+        }
+        final ViewGroup vg = (ViewGroup)view;
+        vg.addView(mSpinner, 0);
+        final ViewGroup.LayoutParams lp = mSpinner.getLayoutParams();
+        lp.width = 0;
+        mSpinner.setLayoutParams(lp);
+    }
+
+    public interface Callback {
+        boolean onItemSelected(int pos);
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/notification/NotificationSettings.java b/src/com/android/settings/notification/NotificationSettings.java
index 24863cd..2d613e4 100644
--- a/src/com/android/settings/notification/NotificationSettings.java
+++ b/src/com/android/settings/notification/NotificationSettings.java
@@ -57,7 +57,7 @@
 
     private Preference mNotificationSoundPreference;
     private Preference mNotificationAccess;
-    private TwoStatePreference mLockscreenNotifications;
+    private DropDownPreference mLockscreenNotifications;
     private TwoStatePreference mHeadsUp;
     private TwoStatePreference mNotificationPulse;
 
@@ -113,12 +113,24 @@
         refreshNotificationListeners();
 
         mLockscreenNotifications
-                = (TwoStatePreference) root.findPreference(KEY_LOCK_SCREEN_NOTIFICATIONS);
+                = (DropDownPreference) root.findPreference(KEY_LOCK_SCREEN_NOTIFICATIONS);
         if (mLockscreenNotifications != null) {
             if (!getDeviceLockscreenNotificationsEnabled()) {
                 root.removePreference(mLockscreenNotifications);
             } else {
-                mLockscreenNotifications.setChecked(getLockscreenAllowPrivateNotifications());
+                mLockscreenNotifications.addItem(R.string.lock_screen_notifications_summary_show);
+                mLockscreenNotifications.addItem(R.string.lock_screen_notifications_summary_hide);
+                final int pos = getLockscreenAllowPrivateNotifications() ? 0 : 1;
+                mLockscreenNotifications.setSelectedItem(pos);
+                mLockscreenNotifications.setCallback(new DropDownPreference.Callback() {
+                    @Override
+                    public boolean onItemSelected(int pos) {
+                        final int val = pos == 0 ? 1 : 0;
+                        Settings.Secure.putInt(getContentResolver(),
+                                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, val);
+                        return true;
+                    }
+                });
             }
         }
 
@@ -164,11 +176,7 @@
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         final String key = preference.getKey();
 
-        if (KEY_LOCK_SCREEN_NOTIFICATIONS.equals(key)) {
-            Settings.Secure.putInt(getContentResolver(),
-                    Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
-                    mLockscreenNotifications.isChecked() ? 1 : 0);
-        } else if (KEY_HEADS_UP.equals(key)) {
+        if (KEY_HEADS_UP.equals(key)) {
             setHeadsUpMode(getContentResolver(), mHeadsUp.isChecked());
         } else if (KEY_NOTIFICATION_PULSE.equals(key)) {
             Settings.System.putInt(getContentResolver(),
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index d7d25cf..050d2e9 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -47,12 +47,8 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemSelectedListener;
-import android.widget.ArrayAdapter;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.Spinner;
 import android.widget.Switch;
 import android.widget.TextView;
 import android.widget.TimePicker;
@@ -144,6 +140,7 @@
         mStarred = new DropDownPreference(mContext);
         mStarred.setEnabled(false);
         mStarred.setTitle(R.string.zen_mode_from);
+        mStarred.setDropDownWidth(R.dimen.zen_mode_dropdown_width);
         mStarred.addItem(R.string.zen_mode_from_anyone);
         mStarred.addItem(R.string.zen_mode_from_starred);
         mStarred.addItem(R.string.zen_mode_from_contacts);
@@ -168,6 +165,7 @@
         mWhen = new DropDownPreference(mContext);
         mWhen.setKey(KEY_WHEN);
         mWhen.setTitle(R.string.zen_mode_when);
+        mWhen.setDropDownWidth(R.dimen.zen_mode_dropdown_width);
         mWhen.addItem(R.string.zen_mode_when_never);
         mWhen.addItem(R.string.zen_mode_when_every_night);
         mWhen.addItem(R.string.zen_mode_when_weeknights);
@@ -462,80 +460,4 @@
             boolean onSetTime(int hour, int minute);
         }
     }
-
-    private static class DropDownPreference extends Preference {
-        private final Context mContext;
-        private final ArrayAdapter<String> mAdapter;
-        private final Spinner mSpinner;
-
-        private Callback mCallback;
-
-        public DropDownPreference(Context context) {
-            super(context);
-            mContext = context;
-            mAdapter = new ArrayAdapter<String>(mContext,
-                    android.R.layout.simple_spinner_dropdown_item);
-
-            mSpinner = new Spinner(mContext);
-            mSpinner.setDropDownWidth(mContext.getResources()
-                    .getDimensionPixelSize(R.dimen.zen_mode_dropdown_width));
-            mSpinner.setVisibility(View.INVISIBLE);
-            mSpinner.setAdapter(mAdapter);
-            mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
-                @Override
-                public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
-                    setSelectedItem(position);
-                }
-
-                @Override
-                public void onNothingSelected(AdapterView<?> parent) {
-                    // noop
-                }
-            });
-            setPersistent(false);
-            setOnPreferenceClickListener(new OnPreferenceClickListener() {
-                @Override
-                public boolean onPreferenceClick(Preference preference) {
-                    mSpinner.performClick();
-                    return true;
-                }
-            });
-        }
-
-        public void setCallback(Callback callback) {
-            mCallback = callback;
-        }
-
-        public void setSelectedItem(int position) {
-            if (mCallback != null && !mCallback.onItemSelected(position)) {
-                return;
-            }
-            mSpinner.setSelection(position);
-            setSummary(mAdapter.getItem(position));
-            final boolean disableDependents = position == 0;
-            notifyDependencyChange(disableDependents);
-        }
-
-        public void addItem(int resId) {
-            mAdapter.add(mContext.getResources().getString(resId));
-        }
-
-        @Override
-        protected void onBindView(View view) {
-            super.onBindView(view);
-            if (view.equals(mSpinner.getParent())) return;
-            if (mSpinner.getParent() != null) {
-                ((ViewGroup)mSpinner.getParent()).removeView(mSpinner);
-            }
-            final ViewGroup vg = (ViewGroup)view;
-            vg.addView(mSpinner, 0);
-            final ViewGroup.LayoutParams lp = mSpinner.getLayoutParams();
-            lp.width = 0;
-            mSpinner.setLayoutParams(lp);
-        }
-
-        public interface Callback {
-            boolean onItemSelected(int pos);
-        }
-    }
 }
