diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock
index f56d0b424a8f64fdffa469e96723ac0647f1010b..67fcf09c666a1ac0eb7445632068fbba484f1e03 100644
--- a/polkadot/Cargo.lock
+++ b/polkadot/Cargo.lock
@@ -7458,6 +7458,7 @@ dependencies = [
  "scale-info",
  "serde",
  "sp-api",
+ "sp-application-crypto",
  "sp-core",
  "sp-inherents",
  "sp-io",
diff --git a/polkadot/runtime/kusama/src/weights/runtime_parachains_paras.rs b/polkadot/runtime/kusama/src/weights/runtime_parachains_paras.rs
index 3e34104451f3319794db1dfc5e553cdd33c3b1c7..f646638c2786eee8a5d38ce402eaf9c21a2b69fc 100644
--- a/polkadot/runtime/kusama/src/weights/runtime_parachains_paras.rs
+++ b/polkadot/runtime/kusama/src/weights/runtime_parachains_paras.rs
@@ -1,4 +1,4 @@
-// Copyright 2017-2022 Parity Technologies (UK) Ltd.
+// Copyright 2017-2021 Parity Technologies (UK) Ltd.
 // This file is part of Polkadot.
 
 // Polkadot is free software: you can redistribute it and/or modify
@@ -16,11 +16,11 @@
 //! Autogenerated weights for `runtime_parachains::paras`
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-03-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-02-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 1024
 
 // Executed Command:
-// ./target/production/polkadot
+// target/production/polkadot
 // benchmark
 // --chain=kusama-dev
 // --steps=50
@@ -52,13 +52,13 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	fn force_set_current_code(c: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 0
-			.saturating_add((3_000 as Weight).saturating_mul(c as Weight))
+			.saturating_add((2_000 as Weight).saturating_mul(c as Weight))
 			.saturating_add(T::DbWeight::get().reads(4 as Weight))
 			.saturating_add(T::DbWeight::get().writes(6 as Weight))
 	}
 	// Storage: Paras Heads (r:0 w:1)
 	fn force_set_current_head(s: u32, ) -> Weight {
-		(11_215_000 as Weight)
+		(10_155_000 as Weight)
 			// Standard Error: 0
 			.saturating_add((1_000 as Weight).saturating_mul(s as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
@@ -77,7 +77,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	fn force_schedule_code_upgrade(c: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 0
-			.saturating_add((3_000 as Weight).saturating_mul(c as Weight))
+			.saturating_add((2_000 as Weight).saturating_mul(c as Weight))
 			.saturating_add(T::DbWeight::get().reads(9 as Weight))
 			.saturating_add(T::DbWeight::get().writes(8 as Weight))
 	}
@@ -85,7 +85,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	// Storage: Paras Heads (r:0 w:1)
 	// Storage: Paras UpgradeGoAheadSignal (r:0 w:1)
 	fn force_note_new_head(s: u32, ) -> Weight {
-		(14_968_000 as Weight)
+		(15_433_000 as Weight)
 			// Standard Error: 0
 			.saturating_add((1_000 as Weight).saturating_mul(s as Weight))
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
@@ -94,7 +94,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
 	// Storage: Paras ActionsQueue (r:1 w:1)
 	fn force_queue_action() -> Weight {
-		(17_635_000 as Weight)
+		(16_160_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
@@ -103,15 +103,77 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	fn add_trusted_validation_code(c: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 0
-			.saturating_add((3_000 as Weight).saturating_mul(c as Weight))
+			.saturating_add((2_000 as Weight).saturating_mul(c as Weight))
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Paras CodeByHashRefs (r:1 w:0)
 	// Storage: Paras CodeByHash (r:0 w:1)
 	fn poke_unused_validation_code() -> Weight {
-		(2_669_000 as Weight)
+		(2_464_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	fn include_pvf_check_statement() -> Weight {
+		(117_279_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(4 as Weight))
+			.saturating_add(T::DbWeight::get().writes(1 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras UpcomingUpgrades (r:1 w:1)
+	// Storage: System Digest (r:1 w:1)
+	// Storage: Paras FutureCodeUpgrades (r:0 w:100)
+	fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight {
+		(624_849_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(7 as Weight))
+			.saturating_add(T::DbWeight::get().writes(104 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras CodeByHashRefs (r:1 w:1)
+	// Storage: Paras CodeByHash (r:0 w:1)
+	// Storage: Paras UpgradeGoAheadSignal (r:0 w:100)
+	// Storage: Paras FutureCodeHash (r:0 w:100)
+	fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight {
+		(551_320_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(204 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras ActionsQueue (r:1 w:1)
+	fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight {
+		(498_904_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(3 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras CodeByHashRefs (r:1 w:1)
+	// Storage: Paras ParaLifecycles (r:0 w:100)
+	// Storage: Paras CodeByHash (r:0 w:1)
+	// Storage: Paras CurrentCodeHash (r:0 w:100)
+	// Storage: Paras UpcomingParasGenesis (r:0 w:100)
+	fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight {
+		(609_470_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(304 as Weight))
+	}
 }
diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml
index 26e151f27a9f80c7026d6abd33dd5571e8879ba2..ec1ec29650f27dd3b28962dda4bd1662a73fb036 100644
--- a/polkadot/runtime/parachains/Cargo.toml
+++ b/polkadot/runtime/parachains/Cargo.toml
@@ -23,6 +23,7 @@ sp-session = { git = "https://github.com/paritytech/substrate", branch = "master
 sp-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true }
+sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true }
 sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true }
 
 pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
@@ -96,6 +97,7 @@ runtime-benchmarks = [
 	"frame-system/runtime-benchmarks",
 	"primitives/runtime-benchmarks",
 	"static_assertions",
+	"sp-application-crypto",
 ]
 try-runtime = [
 	"frame-support/try-runtime",
diff --git a/polkadot/runtime/parachains/src/paras/benchmarking.rs b/polkadot/runtime/parachains/src/paras/benchmarking.rs
index e2c4954a23401acd51fd14f873c89f426a9a24a9..9d31453638a75bc3505a0b736dfb30031bc803ff 100644
--- a/polkadot/runtime/parachains/src/paras/benchmarking.rs
+++ b/polkadot/runtime/parachains/src/paras/benchmarking.rs
@@ -15,12 +15,16 @@
 // along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
 
 use super::*;
-use crate::{configuration::HostConfiguration, shared};
+use crate::configuration::HostConfiguration;
 use frame_benchmarking::benchmarks;
 use frame_system::RawOrigin;
 use primitives::v2::{HeadData, Id as ParaId, ValidationCode, MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE};
 use sp_runtime::traits::{One, Saturating};
 
+mod pvf_check;
+
+use self::pvf_check::{VoteCause, VoteOutcome};
+
 // 2 ^ 10, because binary search time complexity is O(log(2, n)) and n = 1024 gives us a big and
 // round number.
 // Due to the limited number of parachains, the number of pruning, upcoming upgrades and cooldowns
@@ -139,6 +143,48 @@ benchmarks! {
 		let code_hash = [0; 32].into();
 	}: _(RawOrigin::Root, code_hash)
 
+	include_pvf_check_statement {
+		let (stmt, signature) = pvf_check::prepare_inclusion_bench::<T>();
+	}: {
+		let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature);
+	}
+
+	include_pvf_check_statement_finalize_upgrade_accept {
+		let (stmt, signature) = pvf_check::prepare_finalization_bench::<T>(
+			VoteCause::Upgrade,
+			VoteOutcome::Accept,
+		);
+	}: {
+		let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature);
+	}
+
+	include_pvf_check_statement_finalize_upgrade_reject {
+		let (stmt, signature) = pvf_check::prepare_finalization_bench::<T>(
+			VoteCause::Upgrade,
+			VoteOutcome::Reject,
+		);
+	}: {
+		let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature);
+	}
+
+	include_pvf_check_statement_finalize_onboarding_accept {
+		let (stmt, signature) = pvf_check::prepare_finalization_bench::<T>(
+			VoteCause::Onboarding,
+			VoteOutcome::Accept,
+		);
+	}: {
+		let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature);
+	}
+
+	include_pvf_check_statement_finalize_onboarding_reject {
+		let (stmt, signature) = pvf_check::prepare_finalization_bench::<T>(
+			VoteCause::Onboarding,
+			VoteOutcome::Reject,
+		);
+	}: {
+		let _ = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, signature);
+	}
+
 	impl_benchmark_test_suite!(
 		Pallet,
 		crate::mock::new_test_ext(Default::default()),
diff --git a/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs b/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs
new file mode 100644
index 0000000000000000000000000000000000000000..a89315c2857b677fc0aa8b89f06eda1d43972c46
--- /dev/null
+++ b/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs
@@ -0,0 +1,195 @@
+// Copyright 2022 Parity Technologies (UK) Ltd.
+// This file is part of Polkadot.
+
+// Polkadot is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Polkadot is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
+
+//! This module focuses on the benchmarking of the `include_pvf_check_statement` dispatchable.
+
+use crate::{configuration, paras::*, shared::Pallet as ParasShared};
+use frame_system::RawOrigin;
+use primitives::v2::{HeadData, Id as ParaId, ValidationCode, ValidatorId, ValidatorIndex};
+use sp_application_crypto::RuntimeAppPublic;
+
+// Constants for the benchmarking
+const SESSION_INDEX: SessionIndex = 1;
+const VALIDATOR_NUM: usize = 800;
+const CAUSES_NUM: usize = 100;
+fn validation_code() -> ValidationCode {
+	ValidationCode(vec![0])
+}
+fn old_validation_code() -> ValidationCode {
+	ValidationCode(vec![1])
+}
+
+/// Prepares the PVF check statement and the validator signature to pass into
+/// `include_pvf_check_statement` during benchmarking phase.
+///
+/// It won't trigger finalization, so we expect the benchmarking will only measure the performance
+/// of only vote accounting.
+pub fn prepare_inclusion_bench<T>() -> (PvfCheckStatement, ValidatorSignature)
+where
+	T: Config + shared::Config,
+{
+	initialize::<T>();
+	// we do not plan to trigger finalization, thus the cause is inconsequential.
+	initialize_pvf_active_vote::<T>(VoteCause::Onboarding);
+
+	// `unwrap` cannot panic here since the `initialize` function should initialize validators count
+	// to be more than 0.
+	//
+	// VoteDirection doesn't matter here as well.
+	let stmt_n_sig = generate_statements::<T>(VoteOutcome::Accept).next().unwrap();
+
+	stmt_n_sig
+}
+
+/// Prepares conditions for benchmarking of the finalization part of `include_pvf_check_statement`.
+///
+/// This function will initialize a PVF pre-check vote, then submit a number of PVF pre-checking
+/// statements so that to achieve the quorum only one statement is left. This statement is returned
+/// from this function and is expected to be passed into `include_pvf_check_statement` during the
+/// benchmarking phase.
+pub fn prepare_finalization_bench<T>(
+	cause: VoteCause,
+	outcome: VoteOutcome,
+) -> (PvfCheckStatement, ValidatorSignature)
+where
+	T: Config + shared::Config,
+{
+	initialize::<T>();
+	initialize_pvf_active_vote::<T>(cause);
+
+	let mut stmts = generate_statements::<T>(outcome).collect::<Vec<_>>();
+	// this should be ensured by the `initialize` function.
+	assert!(stmts.len() > 2);
+
+	// stash the last statement to be used in the benchmarking phase.
+	let stmt_n_sig = stmts.pop().unwrap();
+
+	for (stmt, sig) in stmts {
+		let r = Pallet::<T>::include_pvf_check_statement(RawOrigin::None.into(), stmt, sig);
+		assert!(r.is_ok());
+	}
+
+	stmt_n_sig
+}
+
+/// What caused the PVF pre-checking vote?
+#[derive(PartialEq, Eq, Copy, Clone, Debug)]
+pub enum VoteCause {
+	Onboarding,
+	Upgrade,
+}
+
+/// The outcome of the PVF pre-checking vote.
+#[derive(PartialEq, Eq, Copy, Clone, Debug)]
+pub enum VoteOutcome {
+	Accept,
+	Reject,
+}
+
+fn initialize<T>()
+where
+	T: Config + shared::Config,
+{
+	// 0. generate a list of validators
+	let validators = (0..VALIDATOR_NUM)
+		.map(|_| <ValidatorId as RuntimeAppPublic>::generate_pair(None))
+		.collect::<Vec<_>>();
+
+	// 1. Make sure PVF pre-checking is enabled in the config.
+	let mut config = configuration::Pallet::<T>::config();
+	config.pvf_checking_enabled = true;
+	configuration::Pallet::<T>::force_set_active_config(config.clone());
+
+	// 2. initialize a new session with deterministic validator set.
+	ParasShared::<T>::set_active_validators_ascending(validators.clone());
+	ParasShared::<T>::set_session_index(SESSION_INDEX);
+}
+
+/// Creates a new PVF pre-checking active vote.
+///
+/// The subject of the vote (i.e. validation code) and the cause (upgrade/onboarding) is specified
+/// by the test setup.
+fn initialize_pvf_active_vote<T>(vote_cause: VoteCause)
+where
+	T: Config + shared::Config,
+{
+	for i in 0..CAUSES_NUM {
+		let id = ParaId::from(i as u32);
+
+		if vote_cause == VoteCause::Upgrade {
+			// we do care about validation code being actually different, since there is a check
+			// that prevents upgrading to the same code.
+			let old_validation_code = old_validation_code();
+			let validation_code = validation_code();
+
+			let mut parachains = ParachainsCache::new();
+			Pallet::<T>::initialize_para_now(
+				&mut parachains,
+				id,
+				&ParaGenesisArgs {
+					parachain: true,
+					genesis_head: HeadData(vec![1, 2, 3, 4]),
+					validation_code: old_validation_code,
+				},
+			);
+			// don't care about performance here, but we do care about robustness. So dump the cache
+			// asap.
+			drop(parachains);
+
+			Pallet::<T>::schedule_code_upgrade(
+				id,
+				validation_code,
+				/* relay_parent_number */ 1u32.into(),
+				&configuration::Pallet::<T>::config(),
+			);
+		} else {
+			let r = Pallet::<T>::schedule_para_initialize(
+				id,
+				ParaGenesisArgs {
+					parachain: true,
+					genesis_head: HeadData(vec![1, 2, 3, 4]),
+					validation_code: validation_code(),
+				},
+			);
+			assert!(r.is_ok());
+		}
+	}
+}
+
+/// Generates a list of votes combined with signatures for the active validator set. The number of
+/// votes is equal to the minimum number of votes required to reach the supermajority.
+fn generate_statements<T>(
+	vote_outcome: VoteOutcome,
+) -> impl Iterator<Item = (PvfCheckStatement, ValidatorSignature)>
+where
+	T: Config + shared::Config,
+{
+	let validators = ParasShared::<T>::active_validator_keys();
+
+	let required_votes = primitives::v2::supermajority_threshold(validators.len());
+	(0..required_votes).map(move |validator_index| {
+		let stmt = PvfCheckStatement {
+			accept: vote_outcome == VoteOutcome::Accept,
+			subject: validation_code().hash(),
+			session_index: SESSION_INDEX,
+
+			validator_index: ValidatorIndex(validator_index as u32),
+		};
+		let signature = validators[validator_index].sign(&stmt.signing_payload()).unwrap();
+
+		(stmt, signature)
+	})
+}
diff --git a/polkadot/runtime/parachains/src/paras/mod.rs b/polkadot/runtime/parachains/src/paras/mod.rs
index 06902649d35b9a1cc0daef3ed88e84dddcee2d14..4f49b6f2dd59a504e77fdde0627a170a488adbbd 100644
--- a/polkadot/runtime/parachains/src/paras/mod.rs
+++ b/polkadot/runtime/parachains/src/paras/mod.rs
@@ -404,6 +404,12 @@ pub trait WeightInfo {
 	fn force_queue_action() -> Weight;
 	fn add_trusted_validation_code(c: u32) -> Weight;
 	fn poke_unused_validation_code() -> Weight;
+
+	fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight;
+	fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight;
+	fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight;
+	fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight;
+	fn include_pvf_check_statement() -> Weight;
 }
 
 pub struct TestWeightInfo;
@@ -429,6 +435,22 @@ impl WeightInfo for TestWeightInfo {
 	fn poke_unused_validation_code() -> Weight {
 		Weight::MAX
 	}
+	fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight {
+		Weight::MAX
+	}
+	fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight {
+		Weight::MAX
+	}
+	fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight {
+		Weight::MAX
+	}
+	fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight {
+		Weight::MAX
+	}
+	fn include_pvf_check_statement() -> Weight {
+		// This special value is to distinguish from the finalizing variants above in tests.
+		Weight::MAX - 1
+	}
 }
 
 #[frame_support::pallet]
@@ -855,12 +877,23 @@ pub mod pallet {
 
 		/// Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and
 		/// enacts the results if that was the last vote before achieving the supermajority.
-		#[pallet::weight(Weight::MAX)]
+		#[pallet::weight(
+			sp_std::cmp::max(
+				sp_std::cmp::max(
+					<T as Config>::WeightInfo::include_pvf_check_statement_finalize_upgrade_accept(),
+					<T as Config>::WeightInfo::include_pvf_check_statement_finalize_upgrade_reject(),
+				),
+				sp_std::cmp::max(
+					<T as Config>::WeightInfo::include_pvf_check_statement_finalize_onboarding_accept(),
+					<T as Config>::WeightInfo::include_pvf_check_statement_finalize_onboarding_reject(),
+				)
+			)
+		)]
 		pub fn include_pvf_check_statement(
 			origin: OriginFor<T>,
 			stmt: PvfCheckStatement,
 			signature: ValidatorSignature,
-		) -> DispatchResult {
+		) -> DispatchResultWithPostInfo {
 			ensure_none(origin)?;
 
 			// Make sure that PVF pre-checking is enabled.
@@ -931,13 +964,17 @@ pub mod pallet {
 						Self::enact_pvf_rejected(&stmt.subject, active_vote.causes);
 					},
 				}
+
+				// No weight refund since this statement was the last one and lead to finalization.
+				Ok(().into())
 			} else {
-				// No quorum has been achieved. So just store the updated state back into the
-				// storage.
+				// No quorum has been achieved.
+				//
+				// - So just store the updated state back into the storage.
+				// - Only charge weight for simple vote inclusion.
 				PvfActiveVoteMap::<T>::insert(&stmt.subject, active_vote);
+				Ok(Some(<T as Config>::WeightInfo::include_pvf_check_statement()).into())
 			}
-
-			Ok(())
 		}
 	}
 
diff --git a/polkadot/runtime/parachains/src/paras/tests.rs b/polkadot/runtime/parachains/src/paras/tests.rs
index f2fa90fcafb5666988adb84e943ff6b788f96f89..960132d5f8043ac4246c5bb734d8a2cfe9c46538 100644
--- a/polkadot/runtime/parachains/src/paras/tests.rs
+++ b/polkadot/runtime/parachains/src/paras/tests.rs
@@ -1277,7 +1277,8 @@ fn pvf_check_submit_vote() {
 			<Paras as ValidateUnsigned>::validate_unsigned(TransactionSource::InBlock, &call)
 				.map(|_| ());
 		let dispatch_result =
-			Paras::include_pvf_check_statement(None.into(), stmt.clone(), signature.clone());
+			Paras::include_pvf_check_statement(None.into(), stmt.clone(), signature.clone())
+				.map(|_| ());
 
 		(validate_unsigned, dispatch_result)
 	};
@@ -1375,6 +1376,69 @@ fn pvf_check_submit_vote() {
 	});
 }
 
+#[test]
+fn include_pvf_check_statement_refunds_weight() {
+	let a = ParaId::from(111);
+	let old_code: ValidationCode = vec![1, 2, 3].into();
+	let new_code: ValidationCode = vec![3, 2, 1].into();
+
+	let paras = vec![(
+		a,
+		ParaGenesisArgs {
+			parachain: false,
+			genesis_head: Default::default(),
+			validation_code: old_code,
+		},
+	)];
+
+	let genesis_config = MockGenesisConfig {
+		paras: GenesisConfig { paras, ..Default::default() },
+		configuration: crate::configuration::GenesisConfig {
+			config: HostConfiguration { pvf_checking_enabled: true, ..Default::default() },
+			..Default::default()
+		},
+		..Default::default()
+	};
+
+	new_test_ext(genesis_config).execute_with(|| {
+		// At this point `a` is already onboarded. Run to block 1 performing session change at
+		// the end of block #0.
+		run_to_block(2, Some(vec![1]));
+
+		// Relay parent of the block that schedules the upgrade.
+		const RELAY_PARENT: BlockNumber = 1;
+		// Expected current session index.
+		const EXPECTED_SESSION: SessionIndex = 1;
+
+		Paras::schedule_code_upgrade(a, new_code.clone(), RELAY_PARENT, &Configuration::config());
+
+		let mut stmts = IntoIterator::into_iter([0, 1, 2, 3])
+			.map(|i| {
+				let stmt = PvfCheckStatement {
+					accept: true,
+					subject: new_code.hash(),
+					session_index: EXPECTED_SESSION,
+					validator_index: (i as u32).into(),
+				};
+				let sig = VALIDATORS[i].sign(&stmt.signing_payload());
+				(stmt, sig)
+			})
+			.collect::<Vec<_>>();
+		let last_one = stmts.pop().unwrap();
+
+		// Verify that just vote submission is priced accordingly.
+		for (stmt, sig) in stmts {
+			let r = Paras::include_pvf_check_statement(None.into(), stmt, sig.into()).unwrap();
+			assert_eq!(r.actual_weight, Some(TestWeightInfo::include_pvf_check_statement()));
+		}
+
+		// Verify that the last statement is priced maximally.
+		let (stmt, sig) = last_one;
+		let r = Paras::include_pvf_check_statement(None.into(), stmt, sig.into()).unwrap();
+		assert_eq!(r.actual_weight, None);
+	});
+}
+
 #[test]
 fn add_trusted_validation_code_inserts_with_no_users() {
 	// This test is to ensure that trusted validation code is inserted into the storage
diff --git a/polkadot/runtime/parachains/src/shared.rs b/polkadot/runtime/parachains/src/shared.rs
index e309e128800a7182dbe03d88c09d5791cd0cfaa4..3769ff4525c1aee551afa6d6ead313b2e7c61e22 100644
--- a/polkadot/runtime/parachains/src/shared.rs
+++ b/polkadot/runtime/parachains/src/shared.rs
@@ -124,7 +124,7 @@ impl<T: Config> Pallet<T> {
 		CurrentSessionIndex::<T>::set(index);
 	}
 
-	#[cfg(test)]
+	#[cfg(any(feature = "runtime-benchmarks", test))]
 	pub(crate) fn set_active_validators_ascending(active: Vec<ValidatorId>) {
 		ActiveValidatorIndices::<T>::set(
 			(0..active.len()).map(|i| ValidatorIndex(i as _)).collect(),
diff --git a/polkadot/runtime/polkadot/src/weights/runtime_parachains_paras.rs b/polkadot/runtime/polkadot/src/weights/runtime_parachains_paras.rs
index 27ae677d5e9062ac9d3edd28e53d2f9065fdc331..ed4a040d4c183cbb0b4089ddcb6069a13bc3ae6b 100644
--- a/polkadot/runtime/polkadot/src/weights/runtime_parachains_paras.rs
+++ b/polkadot/runtime/polkadot/src/weights/runtime_parachains_paras.rs
@@ -1,4 +1,4 @@
-// Copyright 2017-2022 Parity Technologies (UK) Ltd.
+// Copyright 2017-2021 Parity Technologies (UK) Ltd.
 // This file is part of Polkadot.
 
 // Polkadot is free software: you can redistribute it and/or modify
@@ -16,11 +16,11 @@
 //! Autogenerated weights for `runtime_parachains::paras`
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-03-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-02-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("polkadot-dev"), DB CACHE: 1024
 
 // Executed Command:
-// ./target/production/polkadot
+// target/production/polkadot
 // benchmark
 // --chain=polkadot-dev
 // --steps=50
@@ -52,13 +52,13 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	fn force_set_current_code(c: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 0
-			.saturating_add((3_000 as Weight).saturating_mul(c as Weight))
+			.saturating_add((2_000 as Weight).saturating_mul(c as Weight))
 			.saturating_add(T::DbWeight::get().reads(4 as Weight))
 			.saturating_add(T::DbWeight::get().writes(6 as Weight))
 	}
 	// Storage: Paras Heads (r:0 w:1)
 	fn force_set_current_head(s: u32, ) -> Weight {
-		(10_412_000 as Weight)
+		(8_514_000 as Weight)
 			// Standard Error: 0
 			.saturating_add((1_000 as Weight).saturating_mul(s as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
@@ -77,7 +77,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	fn force_schedule_code_upgrade(c: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 0
-			.saturating_add((3_000 as Weight).saturating_mul(c as Weight))
+			.saturating_add((2_000 as Weight).saturating_mul(c as Weight))
 			.saturating_add(T::DbWeight::get().reads(9 as Weight))
 			.saturating_add(T::DbWeight::get().writes(8 as Weight))
 	}
@@ -85,7 +85,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	// Storage: Paras Heads (r:0 w:1)
 	// Storage: Paras UpgradeGoAheadSignal (r:0 w:1)
 	fn force_note_new_head(s: u32, ) -> Weight {
-		(13_903_000 as Weight)
+		(13_963_000 as Weight)
 			// Standard Error: 0
 			.saturating_add((1_000 as Weight).saturating_mul(s as Weight))
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
@@ -94,7 +94,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
 	// Storage: Paras ActionsQueue (r:1 w:1)
 	fn force_queue_action() -> Weight {
-		(18_447_000 as Weight)
+		(15_934_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
@@ -103,15 +103,77 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	fn add_trusted_validation_code(c: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 0
-			.saturating_add((3_000 as Weight).saturating_mul(c as Weight))
+			.saturating_add((2_000 as Weight).saturating_mul(c as Weight))
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Paras CodeByHashRefs (r:1 w:0)
 	// Storage: Paras CodeByHash (r:0 w:1)
 	fn poke_unused_validation_code() -> Weight {
-		(2_619_000 as Weight)
+		(2_406_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	fn include_pvf_check_statement() -> Weight {
+		(120_016_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(4 as Weight))
+			.saturating_add(T::DbWeight::get().writes(1 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras UpcomingUpgrades (r:1 w:1)
+	// Storage: System Digest (r:1 w:1)
+	// Storage: Paras FutureCodeUpgrades (r:0 w:100)
+	fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight {
+		(623_579_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(7 as Weight))
+			.saturating_add(T::DbWeight::get().writes(104 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras CodeByHashRefs (r:1 w:1)
+	// Storage: Paras CodeByHash (r:0 w:1)
+	// Storage: Paras UpgradeGoAheadSignal (r:0 w:100)
+	// Storage: Paras FutureCodeHash (r:0 w:100)
+	fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight {
+		(552_089_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(204 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras ActionsQueue (r:1 w:1)
+	fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight {
+		(498_524_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(3 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras CodeByHashRefs (r:1 w:1)
+	// Storage: Paras ParaLifecycles (r:0 w:100)
+	// Storage: Paras CodeByHash (r:0 w:1)
+	// Storage: Paras CurrentCodeHash (r:0 w:100)
+	// Storage: Paras UpcomingParasGenesis (r:0 w:100)
+	fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight {
+		(611_386_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(304 as Weight))
+	}
 }
diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_paras.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_paras.rs
index e1ff4d6cc66d17facb79b5137f389ad4d7578848..6f6b6943a14ff968c83e33161b53cf4754d07524 100644
--- a/polkadot/runtime/rococo/src/weights/runtime_parachains_paras.rs
+++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_paras.rs
@@ -1,4 +1,4 @@
-// Copyright 2017-2022 Parity Technologies (UK) Ltd.
+// Copyright 2017-2021 Parity Technologies (UK) Ltd.
 // This file is part of Polkadot.
 
 // Polkadot is free software: you can redistribute it and/or modify
@@ -16,7 +16,7 @@
 //! Autogenerated weights for `runtime_parachains::paras`
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-03-14, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-02-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("rococo-dev"), DB CACHE: 1024
 
 // Executed Command:
@@ -58,7 +58,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	}
 	// Storage: Paras Heads (r:0 w:1)
 	fn force_set_current_head(s: u32, ) -> Weight {
-		(11_885_000 as Weight)
+		(10_856_000 as Weight)
 			// Standard Error: 0
 			.saturating_add((1_000 as Weight).saturating_mul(s as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
@@ -85,7 +85,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	// Storage: Paras Heads (r:0 w:1)
 	// Storage: Paras UpgradeGoAheadSignal (r:0 w:1)
 	fn force_note_new_head(s: u32, ) -> Weight {
-		(14_996_000 as Weight)
+		(13_762_000 as Weight)
 			// Standard Error: 0
 			.saturating_add((1_000 as Weight).saturating_mul(s as Weight))
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
@@ -94,7 +94,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
 	// Storage: Paras ActionsQueue (r:1 w:1)
 	fn force_queue_action() -> Weight {
-		(15_924_000 as Weight)
+		(15_946_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
@@ -110,8 +110,70 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	// Storage: Paras CodeByHashRefs (r:1 w:0)
 	// Storage: Paras CodeByHash (r:0 w:1)
 	fn poke_unused_validation_code() -> Weight {
-		(2_424_000 as Weight)
+		(2_509_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	fn include_pvf_check_statement() -> Weight {
+		(117_675_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(4 as Weight))
+			.saturating_add(T::DbWeight::get().writes(1 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras UpcomingUpgrades (r:1 w:1)
+	// Storage: System Digest (r:1 w:1)
+	// Storage: Paras FutureCodeUpgrades (r:0 w:100)
+	fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight {
+		(618_769_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(7 as Weight))
+			.saturating_add(T::DbWeight::get().writes(104 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras CodeByHashRefs (r:1 w:1)
+	// Storage: Paras CodeByHash (r:0 w:1)
+	// Storage: Paras UpgradeGoAheadSignal (r:0 w:100)
+	// Storage: Paras FutureCodeHash (r:0 w:100)
+	fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight {
+		(553_319_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(204 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras ActionsQueue (r:1 w:1)
+	fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight {
+		(507_519_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(3 as Weight))
+	}
+	// Storage: Configuration ActiveConfig (r:1 w:0)
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras CodeByHashRefs (r:1 w:1)
+	// Storage: Paras ParaLifecycles (r:0 w:100)
+	// Storage: Paras CodeByHash (r:0 w:1)
+	// Storage: Paras CurrentCodeHash (r:0 w:100)
+	// Storage: Paras UpcomingParasGenesis (r:0 w:100)
+	fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight {
+		(609_820_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(304 as Weight))
+	}
 }
diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_paras.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_paras.rs
index 1fc1043bc40c4566a0f1452b0feaec76f8a96dbc..d64471c488c3a6ce6fd38eee64decf02638eceb6 100644
--- a/polkadot/runtime/westend/src/weights/runtime_parachains_paras.rs
+++ b/polkadot/runtime/westend/src/weights/runtime_parachains_paras.rs
@@ -1,4 +1,4 @@
-// Copyright 2017-2022 Parity Technologies (UK) Ltd.
+// Copyright 2017-2021 Parity Technologies (UK) Ltd.
 // This file is part of Polkadot.
 
 // Polkadot is free software: you can redistribute it and/or modify
@@ -16,11 +16,11 @@
 //! Autogenerated weights for `runtime_parachains::paras`
 //!
 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-03-15, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-02-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 1024
 
 // Executed Command:
-// ./target/production/polkadot
+// target/production/polkadot
 // benchmark
 // --chain=westend-dev
 // --steps=50
@@ -52,13 +52,13 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	fn force_set_current_code(c: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 0
-			.saturating_add((3_000 as Weight).saturating_mul(c as Weight))
+			.saturating_add((2_000 as Weight).saturating_mul(c as Weight))
 			.saturating_add(T::DbWeight::get().reads(4 as Weight))
 			.saturating_add(T::DbWeight::get().writes(6 as Weight))
 	}
 	// Storage: Paras Heads (r:0 w:1)
 	fn force_set_current_head(s: u32, ) -> Weight {
-		(8_970_000 as Weight)
+		(10_166_000 as Weight)
 			// Standard Error: 0
 			.saturating_add((1_000 as Weight).saturating_mul(s as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
@@ -76,7 +76,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	fn force_schedule_code_upgrade(c: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 0
-			.saturating_add((3_000 as Weight).saturating_mul(c as Weight))
+			.saturating_add((2_000 as Weight).saturating_mul(c as Weight))
 			.saturating_add(T::DbWeight::get().reads(8 as Weight))
 			.saturating_add(T::DbWeight::get().writes(8 as Weight))
 	}
@@ -84,7 +84,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	// Storage: Paras Heads (r:0 w:1)
 	// Storage: Paras UpgradeGoAheadSignal (r:0 w:1)
 	fn force_note_new_head(s: u32, ) -> Weight {
-		(11_059_000 as Weight)
+		(15_413_000 as Weight)
 			// Standard Error: 0
 			.saturating_add((1_000 as Weight).saturating_mul(s as Weight))
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
@@ -93,7 +93,7 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
 	// Storage: Paras ActionsQueue (r:1 w:1)
 	fn force_queue_action() -> Weight {
-		(18_200_000 as Weight)
+		(15_999_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
@@ -102,15 +102,72 @@ impl<T: frame_system::Config> runtime_parachains::paras::WeightInfo for WeightIn
 	fn add_trusted_validation_code(c: u32, ) -> Weight {
 		(0 as Weight)
 			// Standard Error: 0
-			.saturating_add((3_000 as Weight).saturating_mul(c as Weight))
+			.saturating_add((2_000 as Weight).saturating_mul(c as Weight))
 			.saturating_add(T::DbWeight::get().reads(2 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
 	// Storage: Paras CodeByHashRefs (r:1 w:0)
 	// Storage: Paras CodeByHash (r:0 w:1)
 	fn poke_unused_validation_code() -> Weight {
-		(2_708_000 as Weight)
+		(2_445_000 as Weight)
 			.saturating_add(T::DbWeight::get().reads(1 as Weight))
 			.saturating_add(T::DbWeight::get().writes(1 as Weight))
 	}
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	fn include_pvf_check_statement() -> Weight {
+		(116_591_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(3 as Weight))
+			.saturating_add(T::DbWeight::get().writes(1 as Weight))
+	}
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras UpcomingUpgrades (r:1 w:1)
+	// Storage: System Digest (r:1 w:1)
+	// Storage: Paras FutureCodeUpgrades (r:0 w:100)
+	fn include_pvf_check_statement_finalize_upgrade_accept() -> Weight {
+		(622_057_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(6 as Weight))
+			.saturating_add(T::DbWeight::get().writes(104 as Weight))
+	}
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras CodeByHashRefs (r:1 w:1)
+	// Storage: Paras CodeByHash (r:0 w:1)
+	// Storage: Paras UpgradeGoAheadSignal (r:0 w:100)
+	// Storage: Paras FutureCodeHash (r:0 w:100)
+	fn include_pvf_check_statement_finalize_upgrade_reject() -> Weight {
+		(550_573_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(5 as Weight))
+			.saturating_add(T::DbWeight::get().writes(204 as Weight))
+	}
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras ActionsQueue (r:1 w:1)
+	fn include_pvf_check_statement_finalize_onboarding_accept() -> Weight {
+		(499_580_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(5 as Weight))
+			.saturating_add(T::DbWeight::get().writes(3 as Weight))
+	}
+	// Storage: ParasShared ActiveValidatorKeys (r:1 w:0)
+	// Storage: ParasShared CurrentSessionIndex (r:1 w:0)
+	// Storage: Paras PvfActiveVoteMap (r:1 w:1)
+	// Storage: Paras PvfActiveVoteList (r:1 w:1)
+	// Storage: Paras CodeByHashRefs (r:1 w:1)
+	// Storage: Paras ParaLifecycles (r:0 w:100)
+	// Storage: Paras CodeByHash (r:0 w:1)
+	// Storage: Paras CurrentCodeHash (r:0 w:100)
+	// Storage: Paras UpcomingParasGenesis (r:0 w:100)
+	fn include_pvf_check_statement_finalize_onboarding_reject() -> Weight {
+		(602_317_000 as Weight)
+			.saturating_add(T::DbWeight::get().reads(5 as Weight))
+			.saturating_add(T::DbWeight::get().writes(304 as Weight))
+	}
 }