diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index ab93c30..0679df7 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -52,6 +52,26 @@
 
 	/* L1CTL port (for classic tests) */
 	port L1CTL_PT L1CTL;
+
+	/* SI configuration */
+	var SystemInformationConfig si_cfg := {
+		bcch_extended := false,
+		si1_present := false,
+		si2bis_present := false,
+		si2ter_present := false,
+		si2quater_present := false,
+		si7_present := false,
+		si8_present := false,
+		si9_present := false,
+		si13_present := false,
+		si13alt_present := false,
+		si15_present := false,
+		si16_present := false,
+		si17_present := false,
+		si2n_present := false,
+		si21_present := false,
+		si22_present := false
+	};
 }
 
 /* an individual call / channel */
@@ -1008,6 +1028,438 @@
 	f_sleep(100.0);
 }
 
+/***********************************************************************
+ * BCCH
+ ***********************************************************************/
+
+/* tuple of Frame Number + decoded SI */
+type record SystemInformationFn {
+	GsmFrameNumber frame_number,
+	SystemInformation si
+}
+
+/* an arbitrary-length vector of decoded SI + gsmtap header */
+type record of SystemInformationFn SystemInformationVector;
+
+/* an array of SI-vectors indexed by TC value */
+type SystemInformationVector SystemInformationVectorPerTc[8];
+
+/* determine if a given SI vector contains given SI type at least once */
+function f_si_vecslot_contains(SystemInformationVector arr, RrMessageType key, boolean bcch_ext := false) return boolean {
+	for (var integer i:= 0; i< sizeof(arr); i := i + 1) {
+		var integer fn_mod51 := arr[i].frame_number mod 51;
+		if (not bcch_ext and fn_mod51 == 2 or
+		        bcch_ext and fn_mod51 == 6) {
+			if (arr[i].si.header.message_type == key) {
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+/* ensure a given TC slot of the SI vector contains given SI type at least once at TC */
+function f_ensure_si_vec_contains(SystemInformationVectorPerTc arr, integer tc, RrMessageType key, boolean ext_bcch := false) {
+	if (not f_si_vecslot_contains(arr[tc], key, ext_bcch)) {
+		setverdict(fail, "No ", key, " in TC=", tc, "!");
+	}
+}
+
+/* check if a given SI vector contains given SI type at least once on any TC */
+function f_si_vec_contains(SystemInformationVectorPerTc arr, RrMessageType key) return boolean {
+	for (var integer tc:= 0; tc < sizeof(arr); tc := tc + 1) {
+		if (f_si_vecslot_contains(arr[tc], key) or
+		    f_si_vecslot_contains(arr[tc], key, true)) {
+			return true;
+		}
+	}
+	return false;
+}
+
+/* determine if a given SI vector contains given SI type at least N of M times */
+function f_si_vecslot_contains_n_of_m(SystemInformationVector arr, RrMessageType key, boolean bcch_ext := false, integer n := 1, integer m := 4) return boolean {
+	var integer count := 0;
+	if (sizeof(arr) < m) {
+		setverdict(fail, "Error: Insufficient SI in array");
+		self.stop;
+	}
+	for (var integer i:= 0; i < m; i := i + 1) {
+		var integer fn_mod51 := arr[i].frame_number mod 51;
+		if (not bcch_ext and fn_mod51 == 2 or
+		        bcch_ext and fn_mod51 == 6) {
+			if (arr[i].si.header.message_type == key) {
+				count := count + 1;
+			}
+		}
+	}
+	if (count >= n) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
+/* ensure a given TC slot of the SI vector contains given SI type at least N out of M times at TC */
+function f_ensure_si_vec_contains_n_of_m(SystemInformationVectorPerTc arr, integer tc, RrMessageType key, boolean ext_bcch := false, integer n, integer m) {
+	if (not f_si_vecslot_contains_n_of_m(arr[tc], key, ext_bcch, n, m)) {
+		setverdict(fail, "Not ", n, "/", m, " of ", key, " in TC=", tc, "!");
+	}
+}
+
+/* determine if a given SI vector contains given SI type at least once */
+function f_si_vecslot_contains_only(SystemInformationVector arr, RrMessageType key, boolean bcch_ext := false) return boolean {
+	for (var integer i:= 0; i< sizeof(arr); i := i + 1) {
+		var integer fn_mod51 := arr[i].frame_number mod 51;
+		if (not bcch_ext and fn_mod51 == 2 or
+		        bcch_ext and fn_mod51 == 6) {
+			if (arr[i].si.header.message_type != key) {
+				return false;
+			}
+		}
+	}
+	return true;
+}
+
+/* ensure a given TC slot of the SI vector contains only given SI type */
+function f_ensure_si_vec_contains_only(SystemInformationVectorPerTc arr, integer tc, RrMessageType key, boolean ext_bcch := false) {
+	if (not f_si_vecslot_contains_only(arr[tc], key, ext_bcch)) {
+		setverdict(fail, "Not all ", key, " in TC=", tc, "!");
+	}
+}
+
+/* SI configuration of cell, against which we validate actual SI messages */
+type set SystemInformationConfig {
+	boolean bcch_extended,
+	boolean si1_present,
+	boolean si2bis_present,
+	boolean si2ter_present,
+	boolean si2quater_present,
+	boolean si7_present,
+	boolean si8_present,
+	boolean si9_present,
+	boolean si13_present,
+	boolean si13alt_present,
+	boolean si15_present,
+	boolean si16_present,
+	boolean si17_present,
+	boolean si2n_present,
+	boolean si21_present,
+	boolean si22_present
+}
+
+/* validate the SI scheduling according to TS 45.002 version 14.1.0 Release 14, Section 6.3.1.3 */
+function f_validate_si_scheduling(SystemInformationConfig cfg, SystemInformationVectorPerTc si_per_tc) {
+	var integer i;
+	for (i := 0; i < sizeof(si_per_tc); i := i + 1) {
+		if (sizeof(si_per_tc[i]) == 0) {
+			setverdict(fail, "No SI messages for TC=0!");
+		}
+	}
+	if (cfg.si1_present) {
+		/* ii) System Information Type 1 needs to be sent if frequency hopping is in use or
+		 * when the NCH is present in a cell. If the MS finds another message on BCCH Norm
+		 * when TC = 0, it can assume that System Information Type 1 is not in use. */
+		f_ensure_si_vec_contains(si_per_tc, 0, SYSTEM_INFORMATION_TYPE_1);
+		/* make sure *ALL* contain SI1 */
+		f_ensure_si_vec_contains_only(si_per_tc, 0, SYSTEM_INFORMATION_TYPE_1);
+	}
+	f_ensure_si_vec_contains(si_per_tc, 1, SYSTEM_INFORMATION_TYPE_2);
+	/* iii) A SI 2 message will be sent at least every time TC = 1 */
+	f_ensure_si_vec_contains(si_per_tc, 2, SYSTEM_INFORMATION_TYPE_3);
+	f_ensure_si_vec_contains(si_per_tc, 6, SYSTEM_INFORMATION_TYPE_3);
+	f_ensure_si_vec_contains(si_per_tc, 3, SYSTEM_INFORMATION_TYPE_4);
+	f_ensure_si_vec_contains(si_per_tc, 7, SYSTEM_INFORMATION_TYPE_4);
+
+	/*  iii) System information type 2 bis or 2 ter messages are sent if needed, as determined by the
+	 *  system operator. If only one of them is needed, it is sent when TC = 5. If both are
+	 *  needed, 2bis is sent when TC = 5 and 2ter is sent at least once within any of 4
+	 *  consecutive occurrences of TC = 4. */
+	if (cfg.si2bis_present and not cfg.si2ter_present) {
+		f_ensure_si_vec_contains(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2bis);
+	} else if (cfg.si2ter_present and not cfg.si2bis_present) {
+		f_ensure_si_vec_contains(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2ter);
+	} else if (cfg.si2ter_present and cfg.si2bis_present) {
+		f_ensure_si_vec_contains(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2bis);
+		f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_2ter, false, 1, 4);
+	}
+
+	if (cfg.si7_present or cfg.si8_present) {
+		/* vi) Use of System Information type 7 and 8 is not always necessary. It is necessary
+		 * if System Information type 4 does not contain all information needed for cell
+		 * selection and reselection. */
+		if (not cfg.bcch_extended) {
+			testcase.stop("Error: SI7/SI8 require BCCH Extd.");
+		}
+		if (cfg.si7_present) {
+			f_ensure_si_vec_contains(si_per_tc, 7, SYSTEM_INFORMATION_TYPE_7, true);
+		}
+		if (cfg.si8_present) {
+			f_ensure_si_vec_contains(si_per_tc, 3, SYSTEM_INFORMATION_TYPE_8, true);
+		}
+	}
+
+	if (cfg.si2quater_present) {
+		/*  iii) System information type 2 quater is sent if needed, as determined by the system
+		 *  operator.  If sent on BCCH Norm, it shall be sent when TC = 5 if neither of 2bis
+		 *  and 2ter are used, otherwise it shall be sent at least once within any of 4
+		 *  consecutive occurrences of TC = 4. If sent on BCCH Ext, it is sent at least once
+		 *  within any of 4 consecutive occurrences of TC = 5. */
+		if (not (cfg.bcch_extended)) {
+			if (not (cfg.si2bis_present or cfg.si2ter_present)) {
+				f_ensure_si_vec_contains(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2quater);
+			} else {
+				f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_2quater, false, 1, 4);
+			}
+		} else {
+			f_ensure_si_vec_contains_n_of_m(si_per_tc, 5, SYSTEM_INFORMATION_TYPE_2quater, true, 1, 4);
+		}
+	}
+	if (cfg.si9_present) {
+		/* vi) System Information type 9 is sent in those blocks with TC = 4 which are specified
+		 * in system information type 3 as defined in 3GPP TS 44.018. */
+		f_ensure_si_vec_contains(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_9); // FIXME SI3
+	}
+	if (cfg.si13_present) {
+		/* vii) System Information type 13 is only related to the GPRS service. System Information
+		 * Type 13 need only be sent if GPRS support is indicated in one or more of System
+		 * Information Type 3 or 4 or 7 or 8 messages. These messages also indicate if the
+		 * message is sent on the BCCH Norm or if the message is transmitted on the BCCH Ext.
+		 * In the case that the message is sent on the BCCH Norm, it is sent at least once
+		 * within any of 4 consecutive occurrences of TC=4. */
+		if (not cfg.bcch_extended) {
+			log("not-bccch-extended");
+			f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_13, false, 1, 4);
+		} else {
+			log("bccch-extended");
+			f_ensure_si_vec_contains(si_per_tc, 0, SYSTEM_INFORMATION_TYPE_13, true);
+		}
+		if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_13alt)) {
+			setverdict(fail, "Cannot have SI13alt and SI13");
+		}
+	}
+	if (cfg.si16_present or cfg.si17_present) {
+		/* viii) System Information type 16 and 17 are only related to the SoLSA service. They
+		 * should not be sent in a cell where network sharing is used (see rule xv). */
+		if (cfg.si22_present) {
+			testcase.stop("Error: Cannot have SI16/SI17 and SI22!");
+		}
+		if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_22)) {
+			setverdict(fail, "Cannot have SI16/SI17 and SI22!");
+		}
+		if (not cfg.bcch_extended) {
+			testcase.stop("Error: SI16/SI17 requires BCCH Extd!");
+		}
+		if (cfg.si16_present) {
+			f_ensure_si_vec_contains(si_per_tc, 6, SYSTEM_INFORMATION_TYPE_16, true);
+		}
+		if (cfg.si17_present) {
+			f_ensure_si_vec_contains(si_per_tc, 2, SYSTEM_INFORMATION_TYPE_17, true);
+		}
+	}
+
+		/* ix) System Information type 18 and 20 are sent in order to transmit non-GSM
+		 * broadcast information. The frequency with which they are sent is determined by the
+		 * system operator. System Information type 9 identifies the scheduling of System
+		 * Information type 18 and 20 messages. */
+
+		/* x) System Information Type 19 is sent if COMPACT neighbours exist. If System
+		 * Information Type 19 is present, then its scheduling shall be indicated in System
+		 * Information Type 9. */
+
+	if (cfg.si15_present) {
+		/* xi) System Information Type 15 is broadcast if dynamic ARFCN mapping is used in the
+		 * PLMN. If sent on BCCH Norm, it is sent at least once within any of 4 consecutive
+		 * occurrences of TC = 4. If sent on BCCH Ext, it is sent at least once within any of
+		 * 4 consecutive occurrences of TC = 1. */
+		if (not cfg.bcch_extended) {
+			f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_15, false, 1, 4);
+		} else {
+			f_ensure_si_vec_contains_n_of_m(si_per_tc, 1, SYSTEM_INFORMATION_TYPE_15, true, 1, 4);
+		}
+	}
+	if (cfg.si13alt_present) {
+		/* xii) System Information type 13 alt is only related to the GERAN Iu mode. System
+		 * Information Type 13 alt need only be sent if GERAN Iu mode support is indicated in
+		 * one or more of System Information Type 3 or 4 or 7 or 8 messages and SI 13 is not
+		 * broadcast. These messages also indicate if the message is sent on the BCCH Norm or
+		 * if the message is transmitted on the BCCH Ext. In the case that the message is sent
+		 * on the BCCH Norm, it is sent at least once within any of 4 consecutive occurrences
+		 * of TC = 4. */
+		if (cfg.si13_present) {
+			testcase.stop("Error: Cannot have SI13alt and SI13");
+		}
+		if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_13)) {
+			setverdict(fail, "Cannot have SI13alt and SI13");
+		}
+		if (not cfg.bcch_extended) {
+			f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_13alt, false, 1, 4);
+		} else {
+			f_ensure_si_vec_contains(si_per_tc, 0, SYSTEM_INFORMATION_TYPE_13alt, true);
+		}
+	}
+	if (cfg.si2n_present) {
+		/* xiii) System Information Type 2n is optionally sent on BCCH Norm or BCCH Ext if needed,
+		 * as determined by the system operator. In the case that the message is sent on the
+		 * BCCH Norm, it is sent at least once within any of 4 consecutive occurrences of TC =
+		 * 4. If the message is sent on BCCH Ext, it is sent at least once within any of 2
+		 * consecutive occurrences of TC = 4. */
+		if (not cfg.bcch_extended) {
+			f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_2n, false, 1, 4);
+		} else {
+			f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_2n, true, 2, 4);
+		}
+	}
+	if (cfg.si21_present) {
+		/* xiv) System Information Type 21 is optionally sent on BCCH Norm or BCCH Ext, as
+		 * determined by the system operator. If Extended Access Barring is in use in the cell
+		 * then this message is sent at least once within any of 4 consecutive occurrences of
+		 * TC = 4 regardless if it is sent on BCCH Norm or BCCH Ext. If BCCH Ext is used in a
+		 * cell then this message shall only be sent on BCCH Ext. */
+		if (not cfg.bcch_extended) {
+			f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_21, false, 1, 4);
+		} else {
+			f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, SYSTEM_INFORMATION_TYPE_21, true, 1, 4);
+			if (f_si_vecslot_contains(si_per_tc[4], SYSTEM_INFORMATION_TYPE_21)) {
+				setverdict(fail, "Cannot have SI21 on BCCH Norm if BCCH Extd enabled!");
+			}
+		}
+	}
+	if (cfg.si22_present) {
+		/* xv) System Information Type 22 is sent if network sharing is in use in the cell. It
+		 * should not be sent in a cell where SoLSA is used (see rule viii). System
+		 * Information Type 22 instances shall be sent on BCCH Ext within any occurrence of TC
+		 * =2 and TC=6. */
+		if (cfg.si16_present or cfg.si17_present) {
+			testcase.stop("Error: Cannot have SI16/SI17 and SI22!");
+		}
+		if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_16) or
+		    f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_17)) {
+			setverdict(fail, "Cannot have SI16/SI17 and SI22!");
+		}
+		if (not cfg.bcch_extended) {
+			testcase.stop("Error: SI22 requires BCCH Extd!");
+		} else {
+			f_ensure_si_vec_contains_only(si_per_tc, 2, SYSTEM_INFORMATION_TYPE_22, true);
+			f_ensure_si_vec_contains_only(si_per_tc, 6, SYSTEM_INFORMATION_TYPE_22, true);
+		}
+	}
+}
+
+/* sample Systme Information for specified duration via L1CTL */
+function f_l1_sample_si(L1CTL_PT pt, float duration := 8.0) return SystemInformationVectorPerTc {
+	timer T := duration;
+	var SystemInformationVectorPerTc si_per_tc;
+	var L1ctlDlMessage l1_dl;
+
+	/* initialize all per-TC vectors empty */
+	for (var integer i:= 0; i < sizeof(si_per_tc); i := i+1) {
+		si_per_tc[i] := {};
+	}
+
+	/* flush all previous L1 queued msgs */
+	pt.clear;
+
+	T.start;
+	alt {
+	[] pt.receive(t_L1CTL_DATA_IND(t_RslChanNr_BCCH(0), ?)) -> value l1_dl {
+		/* somehow dec_SystemInformation will try to decode even non-RR as SI */
+		if (not (l1_dl.payload.data_ind.payload[1] ==  '06'O)) {
+			log("Ignoring non-RR SI ", l1_dl);
+			repeat;
+		}
+		var SystemInformationFn sig := {
+			frame_number := l1_dl.dl_info.frame_nr,
+			si := dec_SystemInformation(l1_dl.payload.data_ind.payload)
+		}
+		var integer tc := f_gsm_compute_tc(sig.frame_number);
+		log("SI received at TC=", tc, ": ", sig.si);
+		/* append to the per-TC bucket */
+		si_per_tc[tc] := si_per_tc[tc] & { sig };
+		repeat;
+		}
+	[] pt.receive { repeat; }
+	[] T.timeout { }
+	}
+
+	for (var integer i:= 0; i < sizeof(si_per_tc); i := i+1) {
+		log(testcasename(), ": TC=", i, " has #of SI=", sizeof(si_per_tc[i]));
+	}
+	log("si_per_tc=", si_per_tc);
+	return si_per_tc;
+}
+
+/* helper function: Set given SI via RSL + validate scheduling.
+ * CALLER MUST MAKE SURE TO CHANGE GLOBAL si_cfg! */
+function f_TC_si_sched() runs on test_CT {
+	var SystemInformationVectorPerTc si_per_tc;
+	f_init_l1ctl();
+	f_l1_tune(L1CTL);
+
+	/* Sample + Validate Scheduling */
+	si_per_tc := f_l1_sample_si(L1CTL);
+	f_validate_si_scheduling(si_cfg, si_per_tc);
+
+	setverdict(pass);
+}
+
+testcase TC_si_sched_default() runs on test_CT {
+	f_init();
+	f_rsl_bcch_fill(RSL_SYSTEM_INFO_2, ts_SI2_default);
+	f_rsl_bcch_fill(RSL_SYSTEM_INFO_4, ts_SI4_default);
+	f_TC_si_sched();
+}
+
+testcase TC_si_sched_2bis() runs on test_CT {
+	f_init();
+	si_cfg.si2bis_present := true;
+	f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_2bis, '550602bfe809b3ff00000000000000000000007900002b'O);
+	f_TC_si_sched();
+}
+
+testcase TC_si_sched_2ter() runs on test_CT {
+	f_init();
+	si_cfg.si2ter_present := true;
+	f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_2ter, '010603bf66b0aa0a00000002000000000000002b2b2b2b'O);
+	f_TC_si_sched();
+}
+
+testcase TC_si_sched_2ter_2bis() runs on test_CT {
+	f_init();
+	si_cfg.si2bis_present := true;
+	f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_2bis, '550602bfe809b3ff00000000000000000000007900002b'O);
+	si_cfg.si2ter_present := true;
+	f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_2ter, '010603bf66b0aa0a00000002000000000000002b2b2b2b'O);
+	f_TC_si_sched();
+}
+
+testcase TC_si_sched_2quater() runs on test_CT {
+	f_init();
+	si_cfg.si2quater_present := true;
+	f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_2quater, '050607a8a0364aa698d72ff424feee0506d5e7fff02043'O);
+	f_TC_si_sched();
+}
+
+testcase TC_si_sched_13() runs on test_CT {
+	f_init();
+	si_cfg.si13_present := true;
+	//f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_13, fixme);
+	f_TC_si_sched();
+}
+
+testcase TC_si_sched_13_2bis_2ter_2quater() runs on test_CT {
+	f_init();
+	si_cfg.si2bis_present := true;
+	f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_2bis, '550602bfe809b3ff00000000000000000000007900002b'O);
+	si_cfg.si2ter_present := true;
+	f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_2ter, '010603bf66b0aa0a00000002000000000000002b2b2b2b'O);
+	si_cfg.si2quater_present := true;
+	f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_2quater, '050607a8a0364aa698d72ff424feee0506d5e7fff02043'O);
+	si_cfg.si13_present := true;
+	//f_rsl_bcch_fill_raw(RSL_SYSTEM_INFO_13, fixme);
+	f_TC_si_sched();
+}
+
+
 testcase TC_bcch_info() runs on test_CT {
 	f_init(testcasename());
 	/* FIXME: enable / disable individual BCCH info */
@@ -1186,7 +1638,6 @@
 * BS Power Control
 * Physical Context
 * SACCH info modify
-* BCCH INFO (SI Broadcasting)
 * CCCH Load Indication for PCH and RACH
 * Delete Indication on AGCH overflow
 * SMS Broadcast Req / Cmd / CBCH LOad Ind
@@ -1217,6 +1668,13 @@
 	execute( TC_rsl_protocol_error() );
 	execute( TC_rsl_mand_ie_error() );
 	execute( TC_rsl_ie_content_error() );
+	execute( TC_si_sched_default() );
+	execute( TC_si_sched_2bis() );
+	execute( TC_si_sched_2ter() );
+	execute( TC_si_sched_2ter_2bis() );
+	execute( TC_si_sched_2quater() );
+	execute( TC_si_sched_13() );
+	execute( TC_si_sched_13_2bis_2ter_2quater() );
 	execute( TC_ipa_dlcx_not_active() );
 	execute( TC_ipa_crcx_twice_not_active() );
 	execute( TC_ipa_crcx_mdcx_dlcx_not_active() );
