diff --git a/substrate/core/sr-primitives/src/lib.rs b/substrate/core/sr-primitives/src/lib.rs
index dfd34ed01f3bd26e14bfeb3141194ffe21d79dd1..2deb05c90f57784e37b7381cd260fe9d3c82a732 100644
--- a/substrate/core/sr-primitives/src/lib.rs
+++ b/substrate/core/sr-primitives/src/lib.rs
@@ -525,6 +525,25 @@ impl CheckInherentError {
 	}
 }
 
+/// Simple blob to hold an extrinsic without commiting to its format and ensure it is serialized
+/// correctly.
+#[derive(PartialEq, Eq, Clone, Default, Encode, Decode)]
+#[cfg_attr(feature = "std", derive(Debug))]
+pub struct OpaqueExtrinsic(pub Vec<u8>);
+
+#[cfg(feature = "std")]
+impl ::serde::Serialize for OpaqueExtrinsic {
+	fn serialize<S>(&self, seq: S) -> Result<S::Ok, S::Error> where S: ::serde::Serializer {
+		::codec::Encode::using_encoded(&self.0, |bytes| seq.serialize_bytes(bytes))
+	}
+}
+
+impl traits::Extrinsic for OpaqueExtrinsic {
+	fn is_signed(&self) -> Option<bool> {
+		None
+	}
+}
+
 #[cfg(test)]
 mod tests {
 	use substrate_primitives::hash::H256;
diff --git a/substrate/node/primitives/src/lib.rs b/substrate/node/primitives/src/lib.rs
index 967b0d775c040cdfe56ac0cc39b943ec54e66226..027330613468e581f5c2c7cf687148e3b91ba8fc 100644
--- a/substrate/node/primitives/src/lib.rs
+++ b/substrate/node/primitives/src/lib.rs
@@ -22,21 +22,18 @@
 #![cfg_attr(not(feature = "std"), feature(alloc))]
 
 #[cfg(feature = "std")]
-#[macro_use]
-extern crate serde_derive;
+extern crate serde;
 
-#[macro_use]
-extern crate parity_codec_derive;
+extern crate parity_codec as codec;
 
 extern crate sr_std as rstd;
 extern crate sr_primitives as runtime_primitives;
 extern crate substrate_primitives as primitives;
 
-use rstd::prelude::*;
 use runtime_primitives::generic;
 #[cfg(feature = "std")]
 use primitives::bytes;
-use runtime_primitives::traits::{BlakeTwo256, self};
+use runtime_primitives::{OpaqueExtrinsic, traits::BlakeTwo256};
 
 pub use runtime_primitives::BasicInherentData as InherentData;
 
@@ -78,12 +75,4 @@ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
 pub type BlockId = generic::BlockId<Block>;
 
 /// Opaque, encoded, unchecked extrinsic.
-#[derive(PartialEq, Eq, Clone, Default, Encode, Decode)]
-#[cfg_attr(feature = "std", derive(Serialize, Debug))]
-pub struct UncheckedExtrinsic(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec<u8>);
-
-impl traits::Extrinsic for UncheckedExtrinsic {
-	fn is_signed(&self) -> Option<bool> {
-		None
-	}
-}
+pub type UncheckedExtrinsic = OpaqueExtrinsic;