diff --git a/polkadot/runtime/parachains/src/lib.rs b/polkadot/runtime/parachains/src/lib.rs
index 5abc2fa32ca033d930b220788c8269fa62828b0b..b41968b480f43293d19243a0f93507199818bffa 100644
--- a/polkadot/runtime/parachains/src/lib.rs
+++ b/polkadot/runtime/parachains/src/lib.rs
@@ -23,6 +23,11 @@
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
+use sp_std::result;
+use sp_runtime::traits::BadOrigin;
+use primitives::v1::Id as ParaId;
+use codec::{Decode, Encode};
+
 pub mod configuration;
 pub mod inclusion;
 pub mod inclusion_inherent;
@@ -35,3 +40,22 @@ pub mod runtime_api_impl;
 
 #[cfg(test)]
 mod mock;
+
+/// Origin for the parachains.
+#[derive(PartialEq, Eq, Clone, Encode, Decode)]
+#[cfg_attr(feature = "std", derive(Debug))]
+pub enum Origin {
+	/// It comes from a parachain.
+	Parachain(ParaId),
+}
+
+/// Ensure that the origin `o` represents a parachain.
+/// Returns `Ok` with the parachain ID that effected the extrinsic or an `Err` otherwise.
+pub fn ensure_parachain<OuterOrigin>(o: OuterOrigin) -> result::Result<ParaId, BadOrigin>
+	where OuterOrigin: Into<result::Result<Origin, OuterOrigin>>
+{
+	match o.into() {
+		Ok(Origin::Parachain(id)) => Ok(id),
+		_ => Err(BadOrigin),
+	}
+}