diff --git a/substrate/frame/alliance/src/benchmarking.rs b/substrate/frame/alliance/src/benchmarking.rs
index f312e032bbb0fa51d908987587b4b15954d64a86..01b81ed66e9996e651ff4520efe93be5ebad1d10 100644
--- a/substrate/frame/alliance/src/benchmarking.rs
+++ b/substrate/frame/alliance/src/benchmarking.rs
@@ -25,7 +25,7 @@ use sp_std::{
 	prelude::*,
 };
 
-use frame_benchmarking::v1::{account, benchmarks_instance_pallet};
+use frame_benchmarking::v1::{account, benchmarks_instance_pallet, BenchmarkError};
 use frame_support::traits::{EnsureOrigin, Get, UnfilteredDispatchable};
 use frame_system::{Pallet as System, RawOrigin as SystemOrigin};
 
@@ -581,7 +581,8 @@ benchmarks_instance_pallet! {
 		let rule = rule(b"hello world");
 
 		let call = Call::<T, I>::set_rule { rule: rule.clone() };
-		let origin = T::AdminOrigin::successful_origin();
+		let origin =
+			T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
 		assert_eq!(Alliance::<T, I>::rule(), Some(rule.clone()));
@@ -594,7 +595,8 @@ benchmarks_instance_pallet! {
 		let announcement = announcement(b"hello world");
 
 		let call = Call::<T, I>::announce { announcement: announcement.clone() };
-		let origin = T::AnnouncementOrigin::successful_origin();
+		let origin =
+			T::AnnouncementOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
 		assert!(Alliance::<T, I>::announcements().contains(&announcement));
@@ -609,7 +611,8 @@ benchmarks_instance_pallet! {
 		Announcements::<T, I>::put(announcements);
 
 		let call = Call::<T, I>::remove_announcement { announcement: announcement.clone() };
-		let origin = T::AnnouncementOrigin::successful_origin();
+		let origin =
+			T::AnnouncementOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
 		assert!(Alliance::<T, I>::announcements().is_empty());
@@ -665,7 +668,8 @@ benchmarks_instance_pallet! {
 
 		let ally1_lookup = T::Lookup::unlookup(ally1.clone());
 		let call = Call::<T, I>::elevate_ally { ally: ally1_lookup };
-		let origin = T::MembershipManager::successful_origin();
+		let origin =
+			T::MembershipManager::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
 		assert!(!Alliance::<T, I>::is_ally(&ally1));
@@ -725,7 +729,8 @@ benchmarks_instance_pallet! {
 
 		let fellow2_lookup = T::Lookup::unlookup(fellow2.clone());
 		let call = Call::<T, I>::kick_member { who: fellow2_lookup };
-		let origin = T::MembershipManager::successful_origin();
+		let origin =
+			T::MembershipManager::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
 		assert!(!Alliance::<T, I>::is_member(&fellow2));
@@ -754,7 +759,8 @@ benchmarks_instance_pallet! {
 		unscrupulous_list.extend(websites.into_iter().map(UnscrupulousItem::Website));
 
 		let call = Call::<T, I>::add_unscrupulous_items { items: unscrupulous_list.clone() };
-		let origin = T::AnnouncementOrigin::successful_origin();
+		let origin =
+			T::AnnouncementOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
 		assert_last_event::<T, I>(Event::UnscrupulousItemAdded { items: unscrupulous_list }.into());
@@ -784,7 +790,8 @@ benchmarks_instance_pallet! {
 		unscrupulous_list.extend(websites.into_iter().map(UnscrupulousItem::Website));
 
 		let call = Call::<T, I>::remove_unscrupulous_items { items: unscrupulous_list.clone() };
-		let origin = T::AnnouncementOrigin::successful_origin();
+		let origin =
+			T::AnnouncementOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
 		assert_last_event::<T, I>(Event::UnscrupulousItemRemoved { items: unscrupulous_list }.into());
diff --git a/substrate/frame/assets/src/benchmarking.rs b/substrate/frame/assets/src/benchmarking.rs
index 9acf69f1e4ef433a3547f9fda4a7c13aa557ab02..cf0ec353f6350238b55d9f3f4d9336e695526f33 100644
--- a/substrate/frame/assets/src/benchmarking.rs
+++ b/substrate/frame/assets/src/benchmarking.rs
@@ -21,7 +21,7 @@
 
 use super::*;
 use frame_benchmarking::v1::{
-	account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller,
+	account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller, BenchmarkError,
 };
 use frame_support::{
 	dispatch::UnfilteredDispatchable,
@@ -135,7 +135,8 @@ fn assert_event<T: Config<I>, I: 'static>(generic_event: <T as Config<I>>::Runti
 benchmarks_instance_pallet! {
 	create {
 		let asset_id = default_asset_id::<T, I>();
-		let origin = T::CreateOrigin::successful_origin(&asset_id.into());
+		let origin = T::CreateOrigin::try_successful_origin(&asset_id.into())
+			.map_err(|_| BenchmarkError::Weightless)?;
 		let caller = T::CreateOrigin::ensure_origin(origin, &asset_id.into()).unwrap();
 		let caller_lookup = T::Lookup::unlookup(caller.clone());
 		T::Currency::make_free_balance_be(&caller, DepositBalanceOf::<T, I>::max_value());
@@ -362,7 +363,8 @@ benchmarks_instance_pallet! {
 
 		let (asset_id, _, _) = create_default_asset::<T, I>(true);
 
-		let origin = T::ForceOrigin::successful_origin();
+		let origin =
+			T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call = Call::<T, I>::force_set_metadata {
 			id: asset_id,
 			name: name.clone(),
@@ -382,7 +384,8 @@ benchmarks_instance_pallet! {
 		let origin = SystemOrigin::Signed(caller).into();
 		Assets::<T, I>::set_metadata(origin, asset_id, dummy.clone(), dummy, 12)?;
 
-		let origin = T::ForceOrigin::successful_origin();
+		let origin =
+			T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call = Call::<T, I>::force_clear_metadata { id: asset_id };
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
@@ -392,7 +395,8 @@ benchmarks_instance_pallet! {
 	force_asset_status {
 		let (asset_id, caller, caller_lookup) = create_default_asset::<T, I>(true);
 
-		let origin = T::ForceOrigin::successful_origin();
+		let origin =
+			T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call = Call::<T, I>::force_asset_status {
 			id: asset_id,
 			owner: caller_lookup.clone(),
diff --git a/substrate/frame/bounties/src/benchmarking.rs b/substrate/frame/bounties/src/benchmarking.rs
index a43372978e5ca619c59cbc5e5cf37a2eda344d04..881f1c912e38b167eb5947a37a4d8e642d706d85 100644
--- a/substrate/frame/bounties/src/benchmarking.rs
+++ b/substrate/frame/bounties/src/benchmarking.rs
@@ -173,7 +173,8 @@ benchmarks_instance_pallet! {
 		let (caller, curator, fee, value, reason) = setup_bounty::<T, I>(0, 0);
 		Bounties::<T, I>::propose_bounty(RawOrigin::Signed(caller).into(), value, reason)?;
 		let bounty_id = BountyCount::<T, I>::get() - 1;
-		let approve_origin = T::ApproveOrigin::successful_origin();
+		let approve_origin =
+			T::ApproveOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: close_bounty<T::RuntimeOrigin>(approve_origin, bounty_id)
 
 	close_bounty_active {
@@ -181,7 +182,8 @@ benchmarks_instance_pallet! {
 		let (curator_lookup, bounty_id) = create_bounty::<T, I>()?;
 		Treasury::<T, I>::on_initialize(T::BlockNumber::zero());
 		let bounty_id = BountyCount::<T, I>::get() - 1;
-		let approve_origin = T::ApproveOrigin::successful_origin();
+		let approve_origin =
+			T::ApproveOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: close_bounty<T::RuntimeOrigin>(approve_origin, bounty_id)
 	verify {
 		assert_last_event::<T, I>(Event::BountyCanceled { index: bounty_id }.into())
diff --git a/substrate/frame/democracy/src/benchmarking.rs b/substrate/frame/democracy/src/benchmarking.rs
index 66d9e2a007afad0ce1752e40d8a299be01c0310f..f2d45b719f6789232e1a66f2c5625b62c275e850 100644
--- a/substrate/frame/democracy/src/benchmarking.rs
+++ b/substrate/frame/democracy/src/benchmarking.rs
@@ -19,7 +19,7 @@
 
 use super::*;
 
-use frame_benchmarking::v1::{account, benchmarks, whitelist_account};
+use frame_benchmarking::v1::{account, benchmarks, whitelist_account, BenchmarkError};
 use frame_support::{
 	assert_noop, assert_ok,
 	traits::{Currency, EnsureOrigin, Get, OnInitialize, UnfilteredDispatchable},
@@ -177,7 +177,8 @@ benchmarks! {
 	}
 
 	emergency_cancel {
-		let origin = T::CancellationOrigin::successful_origin();
+		let origin =
+			T::CancellationOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let ref_index = add_referendum::<T>(0).0;
 		assert_ok!(Democracy::<T>::referendum_status(ref_index));
 	}: _<T::RuntimeOrigin>(origin, ref_index)
@@ -200,10 +201,13 @@ benchmarks! {
 		let (ref_index, hash) = add_referendum::<T>(0);
 		assert_ok!(Democracy::<T>::referendum_status(ref_index));
 		// Place our proposal in the external queue, too.
-		assert_ok!(
-			Democracy::<T>::external_propose(T::ExternalOrigin::successful_origin(), make_proposal::<T>(0))
-		);
-		let origin = T::BlacklistOrigin::successful_origin();
+		assert_ok!(Democracy::<T>::external_propose(
+			T::ExternalOrigin::try_successful_origin()
+				.expect("ExternalOrigin has no successful origin required for the benchmark"),
+			make_proposal::<T>(0)
+		));
+		let origin =
+			T::BlacklistOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: _<T::RuntimeOrigin>(origin, hash, Some(ref_index))
 	verify {
 		// Referendum has been canceled
@@ -215,7 +219,8 @@ benchmarks! {
 
 	// Worst case scenario, we external propose a previously blacklisted proposal
 	external_propose {
-		let origin = T::ExternalOrigin::successful_origin();
+		let origin =
+			T::ExternalOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let proposal = make_proposal::<T>(0);
 		// Add proposal to blacklist with block number 0
 
@@ -233,7 +238,8 @@ benchmarks! {
 	}
 
 	external_propose_majority {
-		let origin = T::ExternalMajorityOrigin::successful_origin();
+		let origin = T::ExternalMajorityOrigin::try_successful_origin()
+			.map_err(|_| BenchmarkError::Weightless)?;
 		let proposal = make_proposal::<T>(0);
 	}: _<T::RuntimeOrigin>(origin, proposal)
 	verify {
@@ -242,7 +248,8 @@ benchmarks! {
 	}
 
 	external_propose_default {
-		let origin = T::ExternalDefaultOrigin::successful_origin();
+		let origin = T::ExternalDefaultOrigin::try_successful_origin()
+			.map_err(|_| BenchmarkError::Weightless)?;
 		let proposal = make_proposal::<T>(0);
 	}: _<T::RuntimeOrigin>(origin, proposal)
 	verify {
@@ -251,13 +258,15 @@ benchmarks! {
 	}
 
 	fast_track {
-		let origin_propose = T::ExternalDefaultOrigin::successful_origin();
+		let origin_propose = T::ExternalDefaultOrigin::try_successful_origin()
+			.expect("ExternalDefaultOrigin has no successful origin required for the benchmark");
 		let proposal = make_proposal::<T>(0);
 		let proposal_hash = proposal.hash();
 		Democracy::<T>::external_propose_default(origin_propose, proposal)?;
 
 		// NOTE: Instant origin may invoke a little bit more logic, but may not always succeed.
-		let origin_fast_track = T::FastTrackOrigin::successful_origin();
+		let origin_fast_track =
+			T::FastTrackOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let voting_period = T::FastTrackVotingPeriod::get();
 		let delay = 0u32;
 	}: _<T::RuntimeOrigin>(origin_fast_track, proposal_hash, voting_period, delay.into())
@@ -269,7 +278,8 @@ benchmarks! {
 		let proposal = make_proposal::<T>(0);
 		let proposal_hash = proposal.hash();
 
-		let origin_propose = T::ExternalDefaultOrigin::successful_origin();
+		let origin_propose = T::ExternalDefaultOrigin::try_successful_origin()
+			.expect("ExternalDefaultOrigin has no successful origin required for the benchmark");
 		Democracy::<T>::external_propose_default(origin_propose, proposal)?;
 
 		let mut vetoers: BoundedVec<T::AccountId, _> = Default::default();
@@ -279,7 +289,7 @@ benchmarks! {
 		vetoers.sort();
 		Blacklist::<T>::insert(proposal_hash, (T::BlockNumber::zero(), vetoers));
 
-		let origin = T::VetoOrigin::successful_origin();
+		let origin = T::VetoOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		ensure!(NextExternal::<T>::get().is_some(), "no external proposal");
 	}: _<T::RuntimeOrigin>(origin, proposal_hash)
 	verify {
@@ -293,7 +303,8 @@ benchmarks! {
 		for i in 0 .. T::MaxProposals::get() {
 			add_proposal::<T>(i)?;
 		}
-		let cancel_origin = T::CancelProposalOrigin::successful_origin();
+		let cancel_origin = T::CancelProposalOrigin::try_successful_origin()
+			.map_err(|_| BenchmarkError::Weightless)?;
 	}: _<T::RuntimeOrigin>(cancel_origin, 0)
 
 	cancel_referendum {
@@ -313,7 +324,8 @@ benchmarks! {
 		// Launch external
 		LastTabledWasExternal::<T>::put(false);
 
-		let origin = T::ExternalMajorityOrigin::successful_origin();
+		let origin = T::ExternalMajorityOrigin::try_successful_origin()
+			.map_err(|_| BenchmarkError::Weightless)?;
 		let proposal = make_proposal::<T>(r);
 		let call = Call::<T>::external_propose_majority { proposal };
 		call.dispatch_bypass_filter(origin)?;
diff --git a/substrate/frame/fast-unstake/src/benchmarking.rs b/substrate/frame/fast-unstake/src/benchmarking.rs
index 77488b6447c617b787c2650e4b25d2a764946206..e0e4186d780148c8f6bb90fb77065dda35152dea 100644
--- a/substrate/frame/fast-unstake/src/benchmarking.rs
+++ b/substrate/frame/fast-unstake/src/benchmarking.rs
@@ -20,7 +20,7 @@
 #![cfg(feature = "runtime-benchmarks")]
 
 use crate::{types::*, Pallet as FastUnstake, *};
-use frame_benchmarking::v1::{benchmarks, whitelist_account};
+use frame_benchmarking::v1::{benchmarks, whitelist_account, BenchmarkError};
 use frame_support::{
 	assert_ok,
 	traits::{Currency, EnsureOrigin, Get, Hooks},
@@ -192,7 +192,8 @@ benchmarks! {
 	}
 
 	control {
-		let origin = <T as Config>::ControlOrigin::successful_origin();
+		let origin = <T as Config>::ControlOrigin::try_successful_origin()
+			.map_err(|_| BenchmarkError::Weightless)?;
 	}
 	: _<T::RuntimeOrigin>(origin, T::MaxErasToCheckPerBlock::get())
 	verify {}
diff --git a/substrate/frame/identity/src/benchmarking.rs b/substrate/frame/identity/src/benchmarking.rs
index 356bcb2e80174dc3840bb71244beca63897a3c73..2d485af0f698bce470e4fbe5bd0efac775dbf007 100644
--- a/substrate/frame/identity/src/benchmarking.rs
+++ b/substrate/frame/identity/src/benchmarking.rs
@@ -22,7 +22,7 @@
 use super::*;
 
 use crate::Pallet as Identity;
-use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller};
+use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller, BenchmarkError};
 use frame_support::{
 	ensure,
 	traits::{EnsureOrigin, Get},
@@ -42,7 +42,8 @@ fn add_registrars<T: Config>(r: u32) -> Result<(), &'static str> {
 		let registrar: T::AccountId = account("registrar", i, SEED);
 		let registrar_lookup = T::Lookup::unlookup(registrar.clone());
 		let _ = T::Currency::make_free_balance_be(&registrar, BalanceOf::<T>::max_value());
-		let registrar_origin = T::RegistrarOrigin::successful_origin();
+		let registrar_origin = T::RegistrarOrigin::try_successful_origin()
+			.expect("RegistrarOrigin has no successful origin required for the benchmark");
 		Identity::<T>::add_registrar(registrar_origin, registrar_lookup)?;
 		Identity::<T>::set_fee(RawOrigin::Signed(registrar.clone()).into(), i, 10u32.into())?;
 		let fields =
@@ -121,7 +122,8 @@ benchmarks! {
 	add_registrar {
 		let r in 1 .. T::MaxRegistrars::get() - 1 => add_registrars::<T>(r)?;
 		ensure!(Registrars::<T>::get().len() as u32 == r, "Registrars not set up correctly.");
-		let origin = T::RegistrarOrigin::successful_origin();
+		let origin =
+			T::RegistrarOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let account = T::Lookup::unlookup(account("registrar", r + 1, SEED));
 	}: _<T::RuntimeOrigin>(origin, account)
 	verify {
@@ -280,7 +282,8 @@ benchmarks! {
 
 		let r in 1 .. T::MaxRegistrars::get() - 1 => add_registrars::<T>(r)?;
 
-		let registrar_origin = T::RegistrarOrigin::successful_origin();
+		let registrar_origin = T::RegistrarOrigin::try_successful_origin()
+			.expect("RegistrarOrigin has no successful origin required for the benchmark");
 		Identity::<T>::add_registrar(registrar_origin, caller_lookup)?;
 		let registrars = Registrars::<T>::get();
 		ensure!(registrars[r as usize].as_ref().unwrap().fee == 0u32.into(), "Fee already set.");
@@ -297,7 +300,8 @@ benchmarks! {
 
 		let r in 1 .. T::MaxRegistrars::get() - 1 => add_registrars::<T>(r)?;
 
-		let registrar_origin = T::RegistrarOrigin::successful_origin();
+		let registrar_origin = T::RegistrarOrigin::try_successful_origin()
+			.expect("RegistrarOrigin has no successful origin required for the benchmark");
 		Identity::<T>::add_registrar(registrar_origin, caller_lookup)?;
 		let registrars = Registrars::<T>::get();
 		ensure!(registrars[r as usize].as_ref().unwrap().account == caller, "id not set.");
@@ -315,7 +319,8 @@ benchmarks! {
 
 		let r in 1 .. T::MaxRegistrars::get() - 1 => add_registrars::<T>(r)?;
 
-		let registrar_origin = T::RegistrarOrigin::successful_origin();
+		let registrar_origin = T::RegistrarOrigin::try_successful_origin()
+			.expect("RegistrarOrigin has no successful origin required for the benchmark");
 		Identity::<T>::add_registrar(registrar_origin, caller_lookup)?;
 		let fields = IdentityFields(
 			IdentityField::Display | IdentityField::Legal | IdentityField::Web | IdentityField::Riot
@@ -347,7 +352,8 @@ benchmarks! {
 		let info_hash = T::Hashing::hash_of(&info);
 		Identity::<T>::set_identity(user_origin.clone(), Box::new(info))?;
 
-		let registrar_origin = T::RegistrarOrigin::successful_origin();
+		let registrar_origin = T::RegistrarOrigin::try_successful_origin()
+			.expect("RegistrarOrigin has no successful origin required for the benchmark");
 		Identity::<T>::add_registrar(registrar_origin, caller_lookup)?;
 		Identity::<T>::request_judgement(user_origin, r, 10u32.into())?;
 	}: _(RawOrigin::Signed(caller), r, user_lookup, Judgement::Reasonable, info_hash)
@@ -385,7 +391,8 @@ benchmarks! {
 			)?;
 		}
 		ensure!(IdentityOf::<T>::contains_key(&target), "Identity not set");
-		let origin = T::ForceOrigin::successful_origin();
+		let origin =
+			T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: _<T::RuntimeOrigin>(origin, target_lookup)
 	verify {
 		ensure!(!IdentityOf::<T>::contains_key(&target), "Identity not removed");
diff --git a/substrate/frame/lottery/src/benchmarking.rs b/substrate/frame/lottery/src/benchmarking.rs
index 658dd25a98a27b64b1dea2c1629e1f2d36264ed3..0db7fabb365ef14f531a95708b2737b16f3d9afe 100644
--- a/substrate/frame/lottery/src/benchmarking.rs
+++ b/substrate/frame/lottery/src/benchmarking.rs
@@ -21,7 +21,7 @@
 
 use super::*;
 
-use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller};
+use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller, BenchmarkError};
 use frame_support::{
 	storage::bounded_vec::BoundedVec,
 	traits::{EnsureOrigin, OnInitialize},
@@ -43,7 +43,8 @@ fn setup_lottery<T: Config>(repeat: bool) -> Result<(), &'static str> {
 	];
 	// Last call will be the match for worst case scenario.
 	calls.push(frame_system::Call::<T>::remark { remark: vec![] }.into());
-	let origin = T::ManagerOrigin::successful_origin();
+	let origin = T::ManagerOrigin::try_successful_origin()
+		.expect("ManagerOrigin has no successful origin required for the benchmark");
 	Lottery::<T>::set_calls(origin.clone(), calls)?;
 	Lottery::<T>::start_lottery(origin, price, length, delay, repeat)?;
 	Ok(())
@@ -76,7 +77,8 @@ benchmarks! {
 	set_calls {
 		let n in 0 .. T::MaxCalls::get() as u32;
 		let calls = vec![frame_system::Call::<T>::remark { remark: vec![] }.into(); n as usize];
-		let origin = T::ManagerOrigin::successful_origin();
+		let origin =
+			T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		assert!(CallIndices::<T>::get().is_empty());
 	}: _<T::RuntimeOrigin>(origin, calls)
 	verify {
@@ -89,7 +91,8 @@ benchmarks! {
 		let price = BalanceOf::<T>::max_value();
 		let end = 10u32.into();
 		let payout = 5u32.into();
-		let origin = T::ManagerOrigin::successful_origin();
+		let origin =
+			T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: _<T::RuntimeOrigin>(origin, price, end, payout, true)
 	verify {
 		assert!(crate::Lottery::<T>::get().is_some());
@@ -98,7 +101,8 @@ benchmarks! {
 	stop_repeat {
 		setup_lottery::<T>(true)?;
 		assert_eq!(crate::Lottery::<T>::get().unwrap().repeat, true);
-		let origin = T::ManagerOrigin::successful_origin();
+		let origin =
+			T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: _<T::RuntimeOrigin>(origin)
 	verify {
 		assert_eq!(crate::Lottery::<T>::get().unwrap().repeat, false);
diff --git a/substrate/frame/membership/src/lib.rs b/substrate/frame/membership/src/lib.rs
index 6d973a15fe0326e342af8b0c00bdfad89c349b64..8b39a08ce6699923c83cc74ff1d1059fdf5c85ff 100644
--- a/substrate/frame/membership/src/lib.rs
+++ b/substrate/frame/membership/src/lib.rs
@@ -362,15 +362,17 @@ impl<T: Config<I>, I: 'static> SortedMembers<T::AccountId> for Pallet<T, I> {
 #[cfg(feature = "runtime-benchmarks")]
 mod benchmark {
 	use super::{Pallet as Membership, *};
-	use frame_benchmarking::v1::{account, benchmarks_instance_pallet, whitelist};
+	use frame_benchmarking::v1::{account, benchmarks_instance_pallet, whitelist, BenchmarkError};
 	use frame_support::{assert_ok, traits::EnsureOrigin};
 	use frame_system::RawOrigin;
 
 	const SEED: u32 = 0;
 
 	fn set_members<T: Config<I>, I: 'static>(members: Vec<T::AccountId>, prime: Option<usize>) {
-		let reset_origin = T::ResetOrigin::successful_origin();
-		let prime_origin = T::PrimeOrigin::successful_origin();
+		let reset_origin = T::ResetOrigin::try_successful_origin()
+			.expect("ResetOrigin has no successful origin required for the benchmark");
+		let prime_origin = T::PrimeOrigin::try_successful_origin()
+			.expect("PrimeOrigin has no successful origin required for the benchmark");
 
 		assert_ok!(<Membership<T, I>>::reset_members(reset_origin, members.clone()));
 		if let Some(prime) = prime.map(|i| members[i].clone()) {
@@ -390,9 +392,11 @@ mod benchmark {
 			let new_member = account::<T::AccountId>("add", m, SEED);
 			let new_member_lookup = T::Lookup::unlookup(new_member.clone());
 		}: {
-			assert_ok!(<Membership<T, I>>::add_member(T::AddOrigin::successful_origin(), new_member_lookup));
-		}
-		verify {
+			assert_ok!(<Membership<T, I>>::add_member(
+				T::AddOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+				new_member_lookup,
+			));
+		} verify {
 			assert!(<Members<T, I>>::get().contains(&new_member));
 			#[cfg(test)] crate::tests::clean();
 		}
@@ -408,7 +412,10 @@ mod benchmark {
 			let to_remove = members.first().cloned().unwrap();
 			let to_remove_lookup = T::Lookup::unlookup(to_remove.clone());
 		}: {
-			assert_ok!(<Membership<T, I>>::remove_member(T::RemoveOrigin::successful_origin(), to_remove_lookup));
+			assert_ok!(<Membership<T, I>>::remove_member(
+				T::RemoveOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+				to_remove_lookup,
+			));
 		} verify {
 			assert!(!<Members<T, I>>::get().contains(&to_remove));
 			// prime is rejigged
@@ -428,7 +435,7 @@ mod benchmark {
 			let remove_lookup = T::Lookup::unlookup(remove.clone());
 		}: {
 			assert_ok!(<Membership<T, I>>::swap_member(
-				T::SwapOrigin::successful_origin(),
+				T::SwapOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
 				remove_lookup,
 				add_lookup,
 			));
@@ -448,7 +455,10 @@ mod benchmark {
 			set_members::<T, I>(members.clone(), Some(members.len() - 1));
 			let mut new_members = (m..2*m).map(|i| account("member", i, SEED)).collect::<Vec<T::AccountId>>();
 		}: {
-			assert_ok!(<Membership<T, I>>::reset_members(T::ResetOrigin::successful_origin(), new_members.clone()));
+			assert_ok!(<Membership<T, I>>::reset_members(
+				T::ResetOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+				new_members.clone(),
+			));
 		} verify {
 			new_members.sort();
 			assert_eq!(<Members<T, I>>::get(), new_members);
@@ -485,7 +495,10 @@ mod benchmark {
 			let prime_lookup = T::Lookup::unlookup(prime.clone());
 			set_members::<T, I>(members, None);
 		}: {
-			assert_ok!(<Membership<T, I>>::set_prime(T::PrimeOrigin::successful_origin(), prime_lookup));
+			assert_ok!(<Membership<T, I>>::set_prime(
+				T::PrimeOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+				prime_lookup,
+			));
 		} verify {
 			assert!(<Prime<T, I>>::get().is_some());
 			assert!(<T::MembershipChanged>::get_prime().is_some());
@@ -498,7 +511,9 @@ mod benchmark {
 			let prime = members.last().cloned().unwrap();
 			set_members::<T, I>(members, None);
 		}: {
-			assert_ok!(<Membership<T, I>>::clear_prime(T::PrimeOrigin::successful_origin()));
+			assert_ok!(<Membership<T, I>>::clear_prime(
+				T::PrimeOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+			));
 		} verify {
 			assert!(<Prime<T, I>>::get().is_none());
 			assert!(<T::MembershipChanged>::get_prime().is_none());
diff --git a/substrate/frame/nfts/src/benchmarking.rs b/substrate/frame/nfts/src/benchmarking.rs
index 17ff28b822814a6c1862347031502bd45a9ff599..a4007f6b2c133c86e93734357ffb8a3e736f82ad 100644
--- a/substrate/frame/nfts/src/benchmarking.rs
+++ b/substrate/frame/nfts/src/benchmarking.rs
@@ -22,7 +22,7 @@
 use super::*;
 use enumflags2::{BitFlag, BitFlags};
 use frame_benchmarking::v1::{
-	account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller,
+	account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller, BenchmarkError,
 };
 use frame_support::{
 	assert_ok,
@@ -151,7 +151,8 @@ fn default_item_config() -> ItemConfig {
 benchmarks_instance_pallet! {
 	create {
 		let collection = T::Helper::collection(0);
-		let origin = T::CreateOrigin::successful_origin(&collection);
+		let origin = T::CreateOrigin::try_successful_origin(&collection)
+			.map_err(|_| BenchmarkError::Weightless)?;
 		let caller = T::CreateOrigin::ensure_origin(origin.clone(), &collection).unwrap();
 		whitelist_account!(caller);
 		let admin = T::Lookup::unlookup(caller.clone());
@@ -311,7 +312,8 @@ benchmarks_instance_pallet! {
 
 	force_collection_owner {
 		let (collection, _, _) = create_collection::<T, I>();
-		let origin = T::ForceOrigin::successful_origin();
+		let origin =
+			T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let target: T::AccountId = account("target", 0, SEED);
 		let target_lookup = T::Lookup::unlookup(target.clone());
 		T::Currency::make_free_balance_be(&target, T::Currency::minimum_balance());
@@ -326,7 +328,8 @@ benchmarks_instance_pallet! {
 
 	force_collection_config {
 		let (collection, caller, _) = create_collection::<T, I>();
-		let origin = T::ForceOrigin::successful_origin();
+		let origin =
+			T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call = Call::<T, I>::force_collection_config {
 			collection,
 			config: make_collection_config::<T, I>(CollectionSetting::DepositRequired.into()),
diff --git a/substrate/frame/nis/src/benchmarking.rs b/substrate/frame/nis/src/benchmarking.rs
index b01d414c4b251e75247b88e43b2db9782070725e..10d3a238a3f5e90e2f74d89b9b49629f7fc12eff 100644
--- a/substrate/frame/nis/src/benchmarking.rs
+++ b/substrate/frame/nis/src/benchmarking.rs
@@ -20,7 +20,7 @@
 #![cfg(feature = "runtime-benchmarks")]
 
 use super::*;
-use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller};
+use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller, BenchmarkError};
 use frame_support::traits::{nonfungible::Inspect, Currency, EnsureOrigin, Get};
 use frame_system::RawOrigin;
 use sp_arithmetic::Perquintill;
@@ -100,7 +100,8 @@ benchmarks! {
 	}
 
 	fund_deficit {
-		let origin = T::FundOrigin::successful_origin();
+		let origin =
+			T::FundOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let caller: T::AccountId = whitelisted_caller();
 		let bid = T::MinBid::get().max(One::one());
 		T::Currency::make_free_balance_be(&caller, bid);
diff --git a/substrate/frame/preimage/src/benchmarking.rs b/substrate/frame/preimage/src/benchmarking.rs
index f9526b67d4bc8271981fe95e3f5cf011fbe1334c..56361b88c25833bedeff56a55cf9fc70f4c03ea3 100644
--- a/substrate/frame/preimage/src/benchmarking.rs
+++ b/substrate/frame/preimage/src/benchmarking.rs
@@ -18,7 +18,7 @@
 //! Preimage pallet benchmarking.
 
 use super::*;
-use frame_benchmarking::v1::{account, benchmarks, whitelist_account};
+use frame_benchmarking::v1::{account, benchmarks, whitelist_account, BenchmarkError};
 use frame_support::assert_ok;
 use frame_system::RawOrigin;
 use sp_runtime::traits::Bounded;
@@ -62,7 +62,11 @@ benchmarks! {
 		let caller = funded_account::<T>("caller", 0);
 		whitelist_account!(caller);
 		let (preimage, hash) = sized_preimage_and_hash::<T>(s);
-		assert_ok!(Preimage::<T>::request_preimage(T::ManagerOrigin::successful_origin(), hash));
+		assert_ok!(Preimage::<T>::request_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			hash,
+		));
 	}: note_preimage(RawOrigin::Signed(caller), preimage)
 	verify {
 		assert!(Preimage::<T>::have_preimage(&hash));
@@ -71,9 +75,15 @@ benchmarks! {
 	note_no_deposit_preimage {
 		let s in 0 .. MAX_SIZE;
 		let (preimage, hash) = sized_preimage_and_hash::<T>(s);
-		assert_ok!(Preimage::<T>::request_preimage(T::ManagerOrigin::successful_origin(), hash));
-	}: note_preimage<T::RuntimeOrigin>(T::ManagerOrigin::successful_origin(), preimage)
-	verify {
+		assert_ok!(Preimage::<T>::request_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			hash,
+		));
+	}: note_preimage<T::RuntimeOrigin>(
+		T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		preimage
+	) verify {
 		assert!(Preimage::<T>::have_preimage(&hash));
 	}
 
@@ -90,9 +100,15 @@ benchmarks! {
 	// Cheap unnote - will not unreserve since there's no deposit held.
 	unnote_no_deposit_preimage {
 		let (preimage, hash) = preimage_and_hash::<T>();
-		assert_ok!(Preimage::<T>::note_preimage(T::ManagerOrigin::successful_origin(), preimage));
-	}: unnote_preimage<T::RuntimeOrigin>(T::ManagerOrigin::successful_origin(), hash)
-	verify {
+		assert_ok!(Preimage::<T>::note_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			preimage,
+		));
+	}: unnote_preimage<T::RuntimeOrigin>(
+		T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		hash
+	) verify {
 		assert!(!Preimage::<T>::have_preimage(&hash));
 	}
 
@@ -102,8 +118,10 @@ benchmarks! {
 		let noter = funded_account::<T>("noter", 0);
 		whitelist_account!(noter);
 		assert_ok!(Preimage::<T>::note_preimage(RawOrigin::Signed(noter.clone()).into(), preimage));
-	}: _<T::RuntimeOrigin>(T::ManagerOrigin::successful_origin(), hash)
-	verify {
+	}: _<T::RuntimeOrigin>(
+		T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		hash
+	) verify {
 		let deposit = T::BaseDeposit::get() + T::ByteDeposit::get() * MAX_SIZE.into();
 		let s = RequestStatus::Requested { deposit: Some((noter, deposit)), count: 1, len: Some(MAX_SIZE) };
 		assert_eq!(StatusFor::<T>::get(&hash), Some(s));
@@ -111,26 +129,40 @@ benchmarks! {
 	// Cheap request - would unreserve the deposit but none was held.
 	request_no_deposit_preimage {
 		let (preimage, hash) = preimage_and_hash::<T>();
-		assert_ok!(Preimage::<T>::note_preimage(T::ManagerOrigin::successful_origin(), preimage));
-	}: request_preimage<T::RuntimeOrigin>(T::ManagerOrigin::successful_origin(), hash)
-	verify {
+		assert_ok!(Preimage::<T>::note_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			preimage,
+		));
+	}: request_preimage<T::RuntimeOrigin>(
+		T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		hash
+	) verify {
 		let s = RequestStatus::Requested { deposit: None, count: 2, len: Some(MAX_SIZE) };
 		assert_eq!(StatusFor::<T>::get(&hash), Some(s));
 	}
 	// Cheap request - the preimage is not yet noted, so deposit to unreserve.
 	request_unnoted_preimage {
 		let (_, hash) = preimage_and_hash::<T>();
-	}: request_preimage<T::RuntimeOrigin>(T::ManagerOrigin::successful_origin(), hash)
-	verify {
+	}: request_preimage<T::RuntimeOrigin>(
+		T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		hash
+	) verify {
 		let s = RequestStatus::Requested { deposit: None, count: 1, len: None };
 		assert_eq!(StatusFor::<T>::get(&hash), Some(s));
 	}
 	// Cheap request - the preimage is already requested, so just a counter bump.
 	request_requested_preimage {
 		let (_, hash) = preimage_and_hash::<T>();
-		assert_ok!(Preimage::<T>::request_preimage(T::ManagerOrigin::successful_origin(), hash));
-	}: request_preimage<T::RuntimeOrigin>(T::ManagerOrigin::successful_origin(), hash)
-	verify {
+		assert_ok!(Preimage::<T>::request_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			hash,
+		));
+	}: request_preimage<T::RuntimeOrigin>(
+		T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		hash
+	) verify {
 		let s = RequestStatus::Requested { deposit: None, count: 2, len: None };
 		assert_eq!(StatusFor::<T>::get(&hash), Some(s));
 	}
@@ -138,27 +170,53 @@ benchmarks! {
 	// Expensive unrequest - last reference and it's noted, so will destroy the preimage.
 	unrequest_preimage {
 		let (preimage, hash) = preimage_and_hash::<T>();
-		assert_ok!(Preimage::<T>::request_preimage(T::ManagerOrigin::successful_origin(), hash));
-		assert_ok!(Preimage::<T>::note_preimage(T::ManagerOrigin::successful_origin(), preimage));
-	}: _<T::RuntimeOrigin>(T::ManagerOrigin::successful_origin(), hash)
-	verify {
+		assert_ok!(Preimage::<T>::request_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			hash,
+		));
+		assert_ok!(Preimage::<T>::note_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			preimage,
+		));
+	}: _<T::RuntimeOrigin>(
+		T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		hash
+	) verify {
 		assert_eq!(StatusFor::<T>::get(&hash), None);
 	}
 	// Cheap unrequest - last reference, but it's not noted.
 	unrequest_unnoted_preimage {
 		let (_, hash) = preimage_and_hash::<T>();
-		assert_ok!(Preimage::<T>::request_preimage(T::ManagerOrigin::successful_origin(), hash));
-	}: unrequest_preimage<T::RuntimeOrigin>(T::ManagerOrigin::successful_origin(), hash)
-	verify {
+		assert_ok!(Preimage::<T>::request_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			hash,
+		));
+	}: unrequest_preimage<T::RuntimeOrigin>(
+		T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		hash
+	) verify {
 		assert_eq!(StatusFor::<T>::get(&hash), None);
 	}
 	// Cheap unrequest - not the last reference.
 	unrequest_multi_referenced_preimage {
 		let (_, hash) = preimage_and_hash::<T>();
-		assert_ok!(Preimage::<T>::request_preimage(T::ManagerOrigin::successful_origin(), hash));
-		assert_ok!(Preimage::<T>::request_preimage(T::ManagerOrigin::successful_origin(), hash));
-	}: unrequest_preimage<T::RuntimeOrigin>(T::ManagerOrigin::successful_origin(), hash)
-	verify {
+		assert_ok!(Preimage::<T>::request_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			hash,
+		));
+		assert_ok!(Preimage::<T>::request_preimage(
+			T::ManagerOrigin::try_successful_origin()
+				.expect("ManagerOrigin has no successful origin required for the benchmark"),
+			hash,
+		));
+	}: unrequest_preimage<T::RuntimeOrigin>(
+		T::ManagerOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		hash
+	) verify {
 		let s = RequestStatus::Requested { deposit: None, count: 1, len: None };
 		assert_eq!(StatusFor::<T>::get(&hash), Some(s));
 	}
diff --git a/substrate/frame/ranked-collective/src/benchmarking.rs b/substrate/frame/ranked-collective/src/benchmarking.rs
index 48df7f1f1e6abaf267a45b1b86bb885e9431ed92..ad81325becb5ecefa7ea5b4a8966605ece97e201 100644
--- a/substrate/frame/ranked-collective/src/benchmarking.rs
+++ b/substrate/frame/ranked-collective/src/benchmarking.rs
@@ -21,7 +21,9 @@ use super::*;
 #[allow(unused_imports)]
 use crate::Pallet as RankedCollective;
 
-use frame_benchmarking::v1::{account, benchmarks_instance_pallet, whitelisted_caller};
+use frame_benchmarking::v1::{
+	account, benchmarks_instance_pallet, whitelisted_caller, BenchmarkError,
+};
 use frame_support::{assert_ok, dispatch::UnfilteredDispatchable};
 use frame_system::RawOrigin as SystemOrigin;
 
@@ -35,13 +37,15 @@ fn make_member<T: Config<I>, I: 'static>(rank: Rank) -> T::AccountId {
 	let who = account::<T::AccountId>("member", MemberCount::<T, I>::get(0), SEED);
 	let who_lookup = T::Lookup::unlookup(who.clone());
 	assert_ok!(Pallet::<T, I>::add_member(
-		T::PromoteOrigin::successful_origin(),
-		who_lookup.clone()
+		T::PromoteOrigin::try_successful_origin()
+			.expect("PromoteOrigin has no successful origin required for the benchmark"),
+		who_lookup.clone(),
 	));
 	for _ in 0..rank {
 		assert_ok!(Pallet::<T, I>::promote_member(
-			T::PromoteOrigin::successful_origin(),
-			who_lookup.clone()
+			T::PromoteOrigin::try_successful_origin()
+				.expect("PromoteOrigin has no successful origin required for the benchmark"),
+			who_lookup.clone(),
 		));
 	}
 	who
@@ -51,7 +55,8 @@ benchmarks_instance_pallet! {
 	add_member {
 		let who = account::<T::AccountId>("member", 0, SEED);
 		let who_lookup = T::Lookup::unlookup(who.clone());
-		let origin = T::PromoteOrigin::successful_origin();
+		let origin =
+			T::PromoteOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call = Call::<T, I>::add_member { who: who_lookup };
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
@@ -67,7 +72,8 @@ benchmarks_instance_pallet! {
 		let who_lookup = T::Lookup::unlookup(who.clone());
 		let last = make_member::<T, I>(rank);
 		let last_index = (0..=rank).map(|r| IdToIndex::<T, I>::get(r, &last).unwrap()).collect::<Vec<_>>();
-		let origin = T::DemoteOrigin::successful_origin();
+		let origin =
+			T::DemoteOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call = Call::<T, I>::remove_member { who: who_lookup, min_rank: rank };
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
@@ -83,7 +89,8 @@ benchmarks_instance_pallet! {
 		let rank = r as u16;
 		let who = make_member::<T, I>(rank);
 		let who_lookup = T::Lookup::unlookup(who.clone());
-		let origin = T::PromoteOrigin::successful_origin();
+		let origin =
+			T::PromoteOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call = Call::<T, I>::promote_member { who: who_lookup };
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
@@ -99,7 +106,8 @@ benchmarks_instance_pallet! {
 		let who_lookup = T::Lookup::unlookup(who.clone());
 		let last = make_member::<T, I>(rank);
 		let last_index = IdToIndex::<T, I>::get(rank, &last).unwrap();
-		let origin = T::DemoteOrigin::successful_origin();
+		let origin =
+			T::DemoteOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call = Call::<T, I>::demote_member { who: who_lookup };
 	}: { call.dispatch_bypass_filter(origin)? }
 	verify {
@@ -115,14 +123,19 @@ benchmarks_instance_pallet! {
 	vote {
 		let caller: T::AccountId = whitelisted_caller();
 		let caller_lookup = T::Lookup::unlookup(caller.clone());
-		assert_ok!(Pallet::<T, I>::add_member(T::PromoteOrigin::successful_origin(), caller_lookup.clone()));
+		assert_ok!(Pallet::<T, I>::add_member(
+			T::PromoteOrigin::try_successful_origin()
+				.expect("PromoteOrigin has no successful origin required for the benchmark"),
+			caller_lookup.clone(),
+		));
 		// Create a poll
 		let class = T::Polls::classes().into_iter().next().unwrap();
 		let rank = T::MinRankOfClass::convert(class.clone());
 		for _ in 0..rank {
 			assert_ok!(Pallet::<T, I>::promote_member(
-				T::PromoteOrigin::successful_origin(),
-				caller_lookup.clone()
+				T::PromoteOrigin::try_successful_origin()
+					.expect("PromoteOrigin has no successful origin required for the benchmark"),
+				caller_lookup.clone(),
 			));
 		}
 
diff --git a/substrate/frame/ranked-collective/src/lib.rs b/substrate/frame/ranked-collective/src/lib.rs
index b057a575080232e3542b623f57c387910e86902a..84be1243c8afc810f98860ba8403bca727c1140f 100644
--- a/substrate/frame/ranked-collective/src/lib.rs
+++ b/substrate/frame/ranked-collective/src/lib.rs
@@ -259,19 +259,6 @@ impl<T: Config<I>, I: 'static, const MIN_RANK: u16> EnsureOrigin<T::RuntimeOrigi
 		let who = IndexToId::<T, I>::get(MIN_RANK, 0).ok_or(())?;
 		Ok(frame_system::RawOrigin::Signed(who).into())
 	}
-
-	#[cfg(feature = "runtime-benchmarks")]
-	fn successful_origin() -> T::RuntimeOrigin {
-		match Self::try_successful_origin() {
-			Ok(o) => o,
-			Err(()) => {
-				let who: T::AccountId = frame_benchmarking::whitelisted_caller();
-				crate::Pallet::<T, I>::do_add_member_to_rank(who.clone(), MIN_RANK)
-					.expect("failed to add ranked member");
-				frame_system::RawOrigin::Signed(who).into()
-			},
-		}
-	}
 }
 
 /// Guard to ensure that the given origin is a member of the collective. The account ID of the
@@ -295,19 +282,6 @@ impl<T: Config<I>, I: 'static, const MIN_RANK: u16> EnsureOrigin<T::RuntimeOrigi
 		let who = IndexToId::<T, I>::get(MIN_RANK, 0).ok_or(())?;
 		Ok(frame_system::RawOrigin::Signed(who).into())
 	}
-
-	#[cfg(feature = "runtime-benchmarks")]
-	fn successful_origin() -> T::RuntimeOrigin {
-		match Self::try_successful_origin() {
-			Ok(o) => o,
-			Err(()) => {
-				let who: T::AccountId = frame_benchmarking::whitelisted_caller();
-				crate::Pallet::<T, I>::do_add_member_to_rank(who.clone(), MIN_RANK)
-					.expect("failed to add ranked member");
-				frame_system::RawOrigin::Signed(who).into()
-			},
-		}
-	}
 }
 
 /// Guard to ensure that the given origin is a member of the collective. The pair of both the
@@ -331,19 +305,6 @@ impl<T: Config<I>, I: 'static, const MIN_RANK: u16> EnsureOrigin<T::RuntimeOrigi
 		let who = IndexToId::<T, I>::get(MIN_RANK, 0).ok_or(())?;
 		Ok(frame_system::RawOrigin::Signed(who).into())
 	}
-
-	#[cfg(feature = "runtime-benchmarks")]
-	fn successful_origin() -> T::RuntimeOrigin {
-		match Self::try_successful_origin() {
-			Ok(o) => o,
-			Err(()) => {
-				let who: T::AccountId = frame_benchmarking::whitelisted_caller();
-				crate::Pallet::<T, I>::do_add_member_to_rank(who.clone(), MIN_RANK)
-					.expect("failed to add ranked member");
-				frame_system::RawOrigin::Signed(who).into()
-			},
-		}
-	}
 }
 
 #[frame_support::pallet]
diff --git a/substrate/frame/referenda/src/benchmarking.rs b/substrate/frame/referenda/src/benchmarking.rs
index db5299e0d5bb2f33e272546693156c7bec82430c..62b37857f25673d6b03c27315b237863de27dfe1 100644
--- a/substrate/frame/referenda/src/benchmarking.rs
+++ b/substrate/frame/referenda/src/benchmarking.rs
@@ -20,7 +20,9 @@
 use super::*;
 use crate::Pallet as Referenda;
 use assert_matches::assert_matches;
-use frame_benchmarking::v1::{account, benchmarks_instance_pallet, whitelist_account};
+use frame_benchmarking::v1::{
+	account, benchmarks_instance_pallet, whitelist_account, BenchmarkError,
+};
 use frame_support::{
 	assert_ok,
 	dispatch::UnfilteredDispatchable,
@@ -48,8 +50,7 @@ fn dummy_call<T: Config<I>, I: 'static>() -> Bounded<<T as Config<I>>::RuntimeCa
 	T::Preimages::bound(call).unwrap()
 }
 
-fn create_referendum<T: Config<I>, I: 'static>() -> (T::RuntimeOrigin, ReferendumIndex) {
-	let origin: T::RuntimeOrigin = T::SubmitOrigin::successful_origin();
+fn create_referendum<T: Config<I>, I: 'static>(origin: T::RuntimeOrigin) -> ReferendumIndex {
 	if let Ok(caller) = frame_system::ensure_signed(origin.clone()) {
 		T::Currency::make_free_balance_be(&caller, BalanceOf::<T, I>::max_value());
 		whitelist_account!(caller);
@@ -61,7 +62,7 @@ fn create_referendum<T: Config<I>, I: 'static>() -> (T::RuntimeOrigin, Referendu
 	let call = crate::Call::<T, I>::submit { proposal_origin, proposal, enactment_moment };
 	assert_ok!(call.dispatch_bypass_filter(origin.clone()));
 	let index = ReferendumCount::<T, I>::get() - 1;
-	(origin, index)
+	index
 }
 
 fn place_deposit<T: Config<I>, I: 'static>(index: ReferendumIndex) {
@@ -75,6 +76,7 @@ fn nudge<T: Config<I>, I: 'static>(index: ReferendumIndex) {
 }
 
 fn fill_queue<T: Config<I>, I: 'static>(
+	origin: T::RuntimeOrigin,
 	index: ReferendumIndex,
 	spaces: u32,
 	pass_after: u32,
@@ -82,7 +84,7 @@ fn fill_queue<T: Config<I>, I: 'static>(
 	// First, create enough other referendums to fill the track.
 	let mut others = vec![];
 	for _ in 0..info::<T, I>(index).max_deciding {
-		let (_origin, index) = create_referendum::<T, I>();
+		let index = create_referendum::<T, I>(origin.clone());
 		place_deposit::<T, I>(index);
 		others.push(index);
 	}
@@ -90,7 +92,7 @@ fn fill_queue<T: Config<I>, I: 'static>(
 	// We will also need enough referenda which are queued and passing, we want `MaxQueued - 1`
 	// in order to force the maximum amount of work to insert ours into the queue.
 	for _ in spaces..T::MaxQueued::get() {
-		let (_origin, index) = create_referendum::<T, I>();
+		let index = create_referendum::<T, I>(origin.clone());
 		place_deposit::<T, I>(index);
 		make_passing_after::<T, I>(index, Perbill::from_percent(pass_after));
 		others.push(index);
@@ -194,7 +196,8 @@ fn is_not_confirming<T: Config<I>, I: 'static>(index: ReferendumIndex) -> bool {
 
 benchmarks_instance_pallet! {
 	submit {
-		let origin: T::RuntimeOrigin = T::SubmitOrigin::successful_origin();
+		let origin =
+			T::SubmitOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		if let Ok(caller) = frame_system::ensure_signed(origin.clone()) {
 			T::Currency::make_free_balance_be(&caller, BalanceOf::<T, I>::max_value());
 			whitelist_account!(caller);
@@ -210,15 +213,19 @@ benchmarks_instance_pallet! {
 	}
 
 	place_decision_deposit_preparing {
-		let (origin, index) = create_referendum::<T, I>();
+		let origin =
+			T::SubmitOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
+		let index = create_referendum::<T, I>(origin.clone());
 	}: place_decision_deposit<T::RuntimeOrigin>(origin, index)
 	verify {
 		assert!(Referenda::<T, I>::ensure_ongoing(index).unwrap().decision_deposit.is_some());
 	}
 
 	place_decision_deposit_queued {
-		let (origin, index) = create_referendum::<T, I>();
-		fill_queue::<T, I>(index, 1, 90);
+		let origin =
+			T::SubmitOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
+		let index = create_referendum::<T, I>(origin.clone());
+		fill_queue::<T, I>(origin.clone(), index, 1, 90);
 	}: place_decision_deposit<T::RuntimeOrigin>(origin, index)
 	verify {
 		let track = Referenda::<T, I>::ensure_ongoing(index).unwrap().track;
@@ -227,8 +234,10 @@ benchmarks_instance_pallet! {
 	}
 
 	place_decision_deposit_not_queued {
-		let (origin, index) = create_referendum::<T, I>();
-		fill_queue::<T, I>(index, 0, 90);
+		let origin =
+			T::SubmitOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
+		let index = create_referendum::<T, I>(origin.clone());
+		fill_queue::<T, I>(origin.clone(), index, 0, 90);
 		let track = Referenda::<T, I>::ensure_ongoing(index).unwrap().track;
 		assert_eq!(TrackQueue::<T, I>::get(&track).len() as u32, T::MaxQueued::get());
 		assert!(TrackQueue::<T, I>::get(&track).into_iter().all(|(i, _)| i != index));
@@ -239,7 +248,9 @@ benchmarks_instance_pallet! {
 	}
 
 	place_decision_deposit_passing {
-		let (origin, index) = create_referendum::<T, I>();
+		let origin =
+			T::SubmitOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
+		let index = create_referendum::<T, I>(origin.clone());
 		skip_prepare_period::<T, I>(index);
 		make_passing::<T, I>(index);
 	}: place_decision_deposit<T::RuntimeOrigin>(origin, index)
@@ -248,7 +259,9 @@ benchmarks_instance_pallet! {
 	}
 
 	place_decision_deposit_failing {
-		let (origin, index) = create_referendum::<T, I>();
+		let origin =
+			T::SubmitOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
+		let index = create_referendum::<T, I>(origin.clone());
 		skip_prepare_period::<T, I>(index);
 	}: place_decision_deposit<T::RuntimeOrigin>(origin, index)
 	verify {
@@ -256,19 +269,31 @@ benchmarks_instance_pallet! {
 	}
 
 	refund_decision_deposit {
-		let (origin, index) = create_referendum::<T, I>();
+		let origin =
+			T::SubmitOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
+		let index = create_referendum::<T, I>(origin.clone());
 		place_deposit::<T, I>(index);
-		assert_ok!(Referenda::<T, I>::cancel(T::CancelOrigin::successful_origin(), index));
+		assert_ok!(Referenda::<T, I>::cancel(
+			T::CancelOrigin::try_successful_origin()
+				.expect("CancelOrigin has no successful origin required for the benchmark"),
+			index,
+		));
 	}: _<T::RuntimeOrigin>(origin, index)
 	verify {
 		assert_matches!(ReferendumInfoFor::<T, I>::get(index), Some(ReferendumInfo::Cancelled(_, _, None)));
 	}
 
 	refund_submission_deposit {
-		let (origin, index) = create_referendum::<T, I>();
+		let origin =
+			T::SubmitOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
+		let index = create_referendum::<T, I>(origin.clone());
 		let caller = frame_system::ensure_signed(origin.clone()).unwrap();
 		let balance = T::Currency::free_balance(&caller);
-		assert_ok!(Referenda::<T, I>::cancel(T::CancelOrigin::successful_origin(), index));
+		assert_ok!(Referenda::<T, I>::cancel(
+			T::CancelOrigin::try_successful_origin()
+				.expect("CancelOrigin has no successful origin required for the benchmark"),
+			index,
+		));
 		assert_matches!(ReferendumInfoFor::<T, I>::get(index), Some(ReferendumInfo::Cancelled(_, Some(_), _)));
 	}: _<T::RuntimeOrigin>(origin, index)
 	verify {
@@ -279,28 +304,42 @@ benchmarks_instance_pallet! {
 	}
 
 	cancel {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
-	}: _<T::RuntimeOrigin>(T::CancelOrigin::successful_origin(), index)
-	verify {
+	}: _<T::RuntimeOrigin>(
+		T::CancelOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		index
+	) verify {
 		assert_matches!(ReferendumInfoFor::<T, I>::get(index), Some(ReferendumInfo::Cancelled(..)));
 	}
 
 	kill {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
-	}: _<T::RuntimeOrigin>(T::KillOrigin::successful_origin(), index)
-	verify {
+	}: _<T::RuntimeOrigin>(
+		T::KillOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?,
+		index
+	) verify {
 		assert_matches!(ReferendumInfoFor::<T, I>::get(index), Some(ReferendumInfo::Killed(..)));
 	}
 
 	one_fewer_deciding_queue_empty {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 		skip_prepare_period::<T, I>(index);
 		nudge::<T, I>(index);
 		let track = Referenda::<T, I>::ensure_ongoing(index).unwrap().track;
-		assert_ok!(Referenda::<T, I>::cancel(T::CancelOrigin::successful_origin(), index));
+		assert_ok!(Referenda::<T, I>::cancel(
+			T::CancelOrigin::try_successful_origin()
+				.expect("CancelOrigin has no successful origin required for the benchmark"),
+			index,
+		));
 		assert_eq!(DecidingCount::<T, I>::get(&track), 1);
 	}: one_fewer_deciding(RawOrigin::Root, track)
 	verify {
@@ -308,11 +347,17 @@ benchmarks_instance_pallet! {
 	}
 
 	one_fewer_deciding_failing {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin.clone());
 		// No spaces free in the queue.
-		let queued = fill_queue::<T, I>(index, 0, 90);
+		let queued = fill_queue::<T, I>(origin, index, 0, 90);
 		let track = Referenda::<T, I>::ensure_ongoing(index).unwrap().track;
-		assert_ok!(Referenda::<T, I>::cancel(T::CancelOrigin::successful_origin(), queued[0]));
+		assert_ok!(Referenda::<T, I>::cancel(
+			T::CancelOrigin::try_successful_origin()
+				.expect("CancelOrigin has no successful origin required for the benchmark"),
+			queued[0],
+		));
 		assert_eq!(TrackQueue::<T, I>::get(&track).len() as u32, T::MaxQueued::get());
 		let deciding_count = DecidingCount::<T, I>::get(&track);
 	}: one_fewer_deciding(RawOrigin::Root, track)
@@ -327,11 +372,17 @@ benchmarks_instance_pallet! {
 	}
 
 	one_fewer_deciding_passing {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin.clone());
 		// No spaces free in the queue.
-		let queued = fill_queue::<T, I>(index, 0, 0);
+		let queued = fill_queue::<T, I>(origin, index, 0, 0);
 		let track = Referenda::<T, I>::ensure_ongoing(index).unwrap().track;
-		assert_ok!(Referenda::<T, I>::cancel(T::CancelOrigin::successful_origin(), queued[0]));
+		assert_ok!(Referenda::<T, I>::cancel(
+			T::CancelOrigin::try_successful_origin()
+				.expect("CancelOrigin has no successful origin required for the benchmark"),
+			queued[0],
+		));
 		assert_eq!(TrackQueue::<T, I>::get(&track).len() as u32, T::MaxQueued::get());
 		let deciding_count = DecidingCount::<T, I>::get(&track);
 	}: one_fewer_deciding(RawOrigin::Root, track)
@@ -346,10 +397,12 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_requeued_insertion {
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
 		// First create our referendum and place the deposit. It will be failing.
-		let (_origin, index) = create_referendum::<T, I>();
+		let index = create_referendum::<T, I>(origin.clone());
 		place_deposit::<T, I>(index);
-		fill_queue::<T, I>(index, 0, 90);
+		fill_queue::<T, I>(origin, index, 0, 90);
 
 		// Now nudge ours, with the track now full and the queue full of referenda with votes,
 		// ours will not be in the queue.
@@ -367,10 +420,12 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_requeued_slide {
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
 		// First create our referendum and place the deposit. It will be failing.
-		let (_origin, index) = create_referendum::<T, I>();
+		let index = create_referendum::<T, I>(origin.clone());
 		place_deposit::<T, I>(index);
-		fill_queue::<T, I>(index, 1, 90);
+		fill_queue::<T, I>(origin, index, 1, 90);
 
 		// Now nudge ours, with the track now full, ours will be queued, but with no votes, it
 		// will have the worst position.
@@ -393,10 +448,12 @@ benchmarks_instance_pallet! {
 		// free and this failing. It would result in `QUEUE_SIZE - 1` items being shifted for the
 		// insertion at the beginning.
 
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
 		// First create our referendum and place the deposit. It will be failing.
-		let (_origin, index) = create_referendum::<T, I>();
+		let index = create_referendum::<T, I>(origin.clone());
 		place_deposit::<T, I>(index);
-		fill_queue::<T, I>(index, 1, 0);
+		fill_queue::<T, I>(origin, index, 1, 0);
 
 		let track = Referenda::<T, I>::ensure_ongoing(index).unwrap().track;
 		assert_eq!(TrackQueue::<T, I>::get(&track).len() as u32, T::MaxQueued::get() - 1);
@@ -410,10 +467,12 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_not_queued {
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
 		// First create our referendum and place the deposit. It will be failing.
-		let (_origin, index) = create_referendum::<T, I>();
+		let index = create_referendum::<T, I>(origin.clone());
 		place_deposit::<T, I>(index);
-		fill_queue::<T, I>(index, 0, 0);
+		fill_queue::<T, I>(origin, index, 0, 0);
 
 		let track = Referenda::<T, I>::ensure_ongoing(index).unwrap().track;
 		assert_eq!(TrackQueue::<T, I>::get(&track).len() as u32, T::MaxQueued::get());
@@ -427,7 +486,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_no_deposit {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		skip_prepare_period::<T, I>(index);
 	}: nudge_referendum(RawOrigin::Root, index)
 	verify {
@@ -436,7 +497,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_preparing {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 	}: nudge_referendum(RawOrigin::Root, index)
 	verify {
@@ -445,7 +508,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_timed_out {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		skip_timeout_period::<T, I>(index);
 	}: nudge_referendum(RawOrigin::Root, index)
 	verify {
@@ -454,7 +519,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_begin_deciding_failing {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 		skip_prepare_period::<T, I>(index);
 	}: nudge_referendum(RawOrigin::Root, index)
@@ -463,7 +530,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_begin_deciding_passing {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 		make_passing::<T, I>(index);
 		skip_prepare_period::<T, I>(index);
@@ -473,7 +542,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_begin_confirming {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 		skip_prepare_period::<T, I>(index);
 		nudge::<T, I>(index);
@@ -485,7 +556,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_end_confirming {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 		skip_prepare_period::<T, I>(index);
 		make_passing::<T, I>(index);
@@ -498,7 +571,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_continue_not_confirming {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 		skip_prepare_period::<T, I>(index);
 		nudge::<T, I>(index);
@@ -512,7 +587,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_continue_confirming {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 		make_passing::<T, I>(index);
 		skip_prepare_period::<T, I>(index);
@@ -525,7 +602,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_approved {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 		skip_prepare_period::<T, I>(index);
 		make_passing::<T, I>(index);
@@ -538,7 +617,9 @@ benchmarks_instance_pallet! {
 	}
 
 	nudge_referendum_rejected {
-		let (_origin, index) = create_referendum::<T, I>();
+		let origin = T::SubmitOrigin::try_successful_origin()
+			.expect("SubmitOrigin has no successful origin required for the benchmark");
+		let index = create_referendum::<T, I>(origin);
 		place_deposit::<T, I>(index);
 		skip_prepare_period::<T, I>(index);
 		make_failing::<T, I>(index);
diff --git a/substrate/frame/scheduler/src/benchmarking.rs b/substrate/frame/scheduler/src/benchmarking.rs
index 9ec82f5c8447efe3510feee6e5b6ada26926e8c4..94a833bd98e0a41e44c347ea716c478aa4e14fe1 100644
--- a/substrate/frame/scheduler/src/benchmarking.rs
+++ b/substrate/frame/scheduler/src/benchmarking.rs
@@ -18,7 +18,7 @@
 //! Scheduler pallet benchmarking.
 
 use super::*;
-use frame_benchmarking::v1::{account, benchmarks};
+use frame_benchmarking::v1::{account, benchmarks, BenchmarkError};
 use frame_support::{
 	ensure,
 	traits::{schedule::Priority, BoundedInline},
@@ -244,7 +244,8 @@ benchmarks! {
 
 		fill_schedule::<T>(when, s)?;
 		assert_eq!(Agenda::<T>::get(when).len(), s as usize);
-		let schedule_origin = T::ScheduleOrigin::successful_origin();
+		let schedule_origin =
+			T::ScheduleOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: _<SystemOrigin<T>>(schedule_origin, when, 0)
 	verify {
 		ensure!(
diff --git a/substrate/frame/support/src/traits/dispatch.rs b/substrate/frame/support/src/traits/dispatch.rs
index 36ddf5b507c0cba6a1459598a24e628d3e40db79..50c6c227919443deb81ba7c5a5b1a7f26ce2a21d 100644
--- a/substrate/frame/support/src/traits/dispatch.rs
+++ b/substrate/frame/support/src/traits/dispatch.rs
@@ -40,25 +40,12 @@ pub trait EnsureOrigin<OuterOrigin> {
 	/// Perform the origin check.
 	fn try_origin(o: OuterOrigin) -> Result<Self::Success, OuterOrigin>;
 
-	/// Returns an outer origin capable of passing `try_origin` check.
-	///
-	/// NOTE: This should generally *NOT* be reimplemented. Instead implement
-	/// `try_successful_origin`.
+	/// Attempt to get an outer origin capable of passing `try_origin` check. May return `Err` if it
+	/// is impossible.
 	///
 	/// ** Should be used for benchmarking only!!! **
 	#[cfg(feature = "runtime-benchmarks")]
-	fn successful_origin() -> OuterOrigin {
-		Self::try_successful_origin().expect("No origin exists which can satisfy the guard")
-	}
-
-	/// Attept to get an outer origin capable of passing `try_origin` check. May return `Err` if it
-	/// is impossible. Default implementation just uses `successful_origin()`.
-	///
-	/// ** Should be used for benchmarking only!!! **
-	#[cfg(feature = "runtime-benchmarks")]
-	fn try_successful_origin() -> Result<OuterOrigin, ()> {
-		Ok(Self::successful_origin())
-	}
+	fn try_successful_origin() -> Result<OuterOrigin, ()>;
 }
 
 /// [`EnsureOrigin`] implementation that always fails.
@@ -171,25 +158,12 @@ pub trait EnsureOriginWithArg<OuterOrigin, Argument> {
 	/// Perform the origin check, returning the origin value if unsuccessful. This allows chaining.
 	fn try_origin(o: OuterOrigin, a: &Argument) -> Result<Self::Success, OuterOrigin>;
 
-	/// Returns an outer origin capable of passing `try_origin` check.
-	///
-	/// NOTE: This should generally *NOT* be reimplemented. Instead implement
-	/// `try_successful_origin`.
-	///
-	/// ** Should be used for benchmarking only!!! **
-	#[cfg(feature = "runtime-benchmarks")]
-	fn successful_origin(a: &Argument) -> OuterOrigin {
-		Self::try_successful_origin(a).expect("No origin exists which can satisfy the guard")
-	}
-
-	/// Attept to get an outer origin capable of passing `try_origin` check. May return `Err` if it
-	/// is impossible. Default implementation just uses `successful_origin()`.
+	/// Attempt to get an outer origin capable of passing `try_origin` check. May return `Err` if it
+	/// is impossible.
 	///
 	/// ** Should be used for benchmarking only!!! **
 	#[cfg(feature = "runtime-benchmarks")]
-	fn try_successful_origin(a: &Argument) -> Result<OuterOrigin, ()> {
-		Ok(Self::successful_origin(a))
-	}
+	fn try_successful_origin(a: &Argument) -> Result<OuterOrigin, ()>;
 }
 
 pub struct AsEnsureOriginWithArg<EO>(sp_std::marker::PhantomData<EO>);
diff --git a/substrate/frame/system/src/tests.rs b/substrate/frame/system/src/tests.rs
index 8223f6674415150950ad465307d01e2ff8546ce5..f441e785599eb7ab3e3e14ab88fe54c4fa9a4b3b 100644
--- a/substrate/frame/system/src/tests.rs
+++ b/substrate/frame/system/src/tests.rs
@@ -679,10 +679,13 @@ fn ensure_signed_stuff_works() {
 
 	#[cfg(feature = "runtime-benchmarks")]
 	{
-		let successful_origin: RuntimeOrigin = EnsureSigned::successful_origin();
+		let successful_origin: RuntimeOrigin = EnsureSigned::try_successful_origin()
+			.expect("EnsureSigned has no successful origin required for the test");
 		assert_ok!(EnsureSigned::try_origin(successful_origin));
 
-		let successful_origin: RuntimeOrigin = EnsureSignedBy::<Members, _>::successful_origin();
+		let successful_origin: RuntimeOrigin =
+			EnsureSignedBy::<Members, _>::try_successful_origin()
+				.expect("EnsureSignedBy has no successful origin required for the test");
 		assert_ok!(EnsureSignedBy::<Members, _>::try_origin(successful_origin));
 	}
 }
diff --git a/substrate/frame/tips/src/benchmarking.rs b/substrate/frame/tips/src/benchmarking.rs
index 8ffc53b45e4ca78dcb4ed8654254cba860665b3f..5b1a102b8eb30e646ee11df331e10f5dfc49b62f 100644
--- a/substrate/frame/tips/src/benchmarking.rs
+++ b/substrate/frame/tips/src/benchmarking.rs
@@ -19,7 +19,9 @@
 
 #![cfg(feature = "runtime-benchmarks")]
 
-use frame_benchmarking::v1::{account, benchmarks_instance_pallet, whitelisted_caller};
+use frame_benchmarking::v1::{
+	account, benchmarks_instance_pallet, whitelisted_caller, BenchmarkError,
+};
 use frame_support::ensure;
 use frame_system::RawOrigin;
 use sp_runtime::traits::Saturating;
@@ -196,7 +198,8 @@ benchmarks_instance_pallet! {
 		let reason_hash = T::Hashing::hash(&reason[..]);
 		let hash = T::Hashing::hash_of(&(&reason_hash, &beneficiary));
 		ensure!(Tips::<T, I>::contains_key(hash), "tip does not exist");
-		let reject_origin = T::RejectOrigin::successful_origin();
+		let reject_origin =
+			T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: _<T::RuntimeOrigin>(reject_origin, hash)
 
 	impl_benchmark_test_suite!(TipsMod, crate::tests::new_test_ext(), crate::tests::Test);
diff --git a/substrate/frame/treasury/src/benchmarking.rs b/substrate/frame/treasury/src/benchmarking.rs
index eb44744506bf4ce08681599067fc5b8a206d03f7..0947618a2b02f23f0f788133cf6bc0dfeccbbfa5 100644
--- a/substrate/frame/treasury/src/benchmarking.rs
+++ b/substrate/frame/treasury/src/benchmarking.rs
@@ -21,7 +21,7 @@
 
 use super::{Pallet as Treasury, *};
 
-use frame_benchmarking::v1::{account, benchmarks_instance_pallet};
+use frame_benchmarking::v1::{account, benchmarks_instance_pallet, BenchmarkError};
 use frame_support::{
 	dispatch::UnfilteredDispatchable,
 	ensure,
@@ -99,7 +99,8 @@ benchmarks_instance_pallet! {
 			beneficiary_lookup
 		)?;
 		let proposal_id = Treasury::<T, _>::proposal_count() - 1;
-		let reject_origin = T::RejectOrigin::successful_origin();
+		let reject_origin =
+			T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: _<T::RuntimeOrigin>(reject_origin, proposal_id)
 
 	approve_proposal {
@@ -112,7 +113,8 @@ benchmarks_instance_pallet! {
 			beneficiary_lookup
 		)?;
 		let proposal_id = Treasury::<T, _>::proposal_count() - 1;
-		let approve_origin = T::ApproveOrigin::successful_origin();
+		let approve_origin =
+			T::ApproveOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: _<T::RuntimeOrigin>(approve_origin, proposal_id)
 
 	remove_approval {
@@ -124,7 +126,8 @@ benchmarks_instance_pallet! {
 		)?;
 		let proposal_id = Treasury::<T, _>::proposal_count() - 1;
 		Treasury::<T, I>::approve_proposal(RawOrigin::Root.into(), proposal_id)?;
-		let reject_origin = T::RejectOrigin::successful_origin();
+		let reject_origin =
+			T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 	}: _<T::RuntimeOrigin>(reject_origin, proposal_id)
 
 	on_initialize_proposals {
diff --git a/substrate/frame/uniques/src/benchmarking.rs b/substrate/frame/uniques/src/benchmarking.rs
index 5ecb093a5d010a33c0bae5956c53def4542eebae..2656582f0e073a6d20cda0f7f195c151297f2d26 100644
--- a/substrate/frame/uniques/src/benchmarking.rs
+++ b/substrate/frame/uniques/src/benchmarking.rs
@@ -21,7 +21,7 @@
 
 use super::*;
 use frame_benchmarking::v1::{
-	account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller,
+	account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller, BenchmarkError,
 };
 use frame_support::{
 	dispatch::UnfilteredDispatchable,
@@ -137,7 +137,8 @@ fn assert_last_event<T: Config<I>, I: 'static>(generic_event: <T as Config<I>>::
 benchmarks_instance_pallet! {
 	create {
 		let collection = T::Helper::collection(0);
-		let origin = T::CreateOrigin::successful_origin(&collection);
+		let origin = T::CreateOrigin::try_successful_origin(&collection)
+			.map_err(|_| BenchmarkError::Weightless)?;
 		let caller = T::CreateOrigin::ensure_origin(origin.clone(), &collection).unwrap();
 		whitelist_account!(caller);
 		let admin = T::Lookup::unlookup(caller.clone());
@@ -290,7 +291,8 @@ benchmarks_instance_pallet! {
 
 	force_item_status {
 		let (collection, caller, caller_lookup) = create_collection::<T, I>();
-		let origin = T::ForceOrigin::successful_origin();
+		let origin =
+			T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call = Call::<T, I>::force_item_status {
 			collection,
 			owner: caller_lookup.clone(),
diff --git a/substrate/frame/whitelist/src/benchmarking.rs b/substrate/frame/whitelist/src/benchmarking.rs
index e64842b34df59f1c1e22a0a0f8a437c4ab1120a3..582f4a7997c672467b0af094455445007571734b 100644
--- a/substrate/frame/whitelist/src/benchmarking.rs
+++ b/substrate/frame/whitelist/src/benchmarking.rs
@@ -20,7 +20,7 @@
 #![cfg(feature = "runtime-benchmarks")]
 
 use super::*;
-use frame_benchmarking::v1::benchmarks;
+use frame_benchmarking::v1::{benchmarks, BenchmarkError};
 use frame_support::{ensure, traits::EnsureOrigin};
 
 #[cfg(test)]
@@ -28,7 +28,8 @@ use crate::Pallet as Whitelist;
 
 benchmarks! {
 	whitelist_call {
-		let origin = T::WhitelistOrigin::successful_origin();
+		let origin =
+			T::WhitelistOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call_hash = Default::default();
 	}: _<T::RuntimeOrigin>(origin, call_hash)
 	verify {
@@ -43,7 +44,8 @@ benchmarks! {
 	}
 
 	remove_whitelisted_call {
-		let origin = T::WhitelistOrigin::successful_origin();
+		let origin =
+			T::WhitelistOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 		let call_hash = Default::default();
 		Pallet::<T>::whitelist_call(origin.clone(), call_hash)
 			.expect("whitelisting call must be successful");
@@ -70,7 +72,8 @@ benchmarks! {
 		// NOTE: we remove `10` because we need some bytes to encode the variants and vec length
 		let n in 1 .. T::Preimages::MAX_LENGTH as u32 - 10;
 
-		let origin = T::DispatchWhitelistedOrigin::successful_origin();
+		let origin = T::DispatchWhitelistedOrigin::try_successful_origin()
+			.map_err(|_| BenchmarkError::Weightless)?;
 		let remark = sp_std::vec![1u8; n as usize];
 		let call: <T as Config>::RuntimeCall = frame_system::Call::remark { remark }.into();
 		let call_weight = call.get_dispatch_info().weight;
@@ -98,7 +101,8 @@ benchmarks! {
 	dispatch_whitelisted_call_with_preimage {
 		let n in 1 .. 10_000;
 
-		let origin = T::DispatchWhitelistedOrigin::successful_origin();
+		let origin = T::DispatchWhitelistedOrigin::try_successful_origin()
+			.map_err(|_| BenchmarkError::Weightless)?;
 		let remark = sp_std::vec![1u8; n as usize];
 
 		let call: <T as Config>::RuntimeCall = frame_system::Call::remark { remark }.into();