diff --git a/library/BSSGP_Emulation.ttcn b/library/BSSGP_Emulation.ttcn
index 8b3b9eb..a9d2a25 100644
--- a/library/BSSGP_Emulation.ttcn
+++ b/library/BSSGP_Emulation.ttcn
@@ -79,9 +79,9 @@
  ***********************************************************************/
 
 type component BSSGP_Client_CT {
-	port BSSGP_PT BSSGP;
-	port BSSGP_PT BSSGP_SIG;
-	port BSSGP_PROC_PT BSSGP_PROC;
+	port BSSGP_PT BSSGP[3];
+	port BSSGP_PT BSSGP_SIG[3];
+	port BSSGP_PROC_PT BSSGP_PROC[3];
 };
 
 /***********************************************************************
@@ -660,14 +660,14 @@
 	return dec;
 }
 
-function f_bssgp_client_register(hexstring imsi, OCT4 tlli, BssgpCellId cell_id, BSSGP_PROC_PT PT := BSSGP_PROC)
+function f_bssgp_client_register(hexstring imsi, OCT4 tlli, BssgpCellId cell_id, BSSGP_PROC_PT PT := BSSGP_PROC[0])
 runs on BSSGP_Client_CT {
 	PT.call(BSSGP_register_client:{imsi, tlli, cell_id}) {
 		[] PT.getreply(BSSGP_register_client:{imsi, tlli, cell_id}) {};
 	}
 }
 
-function f_bssgp_client_unregister(hexstring imsi, BSSGP_PROC_PT PT := BSSGP_PROC)
+function f_bssgp_client_unregister(hexstring imsi, BSSGP_PROC_PT PT := BSSGP_PROC[0])
 runs on BSSGP_Client_CT {
 	PT.call(BSSGP_unregister_client:{imsi}) {
 		[] PT.getreply(BSSGP_unregister_client:{imsi}) {};
@@ -675,7 +675,7 @@
 }
 
 /* TS 44.064 7.2.1.1 LLGMM-ASSIGN */
