diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn
index e0ee84c..5976b45 100644
--- a/msc_tests/MSC_Tests.ttcn
+++ b/msc_tests/MSC_Tests.ttcn
@@ -299,21 +299,24 @@
 
 type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr;
 
-function f_gen_imei(hexstring prefix, integer suffix) return hexstring {
-	var integer suffix_len := 15 - lengthof(prefix);
-	suffix_len := suffix_len;
-	return prefix & int2hex(suffix, suffix_len);
+private function f_concat_pad(integer tot_len, hexstring prefix, integer suffix) return hexstring {
+	var integer suffix_len := tot_len - lengthof(prefix);
+	var charstring suffix_ch := int2str(suffix);
+	var integer pad_len := suffix_len - lengthof(suffix_ch);
+
+	return prefix & int2hex(0, pad_len) & str2hex(suffix_ch);
 }
 
-function f_gen_imsi(hexstring prefix, integer suffix) return hexstring {
-	var integer suffix_len := 15 - lengthof(prefix);
-	suffix_len := suffix_len-1; /* FIXME: fix odd IMSI length */
-	return prefix & int2hex(suffix, suffix_len);
+function f_gen_imei(integer suffix) return hexstring {
+	return f_concat_pad(15, '49999'H, suffix);
 }
 
-function f_gen_msisdn(hexstring prefix, integer suffix) return hexstring {
-	var integer suffix_len := 12 - lengthof(prefix);
-	return prefix & int2hex(suffix, suffix_len);
+function f_gen_imsi(integer suffix) return hexstring {
+	return f_concat_pad(15, '26242'H, suffix);
+}
+
+function f_gen_msisdn(integer suffix) return hexstring {
+	return f_concat_pad(12, '49123'H, suffix);
 }
 
 /* FIXME: move into BSC_ConnectionHandler? */
@@ -323,9 +326,9 @@
 		sccp_addr_own := g_sccp_addr_own,
 		sccp_addr_peer := g_sccp_addr_peer,
 		cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42)),
-		imei := f_gen_imei('49999'H, imsi_suffix),
-		imsi := f_gen_imsi('26242'H, imsi_suffix),
-		msisdn := f_gen_msisdn('491239999'H, imsi_suffix),
+		imei := f_gen_imei(imsi_suffix),
+		imsi := f_gen_imsi(imsi_suffix),
+		msisdn := f_gen_msisdn(imsi_suffix),
 		tmsi := omit,
 		cm2 := valueof(ts_CM2_default),
 		cm3 := omit
@@ -503,7 +506,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 	f_vty_config(MSCVTY, "network", "authentication optional");
-	vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), testcasename(), 5);
+	vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), testcasename(), 6);
 	vc_conn.done;
 }
 
@@ -555,7 +558,7 @@
 	f_init();
 	f_vty_config(MSCVTY, "network", "authentication optional");
 
-	vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), testcasename(), 6);
+	vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), testcasename(), 7);
 	vc_conn.done;
 }
 
@@ -589,7 +592,7 @@
 	f_init();
 	f_vty_config(MSCVTY, "network", "authentication required");
 
-	vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), testcasename(), 7);
+	vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), testcasename(), 8);
 	vc_conn.done;
 }
 
@@ -623,7 +626,7 @@
 	f_init();
 	f_vty_config(MSCVTY, "network", "authentication required");
 
-	vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), testcasename(), 8);
+	vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), testcasename(), 9);
 	vc_conn.done;
 }
 
@@ -655,7 +658,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 
-	vc_conn := f_start_handler(refers(f_tc_lu_clear_request), testcasename(), 8);
+	vc_conn := f_start_handler(refers(f_tc_lu_clear_request), testcasename(), 10);
 	vc_conn.done;
 }
 
@@ -684,7 +687,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 
-	vc_conn := f_start_handler(refers(f_tc_lu_disconnect), testcasename(), 9);
+	vc_conn := f_start_handler(refers(f_tc_lu_disconnect), testcasename(), 11);
 	vc_conn.done;
 }
 
@@ -720,7 +723,7 @@
 	f_init();
 	f_vty_config(MSCVTY, "network", "authentication optional");
 
-	vc_conn := f_start_handler(refers(f_tc_lu_by_imei), testcasename(), 9);
+	vc_conn := f_start_handler(refers(f_tc_lu_by_imei), testcasename(), 12);
 	vc_conn.done;
 }
 
@@ -768,7 +771,7 @@
 	f_init();
 	f_vty_config(MSCVTY, "network", "authentication optional");
 
-	vc_conn := f_start_handler(refers(f_tc_lu_tmsi_noauth_unknown), testcasename(), 1);
+	vc_conn := f_start_handler(refers(f_tc_lu_tmsi_noauth_unknown), testcasename(), 13);
 	vc_conn.done;
 }
 
@@ -795,7 +798,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 
-	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), testcasename(), 2);
+	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), testcasename(), 14);
 	vc_conn.done;
 }
 
@@ -821,7 +824,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 
-	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), testcasename(), 3);
+	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), testcasename(), 15);
 	vc_conn.done;
 }
 
@@ -847,7 +850,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 
-	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), testcasename(), 4);
+	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), testcasename(), 16);
 	vc_conn.done;
 }
 
@@ -911,7 +914,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 
-	vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), testcasename(), 5);
+	vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), testcasename(), 17);
 	vc_conn.done;
 }
 
@@ -928,7 +931,7 @@
 	f_init();
 	f_vty_config(MSCVTY, "network", "authentication optional");
 
-	vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), testcasename(), 6);
+	vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), testcasename(), 18);
 	vc_conn.done;
 }
 
@@ -949,7 +952,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 
-	vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vgcs_reject), testcasename(), 7);
+	vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vgcs_reject), testcasename(), 19);
 	vc_conn.done;
 }
 
@@ -970,7 +973,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 
-	vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vbs_reject), testcasename(), 8);
+	vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vbs_reject), testcasename(), 20);
 	vc_conn.done;
 }
 
@@ -991,7 +994,7 @@
 	var BSC_ConnHdlr vc_conn;
 	f_init();
 
-	vc_conn := f_start_handler(refers(f_tc_cm_serv_req_lcs_reject), testcasename(), 9);
+	vc_conn := f_start_handler(refers(f_tc_cm_serv_req_lcs_reject), testcasename(), 21);
 	vc_conn.done;
 }
 
