diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index 32c28fd..5d7a224 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -179,17 +179,14 @@
     <string name="statusbar_battery_charging_color_enable_summary"></string>
     <string name="battery_enable_title">Show battery</string>
 
-    <string name="button_brightness_title">Brightness</string>
-    <string name="button_brightness_summary">Button backlight brightness</string>
+    <string name="button_backlight_title">Button backlight</string>
     <string name="button_timeout_title">Backlight timeout</string>
     <string name="button_timeout_summary">Disabled on value 0</string>
-    <string name="button_no_brightness">Dark mode</string>
-    <string name="button_no_brightness_summary">Don\'t set button brightness</string>
     <string name="button_link_brightness">Link to screen</string>
     <string name="button_link_brightness_summary">Use screen brightness level</string>
     <string name="button_manual_brightness">Brightness level</string>
-    <string name="dialog_manual_brightness_title">Brightness level</string>
     <string name="unit_sec">sec</string>
+    <string name="button_backlight_enable_title">Enable</string>
 
     <string name="navigation_bar_show_title">Show navigation bar</string>
     <string name="navigation_bar_show_summary">Force enable navigation bar</string>
diff --git a/res/xml/ambient_settings.xml b/res/xml/ambient_settings.xml
index 7c61091..729c881 100644
--- a/res/xml/ambient_settings.xml
+++ b/res/xml/ambient_settings.xml
@@ -54,9 +54,11 @@
                     android:defaultValue="true"
                     android:dependency="doze_overwrite_value" />
 
-            <Preference
+            <com.android.settings.preference.SeekBarPreference
                     android:key="doze_brightness_level"
                     android:title="@string/doze_brightness_level_title"
+                    android:max="255"
+                    settings:min="0"
                     android:persistent="false"
                     android:dependency="doze_overwrite_value" />
 
diff --git a/res/xml/button_brightness_settings.xml b/res/xml/button_brightness_settings.xml
index 941552c..68288ee 100644
--- a/res/xml/button_brightness_settings.xml
+++ b/res/xml/button_brightness_settings.xml
@@ -19,22 +19,24 @@
         android:title="@string/button_brightness_title"
         xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
 
-        <com.android.settings.preference.SeekBarPreference
-                android:key="button_manual_brightness_new"
-                android:title="@string/button_manual_brightness"
-                android:max="255"
-                settings:min="0"
-                android:persistent="false" />
-        <CheckBoxPreference
-                android:key="button_no_brightness"
-                android:title="@string/button_no_brightness"
-                android:summary="@string/button_no_brightness_summary"
+        <SwitchPreference
+                android:key="button_backlight_enable"
+                android:title="@string/button_backlight_enable_title"
                 android:persistent="false"/>
         <CheckBoxPreference
                 android:key="button_link_brightness"
                 android:title="@string/button_link_brightness"
                 android:summary="@string/button_link_brightness_summary"
-                android:persistent="false"/>
+                android:persistent="false"
+                android:dependency="button_backlight_enable"
+                android:disableDependentsState="true" />
+        <com.android.settings.preference.SeekBarPreference
+                android:key="button_manual_brightness_new"
+                android:title="@string/button_manual_brightness"
+                android:max="255"
+                settings:min="0"
+                android:persistent="false"
+                android:dependency="button_link_brightness" />
         <com.android.settings.preference.SeekBarPreference
                 android:key="button_timeout"
                 android:title="@string/button_timeout_title"
@@ -43,5 +45,6 @@
                 settings:min="0"
                 settings:unitsLeft=""
                 settings:unitsRight="@string/unit_sec"
-                android:persistent="false" />
+                android:persistent="false"
+                android:dependency="button_backlight_enable" />
 </PreferenceScreen>
diff --git a/res/xml/button_settings.xml b/res/xml/button_settings.xml
index 4a5e9dd..9aec1fb 100644
--- a/res/xml/button_settings.xml
+++ b/res/xml/button_settings.xml
@@ -102,8 +102,7 @@
 
         <PreferenceScreen
             android:key="button_brightness"
-            android:title="@string/button_brightness_title"
-            android:summary="@string/button_brightness_summary"
+            android:title="@string/button_backlight_title"
             android:fragment="org.omnirom.omnigears.brightness.ButtonBrightnessSettings" />
 
         <!--<SwitchPreference
