diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs
index 9e7974abb5087095c938d418c3d402d5e5891943..c774ff8601a2ce3857c6eb1c324553e1794c5a4d 100644
--- a/substrate/client/src/genesis.rs
+++ b/substrate/client/src/genesis.rs
@@ -59,7 +59,7 @@ mod tests {
 		}
 	}
 
-	fn construct_block(number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec<Transaction>) -> (Vec<u8>, Hash) {
+	fn construct_block(backend: &InMemory, number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec<Transaction>) -> (Vec<u8>, Hash) {
 		use triehash::ordered_trie_root;
 
 		let transactions = txs.into_iter().map(|transaction| {
@@ -80,11 +80,32 @@ mod tests {
 		};
 		let hash = header.blake2_256();
 
-		(Block { header, transactions }.to_vec(), hash)
+		let mut overlay = OverlayedChanges::default();
+
+		for tx in transactions.iter() {
+			let _ = execute(
+				backend,
+				&mut overlay,
+				&executor(),
+				"execute_transaction",
+				&CallData(vec![].join(&number).join(tx))
+			).unwrap();
+		}
+
+		let header = Header::from_slice(&execute(
+			backend,
+			&mut overlay,
+			&executor(),
+			"finalise_block",
+			&CallData(vec![].join(&header))
+		).unwrap()).unwrap();
+
+		(vec![].join(&Block { header, transactions }), hash)
 	}
 
-	fn block1(genesis_hash: Hash) -> (Vec<u8>, Hash) {
+	fn block1(genesis_hash: Hash, backend: &InMemory) -> (Vec<u8>, Hash) {
 		construct_block(
+			backend,
 			1,
 			genesis_hash,
 			hex!("25e5b37074063ab75c889326246640729b40d0c86932edc527bc80db0e04fe5c"),
@@ -108,7 +129,7 @@ mod tests {
 
 		let mut overlay = OverlayedChanges::default();
 		let backend = InMemory::from(storage);
-		let (b1data, _b1hash) = block1(genesis_hash);
+		let (b1data, _b1hash) = block1(genesis_hash, &backend);
 
 		let _ = execute(
 			&backend,
diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs
index 94c5dd51ac6c31b6ae0d06e50b8de8cba1469d19..78ae257603576e206b91636852a37933543c83ce 100644
--- a/substrate/executor/src/native_executor.rs
+++ b/substrate/executor/src/native_executor.rs
@@ -29,6 +29,7 @@ impl CodeExecutor for NativeExecutor {
 			runtime_std::with_externalities(ext, || match method {
 				"execute_block" => safe_call(|| runtime::execute_block(&data.0)),
 				"execute_transaction" => safe_call(|| runtime::execute_transaction(&data.0)),
+				"finalise_block" => safe_call(|| runtime::finalise_block(&data.0)),
 				_ => Err(ErrorKind::MethodNotFound(method.to_owned()).into()),
 			})
 		} else {
diff --git a/substrate/wasm-runtime/polkadot/src/lib.rs b/substrate/wasm-runtime/polkadot/src/lib.rs
index 32d026e42f4643956aa3201e10809ae1fa0479ba..2585c013b00a066bc10da69af8f663556c1eccf9 100644
--- a/substrate/wasm-runtime/polkadot/src/lib.rs
+++ b/substrate/wasm-runtime/polkadot/src/lib.rs
@@ -36,7 +36,7 @@ pub mod primitives;
 pub mod runtime;
 
 use runtime_std::prelude::*;
-use codec::Slicable;
+use codec::{Slicable, Joiner};
 use runtime_std::print;
 use primitives::{Block, Header, BlockNumber, UncheckedTransaction};
 
@@ -55,6 +55,13 @@ pub fn execute_transaction(input: &[u8]) -> Vec<u8> {
 	Vec::new()
 }
 
+/// Execute a given, serialised, transaction. Returns the empty vector.
+pub fn finalise_block(input: &[u8]) -> Vec<u8> {
+	let header = Header::from_slice(input).unwrap();
+	let header = runtime::system::internal::finalise_block(header);
+	Vec::new().join(&header)
+}
+
 /// Run whatever tests we have.
 pub fn run_tests(input: &[u8]) -> Vec<u8> {
 	print("run_tests...");
@@ -65,4 +72,4 @@ pub fn run_tests(input: &[u8]) -> Vec<u8> {
 	[stxs.len() as u8].to_vec()
 }
 
-impl_stubs!(execute_block, execute_transaction, run_tests);
+impl_stubs!(execute_block, execute_transaction, finalise_block, run_tests);
diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm
index 16c8ade8e383ac81198c7957453b3791865dee29..2ea4d55786392d88789f4558c8f01f70334b5754 100644
Binary files a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm and b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm differ
diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm
index 9aa36684060125bbb17071c326801c0143fab754..5421724eaccaf19a960da762a292ea91aadf052b 100644
Binary files a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm and b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm differ