diff --git a/cumulus/test/client/src/lib.rs b/cumulus/test/client/src/lib.rs
index a39a662553b0853ec810a7b5091d521b3e3b40bb..d233ad2691768c0c1d563c3a0f4c62b44f4c9b23 100644
--- a/cumulus/test/client/src/lib.rs
+++ b/cumulus/test/client/src/lib.rs
@@ -45,33 +45,18 @@ pub use substrate_test_client::*;
 
 pub type ParachainBlockData = cumulus_primitives_core::ParachainBlockData<Block>;
 
-mod local_executor {
-	/// Native executor instance.
-	pub struct LocalExecutor;
-
-	impl sc_executor::NativeExecutionDispatch for LocalExecutor {
-		type ExtendHostFunctions =
-			cumulus_primitives_proof_size_hostfunction::storage_proof_size::HostFunctions;
-
-		fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-			cumulus_test_runtime::api::dispatch(method, data)
-		}
-
-		fn native_version() -> sc_executor::NativeVersion {
-			cumulus_test_runtime::native_version()
-		}
-	}
-}
-
-/// Native executor used for tests.
-pub use local_executor::LocalExecutor;
-
 /// Test client database backend.
 pub type Backend = substrate_test_client::Backend<Block>;
 
 /// Test client executor.
-pub type Executor =
-	client::LocalCallExecutor<Block, Backend, sc_executor::NativeElseWasmExecutor<LocalExecutor>>;
+pub type Executor = client::LocalCallExecutor<
+	Block,
+	Backend,
+	WasmExecutor<(
+		sp_io::SubstrateHostFunctions,
+		cumulus_primitives_proof_size_hostfunction::storage_proof_size::HostFunctions,
+	)>,
+>;
 
 /// Test client builder for Cumulus
 pub type TestClientBuilder =
@@ -100,7 +85,7 @@ impl substrate_test_client::GenesisInit for GenesisParameters {
 	}
 }
 
