diff --git a/gbproxy/GBProxy_Tests.ttcn b/gbproxy/GBProxy_Tests.ttcn
index 8de16d2..f18216e 100644
--- a/gbproxy/GBProxy_Tests.ttcn
+++ b/gbproxy/GBProxy_Tests.ttcn
@@ -37,9 +37,12 @@
 
 import from GSM_RR_Types all;
 
+/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
+const BcdMccMnc c_mcc_mnc := '262F42'H;
+
 modulepar {
 	/* IP/port on which we run our internal GSUP/HLR emulation */
-	NSConfigurations_SGSN mp_nsconfig_sgsn := {
+	NSConfigurations mp_nsconfig_sgsn := {
 		{
 			nsei := 101,
 			role_sgsn := true,
@@ -60,7 +63,7 @@
 			}
 		}
 	};
-	NSConfigurations_PCU mp_nsconfig_pcu := {
+	NSConfigurations mp_nsconfig_pcu := {
 		{
 			nsei := 96,
 			role_sgsn := false,
@@ -119,6 +122,69 @@
 			}
 		}
 	};
+	BssgpConfigs mp_gbconfigs := {
+		{
+			nsei := 96,
+			sgsn_role := false,
+			bvc := {
+				{
+					bvci := 196,
+					cell_id := {
+						ra_id := {
+							lai := {
+								mcc_mnc := c_mcc_mnc,
+								lac := 13135
+							},
+							rac := 0
+						},
+						cell_id := 20960
+					},
+					depth := BSSGP_DECODE_DEPTH_BSSGP,
+					create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
+				}
+			}
+		}, {
+			nsei := 97,
+			sgsn_role := false,
+			bvc := {
+				{
+					bvci := 210,
+					cell_id := {
+						ra_id := {
+							lai := {
+								mcc_mnc := c_mcc_mnc,
+								lac := 13200
+							},
+							rac := 0
+						},
+						cell_id := 20961
+					},
+					depth := BSSGP_DECODE_DEPTH_BSSGP,
+					create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
+				}
+			}
+		}, {
+			nsei := 98,
+			sgsn_role := false,
+			bvc := {
+				{
+					bvci := 220,
+					cell_id := {
+						ra_id := {
+							lai := {
+								mcc_mnc := c_mcc_mnc,
+								lac := 13300
+							},
+							rac := 0
+						},
+						cell_id := 20962
+					},
+					depth := BSSGP_DECODE_DEPTH_BSSGP,
+					create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
+				}
+			}
+		}
+	}
 };
 
 const integer NUM_BVC_PER_NSE := 3;
@@ -130,17 +196,16 @@
 };
 
 const integer NUM_PCU := 3;
-type record length(NUM_PCU) of GbInstance GbInstances_PCU;
-type record length(NUM_PCU) of NSConfiguration NSConfigurations_PCU;
-type record length(NUM_PCU) of BssgpCellId BssgpCellIds;
+type record of GbInstance GbInstances;
+type record of BssgpConfig BssgpConfigs;
+type record of NSConfiguration NSConfigurations;
+type record of BssgpCellId BssgpCellIds;
 
 const integer NUM_SGSN := 1;
-type record length(NUM_SGSN) of GbInstance GbInstances_SGSN;
-type record length(NUM_SGSN) of NSConfiguration NSConfigurations_SGSN;
 
 type component test_CT {
-	var GbInstances_PCU g_pcu;
-	var GbInstances_SGSN g_sgsn;
+	var GbInstances g_pcu;
+	var GbInstances g_sgsn;
 
 	port BSSGP_CT_PROC_PT PROC;
 
@@ -243,118 +308,33 @@
 	f_vty_transceive(GBPVTY, "enable");
 }
 
