diff --git a/bridges/modules/parachains/src/lib.rs b/bridges/modules/parachains/src/lib.rs
index 5601f588d50331a2548380a375b1ce95fd6acf85..df169ab0bbc632b51b504ba5e451d3c4529d577f 100644
--- a/bridges/modules/parachains/src/lib.rs
+++ b/bridges/modules/parachains/src/lib.rs
@@ -450,7 +450,7 @@ mod tests {
 		run_test, test_relay_header, Origin, TestRuntime, PARAS_PALLET_NAME, UNTRACKED_PARACHAIN_ID,
 	};
 
-	use bp_runtime::BasicOperatingMode;
+	use bp_runtime::{BasicOperatingMode, OwnedBridgeModuleError};
 	use bp_test_utils::{
 		authority_list, generate_owned_bridge_module_tests, make_default_justification,
 	};
@@ -562,6 +562,36 @@ mod tests {
 			})
 	}
 
+	#[test]
+	fn submit_parachain_heads_checks_operating_mode() {
+		let (state_root, proof) = prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]);
+
+		run_test(|| {
+			initialize(state_root);
+
+			// `submit_parachain_heads()` should fail when the pallet is halted.
+			PalletOperatingMode::<TestRuntime>::put(BasicOperatingMode::Halted);
+			assert_noop!(
+				Pallet::<TestRuntime>::submit_parachain_heads(
+					Origin::signed(1),
+					(0, test_relay_header(0, state_root).hash()),
+					vec![ParaId(1), ParaId(2), ParaId(3)],
+					proof.clone(),
+				),
+				Error::<TestRuntime>::BridgeModule(OwnedBridgeModuleError::Halted)
+			);
+
+			// `submit_parachain_heads()` should succeed now that the pallet is resumed.
+			PalletOperatingMode::<TestRuntime>::put(BasicOperatingMode::Normal);
+			assert_ok!(Pallet::<TestRuntime>::submit_parachain_heads(
+				Origin::signed(1),
+				(0, test_relay_header(0, state_root).hash()),
+				vec![ParaId(1)],
+				proof,
+			),);
+		});
+	}
+
 	#[test]
 	fn imports_initial_parachain_heads() {
 		let (state_root, proof) =