diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index 3861f34..5cba365 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -23,6 +23,7 @@
 friend module BSC_Tests_VAMOS;
 friend module BSC_Tests_CBSP;
 friend module BSC_Tests_LCLS;
+friend module BSC_Tests_ASCI;
 
 import from Misc_Helpers all;
 import from General_Types all;
@@ -106,7 +107,7 @@
  * BTS 2 has BSIC 12, TSC = (BSIC & 7) = 4.
  * BTS 2 has BSIC 12, TSC = (BSIC & 7) = 4.
  */
-private const BtsParams c_BtsParams[NUM_BTS_CFG] := {
+friend const BtsParams c_BtsParams[NUM_BTS_CFG] := {
 	/* BTS0 */ { trx_num := 1, tsc := 2 },
 	/* BTS1 */ { trx_num := 1, tsc := 3 },
 	/* BTS2 */ { trx_num := 4, tsc := 4 },
diff --git a/bsc/BSC_Tests_ASCI.ttcn b/bsc/BSC_Tests_ASCI.ttcn
new file mode 100644
index 0000000..c7e64f9
--- /dev/null
+++ b/bsc/BSC_Tests_ASCI.ttcn
@@ -0,0 +1,512 @@
+module BSC_Tests_ASCI {
+
+/* Integration Tests for OsmoBSC
+ * (C) 2023 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * This test suite tests OsmoBSC while emulating both multiple BTS + MS as
+ * well as the MSC. See README for more details.
+ */
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from GSM_Types all;
+import from Misc_Helpers all;
+
+import from BSC_Tests all;
+import from BSSAP_Types all;
+import from BSSAP_CodecPort all;
+import from BSSMAP_Templates all;
+import from RSL_Types all;
+import from RSL_Emulation all;
+import from MGCP_Emulation all;
+
+import from MobileL3_CommonIE_Types all;
+import from MobileL3_Types all;
+import from L3_Templates all;
+import from GSM_RR_Types all;
+
+import from MSC_ConnectionHandler all;
+import from RAN_Adapter all;
+import from RAN_Emulation all;
+
+const charstring COORD_VGCS_CALL_EST := "VGCS_CALL_EST";
+const charstring COORD_VGCS_CALL_REL := "VGCS_CALL_REL";
+const charstring COORD_VGCS_CHANNEL_REL := "VGCS_CHANNEL_REL";
+const charstring COORD_VGCS_UPLINK_FREE := "VGCS_UPLINK_FREE";
+const charstring COORD_VGCS_UPLINK_BUSY := "VGCS_UPLINK_BUSY";
+const charstring COORD_VGCS_ASSIGN_RES := "VGCS_ASSIGN_RES";
+const charstring COORD_VGCS_ASSIGN_FAIL := "VGCS_ASSIGN_FAIL";
+
+template (value) DescriptiveGroupOrBroadcastCallReference_V
+			ts_BSSMAP_IE_GroupCallRef(integer cr,
+						  BIT1 sf,
+						  BIT1 af,
+						  BIT3 prio,
+						  BIT4 ci) := {
+	binaryCodingOfGroupOrBroadcastCallReference := int2bit(cr, 27),
+	sF := sf,
+	aF := af,
+	callPriority := prio,
+	cipheringInformation := ci,
+	spare := '0000'B
+}
+
+function f_gen_asci_ass_req(integer bssap_idx := 0,
+			    template (value) BSSMAP_IE_ChannelType ch_type := ts_BSSMAP_IE_ChannelType,
+			    template (value) OCT1 ass_requirement := '00'O,
+			    template (value) BSSMAP_IE_CellIdentifier cell_id := ts_CellId_CI(0),
+			    template (value) GroupCallRef group_call_ref := '0000001000'O,
+			    charstring aoip_tla :="1.2.3.4")
+runs on MSC_ConnHdlr return template (value) PDU_BSSAP {
+	if (mp_bssap_cfg[bssap_idx].transport == BSSAP_TRANSPORT_AoIP) {
+		var template (value) BSSMAP_IE_AoIP_TransportLayerAddress tla :=
+			f_ts_BSSMAP_IE_AoIP_TLA(aoip_tla, 2342);
+		var template (value) BSSMAP_IE_SpeechCodecList codec_list :=
+			ts_BSSMAP_IE_CodecList({ts_CodecFR});
+		return ts_BSSMAP_VGCS_VBS_AssignmentReq(ch_type, ass_requirement, cell_id,
+							    group_call_ref, omit, tla, omit, codec_list);
+	} else {
+		var template (value) BSSMAP_IE_CircuitIdentityCode cic := ts_BSSMAP_IE_CIC(0,1);
+		return ts_BSSMAP_VGCS_VBS_AssignmentReq(ch_type, ass_requirement, cell_id,
+							    group_call_ref, cic, omit, omit, omit);
+	}
+}
+
+/*
+ * VGCS/VBS call controling connection
+ */
+
+private function f_tc_vgcs_vbs_setup(charstring id) runs on MSC_ConnHdlr {
+	var PDU_BSSAP rx_bssap;
+	var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
+								ts_BSSMAP_IE_GroupCallRef(11, '1'B, '0'B, '000'B, '0000'B);
+	var template (value) PDU_BSSAP setup_req := ts_BSSMAP_VGCS_VBS_Setup(bit2oct(encvalue(callref)), omit);
+	var boolean uplink_free := false;
+	var boolean uplink_busy := false;
+	var boolean uplink_req := false;
+	var boolean uplink_req_conf := false;
+	var boolean uplink_rel_ind := false;
+	var boolean assign_res := false;
+	var boolean assign_fail := false;
+	/* Note: This timer is used to receive messages after the expected event.
+	 * After timeout, the outcome of the test is checked. */
+	timer T := 0.2;
+
+	/* Wait for the COORD ports to be connected. */
+	f_sleep(1.0);
+
+	/* VGCS/VBS SETUP REQ in SCCP CR (must be the first message) */
+	BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, setup_req));
+	BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
+
+	alt {
+	[] BSSAP.receive(tr_BSSMAP_VGCS_VBS_SetupAck) -> value rx_bssap {
+		log("VGCS: got setup ack");
+		if (not g_pars.asci_test.vgcs_setup_ok) {
+			COORD.send(COORD_VGCS_CALL_EST);
+			repeat;
+		}
+		BSSAP.send(ts_BSSMAP_ClearCommand(0));
+		BSSAP.receive(tr_BSSMAP_ClearComplete);
+		BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
+		setverdict(pass);
+		return;
+		}
+	[] BSSAP.receive(tr_BSSMAP_VGCS_VBS_SetupRefuse) -> value rx_bssap {
+		log("VGCS: got setup refuse");
+		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+					"Expected ASCI Setup to succeed, but got fail");
+		return;
+		}
+	[] BSSAP.receive(tr_BSSMAP_UplinkReq) -> value rx_bssap {
+		log("VGCS: received uplink req");
+		uplink_req := true;
+		BSSAP.send(ts_BSSMAP_UplinkReqAck(omit));
+		if (g_pars.asci_test.vgcs_talker_req) {
+			T.start;
+		}
+		repeat;
+		}
+	[] BSSAP.receive(tr_BSSMAP_UplinkReqConf(?, omit, '1234'O)) -> value rx_bssap {
+		log("VGCS: received uplink req confirm");
+		uplink_req_conf := true;
+		if (g_pars.asci_test.vgcs_talker_est) {
+			T.start;
+		}
+		repeat;
+		}
+	[] BSSAP.receive(tr_BSSMAP_UplinkRelInd(GSM0808_CAUSE_CALL_CONTROL, omit)) -> value rx_bssap {
+		log("VGCS: received uplink rel ind");
+		uplink_rel_ind := true;
+		if (g_pars.asci_test.vgcs_talker_rel) {
+			T.start;
+		}
+		repeat;
+		}
+	[] COORD.receive(COORD_VGCS_ASSIGN_RES) {
+		log("VGCS: got assignment result at call control");
+		assign_res := true;
+		if (g_pars.asci_test.vgcs_assign_ok) {
+			T.start;
+		}
+		repeat;
+		}
+	[] COORD.receive(COORD_VGCS_ASSIGN_FAIL) {
+		log("VGCS: got assignment failure at call control");
+		assign_fail := true;
+		if (g_pars.asci_test.vgcs_assign_fail) {
+			T.start;
+		}
+		repeat;
+		}
+	[] COORD.receive(COORD_VGCS_UPLINK_FREE) {
+		log("VGCS: Got UPLINK FREE at call control");
+		uplink_busy := false;
+		uplink_free := true;
+		repeat;
+		}
+	[] COORD.receive(COORD_VGCS_UPLINK_BUSY) {
+		log("VGCS: Got UPLINK BUSY at call control");
+		uplink_busy := true;
+		uplink_free := false;
+		repeat;
+		}
+	[] T.timeout { }
+	}
+
+	/* After timeout: Release Channel and Call and see if the outcome of the test is as expected. */
+	COORD.send(COORD_VGCS_CHANNEL_REL);
+	BSSAP.send(ts_BSSMAP_ClearCommand(0));
+	BSSAP.receive(tr_BSSMAP_ClearComplete);
+	BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
+
+	if (g_pars.asci_test.vgcs_assign_ok) {
+		if (not assign_res) {
+			setverdict(fail, "VGCS: Assignment did not pass as expected!");
+			return;
+		}
+		if (not uplink_free) {
+			setverdict(fail, "VGCS: Uplink not free as expected!");
+			return;
+		}
+		log("VGCS: Channel assigned and uplink marked free as expected!");
+		setverdict(pass);
+		return;
+	}
+	if (g_pars.asci_test.vgcs_assign_fail) {
+		if (not assign_fail) {
+			setverdict(fail, "VGCS: Assignment did not fail as expected!");
+			return;
+		}
+		log("VGCS: Channel assignment failed as expected!");
+		setverdict(pass);
+		return;
+	}
+	if (g_pars.asci_test.vgcs_talker_req) {
+		if (not uplink_req) {
+			setverdict(fail, "VGCS: No uplink request as expected!");
+			return;
+		}
+		if (not uplink_busy) {
+			setverdict(fail, "VGCS: Uplink not busy as expected!");
+			return;
+		}
+		log("VGCS: Uplink requested and uplink marked busy as expected!");
+		setverdict(pass);
+		return;
+	}
+	if (g_pars.asci_test.vgcs_talker_est) {
+		if (not uplink_req_conf) {
+			setverdict(fail, "VGCS: No uplink request confirm as expected!");
+			return;
+		}
+		if (not uplink_busy) {
+			setverdict(fail, "VGCS: Uplink not busy as expected!");
+			return;
+		}
+		log("VGCS: Uplink established and uplink marked busy as expected!");
+		setverdict(pass);
+		return;
+	}
+	if (g_pars.asci_test.vgcs_talker_rel) {
+		if (not uplink_rel_ind) {
+			setverdict(fail, "VGCS: No uplink release indication as expected!");
+			return;
+		}
+		if (not uplink_free) {
+			setverdict(fail, "VGCS: Uplink not free as expected!");
+			return;
+		}
+		log("VGCS: Uplink established+released and uplink marked free as expected!");
+		setverdict(pass);
+		return;
+	}
+}
+
+/*
+ * VGCS/VBS resource controling connection
+ */
+
+private altstep as_eat_rsl_data() runs on MSC_ConnHdlr {
+	[] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, ?)) {
+		log("VGCS: Got RSL DATA REQ on channel");
+		repeat;
+	}
+}
+
+private function f_tc_asci_assignment(charstring id) runs on MSC_ConnHdlr {
+	var PDU_BSSAP rx_bssap;
+	/* Hack: the proper way would be to wait for the BSSMAP VGCS Assignment Result and extract the
+	 * actual assigned chan_nr from it. But osmo-bsc starts acting on the lchan even before we get a
+	 * chance to evaluate the BSSMAP Handover Request ACK. So we need to assume that osmo-bsc will
+	 * activate TS 1 and already set up this lchan's RSL emulation
+	 * before we get started. */
+	var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH));
+	f_rslem_register(0, new_chan_nr);
+	g_chan_nr := new_chan_nr;
+	var uint3_t expect_target_tsc := c_BtsParams[0].tsc;
+	var default eat_rsl_data;
+
+	/* Wait for the COORD ports to be connected. */
+	f_sleep(1.0);
+
+	f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
+	f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);
+	var default as_media := activate(as_Media());
+
+	log("VGCS: wait for establishment of call controling connection");
+	COORD.receive(COORD_VGCS_CALL_EST);
+	log("VGCS: got establishment of call controling connection");
+
+	/* TODO: Encryption */
+	var template (value) BSSMAP_IE_ChannelType req_ch_type := ts_BSSMAP_IE_ChannelType;
+	var template BSSMAP_IE_ChannelType res_ch_type := tr_BSSMAP_IE_ChannelType('0001'B, ChRate_TCHF, Spdi_TCHF_FR);
+	var template (value) BSSMAP_IE_CellIdentifier req_cell_id := ts_CellId_CI(0);
+	var template BSSMAP_IE_CellIdentifier res_cell_id := tr_CellId_CI(0);
+	var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
+								ts_BSSMAP_IE_GroupCallRef(11, '1'B, '0'B, '000'B, '0000'B);
+	if (g_pars.asci_test.vgcs_assign_fail) {
+		callref := ts_BSSMAP_IE_GroupCallRef(10, '1'B, '0'B, '000'B, '0000'B);
+	}
+	var template (value) PDU_BSSAP ass_req := f_gen_asci_ass_req(ch_type := req_ch_type, cell_id := req_cell_id,
+									group_call_ref := bit2oct(encvalue(callref)));
+	/* VGCS/VBS ASS REQ in SCCP CR (must be the first message) */
+	BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, ass_req));
+	BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
+
+	alt {
+	[] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentRes(res_ch_type, res_cell_id)) -> value rx_bssap {
+		log("VGCS: got assignment result on channel");
+		COORD.send(COORD_VGCS_ASSIGN_RES);
+		if (g_pars.asci_test.vgcs_talker_req or
+		    g_pars.asci_test.vgcs_talker_est or
+		    g_pars.asci_test.vgcs_talker_rel) {
+			log("VGCS: sending talker det");
+			RSL.send(ts_RSL_TALKER_DET(g_chan_nr));
+		}
+		if (g_pars.asci_test.vgcs_talker_est or
+		    g_pars.asci_test.vgcs_talker_rel) {
+			log("VGCS: sending RSL etabish ind");
+			RSL.send(ts_RSL_EST_IND(g_chan_nr, ts_RslLinkID_DCCH(0), '1234'O));
+		}
+		if (g_pars.asci_test.vgcs_talker_rel) {
+			log("VGCS: sending RSL release ind");
+			RSL.send(ts_RSL_REL_IND(g_chan_nr, ts_RslLinkID_DCCH(0)));
+		}
+		repeat;
+		}
+	[] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentFail) -> value rx_bssap {
+		log("VGCS: got assignment failure on channel");
+		COORD.send(COORD_VGCS_ASSIGN_FAIL);
+		log("VGCS: got release order after assignment failure");
+		COORD.receive(COORD_VGCS_CHANNEL_REL);
+		BSSAP.send(ts_BSSMAP_ClearCommand(0));
+		BSSAP.receive(tr_BSSMAP_ClearComplete);
+		BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
+		return;
+		}
+	[] COORD.receive(COORD_VGCS_CHANNEL_REL) {
+		log("VGCS: got release order of resource controling connection");
+		eat_rsl_data := activate(as_eat_rsl_data());
+		f_perform_clear_no_rr_rel();
+		deactivate(eat_rsl_data);
+		return;
+		}
+	[] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, '082B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O)) {
+		log("VGCS: Got UPLINK FREE on channel");
+		COORD.send(COORD_VGCS_UPLINK_FREE);
+		repeat;
+		}
+	[] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, '062A'O)) {
+		log("VGCS: Got UPLINK BUSY on channel");
+		COORD.send(COORD_VGCS_UPLINK_BUSY);
+		repeat;
+		}
+	}
+
+	/* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
+
+	/* we're sure that the channel activation is done now, verify the parameters in it */
+	var RSL_Message chan_act := f_rslem_get_last_act(RSL_PROC, 0, g_chan_nr);
+	/* TODO: Encryption */
+	f_chan_act_verify_tsc(chan_act, expect_target_tsc);
+
+	if (ispresent(rx_bssap.pdu.bssmap.vGCS_VBSAssignmentResult.speechCodec)) {
+		if (not g_pars.aoip) {
+			Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+						"Expected no Speech Codec (Chosen)");
+		}
+	} else {
+		if (g_pars.aoip) {
+			Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+						"Expected Speech Codec (Chosen)");
+		}
+	}
+
+}
+
+testcase TC_vgcs_vbs_setup_only() runs on test_CT {
+	var MSC_ConnHdlr call_conn;
+	var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+	f_init(1, true);
+
+	pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+	pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+	pars.asci_test.vgcs_setup_ok := true;
+
+	call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+
+	call_conn.done;
+
+	f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_assignment() runs on test_CT {
+	var MSC_ConnHdlr call_conn, chan_conn;
+	var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+	f_init(1, true);
+
+	pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+	pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+	pars.asci_test.vgcs_assign_ok := true;
+
+	call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+	chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+	/* Connect COORD ports of both functions. The functions will delay before using them. */
+	connect(call_conn:COORD, chan_conn:COORD);
+
+	call_conn.done;
+	chan_conn.done;
+
+	f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_assignment_fail() runs on test_CT {
+	var MSC_ConnHdlr call_conn, chan_conn;
+	var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+	f_init(1, true);
+
+	pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+	pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+	pars.asci_test.vgcs_assign_fail := true;
+
+	call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+	chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+	/* Connect COORD ports of both functions. The functions will delay before using them. */
+	connect(call_conn:COORD, chan_conn:COORD);
+
+	call_conn.done;
+	chan_conn.done;
+
+	f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_talker_req() runs on test_CT {
+	var MSC_ConnHdlr call_conn, chan_conn;
+	var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+	f_init(1, true);
+
+	pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+	pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+	pars.asci_test.vgcs_talker_req := true;
+
+	call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+	chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+	/* Connect COORD ports of both functions. The functions will delay before using them. */
+	connect(call_conn:COORD, chan_conn:COORD);
+
+	call_conn.done;
+	chan_conn.done;
+
+	f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_talker_est() runs on test_CT {
+	var MSC_ConnHdlr call_conn, chan_conn;
+	var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+	f_init(1, true);
+
+	pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+	pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+	pars.asci_test.vgcs_talker_est := true;
+
+	call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+	chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+	/* Connect COORD ports of both functions. The functions will delay before using them. */
+	connect(call_conn:COORD, chan_conn:COORD);
+
+	call_conn.done;
+	chan_conn.done;
+
+	f_shutdown_helper();
+}
+
+testcase TC_vgcs_vbs_talker_rel() runs on test_CT {
+	var MSC_ConnHdlr call_conn, chan_conn;
+	var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+	f_init(1, true);
+
+	pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+	pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+	pars.asci_test.vgcs_talker_rel := true;
+
+	call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+	chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+	/* Connect COORD ports of both functions. The functions will delay before using them. */
+	connect(call_conn:COORD, chan_conn:COORD);
+
+	call_conn.done;
+	chan_conn.done;
+
+	f_shutdown_helper();
+}
+
+control {
+	execute( TC_vgcs_vbs_setup_only() );
+	execute( TC_vgcs_vbs_assignment() );
+	execute( TC_vgcs_vbs_assignment_fail() );
+	execute( TC_vgcs_vbs_talker_req() );
+	execute( TC_vgcs_vbs_talker_est() );
+	execute( TC_vgcs_vbs_talker_rel() );
+}
+
+
+}
diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn
index 944e153..433dab5 100644
--- a/bsc/MSC_ConnectionHandler.ttcn
+++ b/bsc/MSC_ConnectionHandler.ttcn
@@ -752,6 +752,15 @@
 	PDU_ML3_MS_NW l3_info optional
 }
 
+type record ASCITest {
+	boolean vgcs_setup_ok,
+	boolean vgcs_assign_ok,
+	boolean vgcs_assign_fail,
+	boolean vgcs_talker_req,
+	boolean vgcs_talker_est,
+	boolean vgcs_talker_rel
+};
+
 type record TestHdlrParams {
 	OCT1		ra,
 	GsmFrameNumber	fn,
@@ -785,7 +794,8 @@
 	boolean		inter_bsc_ho_in__ho_req_in_initial_sccp_cr,
 	boolean		ignore_mgw_mdcx,
 	boolean		fail_on_dlcx,
-	boolean		ignore_ipa_media
+	boolean		ignore_ipa_media,
+	ASCITest	asci_test
 };
 
 /* Note: Do not use valueof() to get a value of this template, use
@@ -834,7 +844,15 @@
 	inter_bsc_ho_in__ho_req_in_initial_sccp_cr := true,
 	ignore_mgw_mdcx := false,
 	fail_on_dlcx := true,
-	ignore_ipa_media := false
+	ignore_ipa_media := false,
+	asci_test := {
+		vgcs_setup_ok := false,
+		vgcs_assign_ok := false,
+		vgcs_assign_fail := false,
+		vgcs_talker_req := false,
+		vgcs_talker_est := false,
+		vgcs_talker_rel := false
+	}
 }
 
 function f_create_chan_and_exp(template (present) PDU_BSSAP exp_l3_compl := ?)