diff --git a/src/org/omnirom/omnigears/AmbientSettings.java b/src/org/omnirom/omnigears/AmbientSettings.java
index 92ade63..4814e6a 100644
--- a/src/org/omnirom/omnigears/AmbientSettings.java
+++ b/src/org/omnirom/omnigears/AmbientSettings.java
@@ -49,6 +49,7 @@
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.preference.SeekBarPreference;
 import com.android.settings.preference.SystemCheckBoxPreference;
 import org.omnirom.omnigears.sensor.ShakeSensorManager;
 
@@ -84,8 +85,8 @@
     private ShakeSensorManager mShakeSensorManager;
     private AlertDialog mDialog;
     private Button mShakeFoundButton;
-    private DozeBrightnessDialog mDozeBrightnessDialog;
-    private Preference mDozeBrightness;
+    private SeekBarPreference mDozeBrightness;
+    private int mCurrentBrightness;
 
     @Override
     protected int getMetricsCategory() {
@@ -132,7 +133,16 @@
         updateDozeOptions();
         mShakeSensorManager = new ShakeSensorManager(activity, this);
 
-        mDozeBrightness = (Preference) findPreference(KEY_DOZE_BRIGHTNESS_LEVEL);
+        final int dozeBrightnessConfig = getResources().getInteger(
+                com.android.internal.R.integer.config_screenBrightnessDoze);
+        mCurrentBrightness = Settings.System.getInt(getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_DOZE, dozeBrightnessConfig);
+        mDozeBrightness = (SeekBarPreference) findPreference(KEY_DOZE_BRIGHTNESS_LEVEL);
+        PowerManager pm = (PowerManager)activity.getSystemService(Context.POWER_SERVICE);
+        mDozeBrightness.setMaxValue(pm.getMaximumScreenBrightnessSetting());
+        mDozeBrightness.setMinValue(pm.getMinimumScreenBrightnessSetting());
+        mDozeBrightness.setValue(mCurrentBrightness);
+        mDozeBrightness.setOnPreferenceChangeListener(this);
     }
 
     private static boolean isAccelerometerAvailable(Context context) {
@@ -408,9 +418,6 @@
         if (preference == findPreference(KEY_DOZE_OVERWRITE_VALUE)) {
             updateDozeListMode();
             return true;
-        } else if (preference == mDozeBrightness) {
-            showDozeBrightnessDialog();
-            return true;
         }
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
@@ -457,121 +464,14 @@
             int index = mDozeListMode.findIndexOfValue((String) objValue);
             mDozeListMode.setSummary(mDozeListMode.getEntries()[index]);
         }
+        if (preference == mDozeBrightness) {
+            mCurrentBrightness = (Integer) objValue;
+            Settings.System.putInt(getContentResolver(),
+                    Settings.System.SCREEN_BRIGHTNESS_DOZE, mCurrentBrightness);
+        }
         return true;
     }
 
