diff --git a/res/values/strings.xml b/res/values/strings.xml
index 332d0ac..8e92006 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -705,6 +705,8 @@
          cause of the failure.
          [CHAR LIMIT=NONE] -->
     <string name="pin2_or_fdn_invalid">FDN wasn\'t updated. The PIN2 was incorrect, or the phone number was rejected.</string>
+    <!-- FDN settings: error message displayed in a popup (toast) -->
+    <string name="fdn_failed">FDN operation failed.</string>
 
     <!-- ADN related strings -->
     <!-- Placeholder text displayed while loading the list of SIM contacts -->
@@ -751,7 +753,7 @@
     <!-- SIM PIN screen: status message displayed in a popup (toast) -->
     <string name="pin_changed">SIM PIN changed successfully.</string>
     <!-- SIM PIN screen: error message displayed in a dialog -->
-    <string name="puk_requested">Password incorrect, SIM is locked! PUK2 requested.</string>
+    <string name="puk_requested">Password incorrect, PIN Blocked! PUK requested.</string>
 
     <!-- SIM PIN2 strings -->
     <!-- SIM PIN2 screen: label for PIN entry widget -->
@@ -777,9 +779,15 @@
     <!-- SIM PIN2 screen: label for PUK2 entry widget -->
     <string name="label_puk2_code">Type PUK2 code</string>
     <!-- SIM PIN2 screen: error message displayed in a dialog -->
-    <string name="fdn_enable_puk2_requested">Password incorrect. Change PIN2 and retry.</string>
+    <string name="fdn_enable_puk2_requested">Password incorrect, PIN2 Blocked. Please change PIN2 and retry!</string>
     <!-- SIM PIN2 screen: error message displayed in a dialog -->
     <string name="puk2_requested">Password incorrect, SIM is locked. PUK2 requested.</string>
+    <!-- SIM PIN2 screen: error message -->
+    <string name="puk2_blocked">PUK2 is permanently blocked.</string>
+    <!-- SIM PIN2 screen: error message -->
+    <string name="pin2_attempts">\nThere are <xliff:g id="number">%d</xliff:g> remaining attempts.</string>
+    <!-- SIM PIN screen: status message displayed in a popup (toast) -->
+    <string name="pin2_unblocked">PIN2 Unblocked!</string>
 
     <!-- SIM PIN screen: button label -->
     <string name="doneButton">Done</string>
diff --git a/src/com/android/phone/EditFdnContactScreen.java b/src/com/android/phone/EditFdnContactScreen.java
index 2992b7d..753ae3f 100644
--- a/src/com/android/phone/EditFdnContactScreen.java
+++ b/src/com/android/phone/EditFdnContactScreen.java
@@ -47,6 +47,9 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneFactory;
+
 /**
  * Activity to let the user add or edit an FDN contact.
  */
@@ -377,9 +380,15 @@
             if (invalidNumber) {
                 showStatus(getResources().getText(R.string.fdn_invalid_number));
             } else {
-                // There's no way to know whether the failure is due to incorrect PIN2 or
-                // an inappropriate phone number.
-                showStatus(getResources().getText(R.string.pin2_or_fdn_invalid));
+               if (PhoneFactory.getDefaultPhone().getIccCard().getIccPin2Blocked()) {
+                    showStatus(getResources().getText(R.string.fdn_enable_puk2_requested));
+                } else if (PhoneFactory.getDefaultPhone().getIccCard().getIccPuk2Blocked()) {
+                    showStatus(getResources().getText(R.string.puk2_blocked));
+                } else {
+                    // There's no way to know whether the failure is due to incorrect PIN2 or
+                    // an inappropriate phone number.
+                    showStatus(getResources().getText(R.string.pin2_or_fdn_invalid));
+                }
             }
         }
 
