diff --git a/src/com/android/contacts/TwelveKeyDialer.java b/src/com/android/contacts/TwelveKeyDialer.java
index 2be677a..ebb76c0 100644
--- a/src/com/android/contacts/TwelveKeyDialer.java
+++ b/src/com/android/contacts/TwelveKeyDialer.java
@@ -89,11 +89,8 @@
     private Object mToneGeneratorLock = new Object();
     private Drawable mDigitsBackground;
     private Drawable mDigitsEmptyBackground;
-    private Drawable mDeleteBackground;
-    private Drawable mDeleteEmptyBackground;
-    private View mDigitsAndBackspace;
     private View mDialpad;
-    private View mVoicemailDialAndBackspaceRow;
+    private View mVoicemailDialAndDeleteRow;
     private View mVoicemailButton;
     private View mDialButton;
     private ListView mDialpadChooser;
@@ -158,19 +155,7 @@
             mDigits.getText().clear();
         }
 
-        // Set the proper background for the dial input area
-        if (mDigits.length() != 0) {
-            mDelete.setBackgroundDrawable(mDeleteBackground);
-            mDigits.setBackgroundDrawable(mDigitsBackground);
-            mDigits.setCompoundDrawablesWithIntrinsicBounds(
-                    getResources().getDrawable(R.drawable.ic_dial_number), null, null, null);
-        } else {
-            mDelete.setBackgroundDrawable(mDeleteEmptyBackground);
-            mDigits.setBackgroundDrawable(mDigitsEmptyBackground);
-            mDigits.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
-        }
-
-        updateDialButtonStateEnabledAttr();
+        updateDialAndDeleteButtonStateEnabledAttr();
     }
 
     @Override
@@ -185,11 +170,6 @@
         mDigitsBackground = r.getDrawable(R.drawable.btn_dial_textfield_active);
         //mDigitsBackground.setDither(true);
         mDigitsEmptyBackground = r.getDrawable(R.drawable.btn_dial_textfield);
-        //mDigitsEmptyBackground.setDither(true);
-        mDeleteBackground = r.getDrawable(R.drawable.btn_dial_delete_active);
-        //mDeleteBackground.setDither(true);
-        mDeleteEmptyBackground = r.getDrawable(R.drawable.btn_dial_delete);
-        //mDeleteEmptyBackground.setDither(true);
 
         mDigits = (EditText) findViewById(R.id.digits);
         mDigits.setKeyListener(DialerKeyListener.getInstance());
@@ -203,12 +183,12 @@
             setupKeypad();
         }
 
-        mVoicemailDialAndBackspaceRow = findViewById(R.id.voicemailAndDialAndBackspace);
+        mVoicemailDialAndDeleteRow = findViewById(R.id.voicemailAndDialAndDelete);
 
         initVoicemailButton();
 
         // Check whether we should show the onscreen "Dial" button.
-        mDialButton = mVoicemailDialAndBackspaceRow.findViewById(R.id.dialButton);
+        mDialButton = mVoicemailDialAndDeleteRow.findViewById(R.id.dialButton);
 
         if (r.getBoolean(R.bool.config_show_onscreen_dial_button)) {
             mDialButton.setOnClickListener(this);
@@ -217,12 +197,11 @@
             mDialButton = null;
         }
 
-        view = findViewById(R.id.backspace);
+        view = mVoicemailDialAndDeleteRow.findViewById(R.id.deleteButton);
         view.setOnClickListener(this);
         view.setOnLongClickListener(this);
         mDelete = view;
 
-        mDigitsAndBackspace = findViewById(R.id.digitsAndBackspace);
         mDialpad = findViewById(R.id.dialpad);  // This is null in landscape mode
 
         // Set up the "dialpad chooser" UI; see showDialpadChooser().
@@ -438,7 +417,7 @@
             showDialpadChooser(false);
         }
 
-        updateDialButtonStateEnabledAttr();
+        updateDialAndDeleteButtonStateEnabledAttr();
     }
 
     @Override
@@ -666,7 +645,7 @@
                 keyPressed(KeyEvent.KEYCODE_STAR);
                 return;
             }
-            case R.id.backspace: {
+            case R.id.deleteButton: {
                 keyPressed(KeyEvent.KEYCODE_DEL);
                 return;
             }
@@ -688,8 +667,12 @@
         final Editable digits = mDigits.getText();
         int id = view.getId();
         switch (id) {
-            case R.id.backspace: {
+            case R.id.deleteButton: {
                 digits.clear();
+                // TODO: The framework forgets to clear the pressed
+                // status of disabled button. Until this is fixed,
+                // clear manually the pressed status. b/2133127
+                mDelete.setPressed(false);
                 return true;
             }
             case R.id.one: {
@@ -789,9 +772,9 @@
     private void showDialpadChooser(boolean enabled) {
         if (enabled) {
             // Log.i(TAG, "Showing dialpad chooser!");
-            mDigitsAndBackspace.setVisibility(View.GONE);
+            mDigits.setVisibility(View.GONE);
             if (mDialpad != null) mDialpad.setVisibility(View.GONE);
-            mVoicemailDialAndBackspaceRow.setVisibility(View.GONE);
+            mVoicemailDialAndDeleteRow.setVisibility(View.GONE);
             mDialpadChooser.setVisibility(View.VISIBLE);
 
             // Instantiate the DialpadChooserAdapter and hook it up to the
@@ -802,9 +785,9 @@
             }
         } else {
             // Log.i(TAG, "Displaying normal Dialer UI.");
-            mDigitsAndBackspace.setVisibility(View.VISIBLE);
+            mDigits.setVisibility(View.VISIBLE);
             if (mDialpad != null) mDialpad.setVisibility(View.VISIBLE);
-            mVoicemailDialAndBackspaceRow.setVisibility(View.VISIBLE);
+            mVoicemailDialAndDeleteRow.setVisibility(View.VISIBLE);
             mDialpadChooser.setVisibility(View.GONE);
         }
     }
@@ -1046,14 +1029,18 @@
     }
 
     /**
-     * Update the enabledness of the "Dial" button if applicable.
+     * Update the enabledness of the "Dial" and "Backspace" buttons if applicable.
      */
-    private void updateDialButtonStateEnabledAttr() {
+    private void updateDialAndDeleteButtonStateEnabledAttr() {
+        final boolean notEmpty = mDigits.length() != 0;
+
         if (mDialButton != null) {
-            mDialButton.setEnabled(mDigits.length() != 0);
+            mDialButton.setEnabled(notEmpty);
         }
+        mDelete.setEnabled(notEmpty);
     }
 
+
     /**
      * Check if voicemail is enabled/accessible.
      */
@@ -1065,7 +1052,7 @@
             // Possibly no READ_PHONE_STATE privilege.
         }
 
-        mVoicemailButton = mVoicemailDialAndBackspaceRow.findViewById(R.id.voicemailButton);
+        mVoicemailButton = mVoicemailDialAndDeleteRow.findViewById(R.id.voicemailButton);
         if (hasVoicemail) {
             mVoicemailButton.setOnClickListener(this);
         } else {