-function f_bssgp_client_llgmm_assign(OCT4 tlli_old, OCT4 tlli_new, BSSGP_PROC_PT PT := BSSGP_PROC)
+function f_bssgp_client_llgmm_assign(OCT4 tlli_old, OCT4 tlli_new, BSSGP_PROC_PT PT := BSSGP_PROC[0])
 runs on BSSGP_Client_CT {
 	PT.call(BSSGP_llgmm_assign:{tlli_old, tlli_new}) {
 		[] PT.getreply(BSSGP_llgmm_assign:{tlli_old, tlli_new}) {};
diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn
index d59ac11..a63ca1d 100644
--- a/pcu/PCU_Tests.ttcn
+++ b/pcu/PCU_Tests.ttcn
@@ -68,9 +68,9 @@
 		ns_component := NS_CT.create;
 		bssgp_component := BSSGP_CT.create;
 		/* connect our BSSGP port to the BSSGP Emulation */
-		connect(self:BSSGP, bssgp_component:BSSGP_SP);
-		connect(self:BSSGP_SIG, bssgp_component:BSSGP_SP_SIG);
-		connect(self:BSSGP_PROC, bssgp_component:BSSGP_PROC);
+		connect(self:BSSGP[0], bssgp_component:BSSGP_SP);
+		connect(self:BSSGP_SIG[0], bssgp_component:BSSGP_SP_SIG);
+		connect(self:BSSGP_PROC[0], bssgp_component:BSSGP_PROC);
 		/* connect lower-end of BSSGP with BSSGP_CODEC_PORT (maps to NS_PT*/
 		connect(bssgp_component:BSCP, ns_component:NS_SP);
 		/* connect lower-end of NS emulation to NS_CODEC_PORT (on top of IPl4) */
@@ -186,7 +186,7 @@
 
 		log(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
 
-		BSSGP.send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
+		BSSGP[0].send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
 	}
 
 	/* Establish BSSGP connection to PCU */
@@ -196,8 +196,8 @@
 		f_init();
 		T.start
 		alt {
-			[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { }
-			[] BSSGP.receive { repeat; }
+			[] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { }
+			[] BSSGP[0].receive { repeat; }
 			[] T.timeout {
 				setverdict(fail, "Timeout establishing BSSGP connection");
 				mtc.stop;
@@ -215,17 +215,17 @@
 		f_init();
 
 		/* Send paging on signalling BVCI 0 since osmo-pcu does not support paging on PTP yet. */
-		BSSGP_SIG.send(ts_BSSGP_PS_PAGING_IMSI(0, g_mmctx.imsi));
-		BSSGP_SIG.send(ts_BSSGP_PS_PAGING_PTMSI(0, g_mmctx.imsi, tmsi));
+		BSSGP_SIG[0].send(ts_BSSGP_PS_PAGING_IMSI(0, g_mmctx.imsi));
+		BSSGP_SIG[0].send(ts_BSSGP_PS_PAGING_PTMSI(0, g_mmctx.imsi, tmsi));
 
 		while (true) {
 			var BssgpDecoded bd;
 			alt {
-				[] BSSGP.receive(tr_BD_L3_MT(?)) -> value bd {
+				[] BSSGP[0].receive(tr_BD_L3_MT(?)) -> value bd {
 					log("BSSGP Rx: ", bd);
 				}
-				[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
-				[] BSSGP.receive { repeat; }
+				[] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
+				[] BSSGP[0].receive { repeat; }
 			}
 		}
 	}
@@ -283,7 +283,7 @@
 	timer T := 5.0;
 	T.start;
 	alt {
-	[] BSSGP.receive(bd_exp) {
+	[] BSSGP[0].receive(bd_exp) {
 		log("found matching BSSGP UL-UNITDATA PDU");
 		}
 	[] T.timeout {
@@ -355,14 +355,14 @@
 		while (true) {
 			var BssgpDecoded bd;
 			alt {
-				[] BSSGP.receive(tr_BD_BSSGP(?)) -> value bd {
+				[] BSSGP[0].receive(tr_BD_BSSGP(?)) -> value bd {
 					log("BSSGP Rx: ", bd);
 					//log("GMM Rx: ", dec_PDU_L3_MS_SGSN(pdu.payload));
 					g_mmctx.tlli := bd.bssgp.pDU_BSSGP_UL_UNITDATA.tLLI;
 					tx_gmm(LLC_CR_DL_CMD, gmm_auth_req);
 				}
-				[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
-				[] BSSGP.receive { repeat; }
+				[] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
+				[] BSSGP[0].receive { repeat; }
 			}
 		}
 	}
diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn
index d2db909..6bf2d60 100644
--- a/sgsn/SGSN_Tests.ttcn
+++ b/sgsn/SGSN_Tests.ttcn
@@ -259,8 +259,8 @@
 	};
 
 	vc_conn := BSSGP_ConnHdlr.create(id);
-	connect(vc_conn:BSSGP, gb.vc_BSSGP:BSSGP_SP);
-	connect(vc_conn:BSSGP_PROC, gb.vc_BSSGP:BSSGP_PROC);
+	connect(vc_conn:BSSGP[0], gb.vc_BSSGP:BSSGP_SP);
+	connect(vc_conn:BSSGP_PROC[0], gb.vc_BSSGP:BSSGP_PROC);
 
 	connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
 	connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
@@ -321,14 +321,14 @@
 
 altstep as_mm_identity() runs on BSSGP_ConnHdlr {
 	var MobileL3_CommonIE_Types.MobileIdentityLV mi;
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
 		mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
-		BSSGP.send(ts_GMM_ID_RESP(mi));
+		BSSGP[0].send(ts_GMM_ID_RESP(mi));
 		repeat;
 	}
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
 		mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
-		BSSGP.send(ts_GMM_ID_RESP(mi));
+		BSSGP[0].send(ts_GMM_ID_RESP(mi));
 		repeat;
 	}
 }
@@ -374,7 +374,7 @@
 
 		var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
 		auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
-		BSSGP.receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
+		BSSGP[0].receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
 		l3_mt := bd.l3_mt;
 		var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
 		var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
@@ -397,7 +397,7 @@
 			l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
 						valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
 		}
-		BSSGP.send(l3_mo);
+		BSSGP[0].send(l3_mo);
 	} else {
 		/* wait for identity procedure */
 		f_sleep(1.0);
@@ -503,16 +503,16 @@
 	 * revisionLevelIndicatior is at the wrong place! */
 	attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
 
-	BSSGP.send(attach_req);
+	BSSGP[0].send(attach_req);
 	f_gmm_auth(umts_aka_challenge, force_gsm_sres);
 	/* Expect SGSN to perform LU with HLR */
 	f_gmm_gsup_lu_isd();
 
-	BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
+	BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
 		f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
 	}
 	/* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
-	BSSGP.send(ts_GMM_ATTACH_COMPL);
+	BSSGP[0].send(ts_GMM_ATTACH_COMPL);
 }
 
 private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
@@ -564,16 +564,16 @@
 private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	alt {
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
 		/* don't send ID Response */
 		repeat;
 		}
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
 		setverdict(pass);
 		}
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
 		setverdict(fail, "Wrong Attach Reject Cause");
 		mtc.stop;
 		}
@@ -590,13 +590,13 @@
 private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	alt {
 	[] as_mm_identity();
 	[] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
 	}
 	/* don't send SAI-response from HLR */
-	BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
+	BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
 	setverdict(pass);
 }
 testcase TC_attach_auth_sai_timeout() runs on test_CT {
@@ -610,14 +610,14 @@
 private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	alt {
 	[] as_mm_identity();
 	[] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
 		GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
 		}
 	}
-	BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
+	BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
 	setverdict(pass);
 }
 testcase TC_attach_auth_sai_reject() runs on test_CT {
@@ -632,16 +632,16 @@
 	var BssgpDecoded bd;
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	f_gmm_auth();
 	/* Expect MSC to perform LU with HLR */
 	GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
 	/* Never follow-up with ISD_REQ or UL_RES */
 	alt {
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
 		setverdict(pass);
 		}
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
 		f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
 		setverdict(fail);
 		mtc.stop;
@@ -661,17 +661,17 @@
 	var BssgpDecoded bd;
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	f_gmm_auth();
 	/* Expect MSC to perform LU with HLR */
 	GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
 		GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
 	}
 	alt {
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
 		setverdict(pass);
 		}
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
 		f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
 		setverdict(fail);
 		mtc.stop;
