diff --git a/dia2gsup/DIA2GSUP_Tests.ttcn b/dia2gsup/DIA2GSUP_Tests.ttcn
index 6a3f85c..673038c 100644
--- a/dia2gsup/DIA2GSUP_Tests.ttcn
+++ b/dia2gsup/DIA2GSUP_Tests.ttcn
@@ -214,8 +214,145 @@
 	setverdict(pass);
 }
 
+private function f_DIA_AI_gsup_error(integer gsup_cause, template (present) GenericAVP err_avp) runs on D2G_ConnHdlr {
+	var PDU_DIAMETER rx_dia;
+	var UINT32 hbh_id := f_rnd_octstring(4);
+	var UINT32 ete_id := f_rnd_octstring(4);
+	var octetstring sess_id := char2oct("foobar");
+	var OCT3 vplmn := '00F110'O;
+
+	/* Unlike AIR, AIA contains no IMSI. Register ete_id in DIAMETER_Emulation,
+	 * so AIA is forwarded back to us in DIAMETER port instead of MTC_CT.DIAMETER_UNIT.
+	 */
+	f_diameter_expect_eteid(ete_id);
+
+	/* Send AIR to translator; expect it to show up on GSUP side */
+	DIAMETER.send(ts_DIA_AIR(g_pars.imsi, vplmn, sess_id, hbh_id := hbh_id, ete_id := ete_id));
+	GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
+
+	/* Send an error response back to the translator; expect AIA */
+	GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, gsup_cause));
+
+	alt {
+	/* Unlike AIR, AIA contains no IMSI, hence it is received in DIAMETER_UNIT: */
+	[] DIAMETER.receive(tr_DIA_AIA_ERR(err_avp)) {
+		setverdict(pass);
+		}
+	[] DIAMETER.receive(PDU_DIAMETER:?) -> value rx_dia {
+		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected Diameter msg rx: ", rx_dia));
+		}
+	}
+}
+
+private function f_TC_authinfo_gsup_err_imsi_unknown(charstring id) runs on D2G_ConnHdlr {
+	var DIAMETER_ExperimentalResultcode res_code := DIAMETER_ERROR_USER_UNKNOWN;
+	f_DIA_AI_gsup_error(2, tr_AVP_ExperimentalResult(vendor_id_3GPP, int2oct(enum2int(res_code), 4)));
+}
+testcase TC_authinfo_gsup_err_imsi_unknown() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_imsi_unknown), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_illegal_ms(charstring id) runs on D2G_ConnHdlr {
+	var DIAMETER_ExperimentalResultcode res_code := DIAMETER_ERROR_USER_UNKNOWN;
+	f_DIA_AI_gsup_error(3, tr_AVP_ExperimentalResult(vendor_id_3GPP, int2oct(enum2int(res_code), 4)));
+}
+testcase TC_authinfo_gsup_err_illegal_ms() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_illegal_ms), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_plmn_not_allowed(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(11, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_plmn_not_allowed() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_plmn_not_allowed), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_romaning_not_allowed(charstring id) runs on D2G_ConnHdlr {
+	var DIAMETER_ExperimentalResultcode res_code := DIAMETER_ERROR_ROAMING_NOT_ALLOWED;
+	f_DIA_AI_gsup_error(12, tr_AVP_ExperimentalResult(vendor_id_3GPP, int2oct(enum2int(res_code), 4)));
+}
+testcase TC_authinfo_gsup_err_romaning_not_allowed() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_romaning_not_allowed), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_net_fail(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(17, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_net_fail() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_net_fail), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_congestion(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(22, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_congestion() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_congestion), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_auth_unacceptable(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(23, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_auth_unacceptable() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_auth_unacceptable), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
+private function f_TC_authinfo_gsup_err_proto_unspec(charstring id) runs on D2G_ConnHdlr {
+	f_DIA_AI_gsup_error(23, tr_AVP_ResultCode(DIAMETER_UNABLE_TO_COMPLY));
+}
+testcase TC_authinfo_gsup_err_proto_unspec() runs on MTC_CT {
+	var D2G_ConnHdlrPars pars := f_init_pars();
+	var D2G_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_authinfo_gsup_err_proto_unspec), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
 control {
 	execute ( TC_authinfo_normal() );
+	execute ( TC_authinfo_gsup_err_imsi_unknown() );
+	execute ( TC_authinfo_gsup_err_illegal_ms() );
+	execute ( TC_authinfo_gsup_err_plmn_not_allowed() );
+	execute ( TC_authinfo_gsup_err_romaning_not_allowed() );
+	execute ( TC_authinfo_gsup_err_net_fail() );
+	execute ( TC_authinfo_gsup_err_congestion() );
+	execute ( TC_authinfo_gsup_err_auth_unacceptable() );
+	execute ( TC_authinfo_gsup_err_proto_unspec() );
 }
 
 }
