diff --git a/cumulus/Cargo.lock b/cumulus/Cargo.lock
index c9612a5a28e16142dfe8731b7b74ef6666c05177..ae709690b2578e3fce310c0cf670097bdc2d97d4 100644
--- a/cumulus/Cargo.lock
+++ b/cumulus/Cargo.lock
@@ -6815,6 +6815,7 @@ dependencies = [
  "pallet-transaction-payment-rpc-runtime-api",
  "pallet-xcm",
  "parachain-info",
+ "parachains-common",
  "parity-scale-codec",
  "polkadot-parachain 0.9.27",
  "polkadot-primitives",
@@ -7093,6 +7094,7 @@ dependencies = [
  "polkadot-primitives",
  "polkadot-runtime",
  "polkadot-runtime-common",
+ "rococo-runtime",
  "sc-client-api",
  "sc-consensus",
  "sc-executor",
@@ -7770,6 +7772,7 @@ dependencies = [
  "sp-keystore",
  "sp-offchain",
  "sp-runtime",
+ "sp-serializer",
  "sp-session",
  "sp-timestamp",
  "sp-transaction-pool",
@@ -8118,6 +8121,7 @@ dependencies = [
  "polkadot-runtime-parachains",
  "polkadot-statement-distribution",
  "rococo-runtime",
+ "rococo-runtime-constants",
  "sc-authority-discovery",
  "sc-basic-authorship",
  "sc-block-builder",
@@ -10402,6 +10406,7 @@ dependencies = [
  "pallet-balances",
  "pallet-sudo",
  "parachain-info",
+ "parachains-common",
  "parity-scale-codec",
  "scale-info",
  "serde",
@@ -10609,6 +10614,7 @@ dependencies = [
  "frame-try-runtime",
  "log",
  "parachain-info",
+ "parachains-common",
  "parity-scale-codec",
  "scale-info",
  "serde",
diff --git a/cumulus/parachain-template/node/src/chain_spec.rs b/cumulus/parachain-template/node/src/chain_spec.rs
index afb760685c62c30b1943202ecdcafd35ea8ee36a..b6d018602df149310d6f8104ee37b8b12d11fc53 100644
--- a/cumulus/parachain-template/node/src/chain_spec.rs
+++ b/cumulus/parachain-template/node/src/chain_spec.rs
@@ -14,7 +14,7 @@ pub type ChainSpec =
 const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION;
 
 /// Helper function to generate a crypto pair from seed
-pub fn get_public_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
+pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
 	TPublic::Pair::from_string(&format!("//{}", seed), None)
 		.expect("static values are valid; qed")
 		.public()
@@ -43,7 +43,7 @@ type AccountPublic = <Signature as Verify>::Signer;
 ///
 /// This function's return type must always match the session keys of the chain in tuple format.
 pub fn get_collator_keys_from_seed(seed: &str) -> AuraId {
-	get_public_from_seed::<AuraId>(seed)
+	get_from_seed::<AuraId>(seed)
 }
 
 /// Helper function to generate an account ID from seed
@@ -51,7 +51,7 @@ pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId
 where
 	AccountPublic: From<<TPublic::Pair as Pair>::Public>,
 {
-	AccountPublic::from(get_public_from_seed::<TPublic>(seed)).into_account()
+	AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()
 }
 
 /// Generate the session keys from individual elements.
diff --git a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml
index 159211cf3b22c169287ee626b62da1cac9fb4b5e..693ed3f84bd3e6ab0106a42b9376baf501a04dfc 100644
--- a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml
+++ b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml
@@ -32,6 +32,7 @@ sp-version = { git = "https://github.com/paritytech/substrate", default-features
 cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false }
 cumulus-pallet-solo-to-para = { path = "../../../../pallets/solo-to-para", default-features = false }
 parachain-info = { path = "../../../pallets/parachain-info", default-features = false }
+parachains-common = { path = "../../../common", default-features = false }
 cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false }
 
 [build-dependencies]
diff --git a/cumulus/parachains/runtimes/starters/seedling/src/lib.rs b/cumulus/parachains/runtimes/starters/seedling/src/lib.rs
index 850f6bab34cf370a85c6181f717175cdfa4eeec7..3ba5fb8f7563b8214a7422493a500a6bdf73e42a 100644
--- a/cumulus/parachains/runtimes/starters/seedling/src/lib.rs
+++ b/cumulus/parachains/runtimes/starters/seedling/src/lib.rs
@@ -52,6 +52,7 @@ pub use frame_support::{
 	StorageValue,
 };
 use frame_system::limits::{BlockLength, BlockWeights};
+use parachains_common::{AccountId, Signature};
 #[cfg(any(feature = "std", test))]
 pub use sp_runtime::BuildStorage;
 pub use sp_runtime::{Perbill, Permill};
@@ -189,11 +190,6 @@ construct_runtime! {
 	}
 }
 
-/// Alias to 512-bit hash when used in the context of a transaction signature on the chain.
-pub type Signature = sp_runtime::MultiSignature;
-/// Some way of identifying an account on the chain. We intentionally make it equivalent
-/// to the public key of our transaction signing scheme.
-pub type AccountId = <<Signature as sp_runtime::traits::Verify>::Signer as sp_runtime::traits::IdentifyAccount>::AccountId;
 /// Index of a transaction in the chain.
 pub type Index = u32;
 /// A hash of some data used by the chain.
diff --git a/cumulus/parachains/runtimes/starters/shell/Cargo.toml b/cumulus/parachains/runtimes/starters/shell/Cargo.toml
index 8210d567b21a0c11c853b4f5b008e221de6d545f..a270d188480acaca82a2543c9f0a1e4a367a01f4 100644
--- a/cumulus/parachains/runtimes/starters/shell/Cargo.toml
+++ b/cumulus/parachains/runtimes/starters/shell/Cargo.toml
@@ -39,6 +39,7 @@ cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = fals
 cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false }
 cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false }
 parachain-info = { path = "../../../pallets/parachain-info", default-features = false }
+parachains-common = { path = "../../../common", default-features = false }
 
 [build-dependencies]
 substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" }
diff --git a/cumulus/parachains/runtimes/starters/shell/src/lib.rs b/cumulus/parachains/runtimes/starters/shell/src/lib.rs
index d08cebe47e0790ab558ffcc936e26a13f921eef4..05570ed83d01f17093dd1735dd7ac958d172234b 100644
--- a/cumulus/parachains/runtimes/starters/shell/src/lib.rs
+++ b/cumulus/parachains/runtimes/starters/shell/src/lib.rs
@@ -59,6 +59,7 @@ pub use frame_support::{
 	StorageValue,
 };
 use frame_system::limits::{BlockLength, BlockWeights};
+use parachains_common::{AccountId, Signature};
 #[cfg(any(feature = "std", test))]
 pub use sp_runtime::BuildStorage;
 pub use sp_runtime::{Perbill, Permill};
@@ -228,11 +229,6 @@ impl sp_runtime::traits::SignedExtension for DisallowSigned {
 	}
 }
 
-/// Alias to 512-bit hash when used in the context of a transaction signature on the chain.
-pub type Signature = sp_runtime::MultiSignature;
-/// Some way of identifying an account on the chain. We intentionally make it equivalent
-/// to the public key of our transaction signing scheme.
-pub type AccountId = <<Signature as sp_runtime::traits::Verify>::Signer as sp_runtime::traits::IdentifyAccount>::AccountId;
 /// Index of a transaction in the chain.
 pub type Index = u32;
 /// A hash of some data used by the chain.
diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml
index 81d582a4a2448425f1389f4a69470aa8c4e43b14..f8be17e3ec124cd113eb332726adfa467a9dab1c 100644
--- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml
+++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml
@@ -74,6 +74,7 @@ cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", defa
 cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false }
 pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false }
 parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false }