@@ -692,15 +692,15 @@
 	var BssgpDecoded bd;
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
 	f_gmm_auth();
 	/* Expect MSC to perform LU with HLR */
 	f_gmm_gsup_lu_isd();
 
-	BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
+	BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
 		f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
 	}
-	BSSGP.send(ts_GMM_ATTACH_COMPL);
+	BSSGP[0].send(ts_GMM_ATTACH_COMPL);
 	setverdict(pass);
 }
 testcase TC_attach_combined() runs on test_CT {
@@ -718,12 +718,12 @@
 
 	g_pars.net.expect_auth := false;
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	f_gmm_auth();
-	BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
+	BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
 		f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
 	}
-	BSSGP.send(ts_GMM_ATTACH_COMPL);
+	BSSGP[0].send(ts_GMM_ATTACH_COMPL);
 	setverdict(pass);
 }
 testcase TC_attach_accept_all() runs on test_CT {
@@ -745,16 +745,16 @@
 
 	g_pars.net.expect_auth := false;
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	alt {
 	[] as_mm_identity();
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
 		setverdict(pass);
 		}
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
 		setverdict(pass);
 		}
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
 		setverdict(fail);
 		mtc.stop;
 		}
@@ -777,13 +777,13 @@
 private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
 	var RoutingAreaIdentificationV old_ra := f_random_RAI();
 
-	BSSGP.send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
+	BSSGP[0].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
 	alt {
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
 		setverdict(pass);
 		}
 	/* FIXME: Expect XID RESET? */
