diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index 55f0dbf..72b9a12 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -342,7 +342,7 @@
     <string name="screenshot_crop_behavior_summary"></string>-->
 
     <string name="lockscreen_qs_disabled_title">Disable quick settings when locked</string>
-    <string name="lockscreen_qs_disabled_summary">Disable expanding quick settings on secure lock screens</string>
+    <string name="lockscreen_qs_disabled_summary">Disable shortcuts and expanding quick settings on secure lock screens</string>
 
     <string name="status_bar_quick_qs_pulldown_title">Quick pulldown</string>
     <string name="status_bar_quick_qs_pulldown_summary">%1$s edge of the status bar pulls down Quick Settings</string>
diff --git a/res/xml/lockscreen_settings.xml b/res/xml/lockscreen_settings.xml
index 9b95bcb..e0f97d2 100644
--- a/res/xml/lockscreen_settings.xml
+++ b/res/xml/lockscreen_settings.xml
@@ -16,7 +16,7 @@
  -->
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
-
+<!--
     <PreferenceCategory
         android:key="lockscreen_shortcut"
         android:title="@string/lockscreen_shortcut_title" >
@@ -54,24 +54,24 @@
             android:persistent="false"
             android:dependency="lockscreen_shortcuts_enable" />
     </PreferenceCategory>
-
+-->
     <PreferenceCategory
         android:key="lockscreen_other"
         android:title="@string/other_category" >
-
+<!--
         <com.android.settings.preference.SystemSettingSwitchPreference
             android:key="lockscreen_indicator_display"
             android:title="@string/lockscreen_indicator_display_title"
             android:summary="@string/lockscreen_indicator_display_summary"
             android:defaultValue="true" />
-
-        <com.android.settings.preference.SecureSettingSwitchPreference
+-->
+        <org.omnirom.omnigears.preference.SecureSettingSwitchPreference
             android:key="lockscreen_qs_disabled"
             android:title="@string/lockscreen_qs_disabled_title"
             android:summary="@string/lockscreen_qs_disabled_summary"/>
 
     </PreferenceCategory>
-
+<!--
     <PreferenceCategory
         android:key="lockscreen_wallpaper"
         android:title="@string/lockscreen_wallpaper_title" >
@@ -143,5 +143,5 @@
             android:dependency="lockscreen_clock_enable" />
 
     </PreferenceCategory>
-
+-->
 </PreferenceScreen>
diff --git a/src/org/omnirom/omnigears/interfacesettings/LockscreenSettings.java b/src/org/omnirom/omnigears/interfacesettings/LockscreenSettings.java
index 77e82be..d46ab78 100644
--- a/src/org/omnirom/omnigears/interfacesettings/LockscreenSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/LockscreenSettings.java
@@ -14,6 +14,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
+*/
 package org.omnirom.omnigears.interfacesettings;
 
 import android.app.Activity;
@@ -25,16 +26,16 @@
 import android.graphics.Typeface;
 import android.net.Uri;
 import android.os.Bundle;
-import android.preference.CheckBoxPreference;
-import android.preference.Preference;
-import android.preference.PreferenceScreen;
-import android.preference.SwitchPreference;
+import android.support.v7.preference.CheckBoxPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v14.preference.SwitchPreference;
 import android.provider.Settings;
 import android.provider.SearchIndexableResource;
 import android.text.TextUtils;
 import android.widget.Toast;
 
-import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
@@ -44,7 +45,7 @@
 import org.omnirom.omnigears.preference.FontPreference;
 import org.omnirom.omnigears.preference.NumberPickerPreference;
 import org.omnirom.omnigears.preference.ColorPickerPreference;
-import org.omnirom.omnigears.ui.ShortcutDialog;
+//import org.omnirom.omnigears.ui.ShortcutDialog;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -54,7 +55,7 @@
 
 public class LockscreenSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener, Indexable {
-    public static final int IMAGE_PICK = 1;
+/*    public static final int IMAGE_PICK = 1;
 
     private static final String KEY_WALLPAPER_SET = "lockscreen_wallpaper_set";
     private static final String KEY_WALLPAPER_CLEAR = "lockscreen_wallpaper_clear";
@@ -76,10 +77,10 @@
     private CheckBoxPreference mClockDisplayDate;
     private CheckBoxPreference mClockDisplayAlarm;
     private Preference mShortcuts;
-
+*/
     @Override
     protected int getMetricsCategory() {
-        return MetricsLogger.OMNI_SETTINGS;
+        return MetricsEvent.OMNI_SETTINGS;
     }
 
     @Override
@@ -87,7 +88,7 @@
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.lockscreen_settings);
 
-        mSetWallpaper = (Preference) findPreference(KEY_WALLPAPER_SET);
+/*        mSetWallpaper = (Preference) findPreference(KEY_WALLPAPER_SET);
         mClearWallpaper = (Preference) findPreference(KEY_WALLPAPER_CLEAR);
 
         mClockFont = (FontPreference) findPreference(KEY_CLOCK_FONT);
@@ -132,11 +133,12 @@
         mClockDisplayAlarm.setChecked((clockDisplay & Settings.System.LOCK_CLOCK_ALARM) == Settings.System.LOCK_CLOCK_ALARM);
 
         mShortcuts = findPreference(KEY_SHORTCUTS);
+*/
     }
 
     @Override
-    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-        ContentResolver resolver = getContentResolver();
+    public boolean onPreferenceTreeClick(Preference preference) {
+/*        ContentResolver resolver = getContentResolver();
         if (preference == mSetWallpaper) {
             setKeyguardWallpaper();
             return true;
@@ -162,18 +164,19 @@
             d.show();
             return true;
         }
-        return super.onPreferenceTreeClick(preferenceScreen, preference);
+*/
+        return super.onPreferenceTreeClick(preference);
     }
-
+/*
     private int getCurrentClockDisplayValue() {
         return (mClockDisplayTime.isChecked() ? Settings.System.LOCK_CLOCK_TIME : 0) +
             (mClockDisplayDate.isChecked() ? Settings.System.LOCK_CLOCK_DATE : 0) +
             (mClockDisplayAlarm.isChecked() ? Settings.System.LOCK_CLOCK_ALARM : 0);
     }
-
+*/
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
-        ContentResolver resolver = getContentResolver();
+/*        ContentResolver resolver = getContentResolver();
         if (preference == mClockFont) {
             String value = (String) newValue;
             int valueIndex = mClockFont.findIndexOfValue(value);
@@ -188,9 +191,10 @@
             mClockSize.setSummary(String.valueOf(value));
             Settings.System.putInt(resolver, Settings.System.LOCK_CLOCK_SIZE, value);
         }
+*/
         return true;
     }
-
+/*
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == IMAGE_PICK && resultCode == Activity.RESULT_OK) {
@@ -217,7 +221,7 @@
         wallpaperManager = WallpaperManager.getInstance(getActivity());
         wallpaperManager.clearKeyguardWallpaper();
     }
-
+*/
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
@@ -239,4 +243,4 @@
                     return result;
                 }
             };
-}*/
+}
