diff --git a/sim-applet/src/org/osmocom/IMSIPseudo/IMSIPseudo.java b/sim-applet/src/org/osmocom/IMSIPseudo/IMSIPseudo.java
index bd3a9ec..3107030 100755
--- a/sim-applet/src/org/osmocom/IMSIPseudo/IMSIPseudo.java
+++ b/sim-applet/src/org/osmocom/IMSIPseudo/IMSIPseudo.java
@@ -99,11 +99,101 @@
 		showMsg(msg);
 	}
 
+	/* Convert BCD-encoded digit into printable character
+	 *  \param[in] bcd A single BCD-encoded digit
+	 *  \returns single printable character
+	 */
+	private byte bcd2char(byte bcd)
+	{
+		if (bcd < 0xa)
+			return (byte)('0' + bcd);
+		else
+			return (byte)('A' + (bcd - 0xa));
+	}
+
+	/* Convert BCD to string.
+	 * The given nibble offsets are interpreted in BCD order, i.e. nibble 0 is bcd[0] & 0xf, nibble 1 is bcd[0] >> 4, nibble
+	 * 3 is bcd[1] & 0xf, etc..
+	 *  \param[out] dst  Output byte array.
+	 *  \param[in] dst_ofs  Where to start writing in dst.
+	 *  \param[in] dst_len  How many bytes are available at dst_ofs.
+	 *  \param[in] bcd  Binary coded data buffer.
+	 *  \param[in] start_nibble  Offset to start from, in nibbles.
+	 *  \param[in] end_nibble  Offset to stop before, in nibbles.
+	 *  \param[in] allow_hex  If false, return false if there are digits other than 0-9.
+	 *  \returns true on success, false otherwise
+	 */
+	private boolean bcd2str(byte dst[], byte dst_ofs, byte dst_len,
+				byte bcd[], byte start_nibble, byte end_nibble, boolean allow_hex)
+	{
+		byte nibble_i;
+		byte dst_i = dst_ofs;
+		byte dst_end = (byte)(dst_ofs + dst_len);
+		boolean rc = true;
+
+		for (nibble_i = start_nibble; nibble_i < end_nibble && dst_i < dst_end; nibble_i++, dst_i++) {
+			byte nibble = bcd[(byte)nibble_i >> 1];
+			if ((nibble_i & 1) != 0)
+				nibble >>= 4;
+			nibble &= 0xf;
+
+			if (!allow_hex && nibble > 9)
+				rc = false;
+
+			dst[dst_i] = bcd2char(nibble);
+		}
+
+		return rc;
+	}
+
+	private boolean mi2str(byte dst[], byte dst_ofs, byte dst_len,
+			       byte mi[], boolean allow_hex)
+	{
+		/* The IMSI byte array by example:
+		 * 08 99 10 07 00 00 10 74 90
+		 *
+		 * This is encoded according to 3GPP TS 24.008 10.5.1.4 Mobile
+		 * Identity, short the Mobile Identity IEI:
+		 *
+		 * 08 length for the following MI, in bytes.
+		 *  9 = 0b1001
+		 *	1 = odd nr of digits
+		 *	 001 = MI type = IMSI
+		 * 9  first IMSI digit (BCD)
+		 *  0 second digit
+		 * 1  third
+		 * ...
+		 *  0 14th digit
+		 * 9  15th and last digit
+		 *
+		 * If the IMSI had an even number of digits:
+		 *
+		 * 08 98 10 07 00 00 10 74 f0
+		 *
+		 * 08 length for the following MI, in bytes.
+		 *  8 = 0b0001
+		 *	0 = even nr of digits
+		 *	 001 = MI type = IMSI
+		 * 9  first IMSI digit
+		 *  0 second digit
+		 * 1  third
+		 * ...
+		 *  0 14th and last digit
+		 * f  filler
+		 */
+		byte bytelen = mi[0];
+		byte mi_type = (byte)(mi[1] & 0xf);
+		boolean odd_nr_of_digits = ((mi_type & 0x08) != 0);
+		byte start_nibble = 2 + 1; // 2 to skip the bytelen, 1 to skip the mi_type
+		byte end_nibble = (byte)(2 + bytelen * 2 - (odd_nr_of_digits ? 0 : 1));
+		return bcd2str(dst, dst_ofs, dst_len, mi, start_nibble, end_nibble, allow_hex);
+	}
+
 	private void showIMSI() {
 		/* 3GPP TS 31.102 4.2.2: IMSI */
 		byte[] IMSI = new byte[9];
 		byte[] msg = {'C', 'u', 'r', 'r', 'e', 'n', 't', ' ', 'I', 'M', 'S', 'I', ':', ' ',
-			      '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_'};
+			      ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};
 
 		gsmFile.select((short) SIMView.FID_DF_GSM);
 		gsmFile.select((short) SIMView.FID_EF_IMSI);
@@ -114,19 +204,8 @@
 			showError(e.getReason());
 			return;
 		}
-		byte len = (byte) (IMSI[0] * 2);
 
-		for (byte i = (byte)0; i < (byte)18; i++) {
-			byte msg_i = (byte)(14 + i);
-			if (i >= len) {
-				msg[msg_i] = ' ';
-			} else if (i % (byte)2 == (byte)0) {
-				msg[msg_i] = (byte)('0' + (IMSI[i / (byte)2] & 0x0f));
-			} else {
-				msg[msg_i] = (byte)('0' + (IMSI[i / (byte)2] >>> 4));
-			}
-			showMsg(msg); /* DEBUG */
-		}
+		mi2str(msg, (byte)14, (byte)16, IMSI, false);
 		showMsg(msg);
 	}
 