+parachains-common = { path = "../../../common", default-features = false }
 
 [features]
 default = [
diff --git a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs
index faf12f783f3f2c67d1329ada248326d589f80b47..ff46487bb10eb921c821231d95c61447180800f8 100644
--- a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs
+++ b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs
@@ -50,9 +50,9 @@ pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;
 use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
 use sp_runtime::{
 	create_runtime_str, generic, impl_opaque_keys,
-	traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, IdentifyAccount, Verify},
+	traits::{AccountIdLookup, BlakeTwo256, Block as BlockT},
 	transaction_validity::{TransactionSource, TransactionValidity},
-	ApplyExtrinsicResult, MultiSignature,
+	ApplyExtrinsicResult,
 };
 pub use sp_runtime::{traits::ConvertInto, MultiAddress, Perbill, Permill};
 use sp_std::prelude::*;
@@ -70,16 +70,10 @@ use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate};
 use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight};
 
 // XCM Imports
+use parachains_common::{AccountId, Signature};
 use xcm::latest::prelude::BodyId;
 use xcm_executor::XcmExecutor;
 
-/// Alias to 512-bit hash when used in the context of a transaction signature on the chain.
-pub type Signature = MultiSignature;
-
-/// Some way of identifying an account on the chain. We intentionally make it equivalent
-/// to the public key of our transaction signing scheme.
-pub type AccountId = <<Signature as Verify>::Signer as IdentifyAccount>::AccountId;
-
 /// Balance of an account.
 pub type Balance = u128;
 
diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs
index 98f53af1968d046e3abfe0d235972628501ce75e..1c6003afb70bd27778d8e64417a1428a9454a356 100644
--- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs
+++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs
@@ -59,7 +59,7 @@ pub use sp_runtime::{Perbill, Permill};
 
 use parachains_common::{
 	impls::{AssetsFrom, NonZeroIssuance},
-	AssetId,
+	AccountId, AssetId, Signature,
 };
 use xcm_builder::{
 	AllowKnownQueryResponses, AllowSubscriptionsFrom, AsPrefixedGeneralIndex,
@@ -543,11 +543,6 @@ construct_runtime! {
 	}
 }
 
-/// Alias to 512-bit hash when used in the context of a transaction signature on the chain.
-pub type Signature = sp_runtime::MultiSignature;
-/// Some way of identifying an account on the chain. We intentionally make it equivalent
-/// to the public key of our transaction signing scheme.
-pub type AccountId = <<Signature as sp_runtime::traits::Verify>::Signer as sp_runtime::traits::IdentifyAccount>::AccountId;
 /// Balance of an account.
 pub type Balance = u128;
 /// Index of a transaction in the chain.
diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml
index 1da3c16d3e2e72cc4e50fbb1c9ebf5f8322cb1a6..208c92abb5cb9b29cbfbab409dfc804de7497007 100644
--- a/cumulus/polkadot-parachain/Cargo.toml
+++ b/cumulus/polkadot-parachain/Cargo.toml
@@ -59,6 +59,7 @@ sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "maste
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-sysinfo = { git = "https://github.com/paritytech/substrate", branch = "master" }
+sp-serializer = { git = "https://github.com/paritytech/substrate", branch = "master" }
 substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" }
 try-runtime-cli = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
@@ -95,6 +96,8 @@ nix = "0.24"
 tempfile = "3.3.0"
 tokio = { version = "1.19.2", features = ["macros", "time", "parking_lot"] }
 wait-timeout = "0.2"
+# purge_chain_works works with rococo-local and needs to allow this
+polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master", features = ["rococo-native"] }
 
 [features]
 default = []
diff --git a/cumulus/polkadot-parachain/src/chain_spec/collectives.rs b/cumulus/polkadot-parachain/src/chain_spec/collectives.rs
index f5737faf34a7359a6d5439b3c7301fd0d4f2b883..fcbc341d1d57f71645cac51ad36d917a3ea11add 100644
--- a/cumulus/polkadot-parachain/src/chain_spec/collectives.rs
+++ b/cumulus/polkadot-parachain/src/chain_spec/collectives.rs
@@ -18,8 +18,7 @@ use crate::chain_spec::{
 	get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION,
 };
 use cumulus_primitives_core::ParaId;
-use parachains_common::Balance as CollectivesBalance;
-use rococo_parachain_runtime::{AccountId, AuraId};
+use parachains_common::{AccountId, AuraId, Balance as CollectivesBalance};
 use sc_service::ChainType;
 use sp_core::sr25519;
 