-/// A `test-runtime` extensions to `TestClientBuilder`.
+/// A `test-runtime` extensions to [`TestClientBuilder`].
 pub trait TestClientBuilderExt: Sized {
 	/// Build the test client.
 	fn build(self) -> Client {
diff --git a/prdoc/pr_4329.prdoc b/prdoc/pr_4329.prdoc
new file mode 100644
index 0000000000000000000000000000000000000000..2fe11a60f4baad8374c751a6b533c495ed7152b3
--- /dev/null
+++ b/prdoc/pr_4329.prdoc
@@ -0,0 +1,14 @@
+title: "Deprecate `NativeElseWasmExecutor`"
+
+doc:
+  - audience: Node Dev
+    description: |
+      Deprecates the `NativeElseWasmExecutor` as native execution is already
+      discouraged and should be removed entirely. The executor should be
+      replaced by `WasmExecutor` which can be found in `sc-executor`.
+
+      The `NativeElseWasmExecutor` will be removed at the end of 2024.
+
+crates:
+  - name: sc-executor
+    bump: minor
diff --git a/substrate/client/executor/src/executor.rs b/substrate/client/executor/src/executor.rs
index d56a3b389ef42868d0543303c5fbd63ea8d2d884..913bcdfcfe591d9f7c8a0b78198102bd5441750e 100644
--- a/substrate/client/executor/src/executor.rs
+++ b/substrate/client/executor/src/executor.rs
@@ -83,7 +83,7 @@ fn unwrap_heap_pages(pages: Option<HeapAllocStrategy>) -> HeapAllocStrategy {
 }
 
 /// Builder for creating a [`WasmExecutor`] instance.
-pub struct WasmExecutorBuilder<H> {
+pub struct WasmExecutorBuilder<H = sp_io::SubstrateHostFunctions> {
 	_phantom: PhantomData<H>,
 	method: WasmExecutionMethod,
 	onchain_heap_alloc_strategy: Option<HeapAllocStrategy>,
@@ -218,7 +218,7 @@ impl<H> WasmExecutorBuilder<H> {
 
 /// An abstraction over Wasm code executor. Supports selecting execution backend and
 /// manages runtime cache.
-pub struct WasmExecutor<H> {
+pub struct WasmExecutor<H = sp_io::SubstrateHostFunctions> {
 	/// Method used to execute fallback Wasm code.
 	method: WasmExecutionMethod,
 	/// The heap allocation strategy for onchain Wasm calls.
@@ -252,10 +252,13 @@ impl<H> Clone for WasmExecutor<H> {
 	}
 }
 
-impl<H> WasmExecutor<H>
-where
-	H: HostFunctions,
-{
+impl Default for WasmExecutor<sp_io::SubstrateHostFunctions> {
+	fn default() -> Self {
+		WasmExecutorBuilder::new().build()
+	}
+}
+
+impl<H> WasmExecutor<H> {
 	/// Create new instance.
 	///
 	/// # Parameters
@@ -312,7 +315,12 @@ where
 	pub fn allow_missing_host_functions(&mut self, allow_missing_host_functions: bool) {
 		self.allow_missing_host_functions = allow_missing_host_functions
 	}
+}
 
+impl<H> WasmExecutor<H>
+where
+	H: HostFunctions,
+{
 	/// Execute the given closure `f` with the latest runtime (based on `runtime_code`).
 	///
 	/// The closure `f` is expected to return `Err(_)` when there happened a `panic!` in native code
@@ -558,6 +566,9 @@ where
 
 /// A generic `CodeExecutor` implementation that uses a delegate to determine wasm code equivalence
 /// and dispatch to native code when possible, falling back on `WasmExecutor` when not.
+#[deprecated(
+	note = "Native execution will be deprecated, please replace with `WasmExecutor`. Will be removed at end of 2024."
+)]
 pub struct NativeElseWasmExecutor<D: NativeExecutionDispatch> {
 	/// Native runtime version info.
 	native_version: NativeVersion,
@@ -568,6 +579,7 @@ pub struct NativeElseWasmExecutor<D: NativeExecutionDispatch> {
 	use_native: bool,
 }
 
+#[allow(deprecated)]
 impl<D: NativeExecutionDispatch> NativeElseWasmExecutor<D> {
 	///
 	/// Create new instance.
@@ -628,6 +640,7 @@ impl<D: NativeExecutionDispatch> NativeElseWasmExecutor<D> {
 	}
 }
 
+#[allow(deprecated)]
 impl<D: NativeExecutionDispatch> RuntimeVersionOf for NativeElseWasmExecutor<D> {
 	fn runtime_version(
 		&self,
@@ -638,12 +651,14 @@ impl<D: NativeExecutionDispatch> RuntimeVersionOf for NativeElseWasmExecutor<D>
 	}
 }
 
+#[allow(deprecated)]
 impl<D: NativeExecutionDispatch> GetNativeVersion for NativeElseWasmExecutor<D> {
 	fn native_version(&self) -> &NativeVersion {
 		&self.native_version
 	}
 }
 
+#[allow(deprecated)]
 impl<D: NativeExecutionDispatch + 'static> CodeExecutor for NativeElseWasmExecutor<D> {
 	type Error = Error;
 
@@ -718,6 +733,7 @@ impl<D: NativeExecutionDispatch + 'static> CodeExecutor for NativeElseWasmExecut
 	}
 }
 
+#[allow(deprecated)]
 impl<D: NativeExecutionDispatch> Clone for NativeElseWasmExecutor<D> {
 	fn clone(&self) -> Self {
 		NativeElseWasmExecutor {
@@ -728,6 +744,7 @@ impl<D: NativeExecutionDispatch> Clone for NativeElseWasmExecutor<D> {
 	}
 }
 
+#[allow(deprecated)]
 impl<D: NativeExecutionDispatch> sp_core::traits::ReadRuntimeVersion for NativeElseWasmExecutor<D> {
 	fn read_runtime_version(
 		&self,
@@ -765,6 +782,7 @@ mod tests {
 	}
 
 	#[test]
+	#[allow(deprecated)]
 	fn native_executor_registers_custom_interface() {
 		let executor = NativeElseWasmExecutor::<MyExecutorDispatch>::new_with_wasm_executor(
 			WasmExecutor::builder().build(),
diff --git a/substrate/client/executor/src/lib.rs b/substrate/client/executor/src/lib.rs
index 6b99f0a6ee03b303d2d97ce05040828e3248312b..204f1ff22d74dc96bedb52711308010d59351a27 100644
--- a/substrate/client/executor/src/lib.rs
+++ b/substrate/client/executor/src/lib.rs
@@ -36,18 +36,17 @@ mod executor;
 mod integration_tests;
 mod wasm_runtime;
 
-pub use self::{
-	executor::{
-		with_externalities_safe, NativeElseWasmExecutor, NativeExecutionDispatch, WasmExecutor,
-	},
-	wasm_runtime::{read_embedded_version, WasmExecutionMethod},
-};
 pub use codec::Codec;
+#[allow(deprecated)]
+pub use executor::NativeElseWasmExecutor;
+pub use executor::{with_externalities_safe, NativeExecutionDispatch, WasmExecutor};
 #[doc(hidden)]
 pub use sp_core::traits::Externalities;
 pub use sp_version::{NativeVersion, RuntimeVersion};
 #[doc(hidden)]
 pub use sp_wasm_interface;
+pub use sp_wasm_interface::HostFunctions;
+pub use wasm_runtime::{read_embedded_version, WasmExecutionMethod};
 
 pub use sc_executor_common::{
 	error,
diff --git a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs
index 3495d9e54490c0214c75359843ce0bbf42aa5465..a6edc344bc63fda4cb04caa21dfd20b2df8bd0ad 100644
--- a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs
+++ b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs
@@ -864,7 +864,7 @@ mod tests {
 		Arc<Client<sc_client_api::in_mem::Backend<Block>>>,
 	) {
 		let backend = Arc::new(sc_client_api::in_mem::Backend::new());
-		let executor = substrate_test_runtime_client::new_native_or_wasm_executor();
+		let executor = substrate_test_runtime_client::WasmExecutor::default();
 		let client_config = sc_service::ClientConfig::default();
 		let genesis_block_builder = sc_service::GenesisBlockBuilder::new(
 			&substrate_test_runtime_client::GenesisParameters::default().genesis_storage(),
diff --git a/substrate/client/rpc-spec-v2/src/chain_head/tests.rs b/substrate/client/rpc-spec-v2/src/chain_head/tests.rs
index 4bab2194e082acf65e47bd0a3917ee23c2a81884..363d11235dda4e5bc8595df0303eb7951a0903da 100644
--- a/substrate/client/rpc-spec-v2/src/chain_head/tests.rs
+++ b/substrate/client/rpc-spec-v2/src/chain_head/tests.rs
@@ -16,13 +16,12 @@
 // You should have received a copy of the GNU General Public License
 // along with this program. If not, see <https://www.gnu.org/licenses/>.
 
+use super::*;
 use crate::{
 	chain_head::{api::ChainHeadApiClient, event::MethodResponse, test_utils::ChainHeadMockClient},
 	common::events::{StorageQuery, StorageQueryType, StorageResultType},
 	hex_string,
 };
-
-use super::*;
 use assert_matches::assert_matches;
 use codec::{Decode, Encode};
 use futures::Future;
@@ -32,7 +31,6 @@ use jsonrpsee::{
 	},
 	rpc_params, MethodsError as Error, RpcModule,
 };
-
 use sc_block_builder::BlockBuilderBuilder;
 use sc_client_api::ChildInfo;
 use sc_service::client::new_in_mem;
@@ -2550,7 +2548,7 @@ async fn follow_report_multiple_pruned_block() {
 async fn pin_block_references() {
 	// Manually construct an in-memory backend and client.
 	let backend = Arc::new(sc_client_api::in_mem::Backend::new());
-	let executor = substrate_test_runtime_client::new_native_or_wasm_executor();
+	let executor = substrate_test_runtime_client::WasmExecutor::default();
 	let client_config = sc_service::ClientConfig::default();
 
 	let genesis_block_builder = sc_service::GenesisBlockBuilder::new(
diff --git a/substrate/client/service/src/builder.rs b/substrate/client/service/src/builder.rs
index d0d7cba3862409c2df0d71ea9c6758dd83105340..06fc2ea3b3049492c3755603f661dc378797cc6e 100644
--- a/substrate/client/service/src/builder.rs
+++ b/substrate/client/service/src/builder.rs
@@ -37,8 +37,8 @@ use sc_client_api::{
 use sc_client_db::{Backend, DatabaseSettings};
 use sc_consensus::import_queue::ImportQueue;
 use sc_executor::{
-	sp_wasm_interface::HostFunctions, HeapAllocStrategy, NativeElseWasmExecutor,
-	NativeExecutionDispatch, RuntimeVersionOf, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY,
+	sp_wasm_interface::HostFunctions, HeapAllocStrategy, NativeExecutionDispatch, RuntimeVersionOf,
+	WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY,
 };
 use sc_keystore::LocalKeystore;
 use sc_network::{
@@ -262,11 +262,15 @@ where
 	Ok((client, backend, keystore_container, task_manager))
 }
 
-/// Creates a [`NativeElseWasmExecutor`] according to [`Configuration`].
+/// Creates a [`NativeElseWasmExecutor`](sc_executor::NativeElseWasmExecutor) according to
+/// [`Configuration`].
+#[deprecated(note = "Please switch to `new_wasm_executor`. Will be removed at end of 2024.")]
+#[allow(deprecated)]
 pub fn new_native_or_wasm_executor<D: NativeExecutionDispatch>(
 	config: &Configuration,
-) -> NativeElseWasmExecutor<D> {
-	NativeElseWasmExecutor::new_with_wasm_executor(new_wasm_executor(config))
+) -> sc_executor::NativeElseWasmExecutor<D> {
+	#[allow(deprecated)]
+	sc_executor::NativeElseWasmExecutor::new_with_wasm_executor(new_wasm_executor(config))
 }
 
 /// Creates a [`WasmExecutor`] according to [`Configuration`].
diff --git a/substrate/client/service/src/client/call_executor.rs b/substrate/client/service/src/client/call_executor.rs
index 86b5c7c61fcd2cbe062784fe53f8e9ba30adf6e0..9da4d2192576909f95428933623a1e3160e1f9ad 100644
--- a/substrate/client/service/src/client/call_executor.rs
+++ b/substrate/client/service/src/client/call_executor.rs
@@ -337,26 +337,17 @@ mod tests {
 	use super::*;
 	use backend::Backend;
 	use sc_client_api::in_mem;
-	use sc_executor::{NativeElseWasmExecutor, WasmExecutor};
+	use sc_executor::WasmExecutor;
 	use sp_core::{
 		testing::TaskExecutor,
 		traits::{FetchRuntimeCode, WrappedRuntimeCode},
 	};
 	use std::collections::HashMap;
-	use substrate_test_runtime_client::{runtime, GenesisInit, LocalExecutorDispatch};
-
-	fn executor() -> NativeElseWasmExecutor<LocalExecutorDispatch> {
-		NativeElseWasmExecutor::new_with_wasm_executor(
-			WasmExecutor::builder()
-				.with_max_runtime_instances(1)
-				.with_runtime_cache_size(2)
-				.build(),
-		)
-	}
+	use substrate_test_runtime_client::{runtime, GenesisInit};
 
 	#[test]
 	fn should_get_override_if_exists() {
-		let executor = executor();
+		let executor = WasmExecutor::default();
 
 		let overrides = crate::client::wasm_override::dummy_overrides();
 		let onchain_code = WrappedRuntimeCode(substrate_test_runtime::wasm_binary_unwrap().into());
@@ -425,7 +416,7 @@ mod tests {
 	fn returns_runtime_version_from_substitute() {
 		const SUBSTITUTE_SPEC_NAME: &str = "substitute-spec-name-cool";
 
-		let executor = executor();
+		let executor = WasmExecutor::default();
 
 		let backend = Arc::new(in_mem::Backend::<runtime::Block>::new());
 
diff --git a/substrate/client/service/src/client/wasm_override.rs b/substrate/client/service/src/client/wasm_override.rs
index 725c8ab9429aca18998c4e94c467ff5851348a7c..678ae22bec11117ddfbf1815422638625e602085 100644
--- a/substrate/client/service/src/client/wasm_override.rs
+++ b/substrate/client/service/src/client/wasm_override.rs
@@ -264,24 +264,21 @@ pub fn dummy_overrides() -> WasmOverride {
 #[cfg(test)]
 mod tests {
 	use super::*;
-	use sc_executor::{HeapAllocStrategy, NativeElseWasmExecutor, WasmExecutor};
+	use sc_executor::{HeapAllocStrategy, WasmExecutor};
 	use std::fs::{self, File};
-	use substrate_test_runtime_client::LocalExecutorDispatch;
-
-	fn executor() -> NativeElseWasmExecutor<substrate_test_runtime_client::LocalExecutorDispatch> {
-		NativeElseWasmExecutor::<substrate_test_runtime_client::LocalExecutorDispatch>::new_with_wasm_executor(
-			WasmExecutor::builder()
-				.with_onchain_heap_alloc_strategy(HeapAllocStrategy::Static {extra_pages: 128})
-				.with_offchain_heap_alloc_strategy(HeapAllocStrategy::Static {extra_pages: 128})
-				.with_max_runtime_instances(1)
-				.with_runtime_cache_size(2)
-				.build()
-		)
+
+	fn executor() -> WasmExecutor {
+		WasmExecutor::builder()
+			.with_onchain_heap_alloc_strategy(HeapAllocStrategy::Static { extra_pages: 128 })
+			.with_offchain_heap_alloc_strategy(HeapAllocStrategy::Static { extra_pages: 128 })
+			.with_max_runtime_instances(1)
+			.with_runtime_cache_size(2)
+			.build()
 	}
 
 	fn wasm_test<F>(fun: F)
 	where
-		F: Fn(&Path, &[u8], &NativeElseWasmExecutor<LocalExecutorDispatch>),
+		F: Fn(&Path, &[u8], &WasmExecutor),
 	{
 		let exec = executor();
 		let bytes = substrate_test_runtime::wasm_binary_unwrap();
diff --git a/substrate/client/service/src/lib.rs b/substrate/client/service/src/lib.rs
index e46cfab50a3ebdcb4e6eb8f746ec27751cd77847..d0f315c30c89c4db0da3d9d6b7a1c31591b07229 100644
--- a/substrate/client/service/src/lib.rs
+++ b/substrate/client/service/src/lib.rs
@@ -55,14 +55,15 @@ use sp_runtime::traits::{Block as BlockT, Header as HeaderT};
 pub use self::{
 	builder::{
 		build_network, new_client, new_db_backend, new_full_client, new_full_parts,
-		new_full_parts_record_import, new_full_parts_with_genesis_builder,
-		new_native_or_wasm_executor, new_wasm_executor, spawn_tasks, BuildNetworkParams,
-		KeystoreContainer, NetworkStarter, SpawnTasksParams, TFullBackend, TFullCallExecutor,
-		TFullClient,
+		new_full_parts_record_import, new_full_parts_with_genesis_builder, new_wasm_executor,
+		spawn_tasks, BuildNetworkParams, KeystoreContainer, NetworkStarter, SpawnTasksParams,
+		TFullBackend, TFullCallExecutor, TFullClient,
 	},
 	client::{ClientConfig, LocalCallExecutor},
 	error::Error,
 };
+#[allow(deprecated)]
+pub use builder::new_native_or_wasm_executor;
 
 pub use sc_chain_spec::{
 	construct_genesis_block, resolve_state_version_from_wasm, BuildGenesisBlock,
diff --git a/substrate/client/service/test/src/client/mod.rs b/substrate/client/service/test/src/client/mod.rs
index 51dcc4966e58838a4055f59ff033e16010c1d585..4fcb7c160cb420e00655716f551e37ca5864a6f5 100644
--- a/substrate/client/service/test/src/client/mod.rs
+++ b/substrate/client/service/test/src/client/mod.rs
@@ -28,6 +28,7 @@ use sc_client_db::{Backend, BlocksPruning, DatabaseSettings, DatabaseSource, Pru
 use sc_consensus::{
 	BlockCheckParams, BlockImport, BlockImportParams, ForkChoiceStrategy, ImportResult,
 };
+use sc_executor::WasmExecutor;
 use sc_service::client::{new_in_mem, Client, LocalCallExecutor};
 use sp_api::ProvideRuntimeApi;
 use sp_consensus::{BlockOrigin, Error as ConsensusError, SelectChain};
@@ -42,8 +43,6 @@ use sp_storage::{ChildInfo, StorageKey};
 use std::{collections::HashSet, sync::Arc};
 use substrate_test_runtime::TestAPI;
 use substrate_test_runtime_client::{
-	new_native_or_wasm_executor,
-	prelude::*,
 	runtime::{
 		currency::DOLLARS,
 		genesismap::{insert_genesis_block, GenesisStorageBuilder},
@@ -79,7 +78,7 @@ fn construct_block(
 	StateMachine::new(
 		backend,
 		&mut overlay,
-		&new_native_or_wasm_executor(),
+		&WasmExecutor::default(),
 		"Core_initialize_block",
 		&header.encode(),
 		&mut Default::default(),
@@ -93,7 +92,7 @@ fn construct_block(
 		StateMachine::new(
 			backend,
 			&mut overlay,
-			&new_native_or_wasm_executor(),
+			&WasmExecutor::default(),
 			"BlockBuilder_apply_extrinsic",
 			&tx.encode(),
 			&mut Default::default(),
@@ -107,7 +106,7 @@ fn construct_block(
 	let ret_data = StateMachine::new(
 		backend,
 		&mut overlay,
-		&new_native_or_wasm_executor(),
+		&WasmExecutor::default(),
 		"BlockBuilder_finalize_block",
 		&[],
 		&mut Default::default(),
@@ -175,7 +174,7 @@ fn construct_genesis_should_work_with_native() {
 	let _ = StateMachine::new(
 		&backend,
 		&mut overlay,
-		&new_native_or_wasm_executor(),
+		&WasmExecutor::default(),
 		"Core_execute_block",
 		&b1data,
 		&mut Default::default(),
@@ -206,7 +205,7 @@ fn construct_genesis_should_work_with_wasm() {
 	let _ = StateMachine::new(
 		&backend,
 		&mut overlay,
-		&new_native_or_wasm_executor(),
+		&WasmExecutor::default(),
 		"Core_execute_block",
 		&b1data,
 		&mut Default::default(),
@@ -2072,7 +2071,7 @@ fn cleans_up_closed_notification_sinks_on_block_import() {
 	use substrate_test_runtime_client::GenesisInit;
 
 	let backend = Arc::new(sc_client_api::in_mem::Backend::new());
-	let executor = new_native_or_wasm_executor();
+	let executor = WasmExecutor::default();
 	let client_config = sc_service::ClientConfig::default();
 
 	let genesis_block_builder = sc_service::GenesisBlockBuilder::new(
@@ -2099,11 +2098,7 @@ fn cleans_up_closed_notification_sinks_on_block_import() {
 
 	type TestClient = Client<
 		in_mem::Backend<Block>,
-		LocalCallExecutor<
-			Block,
-			in_mem::Backend<Block>,
-			sc_executor::NativeElseWasmExecutor<LocalExecutorDispatch>,
-		>,
+		LocalCallExecutor<Block, in_mem::Backend<Block>, WasmExecutor>,
 		Block,
 		RuntimeApi,
 	>;
diff --git a/substrate/frame/system/src/tests.rs b/substrate/frame/system/src/tests.rs
index b889b5ca046efe557e7706870c11febce8a358b2..22b98014db4edf687aea7213c961082a85ebbbe8 100644
--- a/substrate/frame/system/src/tests.rs
+++ b/substrate/frame/system/src/tests.rs
@@ -21,14 +21,14 @@ use frame_support::{
 	dispatch::{Pays, PostDispatchInfo, WithPostDispatchInfo},
 	traits::{OnRuntimeUpgrade, WhitelistedStorageKeys},
 };
-use std::collections::BTreeSet;
-
 use mock::{RuntimeOrigin, *};
 use sp_core::{hexdisplay::HexDisplay, H256};
 use sp_runtime::{
 	traits::{BlakeTwo256, Header},
 	DispatchError, DispatchErrorWithPostInfo,
 };
+use std::collections::BTreeSet;
+use substrate_test_runtime_client::WasmExecutor;
 
 #[test]
 fn check_whitelist() {
@@ -653,7 +653,7 @@ fn assert_runtime_updated_digest(num: usize) {
 
 #[test]
 fn set_code_with_real_wasm_blob() {
-	let executor = substrate_test_runtime_client::new_native_or_wasm_executor();
+	let executor = WasmExecutor::default();
 	let mut ext = new_test_ext();
 	ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor));
 	ext.execute_with(|| {
@@ -679,7 +679,7 @@ fn set_code_with_real_wasm_blob() {
 fn set_code_rejects_during_mbm() {
 	Ongoing::set(true);
 
-	let executor = substrate_test_runtime_client::new_native_or_wasm_executor();
+	let executor = substrate_test_runtime_client::WasmExecutor::default();
 	let mut ext = new_test_ext();
 	ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor));
 	ext.execute_with(|| {
@@ -699,7 +699,7 @@ fn set_code_rejects_during_mbm() {
 
 #[test]
 fn set_code_via_authorization_works() {
-	let executor = substrate_test_runtime_client::new_native_or_wasm_executor();
+	let executor = substrate_test_runtime_client::WasmExecutor::default();
 	let mut ext = new_test_ext();
 	ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor));
 	ext.execute_with(|| {
@@ -739,7 +739,7 @@ fn set_code_via_authorization_works() {
 
 #[test]
 fn runtime_upgraded_with_set_storage() {
-	let executor = substrate_test_runtime_client::new_native_or_wasm_executor();
+	let executor = substrate_test_runtime_client::WasmExecutor::default();
 	let mut ext = new_test_ext();
 	ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor));
 	ext.execute_with(|| {
diff --git a/substrate/primitives/api/test/tests/runtime_calls.rs b/substrate/primitives/api/test/tests/runtime_calls.rs
index e66be7f9bf1a4b8ecb6619fe74035278e54ba7dc..5a524d1c7f4d3c6e31b2fee19e2af57e1c6365f8 100644
--- a/substrate/primitives/api/test/tests/runtime_calls.rs
+++ b/substrate/primitives/api/test/tests/runtime_calls.rs
@@ -122,9 +122,7 @@ fn record_proof_works() {
 
 	// Use the proof backend to execute `execute_block`.
 	let mut overlay = Default::default();
-	let executor = NativeElseWasmExecutor::<LocalExecutorDispatch>::new_with_wasm_executor(
-		WasmExecutor::builder().build(),
-	);
+	let executor: WasmExecutor = WasmExecutor::builder().build();
 	execution_proof_check_on_trie_backend(
 		&backend,
 		&mut overlay,
diff --git a/substrate/test-utils/client/src/lib.rs b/substrate/test-utils/client/src/lib.rs
index d283b24f286aed743ba613f095f2cd319caba263..c07640653d560b54658ced8dc466398b6f291f77 100644
--- a/substrate/test-utils/client/src/lib.rs
+++ b/substrate/test-utils/client/src/lib.rs
@@ -24,7 +24,7 @@ pub mod client_ext;
 pub use self::client_ext::{BlockOrigin, ClientBlockImportExt, ClientExt};
 pub use sc_client_api::{execution_extensions::ExecutionExtensions, BadBlocks, ForkBlocks};
 pub use sc_client_db::{self, Backend, BlocksPruning};
-pub use sc_executor::{self, NativeElseWasmExecutor, WasmExecutionMethod, WasmExecutor};
+pub use sc_executor::{self, WasmExecutionMethod, WasmExecutor};
 pub use sc_service::{client, RpcHandlers};
 pub use sp_consensus;
 pub use sp_keyring::{
@@ -245,14 +245,8 @@ impl<Block: BlockT, ExecutorDispatch, Backend, G: GenesisInit>
 	}
 }
 
-impl<Block: BlockT, D, Backend, G: GenesisInit>
-	TestClientBuilder<
-		Block,
-		client::LocalCallExecutor<Block, Backend, NativeElseWasmExecutor<D>>,
-		Backend,
-		G,
-	> where
-	D: sc_executor::NativeExecutionDispatch,
+impl<Block: BlockT, H, Backend, G: GenesisInit>
+	TestClientBuilder<Block, client::LocalCallExecutor<Block, Backend, WasmExecutor<H>>, Backend, G>
 {
 	/// Build the test client with the given native executor.
 	pub fn build_with_native_executor<RuntimeApi, I>(
@@ -261,21 +255,18 @@ impl<Block: BlockT, D, Backend, G: GenesisInit>
 	) -> (
 		client::Client<
 			Backend,
-			client::LocalCallExecutor<Block, Backend, NativeElseWasmExecutor<D>>,
+			client::LocalCallExecutor<Block, Backend, WasmExecutor<H>>,
 			Block,
 			RuntimeApi,
 		>,
 		sc_consensus::LongestChain<Backend, Block>,
 	)
 	where
-		I: Into<Option<NativeElseWasmExecutor<D>>>,
-		D: sc_executor::NativeExecutionDispatch + 'static,
+		I: Into<Option<WasmExecutor<H>>>,
 		Backend: sc_client_api::backend::Backend<Block> + 'static,
+		H: sc_executor::HostFunctions,
 	{
-		let mut executor = executor.into().unwrap_or_else(|| {
-			NativeElseWasmExecutor::new_with_wasm_executor(WasmExecutor::builder().build())
-		});
-		executor.disable_use_native();
+		let executor = executor.into().unwrap_or_else(|| WasmExecutor::<H>::builder().build());
 		let executor = LocalCallExecutor::new(
 			self.backend.clone(),
 			executor.clone(),
diff --git a/substrate/test-utils/runtime/client/src/lib.rs b/substrate/test-utils/runtime/client/src/lib.rs
index 7428a7de3a096f343d28b39b618f353578649c74..435f3f5ebacb245ded18b6c258220744619e6d94 100644
--- a/substrate/test-utils/runtime/client/src/lib.rs
+++ b/substrate/test-utils/runtime/client/src/lib.rs
@@ -42,38 +42,18 @@ pub mod prelude {
 	};
 	// Client structs
 	pub use super::{
-		Backend, ExecutorDispatch, LocalExecutorDispatch, NativeElseWasmExecutor, TestClient,
-		TestClientBuilder, WasmExecutionMethod,
+		Backend, ExecutorDispatch, TestClient, TestClientBuilder, WasmExecutionMethod,
 	};
 	// Keyring
 	pub use super::{AccountKeyring, Sr25519Keyring};
 }
 
-/// A unit struct which implements `NativeExecutionDispatch` feeding in the
-/// hard-coded runtime.
-pub struct LocalExecutorDispatch;
-
-impl sc_executor::NativeExecutionDispatch for LocalExecutorDispatch {
-	type ExtendHostFunctions = ();
-
-	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-		substrate_test_runtime::api::dispatch(method, data)
-	}
-
-	fn native_version() -> sc_executor::NativeVersion {
-		substrate_test_runtime::native_version()
-	}
-}
-
 /// Test client database backend.
 pub type Backend = substrate_test_client::Backend<substrate_test_runtime::Block>;
 
 /// Test client executor.
-pub type ExecutorDispatch = client::LocalCallExecutor<
-	substrate_test_runtime::Block,
-	Backend,
-	NativeElseWasmExecutor<LocalExecutorDispatch>,
->;
+pub type ExecutorDispatch =
+	client::LocalCallExecutor<substrate_test_runtime::Block, Backend, WasmExecutor>;
 
 /// Parameters of test-client builder with test-runtime.
 #[derive(Default)]
@@ -113,14 +93,10 @@ pub type TestClientBuilder<E, B> = substrate_test_client::TestClientBuilder<
 	GenesisParameters,
 >;
 
-/// Test client type with `LocalExecutorDispatch` and generic Backend.
+/// Test client type with `WasmExecutor` and generic Backend.
 pub type Client<B> = client::Client<
 	B,
-	client::LocalCallExecutor<
-		substrate_test_runtime::Block,
-		B,
-		NativeElseWasmExecutor<LocalExecutorDispatch>,
-	>,
+	client::LocalCallExecutor<substrate_test_runtime::Block, B, WasmExecutor>,
 	substrate_test_runtime::Block,
 	substrate_test_runtime::RuntimeApi,
 >;
@@ -206,14 +182,8 @@ pub trait TestClientBuilderExt<B>: Sized {
 }
 
 impl<B> TestClientBuilderExt<B>
-	for TestClientBuilder<
-		client::LocalCallExecutor<
-			substrate_test_runtime::Block,
-			B,
-			NativeElseWasmExecutor<LocalExecutorDispatch>,
-		>,
-		B,
-	> where
+	for TestClientBuilder<client::LocalCallExecutor<substrate_test_runtime::Block, B, WasmExecutor>, B>
+where
 	B: sc_client_api::backend::Backend<substrate_test_runtime::Block> + 'static,
 {
 	fn genesis_init_mut(&mut self) -> &mut GenesisParameters {
@@ -238,6 +208,7 @@ pub fn new() -> Client<Backend> {
 }
 
 /// Create a new native executor.
-pub fn new_native_or_wasm_executor() -> NativeElseWasmExecutor<LocalExecutorDispatch> {
-	NativeElseWasmExecutor::new_with_wasm_executor(WasmExecutor::builder().build())
+#[deprecated(note = "Switch to `WasmExecutor:default()`.")]
+pub fn new_native_or_wasm_executor() -> WasmExecutor {
+	WasmExecutor::default()
 }