diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs
index c774ff8601a2ce3857c6eb1c324553e1794c5a4d..cb6f5a6df3a0cc676135d56a903acbe1a36d71f9 100644
--- a/substrate/client/src/genesis.rs
+++ b/substrate/client/src/genesis.rs
@@ -71,7 +71,7 @@ mod tests {
 
 		let transaction_root = ordered_trie_root(transactions.iter().map(Slicable::to_vec)).0;
 
-		let header = Header {
+		let mut header = Header {
 			parent_hash,
 			number,
 			state_root,
@@ -83,16 +83,16 @@ mod tests {
 		let mut overlay = OverlayedChanges::default();
 
 		for tx in transactions.iter() {
-			let _ = execute(
+			header = Header::from_slice(&execute(
 				backend,
 				&mut overlay,
 				&executor(),
 				"execute_transaction",
-				&CallData(vec![].join(&number).join(tx))
-			).unwrap();
+				&CallData(vec![].join(&header).join(tx))
+			).unwrap()).unwrap();
 		}
 
-		let header = Header::from_slice(&execute(
+		header = Header::from_slice(&execute(
 			backend,
 			&mut overlay,
 			&executor(),
diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs
index 78ae257603576e206b91636852a37933543c83ce..d45efd9031dc4204450ca77bc6de1e09c0e3835f 100644
--- a/substrate/executor/src/native_executor.rs
+++ b/substrate/executor/src/native_executor.rs
@@ -44,7 +44,7 @@ mod tests {
 	use super::*;
 	use runtime_std::TestExternalities;
 	use native_runtime::codec::{KeyedVec, Joiner, Slicable};
-	use native_runtime::support::{one, two, StaticHexInto, Hashable};
+	use native_runtime::support::{one, two, Hashable};
 	use native_runtime::primitives::*;
 	use native_runtime::runtime::staking::balance;
 	use primitives::twox_128;
@@ -71,7 +71,7 @@ mod tests {
 			twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0]
 		], };
 
-		let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&1u64).join(&tx())));
+		let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx())));
 		assert!(r.is_err());
 	}
 
@@ -82,7 +82,7 @@ mod tests {
 			twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0]
 		], };
 
-		let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&1u64).join(&tx())));
+		let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx())));
 		assert!(r.is_err());
 	}
 
@@ -95,7 +95,7 @@ mod tests {
 			twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0]
 		], };
 
-		let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&1u64).join(&tx())));
+		let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx())));
 		assert!(r.is_ok());
 
 		runtime_std::with_externalities(&mut t, || {
@@ -113,7 +113,7 @@ mod tests {
 			twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0]
 		], };
 
-		let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&1u64).join(&tx())));
+		let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx())));
 		assert!(r.is_ok());
 
 		runtime_std::with_externalities(&mut t, || {
diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs
index a9e8a856476699b53becbbacadd9515eeff52755..5ab95c3648553b28302338ea1948e076aa44e620 100644
--- a/substrate/executor/src/wasm_executor.rs
+++ b/substrate/executor/src/wasm_executor.rs
@@ -293,7 +293,7 @@ mod tests {
 	use primitives::{blake2_256, twox_128};
 	use runtime_std::{self, TestExternalities};
 	use native_runtime::support::{one, two};
-	use native_runtime::primitives::{UncheckedTransaction, AccountID};
+	use native_runtime::primitives::{UncheckedTransaction, AccountID, Header};
 	use native_runtime::codec::{Joiner, KeyedVec};
 	use native_runtime::runtime::staking::balance;
 
@@ -436,7 +436,7 @@ mod tests {
 		], };
 
 		let foreign_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm");
-		let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&1u64).join(&tx())));
+		let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx())));
 		assert!(r.is_err());
 	}
 
@@ -450,7 +450,7 @@ mod tests {
 		], };
 
 		let foreign_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm");
