diff -urN opensc-trunk/src/libopensc/opensc.h opensc-trunk.patch/src/libopensc/opensc.h
--- opensc-trunk/src/libopensc/opensc.h	2009-09-24 21:42:45.000000000 +0100
+++ opensc-trunk.patch/src/libopensc/opensc.h	2009-09-24 21:44:59.000000000 +0100
@@ -318,8 +318,9 @@
 #define SC_PIN_CMD_CHANGE	1
 #define SC_PIN_CMD_UNBLOCK	2
 
-#define SC_PIN_CMD_USE_PINPAD	0x0001
-#define SC_PIN_CMD_NEED_PADDING	0x0002
+#define SC_PIN_CMD_USE_PINPAD		0x0001
+#define SC_PIN_CMD_NEED_PADDING 	0x0002
+#define SC_PIN_CMD_IMPLICIT_CHANGE	0x0004
 
 #define SC_PIN_ENCODING_ASCII	0
 #define SC_PIN_ENCODING_BCD	1
diff -urN opensc-trunk/src/libopensc/pkcs15-pin.c opensc-trunk.patch/src/libopensc/pkcs15-pin.c
--- opensc-trunk/src/libopensc/pkcs15-pin.c	2009-09-24 21:42:45.000000000 +0100
+++ opensc-trunk.patch/src/libopensc/pkcs15-pin.c	2009-09-24 21:46:05.000000000 +0100
@@ -230,6 +230,9 @@
 	if (pin->flags & SC_PKCS15_PIN_FLAG_NEEDS_PADDING)
 		data.flags |= SC_PIN_CMD_NEED_PADDING;
 
+	if (pin->flags & SC_PKCS15_PIN_FLAG_IMPLICT_CHANGE)
+		data.flags |= SC_PIN_CMD_IMPLICIT_CHANGE;
+
 	switch (pin->type) {
 	case SC_PKCS15_PIN_TYPE_BCD:
 		data.pin1.encoding = SC_PIN_ENCODING_BCD;
@@ -305,6 +308,9 @@
 	if (pin->flags & SC_PKCS15_PIN_FLAG_NEEDS_PADDING)
 		data.flags |= SC_PIN_CMD_NEED_PADDING;
 
+	if (pin->flags & SC_PKCS15_PIN_FLAG_IMPLICT_CHANGE)
+		data.flags |= SC_PIN_CMD_IMPLICIT_CHANGE;
+
 	switch (pin->type) {
 	case SC_PKCS15_PIN_TYPE_BCD:
 		data.pin1.encoding = SC_PIN_ENCODING_BCD;
@@ -406,6 +412,9 @@
 	if (pin->flags & SC_PKCS15_PIN_FLAG_NEEDS_PADDING)
 		data.flags |= SC_PIN_CMD_NEED_PADDING;
 
+	if (pin->flags & SC_PKCS15_PIN_FLAG_IMPLICT_CHANGE)
+		data.flags |= SC_PIN_CMD_IMPLICIT_CHANGE;
+
 	switch (pin->type) {
 	case SC_PKCS15_PIN_TYPE_BCD:
 		data.pin1.encoding = SC_PIN_ENCODING_BCD;
diff -urN opensc-trunk/src/libopensc/pkcs15.h opensc-trunk.patch/src/libopensc/pkcs15.h
--- opensc-trunk/src/libopensc/pkcs15.h	2009-09-24 21:42:45.000000000 +0100
+++ opensc-trunk.patch/src/libopensc/pkcs15.h	2009-09-24 21:45:21.000000000 +0100
@@ -56,6 +56,7 @@
 #define SC_PKCS15_PIN_FLAG_INTEGRITY_PROTECTED		0x0200
 #define SC_PKCS15_PIN_FLAG_CONFIDENTIALITY_PROTECTED	0x0400
 #define SC_PKCS15_PIN_FLAG_EXCHANGE_REF_DATA		0x0800
+#define SC_PKCS15_PIN_FLAG_IMPLICT_CHANGE		0x1000
 
 #define SC_PKCS15_PIN_TYPE_BCD				0
 #define SC_PKCS15_PIN_TYPE_ASCII_NUMERIC		1
diff -urN opensc-trunk/src/libopensc/reader-pcsc.c opensc-trunk.patch/src/libopensc/reader-pcsc.c
--- opensc-trunk/src/libopensc/reader-pcsc.c	2009-09-24 21:42:45.000000000 +0100
+++ opensc-trunk.patch/src/libopensc/reader-pcsc.c	2009-09-24 21:49:40.000000000 +0100
@@ -1223,11 +1223,20 @@
 	tmp16 = (data->pin1.min_length << 8 ) + data->pin1.max_length;
 	pin_modify->wPINMaxExtraDigit = HOST_TO_CCID_16(tmp16); /* Min Max */
 
-	pin_modify->bConfirmPIN = 0x03;	/* bConfirmPIN, all */
+	/* bConfirmPIN flags
+	 * 0x01: New Pin, Confirm Pin
+	 * 0x03: Enter Old Pin, New Pin, Confirm Pin
+	 */
+	pin_modify->bConfirmPIN = data->flags & SC_PIN_CMD_IMPLICIT_CHANGE ? 0x01 : 0x03;
 	pin_modify->bEntryValidationCondition = 0x02;	/* bEntryValidationCondition, keypress only */
 	
+	/* bNumberMessage flags
+	 * 0x02: Messages seen on Pinpad display: New Pin, Confirm Pin
+	 * 0x03: Messages seen on Pinpad display: Enter Old Pin, New Pin, Confirm Pin
+	 * Could be 0xFF too.
+	 */
 	if (slot->capabilities & SC_SLOT_CAP_DISPLAY)
-		pin_modify->bNumberMessage = 0x03; /* 3 messages (because bConfirmPIN = 3), all default. Could be 0xFF too */
+		pin_modify->bNumberMessage = data->flags & SC_PIN_CMD_IMPLICIT_CHANGE ? 0x02 : 0x03;
 	else
 		pin_modify->bNumberMessage = 0x00; /* No messages */
 
