diff --git a/src/com/android/settings/BrightnessPreference.java b/src/com/android/settings/BrightnessPreference.java
index eff5c50..a80ceb9 100644
--- a/src/com/android/settings/BrightnessPreference.java
+++ b/src/com/android/settings/BrightnessPreference.java
@@ -24,6 +24,7 @@
 import android.os.IPowerManager;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.PowerManager;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.preference.SeekBarDialogPreference;
@@ -37,6 +38,8 @@
 
 public class BrightnessPreference extends SeekBarDialogPreference implements
         SeekBar.OnSeekBarChangeListener, CheckBox.OnCheckedChangeListener {
+    private final int mScreenBrightnessMinimum;
+    private final int mScreenBrightnessMaximum;
 
     private SeekBar mSeekBar;
     private CheckBox mCheckBox;
@@ -51,12 +54,6 @@
 
     private boolean mRestoredOldState;
 
-    // Backlight range is from 0 - 255. Need to make sure that user
-    // doesn't set the backlight to 0 and get stuck
-    private int mScreenBrightnessDim =
-	    getContext().getResources().getInteger(com.android.internal.R.integer.config_screenBrightnessDim);
-    private static final int MAXIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_ON;
-
     private static final int SEEK_BAR_RANGE = 10000;
 
     private ContentObserver mBrightnessObserver = new ContentObserver(new Handler()) {
@@ -77,6 +74,10 @@
     public BrightnessPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
 
+        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
+        mScreenBrightnessMinimum = pm.getMinimumScreenBrightnessSetting();
+        mScreenBrightnessMaximum = pm.getMaximumScreenBrightnessSetting();
+
         mAutomaticAvailable = context.getResources().getBoolean(
                 com.android.internal.R.bool.config_automatic_brightness_available);
 
@@ -155,8 +156,8 @@
             } else {
                 brightness = mCurBrightness;
             }
-            brightness = (brightness - mScreenBrightnessDim)
-                    / (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);
+            brightness = (brightness - mScreenBrightnessMinimum)
+                    / (mScreenBrightnessMaximum - mScreenBrightnessMinimum);
         }
         return (int)(brightness*SEEK_BAR_RANGE);
     }
