diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index 88282d3..317ae84 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -176,4 +176,6 @@
     <string name="omniswitch_dialog_running">OmniSwitch is not running. Please make sure to enable it before enabling it as recents.</string>
     <string name="omniswitch_dialog_unavail">OmniSwitch is not installed.</string>
     <string name="omniswitch_title">OmniSwitch</string>
+
+    <string name="doze_brightness_level_title">Brightness level</string>
 </resources>
diff --git a/res/xml/ambient_settings.xml b/res/xml/ambient_settings.xml
index 2a8c4c9..7c61091 100644
--- a/res/xml/ambient_settings.xml
+++ b/res/xml/ambient_settings.xml
@@ -54,6 +54,12 @@
                     android:defaultValue="true"
                     android:dependency="doze_overwrite_value" />
 
+            <Preference
+                    android:key="doze_brightness_level"
+                    android:title="@string/doze_brightness_level_title"
+                    android:persistent="false"
+                    android:dependency="doze_overwrite_value" />
+
             <PreferenceCategory
                     android:key="doze_pulse_category"
                     android:title="@string/doze_pulse_title" >
diff --git a/src/org/omnirom/omnigears/AmbientSettings.java b/src/org/omnirom/omnigears/AmbientSettings.java
index f433fdd..d004a07 100644
--- a/src/org/omnirom/omnigears/AmbientSettings.java
+++ b/src/org/omnirom/omnigears/AmbientSettings.java
@@ -28,6 +28,7 @@
 import android.database.ContentObserver;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.PowerManager;
 import android.os.SystemProperties;
 import android.preference.ListPreference;
 import android.preference.Preference;
@@ -37,8 +38,14 @@
 import android.preference.SwitchPreference;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
+import android.text.Editable;
 import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.View;
 import android.widget.Button;
+import android.widget.EditText;
+import android.widget.SeekBar;
 
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.preference.SystemCheckBoxPreference;
@@ -48,7 +55,7 @@
 import java.util.List;
 
 public class AmbientSettings extends SettingsPreferenceFragment implements
-        Preference.OnPreferenceChangeListener, OnPreferenceClickListener,
+        Preference.OnPreferenceChangeListener,
         Indexable, ShakeSensorManager.ShakeListener {
     private static final String TAG = "AmbientSettings";
 
@@ -62,6 +69,7 @@
     private static final String KEY_DOZE_SHAKE_CATEGORY = "doze_shake_category";
     private static final String KEY_DOZE_SHAKE_THRESHOLD = "doze_shake_threshold";
     private static final String KEY_DOZE_TIME_MODE = "doze_time_mode";
+    private static final String KEY_DOZE_BRIGHTNESS_LEVEL = "doze_brightness_level";
 
     private int mAccValue;
     private int mOldAccValue;
@@ -75,6 +83,8 @@
     private ShakeSensorManager mShakeSensorManager;
     private AlertDialog mDialog;
     private Button mShakeFoundButton;
+    private DozeBrightnessDialog mDozeBrightnessDialog;
+    private Preference mDozeBrightness;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -114,6 +124,8 @@
         updateDozeListMode();
         updateDozeOptions();
         mShakeSensorManager = new ShakeSensorManager(activity, this);
+
+        mDozeBrightness = (Preference) findPreference(KEY_DOZE_BRIGHTNESS_LEVEL);
     }
 
     private static boolean isAccelerometerAvailable(Context context) {
@@ -388,6 +400,10 @@
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         if (preference == findPreference(KEY_DOZE_OVERWRITE_VALUE)) {
             updateDozeListMode();
+            return true;
+        } else if (preference == mDozeBrightness) {
+            showDozeBrightnessDialog();
+            return true;
         }
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
@@ -437,9 +453,116 @@
         return true;
     }
 
-    @Override
-    public boolean onPreferenceClick(Preference preference) {
-        return false;
+    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 =