-    private void showDozeBrightnessDialog() {
-        if (mDozeBrightnessDialog != null && mDozeBrightnessDialog.isShowing()) {
-            return;
-        }
-
-        mDozeBrightnessDialog = new DozeBrightnessDialog(getActivity());
-        mDozeBrightnessDialog.show();
-    }
-
-    private class DozeBrightnessDialog extends AlertDialog implements DialogInterface.OnClickListener {
-
-        private SeekBar mBacklightBar;
-        private EditText mBacklightInput;
-        private int mCurrentBrightness;
-        private int mMaxBrightness;
-
-        public DozeBrightnessDialog(Context context) {
-            super(context);
-        }
-
-        @Override
-        protected void onCreate(Bundle savedInstanceState) {
-            final View v = getLayoutInflater().inflate(R.layout.dialog_manual_brightness, null);
-            final Context context = getContext();
-
-            mBacklightBar = (SeekBar) v.findViewById(R.id.backlight);
-            mBacklightInput = (EditText) v.findViewById(R.id.backlight_input);
-
-            setTitle(R.string.dialog_manual_brightness_title);
-            setCancelable(true);
-            setView(v);
-
-            final int dozeBrightnessConfig = getResources().getInteger(
-                    com.android.internal.R.integer.config_screenBrightnessDoze);
-            mCurrentBrightness = Settings.System.getInt(getContentResolver(),
-                    Settings.System.SCREEN_BRIGHTNESS_DOZE, dozeBrightnessConfig);
-
-            final PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
-            mMaxBrightness = pm.getMaximumScreenBrightnessSetting();
-            mBacklightBar.setMax(mMaxBrightness);
-            mBacklightBar.setProgress(mCurrentBrightness);
-            mBacklightInput.setText(String.valueOf(mCurrentBrightness));
-
-            initListeners();
-
-            setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(R.string.ok), this);
-            setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), this);
-
-            super.onCreate(savedInstanceState);
-        }
-
-        @Override
-        public void onClick(DialogInterface dialog, int which) {
-            if (which == DialogInterface.BUTTON_POSITIVE) {
-                try {
-                    int newBacklight = Integer.valueOf(mBacklightInput.getText().toString());
-                    Settings.System.putInt(getContext().getContentResolver(),
-                            Settings.System.SCREEN_BRIGHTNESS_DOZE, newBacklight);
-                } catch (NumberFormatException e) {
-                    Log.d(TAG, "NumberFormatException " + e);
-                }
-            }
-        }
-
-        private void initListeners() {
-            mBacklightBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
-                @Override
-                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-                    if (seekBar.getProgress() > 0) {
-                        mBacklightInput.setText(String.valueOf(seekBar.getProgress()));
-                    }
-                }
-                @Override
-                public void onStartTrackingTouch(SeekBar seekBar) {
-                }
-                @Override
-                public void onStopTrackingTouch(SeekBar seekBar) {
-                }
-            });
-
-            mBacklightInput.addTextChangedListener(new TextWatcher() {
-                @Override
-                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-                }
-                @Override
-                public void onTextChanged(CharSequence s, int start, int before, int count) {
-                }
-                @Override
-                public void afterTextChanged(Editable s) {
-                    boolean ok = false;
-                    try {
-                        int minValue = 1;
-                        int maxValue = mMaxBrightness;
-                        int newBrightness = Integer.valueOf(s.toString());
-
-                        if (newBrightness >= minValue && newBrightness <= maxValue) {
-                            ok = true;
-                            mBacklightBar.setProgress(newBrightness);
-                        }
-                    } catch (NumberFormatException e) {
-                        //ignored, ok is false ayway
-                    }
-
-                    Button okButton = mDozeBrightnessDialog.getButton(DialogInterface.BUTTON_POSITIVE);
-                    if (okButton != null) {
-                        okButton.setEnabled(ok);
-                    }
-                }
-            });
-        }
-    }
-
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
diff --git a/src/org/omnirom/omnigears/ButtonBrightnessSettings.java b/src/org/omnirom/omnigears/ButtonBrightnessSettings.java
index e5b56fd..3d91713 100644
--- a/src/org/omnirom/omnigears/ButtonBrightnessSettings.java
+++ b/src/org/omnirom/omnigears/ButtonBrightnessSettings.java
@@ -34,6 +34,7 @@
 import android.preference.ListPreference;
 import android.preference.CheckBoxPreference;
 import android.preference.PreferenceCategory;
+import android.preference.SwitchPreference;
 import android.provider.Settings;
 import android.provider.SearchIndexableResource;
 import android.view.View;