-/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
-function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
+function f_init() runs on test_CT {
 	var integer i;
 
 	if (g_initialized == true) {
 		return;
 	}
 	g_initialized := true;
-	g_pcu[0].cfg := {
-		nsei := 96,
-		sgsn_role := false,
-		bvc := { {
-			bvci := 196,
-			cell_id := {
-				ra_id := {
-					lai := {
-						mcc_mnc := mcc_mnc, lac := 13135},
-						rac := 0
-					},
-				cell_id := 20960
-			},
-			depth := BSSGP_DECODE_DEPTH_BSSGP,
-			create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
-		} }
-	};
-	g_pcu[1].cfg := {
-		nsei := 97,
-		sgsn_role := false,
-		bvc := { {
-			bvci := 210,
-			cell_id := {
-				ra_id := {
-					lai := {
-						mcc_mnc := mcc_mnc, lac := 13200},
-						rac := 0
-					},
-				cell_id := 20961
-			},
-			depth := BSSGP_DECODE_DEPTH_BSSGP,
-			create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
-		} }
-	};
-	g_pcu[2].cfg := {
-		nsei := 98,
-		sgsn_role := false,
-		bvc := { {
-			bvci := 220,
-			cell_id := {
-				ra_id := {
-					lai := {
-						mcc_mnc := mcc_mnc, lac := 13300},
-						rac := 0
-					},
-				cell_id := 20962
-			},
-			depth := BSSGP_DECODE_DEPTH_BSSGP,
-			create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
-		} }
-	};
 
 	g_sgsn[0].cfg := {
-		nsei := 101,
+		nsei := mp_nsconfig_sgsn[0].nsei,
 		sgsn_role := true,
-		bvc := {
-			{
-				bvci := 196,
-				cell_id := {
-					ra_id := {
-						lai := {
-							mcc_mnc := mcc_mnc, lac := 13135},
-							rac := 0
-						},
-					cell_id := 20960
-				},
-				depth := BSSGP_DECODE_DEPTH_BSSGP,
-				create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
-			},
-			{
-				bvci := 210,
-				cell_id := {
-					ra_id := {
-						lai := {
-							mcc_mnc := mcc_mnc, lac := 13200},
-							rac := 0
-						},
-					cell_id := 20961
-				},
-				depth := BSSGP_DECODE_DEPTH_BSSGP,
-				create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
-			},
-			{
-				bvci := 220,
-				cell_id := {
-					ra_id := {
-						lai := {
-							mcc_mnc := mcc_mnc, lac := 13300},
-							rac := 0
-						},
-					cell_id := 20962
-				},
-				depth := BSSGP_DECODE_DEPTH_BSSGP,
-				create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
-			}
-		}
-	};
+		bvc := { }
+	}
+	for (i := 0; i < lengthof(mp_gbconfigs); i := i+1) {
+		g_pcu[i].cfg := mp_gbconfigs[i];
+		/* concatenate all the PCU-side BVCs for the SGSN side */
+		g_sgsn[0].cfg.bvc := g_sgsn[0].cfg.bvc & mp_gbconfigs[i].bvc;
+	}
 
 	f_init_vty();
-	f_init_gb_sgsn(g_sgsn[0], "GbProxy_Test-SGSN0", 0);
+	for (i := 0; i < lengthof(mp_nsconfig_sgsn); i := i+1) {
+		f_init_gb_sgsn(g_sgsn[0], "GbProxy_Test-SGSN" & int2str(i), 0);
+	}
 	f_sleep(4.0);
-	f_init_gb_pcu(g_pcu[0], "GbProxy_Test-PCU0", 0);
-	f_init_gb_pcu(g_pcu[1], "GbProxy_Test-PCU1", 1);
-	f_init_gb_pcu(g_pcu[2], "GbProxy_Test-PCU2", 2);
+	for (i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
+		f_init_gb_pcu(g_pcu[i], "GbProxy_Test-PCU" & int2str(i), i);
+	}
 }
 
 function f_cleanup() runs on test_CT {
@@ -364,7 +344,7 @@
 type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
 
 /* helper function to create, connect and start a BSSGP_ConnHdlr component */
-function f_start_handler(void_fn fn, charstring id, GbInstances_PCU pcu, GbInstances_SGSN sgsn, integer imsi_suffix,
+function f_start_handler(void_fn fn, charstring id, GbInstances pcu, GbInstances sgsn, integer imsi_suffix,
 			 float t_guard := 30.0)
 runs on test_CT return BSSGP_ConnHdlr {
 	var BSSGP_ConnHdlr vc_conn;
