diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index bd6785e..289298b 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -4928,13 +4928,28 @@
 	return si;
 }
 
-private function f_si3_has_gprs_indicator(RestOctets ro) return boolean {
-	var SI3RestOctets rest := dec_SI3RestOctets(ro);
-	return rest.gprs_ind.presence == '1'B;
+/* Check if GPRS Indicator is present in RR System Information of a given type */
+private function f_si_has_gprs_indicator(RrMessageType si_type)
+runs on test_CT return boolean {
+	var SystemInformation si := f_get_si(L1CTL, si_type);
+
+	if (si_type == SYSTEM_INFORMATION_TYPE_3) {
+		var RestOctets ro := si.payload.si3.rest_octets;
+		var SI3RestOctets rest := dec_SI3RestOctets(ro);
+		return rest.gprs_ind.presence == '1'B;
+	} else if (si_type == SYSTEM_INFORMATION_TYPE_4) {
+		var RestOctets ro := si.payload.si4.rest_octets;
+		var SI4RestOctets rest := dec_SI4RestOctets(ro);
+		return rest.gprs_ind.presence == '1'B;
+	}
+
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Unhandled SI type");
+	return false;
 }
 
-testcase TC_pcu_socket_noconnect_nosi3gprs() runs on test_CT {
-	var SystemInformation si;
+/* Make sure that GPRS Indicator is absent when the PCU is not connected */
+private function f_TC_pcu_socket_noconnect(RrMessageType si_type)
+runs on test_CT {
 	timer T := 5.0;
 
 	/* don't call f_init() as this would connect PCU socket */
@@ -4946,26 +4961,36 @@
 		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for ASP_IPA_EVENT_UP");
 		}
 	}
+
+	/* Send both System Information Type 3 and 4 (with GPRS Indicator) */
 	f_rsl_bcch_fill(RSL_SYSTEM_INFO_3, ts_SI3_default);
+	f_rsl_bcch_fill(RSL_SYSTEM_INFO_4, ts_SI4_default);
 
 	f_init_l1ctl();
 	f_l1_tune(L1CTL);
-
 	f_sleep(2.0);
 	L1CTL.clear;
-	si := f_get_si(L1CTL, SYSTEM_INFORMATION_TYPE_3);
-	if (f_si3_has_gprs_indicator(si.payload.si3.rest_octets)) {
-		setverdict(fail, "SI3 indicates GPRS even before PCU socket connected");
+
+	if (f_si_has_gprs_indicator(si_type)) {
+		setverdict(fail, si_type, " indicates GPRS even before PCU socket connected");
 	} else {
 		setverdict(pass);
 	}
+
 	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
 }
 
-/* Ensure that GPRS capability is advertised after PCU socket connect */
-testcase TC_pcu_socket_connect_si3gprs() runs on test_CT {
-	var SystemInformation si;
+testcase TC_pcu_socket_noconnect_nosi3gprs() runs on test_CT {
+	f_TC_pcu_socket_noconnect(SYSTEM_INFORMATION_TYPE_3);
+}
 
+testcase TC_pcu_socket_noconnect_nosi4gprs() runs on test_CT {
+	f_TC_pcu_socket_noconnect(SYSTEM_INFORMATION_TYPE_4);
+}
+
+/* Ensure that GPRS capability is advertised after PCU socket connect */
+private function f_TC_pcu_socket_connect(RrMessageType si_type)
+runs on test_CT {
 	/* this (among other things) establishes the first connection to the PCUIF socket */
 	f_init();
 	f_init_l1ctl();
@@ -4973,19 +4998,27 @@
 
 	f_sleep(2.0);
 	L1CTL.clear;
-	si := f_get_si(L1CTL, SYSTEM_INFORMATION_TYPE_3);
-	if (not f_si3_has_gprs_indicator(si.payload.si3.rest_octets)) {
-		setverdict(fail, "SI3 indicates no GPRS despite PCU socket connected");
+
+	if (not f_si_has_gprs_indicator(si_type)) {
+		setverdict(fail, si_type, " indicates no GPRS despite PCU socket connected");
 	} else {
 		setverdict(pass);
 	}
+
 	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
 }
 
-/* Ensure that GPRS capability is no longer advertised after PCU socket disconnect */
-testcase TC_pcu_socket_disconnect_nosi3gprs() runs on test_CT {
-	var SystemInformation si;
+testcase TC_pcu_socket_connect_si3gprs() runs on test_CT {
+	f_TC_pcu_socket_connect(SYSTEM_INFORMATION_TYPE_3);
+}
 
+testcase TC_pcu_socket_connect_si4gprs() runs on test_CT {
+	f_TC_pcu_socket_connect(SYSTEM_INFORMATION_TYPE_4);
+}
+
+/* Ensure that GPRS capability is no longer advertised after PCU socket disconnect */
+private function f_TC_pcu_socket_disconnect(RrMessageType si_type)
+runs on test_CT {
 	/* this (among other things) establishes the first connection to the PCUIF socket */
 	f_init();
 	f_init_l1ctl();
@@ -5002,9 +5035,9 @@
 
 	f_sleep(2.0);
 	L1CTL.clear;
-	si := f_get_si(L1CTL, SYSTEM_INFORMATION_TYPE_3);
-	if (f_si3_has_gprs_indicator(si.payload.si3.rest_octets)) {
-		setverdict(fail, "SI3 indicates GPRS after PCU socket disconnected");
+
+	if (f_si_has_gprs_indicator(si_type)) {
+		setverdict(fail, si_type, " indicates GPRS after PCU socket disconnected");
 	} else {
 		setverdict(pass);
 	}
@@ -5012,6 +5045,14 @@
 	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
 }
 
+testcase TC_pcu_socket_disconnect_nosi3gprs() runs on test_CT {
+	f_TC_pcu_socket_disconnect(SYSTEM_INFORMATION_TYPE_3);
+}
+
+testcase TC_pcu_socket_disconnect_nosi4gprs() runs on test_CT {
+	f_TC_pcu_socket_disconnect(SYSTEM_INFORMATION_TYPE_4);
+}
+
 /* Verify that the cell_id of SI3 (TS 04.08 9.1.35) and other values are passed properly to the PCU socket (OS#3854) */
 testcase TC_pcu_socket_verify_info_ind() runs on test_CT {
 	var SystemInformation si3 := valueof(ts_SI3_default);
@@ -6438,8 +6479,11 @@
 		execute( TC_pcu_socket_connect_multi() );
 		execute( TC_pcu_socket_reconnect() );
 		execute( TC_pcu_socket_noconnect_nosi3gprs() );
+		execute( TC_pcu_socket_noconnect_nosi4gprs() );
 		execute( TC_pcu_socket_connect_si3gprs() );
+		execute( TC_pcu_socket_connect_si4gprs() );
 		execute( TC_pcu_socket_disconnect_nosi3gprs() );
+		execute( TC_pcu_socket_disconnect_nosi4gprs() );
 		execute( TC_pcu_socket_verify_info_ind() );
 		execute( TC_dyn_osmo_pdch_act_deact() );
 		execute( TC_dyn_osmo_pdch_double_act() );
