diff --git a/src/com/android/phone/EmergencyDialer.java b/src/com/android/phone/EmergencyDialer.java
index 53f6f7e..88f6039 100644
--- a/src/com/android/phone/EmergencyDialer.java
+++ b/src/com/android/phone/EmergencyDialer.java
@@ -20,11 +20,15 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.StatusBarManager;
+import android.app.WallpaperManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.Point;
+import android.graphics.drawable.ColorDrawable;
 import android.media.AudioManager;
 import android.media.ToneGenerator;
 import android.net.Uri;
@@ -51,10 +55,14 @@
 import android.view.View;
 import android.view.WindowManager;
 import android.widget.EditText;
+import android.widget.FrameLayout;
 
 import com.android.phone.common.dialpad.DialpadKeyButton;
 import com.android.phone.common.util.ViewUtil;
 
+import com.google.android.colorextraction.ColorExtractor;
+import com.google.android.colorextraction.ColorExtractor.GradientColors;
+import com.google.android.colorextraction.drawable.GradientDrawable;
 
 /**
  * EmergencyDialer is a special dialer that is used ONLY for dialing emergency calls.
@@ -75,7 +83,7 @@
  */
 public class EmergencyDialer extends Activity implements View.OnClickListener,
         View.OnLongClickListener, View.OnKeyListener, TextWatcher,
-        DialpadKeyButton.OnPressedListener {
+        DialpadKeyButton.OnPressedListener, ColorExtractor.OnColorsChangedListener {
     // Keys used with onSaveInstanceState().
     private static final String LAST_NUMBER = "lastNumber";
 
@@ -106,6 +114,9 @@
 
     private static final int BAD_EMERGENCY_NUMBER_DIALOG = 0;
 
+    /** 90% opacity, different from other gradients **/
+    private static final int BACKGROUND_GRADIENT_ALPHA = 230;
+
     EditText mDigits;
     private View mDialButton;
     private View mDelete;
@@ -130,6 +141,11 @@
 
     private String mLastNumber; // last number we tried to dial. Used to restore error dialog.
 
+    // Background gradient
+    private ColorExtractor mColorExtractor;
+    private GradientDrawable mBackgroundGradient;
+    private boolean mSupportsDarkText;
+
     @Override
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         // Do nothing
@@ -176,6 +192,10 @@
 
         getWindow().setAttributes(lp);
 
+        mColorExtractor = new ColorExtractor(this);
+        GradientColors lockScreenColors = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK);
+        updateTheme(lockScreenColors.supportsDarkText());
+
         setContentView(R.layout.emergency_dialer);
 
         mDigits = (EditText) findViewById(R.id.digits);
@@ -186,6 +206,14 @@
         mDigits.setInputType(InputType.TYPE_NULL);
         maybeAddNumberFormatting();
 
+        mBackgroundGradient = new GradientDrawable(this);
+        Point displaySize = new Point();
+        ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
+                .getDefaultDisplay().getSize(displaySize);
+        mBackgroundGradient.setScreenSize(displaySize.x, displaySize.y);
+        mBackgroundGradient.setAlpha(BACKGROUND_GRADIENT_ALPHA);
+        getWindow().setBackgroundDrawable(mBackgroundGradient);
+
         // Check for the presence of the keypad
         View view = findViewById(R.id.one);
         if (view != null) {
@@ -462,6 +490,17 @@
     }
 
     @Override
+    protected void onStart() {
+        super.onStart();
+
+        mColorExtractor.addOnColorsChangedListener(this);
+        GradientColors lockScreenColors = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK);
+        // Do not animate when view isn't visible yet, just set an initial state.
+        mBackgroundGradient.setColors(lockScreenColors, false);
+        updateTheme(lockScreenColors.supportsDarkText());
+    }
+
+    @Override
     protected void onResume() {
         super.onResume();
 
@@ -508,6 +547,43 @@
         }
     }
 
+    @Override
+    protected void onStop() {
+        super.onStop();
+
+        mColorExtractor.removeOnColorsChangedListener(this);
+    }
+
+    /**
+     * Sets theme based on gradient colors
+     * @param supportsDarkText true if gradient supports dark text
+     */
+    private void updateTheme(boolean supportsDarkText) {
+        if (mSupportsDarkText == supportsDarkText) {
+            return;
+        }
+        mSupportsDarkText = supportsDarkText;
+
+        // We can't change themes after inflation, in this case we'll have to recreate
+        // the whole activity.
+        if (mBackgroundGradient != null) {
+            recreate();
+            return;
+        }
+
+        int vis = getWindow().getDecorView().getSystemUiVisibility();
+        if (supportsDarkText) {
+            vis |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
+            vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+            setTheme(R.style.EmergencyDialerThemeDark);
+        } else {
+            vis &= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
+            vis &= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+            setTheme(R.style.EmergencyDialerTheme);
+        }
+        getWindow().getDecorView().setSystemUiVisibility(vis);
+    }
+
     /**
      * place the call, but check to make sure it is a viable number.
      */
@@ -657,4 +733,12 @@
         }
         PhoneNumberUtils.ttsSpanAsPhoneNumber(mDigits.getText(), 0, mDigits.getText().length());
     }
+
+    @Override
+    public void onColorsChanged(GradientColors colors, int which) {
+        if ((which & WallpaperManager.FLAG_LOCK) != 0) {
+            mBackgroundGradient.setColors(colors);
+            updateTheme(colors.supportsDarkText());
+        }
+    }
 }