@@ -61,12 +62,12 @@
         Preference.OnPreferenceChangeListener, Indexable {
     private static final String TAG = "ButtonBrightnessSettings";
 
-    private static final String KEY_BUTTON_NO_BRIGHTNESS = "button_no_brightness";
+    private static final String KEY_BUTTON_BACKLIGHT_ENABLE = "button_backlight_enable";
     private static final String KEY_BUTTON_LINK_BRIGHTNESS = "button_link_brightness";
     private static final String KEY_BUTTON_MANUAL_BRIGHTNESS_NEW = "button_manual_brightness_new";
     private static final String KEY_BUTTON_TIMEOUT = "button_timeout";
 
-    private CheckBoxPreference mNoButtonBrightness;
+    private SwitchPreference mButtonBacklightEnable;
     private CheckBoxPreference mLinkButtonBrightness;
     private IPowerManager mPowerService;
     private SeekBarPreference mButtonTimoutBar;
@@ -84,9 +85,9 @@
         PreferenceScreen prefSet = getPreferenceScreen();
         ContentResolver resolver = getContentResolver();
 
-        mNoButtonBrightness = (CheckBoxPreference) findPreference(KEY_BUTTON_NO_BRIGHTNESS);
-        mNoButtonBrightness.setChecked(Settings.System.getInt(resolver,
-                Settings.System.CUSTOM_BUTTON_DISABLE_BRIGHTNESS, 0) != 0);
+        mButtonBacklightEnable = (SwitchPreference) findPreference(KEY_BUTTON_BACKLIGHT_ENABLE);
+        mButtonBacklightEnable.setChecked(Settings.System.getInt(resolver,
+                Settings.System.CUSTOM_BUTTON_DISABLE_BRIGHTNESS, 0) == 0);
 
         mLinkButtonBrightness = (CheckBoxPreference) findPreference(KEY_BUTTON_LINK_BRIGHTNESS);
         mLinkButtonBrightness.setChecked(Settings.System.getInt(resolver,
@@ -97,6 +98,8 @@
                 com.android.internal.R.integer.config_button_brightness_default);
         final int currentBrightness = Settings.System.getInt(resolver,
                 Settings.System.CUSTOM_BUTTON_BRIGHTNESS, customButtonBrightness);
+        PowerManager pm = (PowerManager)getActivity().getSystemService(Context.POWER_SERVICE);
+        mManualButtonBrightnessNew.setMaxValue(pm.getMaximumScreenBrightnessSetting());
         mManualButtonBrightnessNew.setValue(currentBrightness);
         mManualButtonBrightnessNew.setOnPreferenceChangeListener(this);
 
@@ -107,39 +110,19 @@
         mButtonTimoutBar.setOnPreferenceChangeListener(this);
 
         mPowerService = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
-
-        updateEnablement();
-    }
-
-    private void updateEnablement() {
-        if (mNoButtonBrightness.isChecked()){
-            mLinkButtonBrightness.setEnabled(false);
-            mButtonTimoutBar.setEnabled(false);
-            mManualButtonBrightnessNew.setEnabled(false);
-        } else if (mLinkButtonBrightness.isChecked()){
-            mNoButtonBrightness.setEnabled(false);
-            mManualButtonBrightnessNew.setEnabled(false);
-        } else {
-            mNoButtonBrightness.setEnabled(true);
-            mLinkButtonBrightness.setEnabled(true);
-            mButtonTimoutBar.setEnabled(true);
-            mManualButtonBrightnessNew.setEnabled(true);
-        }
     }
 
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-        if (preference == mNoButtonBrightness) {
-            boolean checked = ((CheckBoxPreference)preference).isChecked();
+        if (preference == mButtonBacklightEnable) {
+            boolean checked = ((SwitchPreference)preference).isChecked();
             Settings.System.putInt(getContentResolver(),
-                    Settings.System.CUSTOM_BUTTON_DISABLE_BRIGHTNESS, checked ? 1:0);
-            updateEnablement();
+                    Settings.System.CUSTOM_BUTTON_DISABLE_BRIGHTNESS, checked ? 0 : 1);
             return true;
         } else if (preference == mLinkButtonBrightness) {
             boolean checked = ((CheckBoxPreference)preference).isChecked();
             Settings.System.putInt(getContentResolver(),
-                    Settings.System.CUSTOM_BUTTON_USE_SCREEN_BRIGHTNESS, checked ? 1:0);
-            updateEnablement();
+                    Settings.System.CUSTOM_BUTTON_USE_SCREEN_BRIGHTNESS, checked ? 1 : 0);
             return true;
         }
         return super.onPreferenceTreeClick(preferenceScreen, preference);
diff --git a/src/org/omnirom/omnigears/interfacesettings/GlobalActionsSettings.java b/src/org/omnirom/omnigears/interfacesettings/GlobalActionsSettings.java
index 3cffc44..cb7ecbe 100644
--- a/src/org/omnirom/omnigears/interfacesettings/GlobalActionsSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/GlobalActionsSettings.java
@@ -69,6 +69,7 @@
 
         final String[] allActions = getContext().getResources().getStringArray(
                 com.android.internal.R.array.values_globalActionsList);
+        final List<String> allActionssList = new ArrayList<String>(Arrays.asList(allActions));
 
         final String enabledActions = Settings.System.getString(contentResolver,
                 Settings.System.GLOBAL_ACTIONS_LIST);
@@ -88,22 +89,23 @@
         }
         final UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
         boolean multiUser = um.isUserSwitcherEnabled();
-        Preference userPref = null;
         int count = prefScreen.getPreferenceCount();
         for (int i = 0; i < count; i++) {
             Preference p = prefScreen.getPreference(i);
             if (p instanceof SwitchPreference) {
                 SwitchPreference action = (SwitchPreference) p;
                 String key = action.getKey();
+                if (!allActionssList.contains(key)) {
+                    prefScreen.removePreference(action);
+                    continue;
+                }
                 if (key.equals("users") && !multiUser) {
-                    userPref = action;
+                    prefScreen.removePreference(action);
+                    continue;
                 }
                 action.setChecked(mGlobalActionsMap.get(key));
             }
         }
-        if (userPref != null) {
-            prefScreen.removePreference(userPref);
-        }
     }
 
     @Override
