diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock
index aae23858ada1e3c1537665ed77151beee16bc76d..a2d998ac4495aad0183909c231813d581824c06a 100644
--- a/substrate/Cargo.lock
+++ b/substrate/Cargo.lock
@@ -1521,7 +1521,6 @@ dependencies = [
  "substrate-primitives 0.1.0",
  "substrate-runtime-io 0.1.0",
  "substrate-runtime-std 0.1.0",
- "substrate-state-machine 0.1.0",
 ]
 
 [[package]]
diff --git a/substrate/polkadot/runtime/wasm/Cargo.lock b/substrate/polkadot/runtime/wasm/Cargo.lock
index 1ed330a400acac83cc0f0ad7c6025324c5d410d7..df8296ff092ecfd3354209a8b27d3828b8d36847 100644
--- a/substrate/polkadot/runtime/wasm/Cargo.lock
+++ b/substrate/polkadot/runtime/wasm/Cargo.lock
@@ -649,7 +649,6 @@ dependencies = [
  "substrate-primitives 0.1.0",
  "substrate-runtime-io 0.1.0",
  "substrate-runtime-std 0.1.0",
- "substrate-state-machine 0.1.0",
 ]
 
 [[package]]
diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm
index e56ad51f9a1de40b9ae8d68e0d63a9c4689d19d9..0382155efe00b8a70216123aa970a4038d6981b4 100644
Binary files a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm and b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm differ
diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm
index 6341c45abc7cadb6bc9a36ffb3f1eb54d5a65db3..442401ac0613bef04e94de5eb6f253a90fd084d7 100644
Binary files a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm and b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm differ
diff --git a/substrate/substrate/executor/src/wasm_executor.rs b/substrate/substrate/executor/src/wasm_executor.rs
index fcc1b2b5646c1f148334063ecf0a2c9fb64395f2..eef0df976d54e7a829f5219a63a4a35b69fd73fa 100644
--- a/substrate/substrate/executor/src/wasm_executor.rs
+++ b/substrate/substrate/executor/src/wasm_executor.rs
@@ -423,6 +423,17 @@ mod tests {
 		let mut calldata = vec![];
 		calldata.extend_from_slice(key.public().as_ref());
 		calldata.extend_from_slice(sig.as_ref());
+
+		assert_eq!(
+			WasmExecutor.call(&mut ext, &test_code[..], "test_ed25519_verify", &calldata).unwrap(),
+			vec![1]
+		);
+
+		let other_sig = key.sign(b"all is not ok!");
+		let mut calldata = vec![];
+		calldata.extend_from_slice(key.public().as_ref());
+		calldata.extend_from_slice(other_sig.as_ref());
+
 		assert_eq!(
 			WasmExecutor.call(&mut ext, &test_code[..], "test_ed25519_verify", &calldata).unwrap(),
 			vec![0]
diff --git a/substrate/substrate/executor/wasm/src/lib.rs b/substrate/substrate/executor/wasm/src/lib.rs
index 48bbd04dca966d2a531396b4a8b0653e4fb6a94d..11401a39d7b45a6f35651d8fc50b2f20eb2fcb12 100644
--- a/substrate/substrate/executor/wasm/src/lib.rs
+++ b/substrate/substrate/executor/wasm/src/lib.rs
@@ -13,57 +13,42 @@ use runtime_io::{
 	twox_128, twox_256, ed25519_verify, enumerated_trie_root
 };
 
-fn test_blake2_256(input: &[u8]) -> Vec<u8> {
-	blake2_256(&input).encode()
-}
-
-fn test_twox_256(input: &[u8]) -> Vec<u8> {
-	twox_256(&input).encode()
-}
-
-fn test_twox_128(input: &[u8]) -> Vec<u8> {
-	twox_128(&input).encode()
-}
-
-fn test_ed25519_verify(input: &[u8]) -> Vec<u8> {
-	let sig = &input[0..64];
-	let pubkey = &input[64..96];
-	let msg = b"all ok!";
-	[ed25519_verify(sig, &msg[..], pubkey) as u8].encode()
-}
-
-fn test_enumerated_trie_root(_input: &[u8]) -> Vec<u8> {
-	enumerated_trie_root(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).encode()
-}
-
-fn test_data_in(input: &[u8]) -> Vec<u8> {
-	print("set_storage");
-	set_storage(b"input", &input);
-
-	print("storage");
-	let foo = storage(b"foo");
-
-	print("set_storage");
-	set_storage(b"baz", &foo);
-
-	print("finished!");
-	b"all ok!".to_vec()
-}
-
-fn test_empty_return(_input: &[u8]) -> Vec<u8> {
-	Vec::new()
-}
-
-fn test_panic(_input: &[u8]) -> Vec<u8> {
-	panic!("test panic");
-}
-
-fn test_conditional_panic(input: &[u8]) -> Vec<u8> {
-	if input.len() > 0 {
-		panic!("test panic");
+impl_stubs!(
+	test_data_in NO_DECODE => |input| {
+		print("set_storage");
+		set_storage(b"input", input);
+
+		print("storage");
+		let foo = storage(b"foo");
+
+		print("set_storage");
+		set_storage(b"baz", &foo);
+
+		print("finished!");
+		b"all ok!".to_vec()
+	},
+	test_empty_return NO_DECODE => |_| Vec::new(),
+	test_panic NO_DECODE => |_| panic!("test panic"),
+	test_conditional_panic NO_DECODE => |input: &[u8]| {
+		if input.len() > 0 {
+			panic!("test panic")
+		}
+		input.to_vec()
+	},
+	test_blake2_256 NO_DECODE => |input| blake2_256(input).to_vec(),
+	test_twox_256 NO_DECODE => |input| twox_256(input).to_vec(),
+	test_twox_128 NO_DECODE => |input| twox_128(input).to_vec(),
+	test_ed25519_verify NO_DECODE => |input: &[u8]| {
+		let mut pubkey = [0; 32];
+		let mut sig = [0; 64];
+
+		pubkey.copy_from_slice(&input[0..32]);
+		sig.copy_from_slice(&input[32..96]);
+
+		let msg = b"all ok!";
+		[ed25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec()
+	},
+	test_enumerated_trie_root NO_DECODE => |_| {
+		enumerated_trie_root(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).to_vec()
 	}
-	input.encode()
-}
-
-impl_stubs!(test_data_in, test_empty_return, test_panic, test_conditional_panic,
-	test_blake2_256, test_twox_256, test_twox_128, test_ed25519_verify, test_enumerated_trie_root);
+);
diff --git a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm
index 1bca666aa1c9f94e13be0ecefc8ea82c7875ef4a..39b6f737efc2312f442206f6204d317487855cba 100644
Binary files a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm and b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm differ
diff --git a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm
index ca0e750015cedc22c328b69348d5af65216bde80..7a21c422087bd00293fd1508f1542997922d3c44 100644
Binary files a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm and b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm differ
diff --git a/substrate/substrate/runtime-io/with_std.rs b/substrate/substrate/runtime-io/with_std.rs
index 0eadb7a27cf1bf8e25825b2a855d1c24eb831b08..98864baa63be79c7dc942f4258f3e95aadcf832f 100644
--- a/substrate/substrate/runtime-io/with_std.rs
+++ b/substrate/substrate/runtime-io/with_std.rs
@@ -126,25 +126,30 @@ pub fn print<T: Printable + Sized>(value: T) {
 
 #[macro_export]
 macro_rules! impl_stubs {
-	( $( $name:ident => $invoke:expr ),* ) => {
+	( $( $new_name:ident $($nodecode:ident)* => $invoke: expr ),*) => {
 		/// Dispatch logic for the native runtime.
-		pub fn dispatch(method: &str, mut data: &[u8]) -> Option<Vec<u8>> {
+		pub fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
 			match method {
 				$(
-					stringify!($name) => {
-						let input = match $crate::codec::Slicable::decode(&mut data) {
-							Some(input) => input,
-							None => panic!("Bad input data provided to {}", stringify!($name)),
-						};
-
-						let output = $invoke(input);
-						Some($crate::codec::Slicable::encode(&output))
-					}
+					stringify!($new_name) => { impl_stubs!(@METHOD data $new_name $($nodecode)* => $invoke) }
 				)*
 				_ => None,
 			}
 		}
-	}
+	};
+	(@METHOD $data: ident $new_name: ident NO_DECODE => $invoke:expr) => {
+		Some($invoke($data))
+	};
+	(@METHOD $data: ident $new_name: ident => $invoke:expr) => {{
+		let mut data = $data;
+		let input = match $crate::codec::Slicable::decode(&mut data) {
+			Some(input) => input,
+			None => panic!("Bad input data provided to {}", stringify!($new_name)),
+		};
+
+		let output = $invoke(input);
+		Some($crate::codec::Slicable::encode(&output))
+	}}
 }
 
 #[cfg(test)]
diff --git a/substrate/substrate/runtime-io/without_std.rs b/substrate/substrate/runtime-io/without_std.rs
index 1d4e286b402b6cc1eaaf548d6e7f7d4e3450004f..cac6b6dff2192895c9e25afa0395c3d9c9faf7f1 100644
--- a/substrate/substrate/runtime-io/without_std.rs
+++ b/substrate/substrate/runtime-io/without_std.rs
@@ -14,9 +14,12 @@
 // You should have received a copy of the GNU General Public License
 // along with Substrate.  If not, see <http://www.gnu.org/licenses/>.
 
-extern crate substrate_runtime_std as rstd;
+
 extern crate substrate_primitives as primitives;
 
+#[doc(hidden)]
+pub extern crate substrate_runtime_std as rstd;
+
 #[doc(hidden)]
 pub extern crate substrate_codec as codec;
 
@@ -141,10 +144,10 @@ pub fn twox_128(data: &[u8]) -> [u8; 16] {
 }
 
 /// Verify a ed25519 signature.
-pub fn ed25519_verify(sig: &[u8], msg: &[u8], pubkey: &[u8]) -> bool {
-	sig.len() == 64 && pubkey.len() == 32 && unsafe {
-		ext_ed25519_verify(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ptr())
-	} == 0
+pub fn ed25519_verify(sig: &[u8; 64], msg: &[u8], pubkey: &[u8; 32]) -> bool {
+	unsafe {
+		ext_ed25519_verify(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ptr()) == 0
+	}
 }
 
 /// Trait for things which can be printed.
@@ -181,33 +184,57 @@ pub fn print<T: Printable + Sized>(value: T) {
 
 #[macro_export]
 macro_rules! impl_stubs {
-	( $( $new_name:ident => $invoke:expr ),* ) => {
+	( $( $new_name:ident $($nodecode:ident)* => $invoke:expr ),* ) => {
 		$(
-			#[no_mangle]
-			pub fn $new_name(input_data: *mut u8, input_len: usize) -> u64 {
-				let mut input = if input_len == 0 {
-					&[0u8; 0]
-				} else {
-					unsafe {
-						$crate::slice::from_raw_parts(input_data, input_len)
-					}
-				};
-
-				let input = match $crate::codec::Slicable::decode(&mut input) {
-					Some(input) => input,
-					None => panic!("Bad input data provided to {}", stringify!($name)),
-				};
-
-				let output = ($invoke)(input);
-				let output = $crate::codec::Slicable::encode(&output);
-				let res = output.as_ptr() as u64 + ((output.len() as u64) << 32);
-
-				// Leak the output vector to avoid it being freed.
-				// This is fine in a WASM context since the heap
-				// will be discarded after the call.
-				::core::mem::forget(output);
-				res
-			}
+			impl_stubs!(@METHOD $new_name $($nodecode)* => $invoke);
 		)*
+	};
+	( @METHOD $new_name:ident NO_DECODE => $invoke:expr ) => {
+		#[no_mangle]
+		pub fn $new_name(input_data: *mut u8, input_len: usize) -> u64 {
+			let input: &[u8] = if input_len == 0 {
+				&[0u8; 0]
+			} else {
+				unsafe {
+					$crate::slice::from_raw_parts(input_data, input_len)
+				}
+			};
+
+			let output: $crate::rstd::vec::Vec<u8> = $invoke(input);
+			let res = output.as_ptr() as u64 + ((output.len() as u64) << 32);
+
+			// Leak the output vector to avoid it being freed.
+			// This is fine in a WASM context since the heap
+			// will be discarded after the call.
+			::core::mem::forget(output);
+			res
+		}
+	};
+	( @METHOD $new_name:ident => $invoke:expr ) => {
+		#[no_mangle]
+		pub fn $new_name(input_data: *mut u8, input_len: usize) -> u64 {
+			let mut input = if input_len == 0 {
+				&[0u8; 0]
+			} else {
+				unsafe {
+					$crate::slice::from_raw_parts(input_data, input_len)
+				}
+			};
+
+			let input = match $crate::codec::Slicable::decode(&mut input) {
+				Some(input) => input,
+				None => panic!("Bad input data provided to {}", stringify!($name)),
+			};
+
+			let output = ($invoke)(input);
+			let output = $crate::codec::Slicable::encode(&output);
+			let res = output.as_ptr() as u64 + ((output.len() as u64) << 32);
+
+			// Leak the output vector to avoid it being freed.
+			// This is fine in a WASM context since the heap
+			// will be discarded after the call.
+			::core::mem::forget(output);
+			res
+		}
 	}
 }
diff --git a/substrate/substrate/runtime-support/Cargo.toml b/substrate/substrate/runtime-support/Cargo.toml
index 2acbd53df9af72b8e404021a5f11a67e0ad84692..9e68c252ecef9d2555468a4bcbd1eb5b163315ff 100644
--- a/substrate/substrate/runtime-support/Cargo.toml
+++ b/substrate/substrate/runtime-support/Cargo.toml
@@ -4,19 +4,18 @@ version = "0.1.0"
 authors = ["Parity Technologies <admin@parity.io>"]
 
 [dependencies]
-hex-literal = "0.1.0"
+hex-literal = { version = "0.1.0", optional = true }
 substrate-runtime-std = { path = "../runtime-std", default_features = false }
 substrate-runtime-io = { path = "../runtime-io", default_features = false }
 environmental = { path = "../environmental", optional = true }
-substrate-state-machine = { path = "../state-machine", optional = true }
 substrate-primitives = { path = "../primitives", default_features = false }
 substrate-codec = { path = "../codec", default_features = false }
 
 [features]
 default = ["std"]
 std = [
+	"hex-literal",
 	"environmental",
-	"substrate-state-machine",
 	"substrate-primitives/std",
 	"substrate-runtime-io/std",
 	"substrate-codec/std",
diff --git a/substrate/substrate/test-runtime/src/lib.rs b/substrate/substrate/test-runtime/src/lib.rs
index b5be15fc2317a6ae2db243d3e34326490a6ff03e..3e0f65a2b40483674a7eb18a09f8d720c7879ca3 100644
--- a/substrate/substrate/test-runtime/src/lib.rs
+++ b/substrate/substrate/test-runtime/src/lib.rs
@@ -23,7 +23,7 @@ extern crate substrate_runtime_std as rstd;
 extern crate substrate_runtime_io as runtime_io;
 extern crate substrate_runtime_support as runtime_support;
 extern crate substrate_codec as codec;
-#[cfg_attr(test, macro_use)] extern crate hex_literal;
+#[cfg(test)] #[macro_use] extern crate hex_literal;
 #[cfg_attr(test, macro_use)] extern crate substrate_primitives as primitives;
 
 #[cfg(feature = "std")]
diff --git a/substrate/substrate/test-runtime/src/system.rs b/substrate/substrate/test-runtime/src/system.rs
index d6a9426538d48295e92b729c3d57c9c4ef2296df..82a428d45899375a65442fc78f615368e6585625 100644
--- a/substrate/substrate/test-runtime/src/system.rs
+++ b/substrate/substrate/test-runtime/src/system.rs
@@ -131,10 +131,9 @@ mod tests {
 	use super::*;
 
 	use runtime_io::{with_externalities, twox_128, TestExternalities};
-	use codec::{Joiner, KeyedVec, Slicable};
+	use codec::{Joiner, KeyedVec};
 	use runtime_support::{one, two};
-	use primitives::hexdisplay::HexDisplay;
-	use ::{Header, Digest, UncheckedTransaction, Transaction};
+	use ::{Header, Digest};
 
 	fn new_test_ext() -> TestExternalities {
 		let one = one();
@@ -153,9 +152,6 @@ mod tests {
 
 	#[test]
 	fn block_import_works() {
-		let one = one();
-		let two = two();
-
 		let mut t = new_test_ext();
 
 		let h = Header {
diff --git a/substrate/substrate/test-runtime/wasm/Cargo.lock b/substrate/substrate/test-runtime/wasm/Cargo.lock
index 29ef026e0d771c3577071e4155e9270228d1167f..0d387390319fdb04fc4f5d315477e6d2f2b24214 100644
--- a/substrate/substrate/test-runtime/wasm/Cargo.lock
+++ b/substrate/substrate/test-runtime/wasm/Cargo.lock
@@ -626,7 +626,6 @@ dependencies = [
  "substrate-primitives 0.1.0",
  "substrate-runtime-io 0.1.0",
  "substrate-runtime-std 0.1.0",
- "substrate-state-machine 0.1.0",
 ]
 
 [[package]]
@@ -646,6 +645,7 @@ dependencies = [
 name = "substrate-test-runtime"
 version = "0.1.0"
 dependencies = [
+ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "substrate-codec 0.1.0",
  "substrate-primitives 0.1.0",
  "substrate-runtime-io 0.1.0",
diff --git a/substrate/substrate/test-runtime/wasm/Cargo.toml b/substrate/substrate/test-runtime/wasm/Cargo.toml
index 93886c1f3a5b59f6bc06c92f13c5b317516e1d98..a40af49c330594f51474f78eee4d3a199c661518 100644
--- a/substrate/substrate/test-runtime/wasm/Cargo.toml
+++ b/substrate/substrate/test-runtime/wasm/Cargo.toml
@@ -7,20 +7,22 @@ authors = ["Parity Technologies <admin@parity.io>"]
 crate-type = ["cdylib"]
 
 [dependencies]
-substrate-codec = { path = "../../codec", default-features = false }
-substrate-runtime-std = { path = "../../runtime-std", default-features = false }
-substrate-runtime-io = { path = "../../runtime-io", default-features = false }
-substrate-runtime-support = { path = "../../runtime-support", default-features = false }
-substrate-primitives = { path = "../../primitives", default-features = false }
+hex-literal = { version = "0.1.0", optional = true }
+substrate-codec = { path = "../../../substrate/codec", default-features = false }
+substrate-runtime-std = { path = "../../../substrate/runtime-std", default-features = false }
+substrate-runtime-io = { path = "../../../substrate/runtime-io", default-features = false }
+substrate-runtime-support = { path = "../../../substrate/runtime-support", default-features = false }
+substrate-primitives = { path = "../../../substrate/primitives", default-features = false }
 
 [features]
 default = []
 std = [
+	"hex-literal",
 	"substrate-codec/std",
 	"substrate-runtime-io/std",
 	"substrate-runtime-std/std",
 	"substrate-runtime-support/std",
-	"substrate-primitives/std"
+	"substrate-primitives/std",
 ]
 
 [profile.release]
diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm
index 8d1693d8f8cac9ae16a757bfa2fd46be453596c9..95e6b0c7f7fe14fbbfaa3505e8bce0402610b308 100644
Binary files a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ
diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm
index f0415f875a21224beeaaaf2f38a6b3ef0c386d17..5003985d234677e20942e5c129dc044bcc9a6a33 100644
Binary files a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm and b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm differ