-	[] BSSGP.receive { repeat; }
+	[] BSSGP[0].receive { repeat; }
 	}
 }
 testcase TC_rau_unknown() runs on test_CT {
@@ -801,18 +801,18 @@
 	f_TC_attach(id);
 
 	/* then send RAU */
-	BSSGP.send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
+	BSSGP[0].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
 	alt {
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
 		f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
-		BSSGP.send(ts_GMM_RAU_COMPL);
+		BSSGP[0].send(ts_GMM_RAU_COMPL);
 		setverdict(pass);
 		}
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
 		setverdict(fail, "Unexpected RAU Reject");
 		mtc.stop;
 		}
-	[] BSSGP.receive { repeat; }
+	[] BSSGP[0].receive { repeat; }
 	}
 }
 testcase TC_attach_rau() runs on test_CT {
@@ -827,7 +827,7 @@
 function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
 	var BssgpDecoded bd;
 	timer T := 5.0;
-	BSSGP.send(ts_GMM_DET_REQ_MO(detach_type, power_off));
+	BSSGP[0].send(ts_GMM_DET_REQ_MO(detach_type, power_off));
 	if (expect_purge) {
 		GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
 		GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
@@ -838,7 +838,7 @@
 		setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
 		mtc.stop;
 		}
-	[power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
+	[power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
 		g_pars.ra := omit;
 		setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
 		mtc.stop;
@@ -847,12 +847,12 @@
 	[power_off] T.timeout {
 		setverdict(pass);
 		}
-	[not power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
+	[not power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
 		g_pars.ra := omit;
 		setverdict(pass);
 		/* TODO: check if any PDP contexts are deactivated on network side? */
 		}
-	[] BSSGP.receive { repeat; }
+	[] BSSGP[0].receive { repeat; }
 	}
 }
 
@@ -954,7 +954,7 @@
 		recovery := ts_Recovery(apars.ggsn_restart_ctr);
 	}
 
-	BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
+	BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
 				     apars.apn, apars.pco));
 	GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
 		f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