diff --git a/src/com/android/phone/FdnSetting.java b/src/com/android/phone/FdnSetting.java
index 283d612..a471093 100644
--- a/src/com/android/phone/FdnSetting.java
+++ b/src/com/android/phone/FdnSetting.java
@@ -243,16 +243,25 @@
                 // a toast, or just update the UI.
                 case EVENT_PIN2_ENTRY_COMPLETE: {
                         AsyncResult ar = (AsyncResult) msg.obj;
-                        if (ar.exception != null) {
+                        if (ar.exception != null && ar.exception instanceof CommandException) {
+                            int attemptsRemaining = msg.arg1;
                             // see if PUK2 is requested and alert the user accordingly.
-                            CommandException ce = (CommandException) ar.exception;
-                            if (ce.getCommandError() == CommandException.Error.SIM_PUK2) {
-                                // make sure we set the PUK2 state so that we can skip
-                                // some redundant behaviour.
-                                displayMessage(R.string.fdn_enable_puk2_requested);
-                                resetPinChangeStateForPUK2();
-                            } else {
-                                displayMessage(R.string.pin2_invalid);
+                            CommandException.Error e =
+                                    ((CommandException) ar.exception).getCommandError();
+                            switch (e) {
+                                case SIM_PUK2:
+                                    // make sure we set the PUK2 state so that we can skip
+                                    // some redundant behaviour.
+                                    displayMessage(R.string.fdn_enable_puk2_requested,
+                                            attemptsRemaining);
+                                    resetPinChangeStateForPUK2();
+                                    break;
+                                case PASSWORD_INCORRECT:
+                                    displayMessage(R.string.pin2_invalid, attemptsRemaining);
+                                    break;
+                                default:
+                                    displayMessage(R.string.fdn_failed, attemptsRemaining);
+                                    break;
                             }
                         }
                         updateEnableFDN();
@@ -267,6 +276,9 @@
                             log("Handle EVENT_PIN2_CHANGE_COMPLETE");
                         AsyncResult ar = (AsyncResult) msg.obj;
                         if (ar.exception != null) {
+                            int attemptsRemaining = msg.arg1;
+                            log("Handle EVENT_PIN2_CHANGE_COMPLETE attemptsRemaining="
+                                    + attemptsRemaining);
                             CommandException ce = (CommandException) ar.exception;
                             if (ce.getCommandError() == CommandException.Error.SIM_PUK2) {
                                 // throw an alert dialog on the screen, displaying the
@@ -284,16 +296,21 @@
                                 // set the correct error message depending upon the state.
                                 // Reset the state depending upon or knowledge of the PUK state.
                                 if (!mIsPuk2Locked) {
-                                    displayMessage(R.string.badPin2);
+                                    displayMessage(R.string.badPin2, attemptsRemaining);
                                     resetPinChangeState();
                                 } else {
-                                    displayMessage(R.string.badPuk2);
+                                    displayMessage(R.string.badPuk2, attemptsRemaining);
                                     resetPinChangeStateForPUK2();
                                 }
                             }
                         } else {
+                            if (mPinChangeState == PIN_CHANGE_PUK) {
+                                displayMessage(R.string.pin2_unblocked);
+                            } else {
+                                displayMessage(R.string.pin2_changed);
+                            }
+
                             // reset to normal behaviour on successful change.
-                            displayMessage(R.string.pin2_changed);
                             resetPinChangeState();
                         }
                     }
@@ -315,9 +332,22 @@
     /**
      * Display a toast for message, like the rest of the settings.
      */
+    private final void displayMessage(int strId, int attemptsRemaining) {
+        String s = getString(strId);
+        if ((strId == R.string.badPin2) || (strId == R.string.badPuk2) ||
+                (strId == R.string.pin2_invalid)) {
+            if (attemptsRemaining >= 0) {
+                s = getString(strId) + getString(R.string.pin2_attempts, attemptsRemaining);
+            } else {
+                s = getString(strId);
+            }
+        }
+        log("displayMessage: attemptsRemaining=" + attemptsRemaining + " s=" + s);
+        Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
+    }
+
     private final void displayMessage(int strId) {
-        Toast.makeText(this, getString(strId), Toast.LENGTH_SHORT)
-            .show();
+        displayMessage(strId, -1);
     }
 
     /**
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 1ce46b2..82b5e9f 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -43,6 +43,7 @@
 import com.android.internal.telephony.ITelephony;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.CallManager;
+import com.android.internal.telephony.CommandException;
 import com.android.internal.telephony.PhoneConstants;
 
 import java.util.List;
@@ -423,13 +424,25 @@
     }
 
     public boolean supplyPin(String pin) {
+        int [] resultArray = supplyPinReportResult(pin);
+        return (resultArray[0] == PhoneConstants.PIN_RESULT_SUCCESS) ? true : false;
+    }
+
+    public boolean supplyPuk(String puk, String pin) {
+        int [] resultArray = supplyPukReportResult(puk, pin);
+        return (resultArray[0] == PhoneConstants.PIN_RESULT_SUCCESS) ? true : false;
+    }
+
+    /** {@hide} */
+    public int[] supplyPinReportResult(String pin) {
         enforceModifyPermission();
         final UnlockSim checkSimPin = new UnlockSim(mPhone.getIccCard());
         checkSimPin.start();
         return checkSimPin.unlockSim(null, pin);
     }
 
-    public boolean supplyPuk(String puk, String pin) {
+    /** {@hide} */
+    public int[] supplyPukReportResult(String puk, String pin) {
         enforceModifyPermission();
         final UnlockSim checkSimPuk = new UnlockSim(mPhone.getIccCard());
         checkSimPuk.start();
@@ -437,7 +450,7 @@
     }
 
     /**
-     * Helper thread to turn async call to {@link SimCard#supplyPin} into
+     * Helper thread to turn async call to SimCard#supplyPin into
      * a synchronous one.
      */
     private static class UnlockSim extends Thread {
@@ -445,7 +458,8 @@
         private final IccCard mSimCard;
 
         private boolean mDone = false;
-        private boolean mResult = false;
+        private int mResult = PhoneConstants.PIN_GENERAL_FAILURE;
+        private int mRetryCount = -1;
 
         // For replies from SimCard interface
         private Handler mHandler;
@@ -469,7 +483,18 @@
                             case SUPPLY_PIN_COMPLETE:
                                 Log.d(LOG_TAG, "SUPPLY_PIN_COMPLETE");
                                 synchronized (UnlockSim.this) {
-                                    mResult = (ar.exception == null);
+                                    mRetryCount = msg.arg1;
+                                    if (ar.exception != null) {
+                                        if (ar.exception instanceof CommandException &&
+                                                ((CommandException)(ar.exception)).getCommandError()
+                                                == CommandException.Error.PASSWORD_INCORRECT) {
+                                            mResult = PhoneConstants.PIN_PASSWORD_INCORRECT;
+                                        } else {
+                                            mResult = PhoneConstants.PIN_GENERAL_FAILURE;
+                                        }
+                                    } else {
+                                        mResult = PhoneConstants.PIN_RESULT_SUCCESS;
+                                    }
                                     mDone = true;
                                     UnlockSim.this.notifyAll();
                                 }
@@ -489,7 +514,7 @@
          *
          * If PUK is not null, unlock SIM card with PUK and set PIN code
          */
-        synchronized boolean unlockSim(String puk, String pin) {
+        synchronized int[] unlockSim(String puk, String pin) {
 
             while (mHandler == null) {
                 try {
@@ -516,7 +541,10 @@
                 }
             }
             Log.d(LOG_TAG, "done");
-            return mResult;
+            int[] resultArray = new int[2];
+            resultArray[0] = mResult;
+            resultArray[1] = mRetryCount;
+            return resultArray;
         }
     }
 