diff --git a/cumulus/polkadot-parachain/src/chain_spec/contracts.rs b/cumulus/polkadot-parachain/src/chain_spec/contracts.rs
index de426363824e9c4a0c53e39784a289bd3e7f3aef..d7d2e9ea9993858caa922dc8586e74a352d7ba47 100644
--- a/cumulus/polkadot-parachain/src/chain_spec/contracts.rs
+++ b/cumulus/polkadot-parachain/src/chain_spec/contracts.rs
@@ -19,7 +19,7 @@ use crate::chain_spec::{
 };
 use cumulus_primitives_core::ParaId;
 use hex_literal::hex;
-use rococo_parachain_runtime::{AccountId, AuraId};
+use parachains_common::{AccountId, AuraId};
 use sc_service::ChainType;
 use sp_core::{crypto::UncheckedInto, sr25519};
 
diff --git a/cumulus/polkadot-parachain/src/chain_spec/mod.rs b/cumulus/polkadot-parachain/src/chain_spec/mod.rs
index 4566861a64d3caad913e31662674ad156363314b..30cff43b57c2b019549d1be6059b5eac94e8fb36 100644
--- a/cumulus/polkadot-parachain/src/chain_spec/mod.rs
+++ b/cumulus/polkadot-parachain/src/chain_spec/mod.rs
@@ -14,37 +14,24 @@
 // You should have received a copy of the GNU General Public License
 // along with Cumulus.  If not, see <http://www.gnu.org/licenses/>.
 
-use cumulus_primitives_core::ParaId;
-use hex_literal::hex;
-use rococo_parachain_runtime::{AccountId, AuraId, Signature};
+use parachains_common::{AccountId, Signature};
 use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};
-use sc_service::ChainType;
 use serde::{Deserialize, Serialize};
-use sp_core::{crypto::UncheckedInto, sr25519, Pair, Public};
+use sp_core::{Pair, Public};
 use sp_runtime::traits::{IdentifyAccount, Verify};
 
 pub mod collectives;
 pub mod contracts;
 pub mod penpal;
+pub mod rococo_parachain;
 pub mod seedling;
 pub mod shell;
 pub mod statemint;
 
-/// Specialized `ChainSpec` for the normal parachain runtime.
-pub type ChainSpec =
-	sc_service::GenericChainSpec<rococo_parachain_runtime::GenesisConfig, Extensions>;
-
 /// The default XCM version to set in genesis config.
 const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION;
 
-/// Helper function to generate a crypto pair from seed
-pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
-	TPublic::Pair::from_string(&format!("//{}", seed), None)
-		.expect("static values are valid; qed")
-		.public()
-}
-
-/// The extensions for the [`ChainSpec`].
+/// Generic extensions for Parachain ChainSpecs.
 #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]
 #[serde(deny_unknown_fields)]
 pub struct Extensions {
@@ -61,6 +48,13 @@ impl Extensions {
 	}
 }
 
+/// Helper function to generate a crypto pair from seed
+pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
+	TPublic::Pair::from_string(&format!("//{}", seed), None)
+		.expect("static values are valid; qed")
+		.public()
+}
+
 type AccountPublic = <Signature as Verify>::Signer;
 
 /// Helper function to generate an account ID from seed
@@ -71,108 +65,9 @@ where
 	AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()
 }
 
-pub fn get_chain_spec() -> ChainSpec {
-	ChainSpec::from_genesis(
-		"Local Testnet",
-		"local_testnet",
-		ChainType::Local,
-		move || {
-			testnet_genesis(
-				get_account_id_from_seed::<sr25519::Public>("Alice"),
-				vec![get_from_seed::<AuraId>("Alice"), get_from_seed::<AuraId>("Bob")],
-				vec![
-					get_account_id_from_seed::<sr25519::Public>("Alice"),
-					get_account_id_from_seed::<sr25519::Public>("Bob"),
-					get_account_id_from_seed::<sr25519::Public>("Charlie"),
-					get_account_id_from_seed::<sr25519::Public>("Dave"),
-					get_account_id_from_seed::<sr25519::Public>("Eve"),
-					get_account_id_from_seed::<sr25519::Public>("Ferdie"),
-					get_account_id_from_seed::<sr25519::Public>("Alice//stash"),
-					get_account_id_from_seed::<sr25519::Public>("Bob//stash"),
-					get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),
-					get_account_id_from_seed::<sr25519::Public>("Dave//stash"),
-					get_account_id_from_seed::<sr25519::Public>("Eve//stash"),
-					get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),
-				],
-				1000.into(),
-			)
-		},
-		Vec::new(),
-		None,
-		None,
-		None,
-		None,
-		Extensions { relay_chain: "westend".into(), para_id: 1000 },
-	)
-}
-
-pub fn staging_test_net() -> ChainSpec {
-	ChainSpec::from_genesis(
-		"Staging Testnet",
-		"staging_testnet",
-		ChainType::Live,
-		move || {
-			testnet_genesis(
-				hex!["9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00"].into(),
-				vec![
-					// $secret//one
-					hex!["aad9fa2249f87a210a0f93400b7f90e47b810c6d65caa0ca3f5af982904c2a33"]
-						.unchecked_into(),
-					// $secret//two
-					hex!["d47753f0cca9dd8da00c70e82ec4fc5501a69c49a5952a643d18802837c88212"]
-						.unchecked_into(),
-				],
-				vec![
-					hex!["9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00"].into()
-				],
-				1000.into(),
-			)
-		},
-		Vec::new(),
-		None,
-		None,
-		None,
-		None,
-		Extensions { relay_chain: "westend".into(), para_id: 1000 },
-	)
-}
-
-fn testnet_genesis(
-	root_key: AccountId,
-	initial_authorities: Vec<AuraId>,
-	endowed_accounts: Vec<AccountId>,
-	id: ParaId,
-) -> rococo_parachain_runtime::GenesisConfig {
-	rococo_parachain_runtime::GenesisConfig {
-		system: rococo_parachain_runtime::SystemConfig {
-			code: rococo_parachain_runtime::WASM_BINARY
-				.expect("WASM binary was not build, please build it!")
-				.to_vec(),
-		},
-		balances: rococo_parachain_runtime::BalancesConfig {
-			balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(),
-		},
-		sudo: rococo_parachain_runtime::SudoConfig { key: Some(root_key) },
-		parachain_info: rococo_parachain_runtime::ParachainInfoConfig { parachain_id: id },
-		aura: rococo_parachain_runtime::AuraConfig { authorities: initial_authorities },
-		aura_ext: Default::default(),
-		parachain_system: Default::default(),
-		polkadot_xcm: rococo_parachain_runtime::PolkadotXcmConfig {
-			safe_xcm_version: Some(SAFE_XCM_VERSION),
-		},
-	}
-}
-
-/// Helper function to generate a crypto pair from seed
-pub fn get_public_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
-	TPublic::Pair::from_string(&format!("//{}", seed), None)
-		.expect("static values are valid; qed")
-		.public()
-}
-
 /// Generate collator keys from seed.
 ///
 /// This function's return type must always match the session keys of the chain in tuple format.
 pub fn get_collator_keys_from_seed<AuraId: Public>(seed: &str) -> <AuraId::Pair as Pair>::Public {
-	get_public_from_seed::<AuraId>(seed)
+	get_from_seed::<AuraId>(seed)
 }