@@ -967,18 +967,18 @@
 						omit, recovery));
 	}
 	alt {
-	[exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
+	[exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
 		setverdict(pass);
 		}
-	[exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
+	[exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
 		setverdict(fail, "Unexpected PDP CTX ACT ACC");
 		mtc.stop;
 		}
-	[not exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
+	[not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
 		setverdict(fail, "Unexpected PDP CTX ACT FAIL");
 		mtc.stop;
 		}
-	[not exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
+	[not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
 		setverdict(pass);
 		}
 	[] as_xid(apars);
@@ -989,14 +989,14 @@
 	var boolean exp_rej := ispresent(apars.exp_rej_cause);
 	var Gtp1cUnitdata g_ud;
 
-	BSSGP.send(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
+	BSSGP[0].send(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
 	GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
 		var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
-		BSSGP.clear;
+		BSSGP[0].clear;
 		GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
 	}
 	alt {
-	[] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
 		setverdict(pass);
 		}
 	[] as_xid(apars);
@@ -1008,7 +1008,7 @@
 	var integer seq_nr := 23;
 	var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
 
-	BSSGP.clear;
+	BSSGP[0].clear;
 	if (error_ind) {
 		GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
 	} else {
@@ -1019,8 +1019,8 @@
 	T.start;
 
 	alt {
-	[] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
-		BSSGP.send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
+		BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
 		}
 	[not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
 		repeat;
@@ -1124,7 +1124,7 @@
 }
 
 private altstep as_xid(PdpActPars apars) runs on BSSGP_ConnHdlr {
-	[] BSSGP.receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
+	[] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
 		repeat;
 	}
 }
@@ -1169,7 +1169,7 @@
 	/* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
 	alt {
 	[] as_xid(apars);
-	[] BSSGP.receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
+	[] BSSGP[0].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
 	}
 }
 
@@ -1178,7 +1178,7 @@
 	/* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
 	var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
 	var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
-	BSSGP.send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
+	BSSGP[0].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
 	/* Expect PDU via GTP from SGSN on simulated GGSN */
 	alt {
 	[] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
@@ -1203,22 +1203,22 @@
 /* PDP Context activation for not-attached subscriber; expect fail */
 private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
 	var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
-	BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
+	BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
 				     apars.apn, apars.pco));
 	alt {
 	/* We might want toalso actually expect a PDPC CTX ACT REJ? */
-	[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
 		setverdict(pass);
 		}
 	[] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
 		setverdict(fail, "Unexpected GTP PDP CTX ACT");
 		mtc.stop;
 		}
-	[] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
 		setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
 		mtc.stop;
 		}
-	[] BSSGP.receive { repeat; }
+	[] BSSGP[0].receive { repeat; }
 	}
 }
 testcase TC_pdp_act_unattached() runs on test_CT {
@@ -1350,8 +1350,8 @@
 	}
 	var OCT1 cause_network_failure := int2oct(38, 1)
 	alt {
-	[] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
-		BSSGP.send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
+	[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
+		BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
 		setverdict(pass);
 		}
 	[] as_xid(apars);
@@ -1419,20 +1419,20 @@
 	/* then activate PDP context */
 	f_pdp_ctx_act(apars);
 
-	BSSGP.clear;
+	BSSGP[0].clear;
 	peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
 	GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
 
 	for (i := 0; i < 5; i := i+1) {
 		alt {
-			[] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
+			[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
 			[] as_xid(apars);
 		}
 	}
 
 	GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
 
-	BSSGP.send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
+	BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
 	setverdict(pass);
 }
 testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
@@ -1455,7 +1455,7 @@
 	timer T := 5.0;
 	T.start;
 	alt {
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
 			T.stop;
 			setverdict(fail, "Unexpected GMM Detach Request");
 			mtc.stop;
@@ -1464,7 +1464,7 @@
 			setverdict(pass);
 			mtc.stop;
 		}
-		[] BSSGP.receive {
+		[] BSSGP[0].receive {
 			repeat;
 		}
 	}
@@ -1514,8 +1514,8 @@
 	GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
 
 	/* MS: receive a Detach Request */
-	BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
-	BSSGP.send(ts_GMM_DET_ACCEPT_MO);
+	BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
+	BSSGP[0].send(ts_GMM_DET_ACCEPT_MO);
 
 	setverdict(pass);
 }
@@ -1606,18 +1606,18 @@
 	var integer count_req := 0;
 	var MobileL3_CommonIE_Types.MobileIdentityLV mi;
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
 
 	alt {
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
 			/* break */
 		}
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
 			mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
-			BSSGP.send(ts_GMM_ID_RESP(mi));
+			BSSGP[0].send(ts_GMM_ID_RESP(mi));
 			repeat;
 		}
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
 			/* ignore ID REQ IMEI */
 			count_req := count_req + 1;
 			repeat;
@@ -1654,20 +1654,20 @@
 	/* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
 	g_pars.p_tmsi := 'c0000035'O;
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
 
 	alt {
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
 			/* break */
 		}
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
 			/* ignore ID REQ IMSI */
 			count_req := count_req + 1;
 			repeat;
 		}
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
 			mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
-			BSSGP.send(ts_GMM_ID_RESP(mi));
+			BSSGP[0].send(ts_GMM_ID_RESP(mi));
 			repeat;
 		}
 	}
@@ -1728,16 +1728,16 @@
 	/* there is no auth */
 	g_pars.net.expect_auth := false;
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
 	f_gmm_auth();
 	alt {
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
 			setverdict(fail, "Received unexpected GMM Attach REJECT");
 			mtc.stop;
 		}
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
 			f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
-			BSSGP.send(ts_GMM_ATTACH_COMPL);
+			BSSGP[0].send(ts_GMM_ATTACH_COMPL);
 			setverdict(pass);
 		}
 	}
@@ -1774,14 +1774,14 @@
 private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
 	var integer count_req := 0;
 
-	BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
+	BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
 	f_gmm_auth();
 
 	alt {
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
 			/* break */
 		}
-		[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
+		[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
 			/* ignore */
 			count_req := count_req + 1;
 			repeat;
