diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock
index f0471d019c1a22f293e7bff1f8768d99a5643cf2..beb234518041e84020b5a7c32d48540c8220ee35 100644
--- a/substrate/Cargo.lock
+++ b/substrate/Cargo.lock
@@ -3401,6 +3401,7 @@ dependencies = [
  "pallet-recovery",
  "pallet-referenda",
  "pallet-remark",
+ "pallet-root-testing",
  "pallet-scheduler",
  "pallet-session",
  "pallet-session-benchmarking",
@@ -4589,6 +4590,7 @@ dependencies = [
  "pallet-balances",
  "pallet-contracts",
  "pallet-im-online",
+ "pallet-root-testing",
  "pallet-sudo",
  "pallet-timestamp",
  "pallet-transaction-payment",
@@ -5957,13 +5959,12 @@ dependencies = [
 
 [[package]]
 name = "pallet-root-offences"
-version = "1.0.0"
+version = "1.0.0-dev"
 dependencies = [
  "frame-election-provider-support",
  "frame-support",
  "frame-system",
  "pallet-balances",
- "pallet-offences",
  "pallet-session",
  "pallet-staking",
  "pallet-staking-reward-curve",
@@ -5977,6 +5978,17 @@ dependencies = [
  "sp-std",
 ]
 
+[[package]]
+name = "pallet-root-testing"
+version = "1.0.0-dev"
+dependencies = [
+ "frame-support",
+ "frame-system",
+ "parity-scale-codec",
+ "scale-info",
+ "sp-runtime",
+]
+
 [[package]]
 name = "pallet-scheduler"
 version = "4.0.0-dev"
@@ -6317,6 +6329,7 @@ dependencies = [
  "frame-support",
  "frame-system",
  "pallet-balances",
+ "pallet-root-testing",
  "pallet-collective",
  "pallet-timestamp",
  "parity-scale-codec",
diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml
index ab8fbd816b0046bc7523e62c52781da0d24a9e45..956c106e0dc2d4bb3ccac9124aadded1e2df2f0e 100644
--- a/substrate/Cargo.toml
+++ b/substrate/Cargo.toml
@@ -135,6 +135,7 @@ members = [
 	"frame/state-trie-migration",
 	"frame/sudo",
 	"frame/root-offences",
+	"frame/root-testing",
 	"frame/support",
 	"frame/support/procedural",
 	"frame/support/procedural/tools",
diff --git a/substrate/bin/node/executor/Cargo.toml b/substrate/bin/node/executor/Cargo.toml
index 651e4657dde323ac75b73f15bee7572c7ab98ea0..681eb79f0d224e2f3ba4f4a5ee869f3f2f79d415 100644
--- a/substrate/bin/node/executor/Cargo.toml
+++ b/substrate/bin/node/executor/Cargo.toml
@@ -38,6 +38,7 @@ pallet-sudo = { version = "4.0.0-dev", path = "../../../frame/sudo" }
 pallet-timestamp = { version = "4.0.0-dev", path = "../../../frame/timestamp" }
 pallet-treasury = { version = "4.0.0-dev", path = "../../../frame/treasury" }
 pallet-transaction-payment = { version = "4.0.0-dev", path = "../../../frame/transaction-payment" }
+pallet-root-testing = { version = "1.0.0-dev", path = "../../../frame/root-testing" }
 sp-application-crypto = { version = "6.0.0", path = "../../../primitives/application-crypto" }
 sp-consensus-babe = { version = "0.10.0-dev", path = "../../../primitives/consensus/babe" }
 sp-externalities = { version = "0.12.0", path = "../../../primitives/externalities" }
diff --git a/substrate/bin/node/executor/tests/fees.rs b/substrate/bin/node/executor/tests/fees.rs
index 6932cb2cea867b62e9f29f3298bec2ac04e101fb..3c696d595040b7fd620c0a43517355154df8b6c8 100644
--- a/substrate/bin/node/executor/tests/fees.rs
+++ b/substrate/bin/node/executor/tests/fees.rs
@@ -60,9 +60,9 @@ fn fee_multiplier_increases_and_decreases_on_big_weight() {
 			CheckedExtrinsic {
 				signed: Some((charlie(), signed_extra(0, 0))),
 				function: RuntimeCall::Sudo(pallet_sudo::Call::sudo {
-					call: Box::new(RuntimeCall::System(frame_system::Call::fill_block {
-						ratio: Perbill::from_percent(60),
-					})),
+					call: Box::new(RuntimeCall::RootTesting(
+						pallet_root_testing::Call::fill_block { ratio: Perbill::from_percent(60) },
+					)),
 				}),
 			},
 		],
diff --git a/substrate/bin/node/runtime/Cargo.toml b/substrate/bin/node/runtime/Cargo.toml
index 39364961d57e2695bc53b137e3c7786bbbf3ca04..c45d468c5961612a5f64eacca5e81e2d61390a02 100644
--- a/substrate/bin/node/runtime/Cargo.toml
+++ b/substrate/bin/node/runtime/Cargo.toml
@@ -89,6 +89,7 @@ pallet-ranked-collective = { version = "4.0.0-dev", default-features = false, pa
 pallet-recovery = { version = "4.0.0-dev", default-features = false, path = "../../../frame/recovery" }
 pallet-referenda = { version = "4.0.0-dev", default-features = false, path = "../../../frame/referenda" }
 pallet-remark = { version = "4.0.0-dev", default-features = false, path = "../../../frame/remark" }
+pallet-root-testing = { version = "1.0.0-dev", default-features = false, path = "../../../frame/root-testing" }
 pallet-session = { version = "4.0.0-dev", features = [ "historical" ], path = "../../../frame/session", default-features = false }
 pallet-session-benchmarking = { version = "4.0.0-dev", path = "../../../frame/session/benchmarking", default-features = false, optional = true }
 pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../../../frame/staking" }
@@ -192,6 +193,7 @@ std = [
 	"pallet-ranked-collective/std",
 	"pallet-referenda/std",
 	"pallet-remark/std",
+	"pallet-root-testing/std",
 	"pallet-recovery/std",
 	"pallet-uniques/std",
 	"pallet-vesting/std",
@@ -292,6 +294,7 @@ try-runtime = [
 	"pallet-recovery/try-runtime",
 	"pallet-referenda/try-runtime",
 	"pallet-remark/try-runtime",
+	"pallet-root-testing/try-runtime",
 	"pallet-session/try-runtime",
 	"pallet-staking/try-runtime",
 	"pallet-state-trie-migration/try-runtime",
diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs
index eab40634ff2412a6b3faf68ff30fe6a98b6272d8..6c3a46e529727c6d46eb52b62fe9bda4e29016d5 100644
--- a/substrate/bin/node/runtime/src/lib.rs
+++ b/substrate/bin/node/runtime/src/lib.rs
@@ -909,6 +909,8 @@ impl pallet_remark::Config for Runtime {
 	type RuntimeEvent = RuntimeEvent;
 }
 
+impl pallet_root_testing::Config for Runtime {}
+
 parameter_types! {
 	pub const LaunchPeriod: BlockNumber = 28 * 24 * 60 * MINUTES;
 	pub const VotingPeriod: BlockNumber = 28 * 24 * 60 * MINUTES;
@@ -1670,6 +1672,7 @@ construct_runtime!(
 		ChildBounties: pallet_child_bounties,
 		Referenda: pallet_referenda,
 		Remark: pallet_remark,
+		RootTesting: pallet_root_testing,
 		ConvictionVoting: pallet_conviction_voting,
 		Whitelist: pallet_whitelist,
 		AllianceMotion: pallet_collective::<Instance3>,
diff --git a/substrate/frame/root-offences/Cargo.toml b/substrate/frame/root-offences/Cargo.toml
index ea6a6527848aacefff8ba1a26aca3b93bd46fee0..a205fc4aa6ca7d9f0faa0ecf7af8ec1d07d5d904 100644
--- a/substrate/frame/root-offences/Cargo.toml
+++ b/substrate/frame/root-offences/Cargo.toml
@@ -1,12 +1,13 @@
 [package]
 name = "pallet-root-offences"
-version = "1.0.0"
+version = "1.0.0-dev"
 authors = ["Parity Technologies <admin@parity.io>"]
 edition = "2021"
 license = "Apache-2.0"
 homepage = "https://substrate.io"
 repository = "https://github.com/paritytech/substrate/"
 description = "FRAME root offences pallet"
+readme = "README.md"
 
 [package.metadata.docs.rs]
 targets = ["x86_64-unknown-linux-gnu"]
@@ -17,11 +18,10 @@ scale-info = { version = "2.1.1", default-features = false, features = ["derive"
 
 pallet-session = { version = "4.0.0-dev", features = [ "historical" ], path = "../../frame/session", default-features = false }
 pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../../frame/staking" }
-pallet-offences = { version = "4.0.0-dev", default-features = false, path = "../../frame/offences" }
 
 frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" }
 frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" }
-sp-runtime = { version = "6.0.0", path = "../../primitives/runtime" }
+sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" }
 sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" }
 
 [dev-dependencies]
@@ -45,7 +45,6 @@ std = [
     "frame-system/std",
 	"pallet-session/std",
 	"pallet-staking/std",
-	"pallet-offences/std",
 	"scale-info/std",
 	"sp-runtime/std",
 ]
diff --git a/substrate/frame/root-offences/README.md b/substrate/frame/root-offences/README.md
index a2c5261b6985a1890b312b2f4acca4c222f9b5f2..c582158721816d6e16ee3d2f1a93d5daa555a1da 100644
--- a/substrate/frame/root-offences/README.md
+++ b/substrate/frame/root-offences/README.md
@@ -1,4 +1,4 @@
-# Sudo Offences Pallet
+# Root Offences Pallet
 
 Pallet that allows the root to create an offence.
 
diff --git a/substrate/frame/root-offences/src/lib.rs b/substrate/frame/root-offences/src/lib.rs
index b4b549627f3fa6c279cd3fd795a056e320a94954..298fe0078a6a6fa3e555acf128d723070d7f7789 100644
--- a/substrate/frame/root-offences/src/lib.rs
+++ b/substrate/frame/root-offences/src/lib.rs
@@ -15,7 +15,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-//! # Sudo Offences Pallet
+//! # Root Offences Pallet
 //! Pallet that allows the root to create an offence.
 //!
 //! NOTE: This pallet should be used for testing purposes.
diff --git a/substrate/frame/root-testing/Cargo.toml b/substrate/frame/root-testing/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..c625d640bc28922dd6ad5b8f3c348be1a4261252
--- /dev/null
+++ b/substrate/frame/root-testing/Cargo.toml
@@ -0,0 +1,34 @@
+[package]
+name = "pallet-root-testing"
+version = "1.0.0-dev"
+authors = ["Parity Technologies <admin@parity.io>"]
+edition = "2021"
+license = "Apache-2.0"
+homepage = "https://substrate.io"
+repository = "https://github.com/paritytech/substrate/"
+description = "FRAME root testing pallet"
+readme = "README.md"
+
+[package.metadata.docs.rs]
+targets = ["x86_64-unknown-linux-gnu"]
+
+[dependencies]
+codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] }
+scale-info = { version = "2.1.1", default-features = false, features = ["derive"] }
+
+frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" }
+frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" }
+sp-runtime = { version = "6.0.0", default-features = false, path = "../../primitives/runtime" }
+
+[dev-dependencies]
+
+[features]
+try-runtime = ["frame-support/try-runtime"]
+default = ["std"]
+std = [
+	"codec/std",
+	"frame-support/std",
+    "frame-system/std",
+	"scale-info/std",
+    "sp-runtime/std",
+]
diff --git a/substrate/frame/root-testing/README.md b/substrate/frame/root-testing/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..637430445a22f6046f6a20bd6fc8ba58901373bc
--- /dev/null
+++ b/substrate/frame/root-testing/README.md
@@ -0,0 +1,5 @@
+# Root Testing Pallet
+
+Pallet that contains extrinsics that can be usefull in testing.
+
+NOTE: This pallet should only be used for testing purposes and should not be used in production runtimes!
\ No newline at end of file
diff --git a/substrate/frame/root-testing/src/lib.rs b/substrate/frame/root-testing/src/lib.rs
new file mode 100644
index 0000000000000000000000000000000000000000..25d66cfac202dc3f21f7257d9881bfe196dbb7a6
--- /dev/null
+++ b/substrate/frame/root-testing/src/lib.rs
@@ -0,0 +1,54 @@
+// This file is part of Substrate.
+
+// Copyright (C) 2022 Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! # Root Testing Pallet
+//!
+//! Pallet that contains extrinsics that can be usefull in testing.
+//!
+//! NOTE: This pallet should only be used for testing purposes and should not be used in production
+//! runtimes!
+
+#![cfg_attr(not(feature = "std"), no_std)]
+
+use frame_support::dispatch::DispatchResult;
+use sp_runtime::Perbill;
+
+pub use pallet::*;
+
+#[frame_support::pallet]
+pub mod pallet {
+	use super::*;
+	use frame_support::pallet_prelude::*;
+	use frame_system::pallet_prelude::*;
+
+	#[pallet::config]
+	pub trait Config: frame_system::Config {}
+
+	#[pallet::pallet]
+	#[pallet::generate_store(pub(super) trait Store)]
+	pub struct Pallet<T>(_);
+
+	#[pallet::call]
+	impl<T: Config> Pallet<T> {
+		/// A dispatch that will fill the block weight up to the given ratio.
+		#[pallet::weight(*_ratio * T::BlockWeights::get().max_block)]
+		pub fn fill_block(origin: OriginFor<T>, _ratio: Perbill) -> DispatchResult {
+			ensure_root(origin)?;
+			Ok(())
+		}
+	}
+}
diff --git a/substrate/frame/system/src/lib.rs b/substrate/frame/system/src/lib.rs
index 7577d0dc6b158f3b2bd71b546c801e61e65fcb1b..477ebb97fbd95bcb4129864025239ee4553df64d 100644
--- a/substrate/frame/system/src/lib.rs
+++ b/substrate/frame/system/src/lib.rs
@@ -75,7 +75,7 @@ use sp_runtime::{
 		CheckEqual, Dispatchable, Hash, Lookup, LookupError, MaybeDisplay, MaybeMallocSizeOf,
 		MaybeSerializeDeserialize, Member, One, Saturating, SimpleBitOps, StaticLookup, Zero,
 	},
-	DispatchError, Perbill, RuntimeDebug,
+	DispatchError, RuntimeDebug,
 };
 #[cfg(any(feature = "std", test))]
 use sp_std::map;
@@ -197,7 +197,6 @@ impl<MaxNormal: Get<u32>, MaxOverflow: Get<u32>> ConsumerLimits for (MaxNormal,
 pub mod pallet {
 	use crate::{self as frame_system, pallet_prelude::*, *};
 	use frame_support::pallet_prelude::*;
-	use sp_runtime::DispatchErrorWithPostInfo;
 
 	/// System configuration trait. Implemented by runtime.
 	#[pallet::config]
@@ -370,23 +369,6 @@ pub mod pallet {
 
 	#[pallet::call]
 	impl<T: Config> Pallet<T> {
-		/// A dispatch that will fill the block weight up to the given ratio.
-		// TODO: This should only be available for testing, rather than in general usage, but
-		// that's not possible at present (since it's within the pallet macro).
-		#[pallet::weight(*_ratio * T::BlockWeights::get().max_block)]
-		pub fn fill_block(origin: OriginFor<T>, _ratio: Perbill) -> DispatchResultWithPostInfo {
-			match ensure_root(origin) {
-				Ok(_) => Ok(().into()),
-				Err(_) => {
-					// roughly same as a 4 byte remark since perbill is u32.
-					Err(DispatchErrorWithPostInfo {
-						post_info: Some(T::SystemWeightInfo::remark(4u32)).into(),
-						error: DispatchError::BadOrigin,
-					})
-				},
-			}
-		}
-
 		/// Make some on-chain remark.
 		///
 		/// # <weight>
diff --git a/substrate/frame/system/src/mock.rs b/substrate/frame/system/src/mock.rs
index d31a1b08667e5794a12ea826d6bc86b2efb7400c..fb230f66a94f70cba5c4e9cf9b9d945d874b3651 100644
--- a/substrate/frame/system/src/mock.rs
+++ b/substrate/frame/system/src/mock.rs
@@ -24,7 +24,7 @@ use sp_core::H256;
 use sp_runtime::{
 	testing::Header,
 	traits::{BlakeTwo256, IdentityLookup},
-	BuildStorage,
+	BuildStorage, Perbill,
 };
 
 type UncheckedExtrinsic = mocking::MockUncheckedExtrinsic<Test>;
diff --git a/substrate/frame/utility/Cargo.toml b/substrate/frame/utility/Cargo.toml
index ac4f52c6bb9f38d835d504368cd0625724f89b37..f49348338394e967eaa1a21729ce85a20211cae5 100644
--- a/substrate/frame/utility/Cargo.toml
+++ b/substrate/frame/utility/Cargo.toml
@@ -25,6 +25,7 @@ sp-std = { version = "4.0.0", default-features = false, path = "../../primitives
 
 [dev-dependencies]
 pallet-balances = { version = "4.0.0-dev", path = "../balances" }
+pallet-root-testing = { version = "1.0.0-dev", path = "../root-testing" }
 pallet-collective = { version = "4.0.0-dev", path = "../collective" }
 pallet-timestamp = { version = "4.0.0-dev", path = "../timestamp" }
 sp-core = { version = "6.0.0", path = "../../primitives/core" }
diff --git a/substrate/frame/utility/src/tests.rs b/substrate/frame/utility/src/tests.rs
index c374f5ae21099a2916bae74944efe3543b52596b..848fc374619b767c1d02e8c826e5c8cd7dad222f 100644
--- a/substrate/frame/utility/src/tests.rs
+++ b/substrate/frame/utility/src/tests.rs
@@ -133,6 +133,7 @@ frame_support::construct_runtime!(
 		System: frame_system::{Pallet, Call, Config, Storage, Event<T>},
 		Timestamp: pallet_timestamp::{Call, Inherent},
 		Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>},
+		RootTesting: pallet_root_testing::{Pallet, Call, Storage},
 		Council: pallet_collective::<Instance1>,
 		Utility: utility::{Pallet, Call, Event},
 		Example: example::{Pallet, Call},
@@ -183,6 +184,8 @@ impl pallet_balances::Config for Test {
 	type WeightInfo = ();
 }
 
+impl pallet_root_testing::Config for Test {}
+
 impl pallet_timestamp::Config for Test {
 	type Moment = u64;
 	type OnTimestampSet = ();
@@ -247,6 +250,7 @@ type UtilityCall = crate::Call<Test>;
 
 use frame_system::Call as SystemCall;
 use pallet_balances::{Call as BalancesCall, Error as BalancesError};
+use pallet_root_testing::Call as RootTestingCall;
 use pallet_timestamp::Call as TimestampCall;
 
 pub fn new_test_ext() -> sp_io::TestExternalities {
@@ -469,8 +473,9 @@ fn batch_early_exit_works() {
 fn batch_weight_calculation_doesnt_overflow() {
 	use sp_runtime::Perbill;
 	new_test_ext().execute_with(|| {
-		let big_call =
-			RuntimeCall::System(SystemCall::fill_block { ratio: Perbill::from_percent(50) });
+		let big_call = RuntimeCall::RootTesting(RootTestingCall::fill_block {
+			ratio: Perbill::from_percent(50),
+		});
 		assert_eq!(big_call.get_dispatch_info().weight, Weight::MAX / 2);
 
 		// 3 * 50% saturates to 100%