diff --git a/cumulus/polkadot-parachain/src/chain_spec/penpal.rs b/cumulus/polkadot-parachain/src/chain_spec/penpal.rs
index fb127e5168e523dc5ea0640f61e6b3cef5e42d81..bb40bbbf3764aeb43a3ff3e0c5d831e6aa3adfab 100644
--- a/cumulus/polkadot-parachain/src/chain_spec/penpal.rs
+++ b/cumulus/polkadot-parachain/src/chain_spec/penpal.rs
@@ -14,10 +14,11 @@
 // You should have received a copy of the GNU General Public License
 // along with Cumulus.  If not, see <http://www.gnu.org/licenses/>.
 
-use crate::chain_spec::{get_account_id_from_seed, Extensions};
+use crate::chain_spec::{
+	get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION,
+};
 use cumulus_primitives_core::ParaId;
-// use rococo_parachain_runtime::{AuraId};
-use crate::chain_spec::{get_collator_keys_from_seed, SAFE_XCM_VERSION};
+use parachains_common::{AccountId, AuraId};
 use sc_service::ChainType;
 use sp_core::sr25519;
 /// Specialized `ChainSpec` for the normal parachain runtime.
@@ -42,11 +43,11 @@ pub fn get_penpal_chain_spec(id: ParaId, relay_chain: &str) -> PenpalChainSpec {
 				vec![
 					(
 						get_account_id_from_seed::<sr25519::Public>("Alice"),
-						get_collator_keys_from_seed::<penpal_runtime::AuraId>("Alice"),
+						get_collator_keys_from_seed::<AuraId>("Alice"),
 					),
 					(
 						get_account_id_from_seed::<sr25519::Public>("Bob"),
-						get_collator_keys_from_seed::<penpal_runtime::AuraId>("Bob"),
+						get_collator_keys_from_seed::<AuraId>("Bob"),
 					),
 				],
 				vec![
@@ -79,8 +80,8 @@ pub fn get_penpal_chain_spec(id: ParaId, relay_chain: &str) -> PenpalChainSpec {
 }
 
 fn penpal_testnet_genesis(
-	invulnerables: Vec<(penpal_runtime::AccountId, penpal_runtime::AuraId)>,
-	endowed_accounts: Vec<penpal_runtime::AccountId>,
+	invulnerables: Vec<(AccountId, AuraId)>,
+	endowed_accounts: Vec<AccountId>,
 	id: ParaId,
 ) -> penpal_runtime::GenesisConfig {
 	penpal_runtime::GenesisConfig {
@@ -131,6 +132,6 @@ fn penpal_testnet_genesis(
 /// Generate the session keys from individual elements.
 ///
 /// The input must be a tuple of individual keys (a single arg for now since we have just one key).
-pub fn penpal_session_keys(keys: penpal_runtime::AuraId) -> penpal_runtime::SessionKeys {
+pub fn penpal_session_keys(keys: AuraId) -> penpal_runtime::SessionKeys {
 	penpal_runtime::SessionKeys { aura: keys }
 }
diff --git a/cumulus/polkadot-parachain/src/chain_spec/rococo_parachain.rs b/cumulus/polkadot-parachain/src/chain_spec/rococo_parachain.rs
new file mode 100644
index 0000000000000000000000000000000000000000..7aa0aeaac3ec1efaeee91f51a948d0797634936b
--- /dev/null
+++ b/cumulus/polkadot-parachain/src/chain_spec/rococo_parachain.rs
@@ -0,0 +1,121 @@
+// Copyright 2022 Parity Technologies (UK) Ltd.
+// This file is part of Cumulus.
+
+// Cumulus is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Cumulus is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Cumulus.  If not, see <http://www.gnu.org/licenses/>.
+
+//! ChainSpecs dedicated to Rococo parachain setups (for testing and example purposes)
+
+use crate::chain_spec::{get_from_seed, Extensions, SAFE_XCM_VERSION};
+use cumulus_primitives_core::ParaId;
+use hex_literal::hex;
+use parachains_common::AccountId;
+use polkadot_service::chain_spec::get_account_id_from_seed;
+use rococo_parachain_runtime::AuraId;
+use sc_chain_spec::ChainType;
+use sp_core::{crypto::UncheckedInto, sr25519};
+
+pub type RococoParachainChainSpec =
+	sc_service::GenericChainSpec<rococo_parachain_runtime::GenesisConfig, Extensions>;
+
+pub fn rococo_parachain_local_config() -> RococoParachainChainSpec {
+	RococoParachainChainSpec::from_genesis(
+		"Rococo Parachain Local",
+		"local_testnet",
+		ChainType::Local,
+		move || {
+			testnet_genesis(
+				get_account_id_from_seed::<sr25519::Public>("Alice"),
+				vec![get_from_seed::<AuraId>("Alice"), get_from_seed::<AuraId>("Bob")],
+				vec![
+					get_account_id_from_seed::<sr25519::Public>("Alice"),
+					get_account_id_from_seed::<sr25519::Public>("Bob"),
+					get_account_id_from_seed::<sr25519::Public>("Charlie"),
+					get_account_id_from_seed::<sr25519::Public>("Dave"),
+					get_account_id_from_seed::<sr25519::Public>("Eve"),
+					get_account_id_from_seed::<sr25519::Public>("Ferdie"),
+					get_account_id_from_seed::<sr25519::Public>("Alice//stash"),
+					get_account_id_from_seed::<sr25519::Public>("Bob//stash"),
+					get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),
+					get_account_id_from_seed::<sr25519::Public>("Dave//stash"),
+					get_account_id_from_seed::<sr25519::Public>("Eve//stash"),
+					get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),
+				],
+				1000.into(),
+			)
+		},
+		Vec::new(),
+		None,
+		None,
+		None,
+		None,
+		Extensions { relay_chain: "rococo-local".into(), para_id: 1000 },
+	)
+}
+
+pub fn staging_rococo_parachain_local_config() -> RococoParachainChainSpec {
+	RococoParachainChainSpec::from_genesis(
+		"Staging Rococo Parachain Local",
+		"staging_testnet",
+		ChainType::Live,
+		move || {
+			testnet_genesis(
+				hex!["9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00"].into(),
+				vec![
+					// $secret//one
+					hex!["aad9fa2249f87a210a0f93400b7f90e47b810c6d65caa0ca3f5af982904c2a33"]
+						.unchecked_into(),
+					// $secret//two
+					hex!["d47753f0cca9dd8da00c70e82ec4fc5501a69c49a5952a643d18802837c88212"]
+						.unchecked_into(),
+				],
+				vec![
+					hex!["9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00"].into()
+				],
+				1000.into(),
+			)
+		},
+		Vec::new(),
+		None,
+		None,
+		None,
+		None,
+		Extensions { relay_chain: "rococo-local".into(), para_id: 1000 },
+	)
+}
+
+pub(crate) fn testnet_genesis(
+	root_key: AccountId,
+	initial_authorities: Vec<AuraId>,
+	endowed_accounts: Vec<AccountId>,
+	id: ParaId,
+) -> rococo_parachain_runtime::GenesisConfig {
+	rococo_parachain_runtime::GenesisConfig {
+		system: rococo_parachain_runtime::SystemConfig {
+			code: rococo_parachain_runtime::WASM_BINARY
+				.expect("WASM binary was not build, please build it!")
+				.to_vec(),
+		},
+		balances: rococo_parachain_runtime::BalancesConfig {
+			balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(),
+		},
+		sudo: rococo_parachain_runtime::SudoConfig { key: Some(root_key) },
+		parachain_info: rococo_parachain_runtime::ParachainInfoConfig { parachain_id: id },
+		aura: rococo_parachain_runtime::AuraConfig { authorities: initial_authorities },
+		aura_ext: Default::default(),
+		parachain_system: Default::default(),
+		polkadot_xcm: rococo_parachain_runtime::PolkadotXcmConfig {
+			safe_xcm_version: Some(SAFE_XCM_VERSION),
+		},
+	}
+}
diff --git a/cumulus/polkadot-parachain/src/chain_spec/seedling.rs b/cumulus/polkadot-parachain/src/chain_spec/seedling.rs
index 75166a1b8f565e5625dbe7c158656dfcdb5c4471..2035c813bb6a5e57c067a666743ded0ab5196050 100644
--- a/cumulus/polkadot-parachain/src/chain_spec/seedling.rs
+++ b/cumulus/polkadot-parachain/src/chain_spec/seedling.rs
@@ -16,7 +16,7 @@
 
 use crate::chain_spec::{get_account_id_from_seed, Extensions};
 use cumulus_primitives_core::ParaId;
-use rococo_parachain_runtime::AccountId;
+use parachains_common::AccountId;
 use sc_service::ChainType;
 use sp_core::sr25519;
 
diff --git a/cumulus/polkadot-parachain/src/chain_spec/statemint.rs b/cumulus/polkadot-parachain/src/chain_spec/statemint.rs
index 800b7af8b987341537495205ecd9195a093c6b94..e12a5d12e174e0ab94abe35fd9db93565b88d4f7 100644
--- a/cumulus/polkadot-parachain/src/chain_spec/statemint.rs
+++ b/cumulus/polkadot-parachain/src/chain_spec/statemint.rs
@@ -19,8 +19,7 @@ use crate::chain_spec::{
 };
 use cumulus_primitives_core::ParaId;
 use hex_literal::hex;
-use parachains_common::{Balance as StatemintBalance, StatemintAuraId};
-use rococo_parachain_runtime::{AccountId, AuraId};
+use parachains_common::{AccountId, AuraId, Balance as StatemintBalance, StatemintAuraId};
 use sc_service::ChainType;
 use sp_core::{crypto::UncheckedInto, sr25519};
 
diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs
index c7e96d3ebf4dbd3f52d341c3582272778bebca33..7452eb483a271f97ab759684466dfa75446d4e58 100644
--- a/cumulus/polkadot-parachain/src/command.rs
+++ b/cumulus/polkadot-parachain/src/command.rs
@@ -38,12 +38,15 @@ use sc_service::{
 };
 use sp_core::hexdisplay::HexDisplay;
 use sp_runtime::traits::{AccountIdConversion, Block as BlockT};
-use std::net::SocketAddr;
+use std::{net::SocketAddr, path::PathBuf};
 
-#[derive(Debug)]
+/// Helper enum that is used for better distinction of different parachain/runtime configuration
+/// (it is based/calculated on ChainSpec's ID attribute)
+#[derive(Debug, PartialEq, Default)]
 enum Runtime {
-	/// This is the default runtime (based on rococo)
-	Generic,
+	/// This is the default runtime (actually based on rococo)
+	#[default]
+	Default,
 	Shell,
 	Seedling,
 	Statemint,
@@ -55,22 +58,30 @@ enum Runtime {
 	CollectivesWestend,
 }
 
-trait ChainType {
+trait RuntimeResolver {
 	fn runtime(&self) -> Runtime;
 }
 
-impl ChainType for dyn ChainSpec {
+impl RuntimeResolver for dyn ChainSpec {
 	fn runtime(&self) -> Runtime {
 		runtime(self.id())
 	}
 }
 
-use sc_chain_spec::GenericChainSpec;
-impl ChainType
-	for GenericChainSpec<rococo_parachain_runtime::GenesisConfig, chain_spec::Extensions>
-{
+/// Implementation, that can resolve [`Runtime`] from any json configuration file
+impl RuntimeResolver for PathBuf {
 	fn runtime(&self) -> Runtime {
-		runtime(self.id())
+		#[derive(Debug, serde::Deserialize)]
+		struct EmptyChainSpecWithId {
+			id: String,
+		}
+
+		let file = std::fs::File::open(self).expect("Failed to open file");
+		let reader = std::io::BufReader::new(file);
+		let chain_spec: EmptyChainSpecWithId = sp_serializer::from_reader(reader)
+			.expect("Failed to read 'json' file with ChainSpec configuration");
+
+		runtime(&chain_spec.id)
 	}
 }
 
@@ -97,32 +108,41 @@ fn runtime(id: &str) -> Runtime {
 	} else if id.starts_with("collectives-westend") {
 		Runtime::CollectivesWestend
 	} else {
-		Runtime::Generic
+		log::warn!("No specific runtime was recognized for ChainSpec's id: '{}', so Runtime::default() will be used", id);
+		Runtime::default()
 	}
 }
 
 fn load_spec(id: &str) -> std::result::Result<Box<dyn ChainSpec>, String> {
 	let (id, _, para_id) = extract_parachain_id(id);
 	Ok(match id {
-		"staging" => Box::new(chain_spec::staging_test_net()),
-		"tick" => Box::new(chain_spec::ChainSpec::from_json_bytes(
-			&include_bytes!("../../parachains/chain-specs/tick.json")[..],
-		)?),
-		"trick" => Box::new(chain_spec::ChainSpec::from_json_bytes(
-			&include_bytes!("../../parachains/chain-specs/trick.json")[..],
-		)?),
-		"track" => Box::new(chain_spec::ChainSpec::from_json_bytes(
-			&include_bytes!("../../parachains/chain-specs/track.json")[..],
-		)?),
+		// - Defaul-like
+		"staging" =>
+			Box::new(chain_spec::rococo_parachain::staging_rococo_parachain_local_config()),
+		"tick" =>
+			Box::new(chain_spec::rococo_parachain::RococoParachainChainSpec::from_json_bytes(
+				&include_bytes!("../../parachains/chain-specs/tick.json")[..],
+			)?),
+		"trick" =>
+			Box::new(chain_spec::rococo_parachain::RococoParachainChainSpec::from_json_bytes(
+				&include_bytes!("../../parachains/chain-specs/trick.json")[..],
+			)?),
+		"track" =>
+			Box::new(chain_spec::rococo_parachain::RococoParachainChainSpec::from_json_bytes(
+				&include_bytes!("../../parachains/chain-specs/track.json")[..],
+			)?),
+
+		// -- Starters
 		"shell" => Box::new(chain_spec::shell::get_shell_chain_spec()),
-		// -- Statemint
 		"seedling" => Box::new(chain_spec::seedling::get_seedling_chain_spec()),
+
+		// -- Statemint
 		"statemint-dev" => Box::new(chain_spec::statemint::statemint_development_config()),
 		"statemint-local" => Box::new(chain_spec::statemint::statemint_local_config()),
 		// the chain spec as used for generating the upgrade genesis values
 		"statemint-genesis" => Box::new(chain_spec::statemint::statemint_config()),
 		// the shell-based chain spec as used for syncing
-		"statemint" => Box::new(chain_spec::ChainSpec::from_json_bytes(
+		"statemint" => Box::new(chain_spec::statemint::StatemintChainSpec::from_json_bytes(
 			&include_bytes!("../../parachains/chain-specs/statemint.json")[..],
 		)?),
 
@@ -132,7 +152,7 @@ fn load_spec(id: &str) -> std::result::Result<Box<dyn ChainSpec>, String> {
 		// the chain spec as used for generating the upgrade genesis values
 		"statemine-genesis" => Box::new(chain_spec::statemint::statemine_config()),
 		// the shell-based chain spec as used for syncing
-		"statemine" => Box::new(chain_spec::ChainSpec::from_json_bytes(
+		"statemine" => Box::new(chain_spec::statemint::StatemineChainSpec::from_json_bytes(
 			&include_bytes!("../../parachains/chain-specs/statemine.json")[..],
 		)?),
 
@@ -142,7 +162,7 @@ fn load_spec(id: &str) -> std::result::Result<Box<dyn ChainSpec>, String> {
 		// the chain spec as used for generating the upgrade genesis values
 		"westmint-genesis" => Box::new(chain_spec::statemint::westmint_config()),
 		// the shell-based chain spec as used for syncing
-		"westmint" => Box::new(chain_spec::ChainSpec::from_json_bytes(
+		"westmint" => Box::new(chain_spec::statemint::WestmintChainSpec::from_json_bytes(
 			&include_bytes!("../../parachains/chain-specs/westmint.json")[..],
 		)?),
 
@@ -151,12 +171,14 @@ fn load_spec(id: &str) -> std::result::Result<Box<dyn ChainSpec>, String> {
 			Box::new(chain_spec::collectives::collectives_polkadot_development_config()),
 		"collectives-polkadot-local" =>
 			Box::new(chain_spec::collectives::collectives_polkadot_local_config()),
-		"collectives-polkadot" => Box::new(chain_spec::ChainSpec::from_json_bytes(
-			&include_bytes!("../../parachains/chain-specs/collectives-polkadot.json")[..],
-		)?),
-		"collectives-westend" => Box::new(chain_spec::ChainSpec::from_json_bytes(
-			&include_bytes!("../../parachains/chain-specs/collectives-westend.json")[..],
-		)?),
+		"collectives-polkadot" =>
+			Box::new(chain_spec::collectives::CollectivesPolkadotChainSpec::from_json_bytes(
+				&include_bytes!("../../parachains/chain-specs/collectives-polkadot.json")[..],
+			)?),
+		"collectives-westend" =>
+			Box::new(chain_spec::collectives::CollectivesPolkadotChainSpec::from_json_bytes(
+				&include_bytes!("../../parachains/chain-specs/collectives-westend.json")[..],
+			)?),
 
 		// -- Contracts on Rococo
 		"contracts-rococo-dev" =>
@@ -164,9 +186,12 @@ fn load_spec(id: &str) -> std::result::Result<Box<dyn ChainSpec>, String> {
 		"contracts-rococo-local" =>
 			Box::new(chain_spec::contracts::contracts_rococo_local_config()),
 		"contracts-rococo-genesis" => Box::new(chain_spec::contracts::contracts_rococo_config()),
-		"contracts-rococo" => Box::new(chain_spec::ChainSpec::from_json_bytes(
-			&include_bytes!("../../parachains/chain-specs/contracts-rococo.json")[..],
-		)?),
+		"contracts-rococo" =>
+			Box::new(chain_spec::contracts::ContractsRococoChainSpec::from_json_bytes(
+				&include_bytes!("../../parachains/chain-specs/contracts-rococo.json")[..],
+			)?),
+
+		// -- Penpall
 		"penpal-kusama" => Box::new(chain_spec::penpal::get_penpal_chain_spec(
 			para_id.expect("Must specify parachain id"),
 			"kusama-local",
@@ -177,34 +202,35 @@ fn load_spec(id: &str) -> std::result::Result<Box<dyn ChainSpec>, String> {
 		)),
 
 		// -- Fallback (generic chainspec)
-		"" => Box::new(chain_spec::get_chain_spec()),
+		"" => {
+			log::warn!("No ChainSpec.id specified, so using default one, based on rococo-parachain runtime");
+			Box::new(chain_spec::rococo_parachain::rococo_parachain_local_config())
+		},
 
 		// -- Loading a specific spec from disk
 		path => {
-			let chain_spec = chain_spec::ChainSpec::from_json_file(path.into())?;
-			match chain_spec.runtime() {
-				Runtime::Statemint => Box::new(
-					chain_spec::statemint::StatemintChainSpec::from_json_file(path.into())?,
-				),
-				Runtime::Statemine => Box::new(
-					chain_spec::statemint::StatemineChainSpec::from_json_file(path.into())?,
-				),
+			let path: PathBuf = path.into();
+			match path.runtime() {
+				Runtime::Statemint =>
+					Box::new(chain_spec::statemint::StatemintChainSpec::from_json_file(path)?),
+				Runtime::Statemine =>
+					Box::new(chain_spec::statemint::StatemineChainSpec::from_json_file(path)?),
 				Runtime::Westmint =>
-					Box::new(chain_spec::statemint::WestmintChainSpec::from_json_file(path.into())?),
-				Runtime::CollectivesPolkadot | Runtime::CollectivesWestend =>
-					Box::new(chain_spec::collectives::CollectivesPolkadotChainSpec::from_json_file(
-						path.into(),
-					)?),
+					Box::new(chain_spec::statemint::WestmintChainSpec::from_json_file(path)?),
+				Runtime::CollectivesPolkadot | Runtime::CollectivesWestend => Box::new(
+					chain_spec::collectives::CollectivesPolkadotChainSpec::from_json_file(path)?,
+				),
 				Runtime::Shell =>
-					Box::new(chain_spec::shell::ShellChainSpec::from_json_file(path.into())?),
+					Box::new(chain_spec::shell::ShellChainSpec::from_json_file(path)?),
 				Runtime::Seedling =>
-					Box::new(chain_spec::seedling::SeedlingChainSpec::from_json_file(path.into())?),
-				Runtime::ContractsRococo => Box::new(
-					chain_spec::contracts::ContractsRococoChainSpec::from_json_file(path.into())?,
-				),
+					Box::new(chain_spec::seedling::SeedlingChainSpec::from_json_file(path)?),
+				Runtime::ContractsRococo =>
+					Box::new(chain_spec::contracts::ContractsRococoChainSpec::from_json_file(path)?),
 				Runtime::Penpal(_para_id) =>
-					Box::new(chain_spec::penpal::PenpalChainSpec::from_json_file(path.into())?),
-				Runtime::Generic => Box::new(chain_spec),
+					Box::new(chain_spec::penpal::PenpalChainSpec::from_json_file(path)?),
+				Runtime::Default => Box::new(
+					chain_spec::rococo_parachain::RococoParachainChainSpec::from_json_file(path)?,
+				),
 			}
 		},
 	})
@@ -263,7 +289,7 @@ impl SubstrateCli for Cli {
 		2017
 	}
 
-	fn load_spec(&self, id: &str) -> std::result::Result<Box<dyn sc_service::ChainSpec>, String> {
+	fn load_spec(&self, id: &str) -> std::result::Result<Box<dyn ChainSpec>, String> {
 		load_spec(id)
 	}
 
@@ -278,7 +304,7 @@ impl SubstrateCli for Cli {
 			Runtime::Seedling => &seedling_runtime::VERSION,
 			Runtime::ContractsRococo => &contracts_rococo_runtime::VERSION,
 			Runtime::Penpal(_) => &penpal_runtime::VERSION,
-			Runtime::Generic => &rococo_parachain_runtime::VERSION,
+			Runtime::Default => &rococo_parachain_runtime::VERSION,
 		}
 	}
 }
@@ -314,7 +340,7 @@ impl SubstrateCli for RelayChainCli {
 		2017
 	}
 
-	fn load_spec(&self, id: &str) -> std::result::Result<Box<dyn sc_service::ChainSpec>, String> {
+	fn load_spec(&self, id: &str) -> std::result::Result<Box<dyn ChainSpec>, String> {
 		polkadot_cli::Cli::from_iter([RelayChainCli::executable_name()].iter()).load_spec(id)
 	}
 
@@ -434,7 +460,7 @@ macro_rules! construct_async_run {
 					{ $( $code )* }.map(|v| (v, task_manager))
 				})
 			},
-			Runtime::Penpal(_) | Runtime::Generic => {
+			Runtime::Penpal(_) | Runtime::Default => {
 				runner.async_run(|$config| {
 					let $components = new_partial::<
 						rococo_parachain_runtime::RuntimeApi,
@@ -700,7 +726,7 @@ pub fn run() -> Result<()> {
 					.await
 					.map(|r| r.0)
 					.map_err(Into::into),
-					Runtime::Penpal(_) | Runtime::Generic =>
+					Runtime::Penpal(_) | Runtime::Default =>
 						crate::service::start_rococo_parachain_node(
 							config,
 							polkadot_config,
@@ -853,3 +879,118 @@ impl CliConfiguration<Self> for RelayChainCli {
 		self.base.base.node_name()
 	}
 }
+
+#[cfg(test)]
+mod tests {
+	use crate::{
+		chain_spec::{get_account_id_from_seed, get_from_seed},
+		command::{Runtime, RuntimeResolver},
+	};
+	use sc_chain_spec::{ChainSpec, ChainSpecExtension, ChainSpecGroup, ChainType, Extension};
+	use serde::{Deserialize, Serialize};
+	use sp_core::sr25519;
+	use std::path::PathBuf;
+	use tempfile::TempDir;
+
+	#[derive(
+		Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension, Default,
+	)]
+	#[serde(deny_unknown_fields)]
+	pub struct Extensions1 {
+		pub attribute1: String,
+		pub attribute2: u32,
+	}
+
+	#[derive(
+		Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension, Default,
+	)]
+	#[serde(deny_unknown_fields)]
+	pub struct Extensions2 {
+		pub attribute_x: String,
+		pub attribute_y: String,
+		pub attribute_z: u32,
+	}
+
+	fn store_configuration(dir: &TempDir, spec: Box<dyn ChainSpec>) -> PathBuf {
+		let raw_output = true;
+		let json = sc_service::chain_ops::build_spec(&*spec, raw_output)
+			.expect("Failed to build json string");
+		let mut cfg_file_path = dir.path().to_path_buf();
+		cfg_file_path.push(spec.id());
+		cfg_file_path.set_extension("json");
+		std::fs::write(&cfg_file_path, json).expect("Failed to write to json file");
+		cfg_file_path
+	}
+
+	pub type DummyChainSpec<E> =
+		sc_service::GenericChainSpec<rococo_parachain_runtime::GenesisConfig, E>;
+
+	pub fn create_default_with_extensions<E: Extension>(
+		id: &str,
+		extension: E,
+	) -> DummyChainSpec<E> {
+		DummyChainSpec::from_genesis(
+			"Dummy local testnet",
+			id,
+			ChainType::Local,
+			move || {
+				crate::chain_spec::rococo_parachain::testnet_genesis(
+					get_account_id_from_seed::<sr25519::Public>("Alice"),
+					vec![
+						get_from_seed::<rococo_parachain_runtime::AuraId>("Alice"),
+						get_from_seed::<rococo_parachain_runtime::AuraId>("Bob"),
+					],
+					vec![get_account_id_from_seed::<sr25519::Public>("Alice")],
+					1000.into(),
+				)
+			},
+			Vec::new(),
+			None,
+			None,
+			None,
+			None,
+			extension,
+		)
+	}
+
+	#[test]
+	fn test_resolve_runtime_for_different_configuration_files() {
+		let temp_dir = tempfile::tempdir().expect("Failed to access tempdir");
+
+		let path = store_configuration(
+			&temp_dir,
+			Box::new(create_default_with_extensions("shell-1", Extensions1::default())),
+		);
+		assert_eq!(Runtime::Shell, path.runtime());
+
+		let path = store_configuration(
+			&temp_dir,
+			Box::new(create_default_with_extensions("shell-2", Extensions2::default())),
+		);
+		assert_eq!(Runtime::Shell, path.runtime());
+
+		let path = store_configuration(
+			&temp_dir,
+			Box::new(create_default_with_extensions("seedling", Extensions2::default())),
+		);
+		assert_eq!(Runtime::Seedling, path.runtime());
+
+		let path = store_configuration(
+			&temp_dir,
+			Box::new(crate::chain_spec::rococo_parachain::rococo_parachain_local_config()),
+		);
+		assert_eq!(Runtime::Default, path.runtime());
+
+		let path = store_configuration(
+			&temp_dir,
+			Box::new(crate::chain_spec::statemint::statemine_local_config()),
+		);
+		assert_eq!(Runtime::Statemine, path.runtime());
+
+		let path = store_configuration(
+			&temp_dir,
+			Box::new(crate::chain_spec::contracts::contracts_rococo_local_config()),
+		);
+		assert_eq!(Runtime::ContractsRococo, path.runtime());
+	}
+}
diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs
index ea52f8d727ce8d1178efe29b789a937c40393d4e..ae03e400b09a09e490af49da273a50ffe512a3b6 100644
--- a/cumulus/polkadot-parachain/src/service.rs
+++ b/cumulus/polkadot-parachain/src/service.rs
@@ -69,21 +69,6 @@ type HostFunctions = sp_io::SubstrateHostFunctions;
 type HostFunctions =
 	(sp_io::SubstrateHostFunctions, frame_benchmarking::benchmarking::HostFunctions);
 
-/// Native executor instance.
-pub struct RococoParachainRuntimeExecutor;
-
-impl sc_executor::NativeExecutionDispatch for RococoParachainRuntimeExecutor {
-	type ExtendHostFunctions = ();
-
-	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-		rococo_parachain_runtime::api::dispatch(method, data)
-	}
-
-	fn native_version() -> sc_executor::NativeVersion {
-		rococo_parachain_runtime::native_version()
-	}
-}
-
 /// Native executor instance.
 pub struct ShellRuntimeExecutor;
 
@@ -99,21 +84,6 @@ impl sc_executor::NativeExecutionDispatch for ShellRuntimeExecutor {
 	}
 }
 
-/// Native executor instance.
-pub struct SeedlingRuntimeExecutor;
-
-impl sc_executor::NativeExecutionDispatch for SeedlingRuntimeExecutor {
-	type ExtendHostFunctions = ();
-
-	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-		seedling_runtime::api::dispatch(method, data)
-	}
-
-	fn native_version() -> sc_executor::NativeVersion {
-		seedling_runtime::native_version()
-	}
-}
-
 // Native Statemint executor instance.
 pub struct StatemintRuntimeExecutor;
 
@@ -174,21 +144,6 @@ impl sc_executor::NativeExecutionDispatch for CollectivesPolkadotRuntimeExecutor
 	}
 }
 
-/// Native Contracts on Rococo executor instance.
-pub struct ContractsRococoRuntimeExecutor;
-
-impl sc_executor::NativeExecutionDispatch for ContractsRococoRuntimeExecutor {
-	type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;
-
-	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-		contracts_rococo_runtime::api::dispatch(method, data)
-	}
-
-	fn native_version() -> sc_executor::NativeVersion {
-		contracts_rococo_runtime::native_version()
-	}
-}
-
 /// Starts a `ServiceBuilder` for a full service.
 ///
 /// Use this macro if you don't actually need the full service, but just the builder in order to