diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs
index 2338192da1f1071df98bba14efa8b57768b60296..2eb242e73871d86939d6067cf75d47ac7b7a6d32 100644
--- a/cumulus/pallets/parachain-system/src/lib.rs
+++ b/cumulus/pallets/parachain-system/src/lib.rs
@@ -310,7 +310,7 @@ pub mod pallet {
 			let relay_state_proof = RelayChainStateProof::new(
 				T::SelfParaId::get(),
 				vfp.relay_parent_storage_root,
-				relay_chain_state,
+				relay_chain_state.clone(),
 			)
 			.expect("Invalid relay chain state proof");
 
@@ -352,6 +352,7 @@ pub mod pallet {
 				.expect("Invalid messaging state in relay chain state proof");
 
 			<ValidationData<T>>::put(&vfp);
+			<RelayStateProof<T>>::put(relay_chain_state);
 			<RelevantMessagingState<T>>::put(relevant_messaging_state.clone());
 			<HostConfiguration<T>>::put(host_config);
 
@@ -484,6 +485,16 @@ pub mod pallet {
 	pub(super) type UpgradeRestrictionSignal<T: Config> =
 		StorageValue<_, Option<relay_chain::v2::UpgradeRestriction>, ValueQuery>;
 
+	/// The state proof for the last relay parent block.
+	///
+	/// This field is meant to be updated each block with the validation data inherent. Therefore,
+	/// before processing of the inherent, e.g. in `on_initialize` this data may be stale.
+	///
+	/// This data is also absent from the genesis.
+	#[pallet::storage]
+	#[pallet::getter(fn relay_state_proof)]
+	pub(super) type RelayStateProof<T: Config> = StorageValue<_, sp_trie::StorageProof>;
+
 	/// The snapshot of some state related to messaging relevant to the current parachain as per
 	/// the relay parent.
 	///
diff --git a/cumulus/primitives/parachain-inherent/src/client_side.rs b/cumulus/primitives/parachain-inherent/src/client_side.rs
index 99c27bc8241f0f1bf4a2c56ccd359f642b517c01..000094f07094ed62d6c563644a30397a15caf32b 100644
--- a/cumulus/primitives/parachain-inherent/src/client_side.rs
+++ b/cumulus/primitives/parachain-inherent/src/client_side.rs
@@ -93,6 +93,9 @@ async fn collect_relay_storage_proof(
 		.unwrap_or_default();
 
 	let mut relevant_keys = Vec::new();
+	relevant_keys.push(relay_well_known_keys::CURRENT_BLOCK_RANDOMNESS.to_vec());
+	relevant_keys.push(relay_well_known_keys::ONE_EPOCH_AGO_RANDOMNESS.to_vec());
+	relevant_keys.push(relay_well_known_keys::TWO_EPOCHS_AGO_RANDOMNESS.to_vec());
 	relevant_keys.push(relay_well_known_keys::CURRENT_SLOT.to_vec());
 	relevant_keys.push(relay_well_known_keys::ACTIVE_CONFIG.to_vec());
 	relevant_keys.push(relay_well_known_keys::dmq_mqc_head(para_id));