-		let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&1u64).join(&tx())));
+		let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx())));
 		assert!(r.is_ok());
 
 		runtime_std::with_externalities(&mut t, || {
diff --git a/substrate/wasm-runtime/polkadot/src/lib.rs b/substrate/wasm-runtime/polkadot/src/lib.rs
index 2585c013b00a066bc10da69af8f663556c1eccf9..eefa6e44a875b7605cbd3eb24c59f5521d1c2262 100644
--- a/substrate/wasm-runtime/polkadot/src/lib.rs
+++ b/substrate/wasm-runtime/polkadot/src/lib.rs
@@ -38,7 +38,7 @@ pub mod runtime;
 use runtime_std::prelude::*;
 use codec::{Slicable, Joiner};
 use runtime_std::print;
-use primitives::{Block, Header, BlockNumber, UncheckedTransaction};
+use primitives::{Block, Header, UncheckedTransaction};
 
 /// Execute a block, with `input` being the canonical serialisation of the block. Returns the
 /// empty vector.
@@ -49,10 +49,10 @@ pub fn execute_block(input: &[u8]) -> Vec<u8> {
 
 /// Execute a given, serialised, transaction. Returns the empty vector.
 pub fn execute_transaction(input: &[u8]) -> Vec<u8> {
-	let number = BlockNumber::from_slice(&input[0..8]).unwrap();
-	let utx = UncheckedTransaction::from_slice(&input[8..]).unwrap();
-	runtime::system::internal::execute_transaction(&utx, Header::from_block_number(number));
-	Vec::new()
+	let header = Header::from_slice(input).unwrap();
+	let utx = UncheckedTransaction::from_slice(&input[Header::size_of(input).unwrap()..]).unwrap();
+	let header = runtime::system::internal::execute_transaction(&utx, header);
+	Vec::new().join(&header)
 }
 
 /// Execute a given, serialised, transaction. Returns the empty vector.
diff --git a/substrate/wasm-runtime/polkadot/src/primitives/digest.rs b/substrate/wasm-runtime/polkadot/src/primitives/digest.rs
index 18107460b0771b2457f1b1e23bdeeaba9788535d..5ce92774200a3308ede72e0857c2a6bd8ce5f2b0 100644
--- a/substrate/wasm-runtime/polkadot/src/primitives/digest.rs
+++ b/substrate/wasm-runtime/polkadot/src/primitives/digest.rs
@@ -18,8 +18,8 @@
 
 use runtime_std::prelude::*;
 
-#[derive(Clone, Default)]
-#[cfg_attr(feature = "with-std", derive(PartialEq, Debug))]
+#[derive(Clone, Default, PartialEq)]
+#[cfg_attr(feature = "with-std", derive(Debug))]
 /// The digest of a block, useful for light-clients.
 pub struct Digest {
 	/// All logs that have happened in the block.
diff --git a/substrate/wasm-runtime/polkadot/src/runtime/system.rs b/substrate/wasm-runtime/polkadot/src/runtime/system.rs
index e6d93e94923297e3ca0a83dc386b466ea7189356..5daf530cb4707e3604468eec03d9fce068952f3b 100644
--- a/substrate/wasm-runtime/polkadot/src/runtime/system.rs
+++ b/substrate/wasm-runtime/polkadot/src/runtime/system.rs
@@ -51,11 +51,8 @@ pub mod internal {
 	use super::*;
 
 	/// Deposits a log and ensures it matches the blocks log data.
-	pub fn deposit_log(log: &[u8]) {
-		with_env(|e| {
-			assert_eq!(log, &e.digest.logs[e.next_log_index][..]);
-			e.next_log_index += 1;
-		});
+	pub fn deposit_log(log: Vec<u8>) {
+		with_env(|e| e.digest.logs.push(log));
 	}
 
 	/// Actually execute all transitioning for `block`.
@@ -63,8 +60,6 @@ pub mod internal {
 		// populate environment from header.
 		with_env(|e| {
 			e.block_number = block.header.number;
-			mem::swap(&mut e.digest, &mut block.header.digest);
-			e.next_log_index = 0;
 		});
 
 		let ref header = block.header;
@@ -104,15 +99,19 @@ pub mod internal {
 
 	/// Execute a transaction outside of the block execution function.
 	/// This doesn't attempt to validate anything regarding the block.
-	pub fn execute_transaction(utx: &UncheckedTransaction, mut header: Header) {
+	pub fn execute_transaction(utx: &UncheckedTransaction, mut header: Header) -> Header {
 		// populate environment from header.
 		with_env(|e| {
 			e.block_number = header.number;
-			mem::swap(&mut e.digest, &mut header.digest);
-			e.next_log_index = 0;
+			mem::swap(&mut header.digest, &mut e.digest);
 		});
 
 		super::execute_transaction(utx);
+
+		with_env(|e| {
+			mem::swap(&mut header.digest, &mut e.digest);
+		});
+		header
 	}
 
 	/// Finalise the block - it is up the caller to ensure that all header fields are valid
@@ -122,6 +121,9 @@ pub mod internal {
 		session::internal::check_rotate_session();
 
 		header.state_root = storage_root();
+		with_env(|e| {
+			mem::swap(&mut header.digest, &mut e.digest);
+		});
 
 		post_finalise(&header);
 
@@ -160,7 +162,7 @@ fn execute_transaction(utx: &UncheckedTransaction) {
 
 fn final_checks(_block: &Block) {
 	with_env(|e| {
-		assert_eq!(e.next_log_index, e.digest.logs.len());
+		assert!(_block.header.digest == e.digest);
 	});
 }
 
diff --git a/substrate/wasm-runtime/polkadot/src/support/environment.rs b/substrate/wasm-runtime/polkadot/src/support/environment.rs
index 7670a4801f29a98acc853c59ba643df9866b4669..3f652530a2b3e6f9947f1b19124a33ab3736f93c 100644
--- a/substrate/wasm-runtime/polkadot/src/support/environment.rs
+++ b/substrate/wasm-runtime/polkadot/src/support/environment.rs
@@ -30,8 +30,6 @@ pub struct Environment {
 	pub block_number: BlockNumber,
 	/// The current block digest.
 	pub digest: Digest,
-	/// The number of log items in this block that have been accounted for so far.
-	pub next_log_index: usize,
 }
 
 /// Do something with the environment and return its value. Keep the function short.
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 e422068474f03a8d8b572bc08de121267e5ad904..c1b383b49ecabb9b591677c90db2cd2d68d63a4f 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 a9e9ae312077b790126526019e7b826f071ab3a1..10c2c86ab173dbdce099090ace6b7f4a2a98ca8e 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