@@ -218,7 +219,7 @@
                     IPowerManager power = IPowerManager.Stub.asInterface(
                             ServiceManager.getService("power"));
                     if (power != null) {
-                        power.setAutoBrightnessAdjustment(valf);
+                        power.setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(valf);
                     }
                     if (write) {
                         final ContentResolver resolver = getContext().getContentResolver();
@@ -229,13 +230,13 @@
                 }
             }
         } else {
-            int range = (MAXIMUM_BACKLIGHT - mScreenBrightnessDim);
-            brightness = (brightness*range)/SEEK_BAR_RANGE + mScreenBrightnessDim;
+            int range = (mScreenBrightnessMaximum - mScreenBrightnessMinimum);
+            brightness = (brightness * range)/SEEK_BAR_RANGE + mScreenBrightnessMinimum;
             try {
                 IPowerManager power = IPowerManager.Stub.asInterface(
                         ServiceManager.getService("power"));
                 if (power != null) {
-                    power.setBacklightBrightness(brightness);
+                    power.setTemporaryScreenBrightnessSettingOverride(brightness);
                 }
                 if (write) {
                     mCurBrightness = -1;
diff --git a/src/com/android/settings/widget/SettingsAppWidgetProvider.java b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
index 1d411f7..3fe5b399 100644
--- a/src/com/android/settings/widget/SettingsAppWidgetProvider.java
+++ b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
@@ -34,6 +34,7 @@
 import android.os.AsyncTask;
 import android.os.Handler;
 import android.os.IPowerManager;
+import android.os.PowerManager;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.provider.Settings;
@@ -94,16 +95,10 @@
         R.drawable.appwidget_settings_ind_on_r_holo
     };
 
-    /**
-     * Minimum and maximum brightnesses.  Don't go to 0 since that makes the display unusable
-     */
-    private static final int MINIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_DIM + 10;
-    private static final int MAXIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_ON;
-    private static final int DEFAULT_BACKLIGHT = (int) (android.os.PowerManager.BRIGHTNESS_ON * 0.4f);
     /** Minimum brightness at which the indicator is shown at half-full and ON */
-    private static final int HALF_BRIGHTNESS_THRESHOLD = (int) (0.3 * MAXIMUM_BACKLIGHT);
+    private static final float HALF_BRIGHTNESS_THRESHOLD = 0.3f;
     /** Minimum brightness at which the indicator is shown at full */
-    private static final int FULL_BRIGHTNESS_THRESHOLD = (int) (0.8 * MAXIMUM_BACKLIGHT);
+    private static final float FULL_BRIGHTNESS_THRESHOLD = 0.8f;
 
     private static final StateTracker sWifiState = new WifiStateTracker();
     private static final StateTracker sBluetoothState = new BluetoothStateTracker();
@@ -684,11 +679,16 @@
                     R.drawable.appwidget_settings_ind_on_r_holo);
         } else {
             final int brightness = getBrightness(context);
+            final PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
             // Set the icon
-            if (brightness > FULL_BRIGHTNESS_THRESHOLD) {
+            final int full = (int)(pm.getMaximumScreenBrightnessSetting()
+                    * FULL_BRIGHTNESS_THRESHOLD);
+            final int half = (int)(pm.getMaximumScreenBrightnessSetting()
+                    * HALF_BRIGHTNESS_THRESHOLD);
+            if (brightness > full) {
                 views.setImageViewResource(R.id.img_brightness,
                         R.drawable.ic_appwidget_settings_brightness_full_holo);
-            } else if (brightness > HALF_BRIGHTNESS_THRESHOLD) {
+            } else if (brightness > half) {
                 views.setImageViewResource(R.id.img_brightness,
                         R.drawable.ic_appwidget_settings_brightness_half_holo);
             } else {
@@ -696,7 +696,7 @@
                         R.drawable.ic_appwidget_settings_brightness_off_holo);
             }
             // Set the ON state
-            if (brightness > HALF_BRIGHTNESS_THRESHOLD) {
+            if (brightness > half) {
                 views.setImageViewResource(R.id.ind_brightness,
                         R.drawable.appwidget_settings_ind_on_r_holo);
             } else {
@@ -775,13 +775,9 @@
      */
     private static int getBrightness(Context context) {
         try {
-            IPowerManager power = IPowerManager.Stub.asInterface(
-                    ServiceManager.getService("power"));
-            if (power != null) {
-                int brightness = Settings.System.getInt(context.getContentResolver(),
-                        Settings.System.SCREEN_BRIGHTNESS);
-                return brightness;
-            }
+            int brightness = Settings.System.getInt(context.getContentResolver(),
+                    Settings.System.SCREEN_BRIGHTNESS);
+            return brightness;
         } catch (Exception e) {
         }
         return 0;
@@ -795,13 +791,9 @@
      */
     private static boolean getBrightnessMode(Context context) {
         try {
-            IPowerManager power = IPowerManager.Stub.asInterface(
-                    ServiceManager.getService("power"));
-            if (power != null) {
-                int brightnessMode = Settings.System.getInt(context.getContentResolver(),
-                        Settings.System.SCREEN_BRIGHTNESS_MODE);
-                return brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
-            }
+            int brightnessMode = Settings.System.getInt(context.getContentResolver(),
+                    Settings.System.SCREEN_BRIGHTNESS_MODE);
+            return brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
         } catch (Exception e) {
             Log.d(TAG, "getBrightnessMode: " + e);
         }
@@ -818,6 +810,8 @@
             IPowerManager power = IPowerManager.Stub.asInterface(
                     ServiceManager.getService("power"));
             if (power != null) {
+                PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
+
                 ContentResolver cr = context.getContentResolver();
                 int brightness = Settings.System.getInt(cr,
                         Settings.System.SCREEN_BRIGHTNESS);
@@ -832,15 +826,15 @@
                 // Rotate AUTO -> MINIMUM -> DEFAULT -> MAXIMUM
                 // Technically, not a toggle...
                 if (brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
-                    brightness = MINIMUM_BACKLIGHT;
+                    brightness = pm.getMinimumScreenBrightnessSetting();
                     brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
-                } else if (brightness < DEFAULT_BACKLIGHT) {
-                    brightness = DEFAULT_BACKLIGHT;
-                } else if (brightness < MAXIMUM_BACKLIGHT) {
-                    brightness = MAXIMUM_BACKLIGHT;
+                } else if (brightness < pm.getDefaultScreenBrightnessSetting()) {
+                    brightness = pm.getDefaultScreenBrightnessSetting();
+                } else if (brightness < pm.getMaximumScreenBrightnessSetting()) {
+                    brightness = pm.getMaximumScreenBrightnessSetting();
                 } else {
                     brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
-                    brightness = MINIMUM_BACKLIGHT;
+                    brightness = pm.getMinimumScreenBrightnessSetting();
                 }
 
                 if (context.getResources().getBoolean(
@@ -854,7 +848,7 @@
                     brightnessMode = Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
                 }
                 if (brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL) {
-                    power.setBacklightBrightness(brightness);
+                    power.setTemporaryScreenBrightnessSettingOverride(brightness);
                     Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS, brightness);
                 }
             }
