diff --git a/substrate/core/sr-primitives/src/generic/digest.rs b/substrate/core/sr-primitives/src/generic/digest.rs
index 75ea6086b49c9c0d5f521916ec7396c9d36829cd..a946efb545220270babcf415206f9bf19385a013 100644
--- a/substrate/core/sr-primitives/src/generic/digest.rs
+++ b/substrate/core/sr-primitives/src/generic/digest.rs
@@ -108,7 +108,7 @@ impl<Hash, AuthorityId> DigestItem<Hash, AuthorityId> {
 	}
 }
 
-impl<Hash: Member, AuthorityId: Member> traits::DigestItem for DigestItem<Hash, AuthorityId> {
+impl<Hash: Codec + Member, AuthorityId: Codec + Member> traits::DigestItem for DigestItem<Hash, AuthorityId> {
 	type Hash = Hash;
 	type AuthorityId = AuthorityId;
 
diff --git a/substrate/core/sr-primitives/src/traits.rs b/substrate/core/sr-primitives/src/traits.rs
index 6691ba0b369cc06dca57b3e6c9b817046e4ca566..75a543850ff3de58dd637e0ed8a66e267fb1cec5 100644
--- a/substrate/core/sr-primitives/src/traits.rs
+++ b/substrate/core/sr-primitives/src/traits.rs
@@ -333,6 +333,24 @@ impl CheckEqual for substrate_primitives::H256 {
 	}
 }
 
+impl<I> CheckEqual for I where I: DigestItem {
+	#[cfg(feature = "std")]
+	fn check_equal(&self, other: &Self) {
+		if self != other {
+			println!("DigestItem: given={:?}, expected={:?}", self, other);
+		}
+	}
+
+	#[cfg(not(feature = "std"))]
+	fn check_equal(&self, other: &Self) {
+		if self != other {
+			runtime_io::print("DigestItem not equal");
+			runtime_io::print(&Encode::encode(self)[..]);
+			runtime_io::print(&Encode::encode(other)[..]);
+		}
+	}
+}
+
 #[cfg(feature = "std")]
 pub trait MaybeSerializeDebugButNotDeserialize: Serialize + Debug {}
 #[cfg(feature = "std")]
@@ -491,7 +509,7 @@ pub trait Digest: Member + Default {
 /// for casting member to 'system' log items, known to substrate.
 ///
 /// If the runtime does not supports some 'system' items, use `()` as a stub.
-pub trait DigestItem: Member {
+pub trait DigestItem: Codec + Member {
 	type Hash: Member;
 	type AuthorityId: Member;
 
diff --git a/substrate/srml/executive/src/lib.rs b/substrate/srml/executive/src/lib.rs
index 07fd67ff24679ac346c83e06e8c1d0a7df717307..3d1a8506133f754504dcbbd1b53bea36a11068b5 100644
--- a/substrate/srml/executive/src/lib.rs
+++ b/substrate/srml/executive/src/lib.rs
@@ -50,7 +50,7 @@ use rstd::prelude::*;
 use rstd::marker::PhantomData;
 use rstd::result;
 use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalise,
-	MakePayment, Hash, As};
+	MakePayment, Hash, As, Digest};
 use runtime_support::Dispatchable;
 use codec::{Codec, Encode};
 use system::extrinsics_root;
@@ -204,10 +204,17 @@ impl<
 		// remove temporaries.
 		let new_header = <system::Module<System>>::finalise();
 
-		// check digest. uncomment next two lines to figure out next digest hash for tests.
-//		runtime_io::print(&header.digest().encode()[..]);
-//		runtime_io::print(&new_header.digest().encode()[..]);
-		assert!(header.digest() == new_header.digest());
+		// check digest.
+		assert_eq!(
+			header.digest().logs().len(),
+			new_header.digest().logs().len(),
+			"Number of digest items must match that calculated."
+		);
+		let items_zip = header.digest().logs().iter().zip(new_header.digest().logs().iter());
+		for (header_item, computed_item) in items_zip {
+			header_item.check_equal(&computed_item);
+			assert!(header_item == computed_item, "Digest item must match that calculated.");
+		}
 
 		// check storage root.
 		let storage_root = System::Hashing::storage_root();