diff --git a/substrate/client/consensus/manual-seal/src/lib.rs b/substrate/client/consensus/manual-seal/src/lib.rs
index 5a1cd0f79b47ddd1b2fc2a95c8f63732aee702e3..9c4465f82fda1ef57e2e18be6ba88be05518531a 100644
--- a/substrate/client/consensus/manual-seal/src/lib.rs
+++ b/substrate/client/consensus/manual-seal/src/lib.rs
@@ -163,10 +163,10 @@ pub async fn run_manual_seal<B, BI, CB, E, C, A, SC, CS>(
 		C: HeaderBackend<B> + Finalizer<B, CB> + ProvideRuntimeApi<B> + 'static,
 		CB: ClientBackend<B> + 'static,
 		E: Environment<B> + 'static,
-		E::Error: std::fmt::Display,
-		<E::Proposer as Proposer<B>>::Error: std::fmt::Display,
+		E::Proposer: Proposer<B, Transaction = TransactionFor<C, B>>,
 		CS: Stream<Item=EngineCommand<<B as BlockT>::Hash>> + Unpin + 'static,
 		SC: SelectChain<B> + 'static,
+		TransactionFor<C, B>: 'static,
 {
 	while let Some(command) = commands_stream.next().await {
 		match command {
@@ -230,9 +230,9 @@ pub async fn run_instant_seal<B, BI, CB, E, C, A, SC>(
 		C: HeaderBackend<B> + Finalizer<B, CB> + ProvideRuntimeApi<B> + 'static,
 		CB: ClientBackend<B> + 'static,
 		E: Environment<B> + 'static,
-		E::Error: std::fmt::Display,
-		<E::Proposer as Proposer<B>>::Error: std::fmt::Display,
-		SC: SelectChain<B> + 'static
+		E::Proposer: Proposer<B, Transaction = TransactionFor<C, B>>,
+		SC: SelectChain<B> + 'static,
+		TransactionFor<C, B>: 'static,
 {
 	// instant-seal creates blocks as soon as transactions are imported
 	// into the transaction pool.
diff --git a/substrate/client/consensus/manual-seal/src/seal_block.rs b/substrate/client/consensus/manual-seal/src/seal_block.rs
index 58f017f2d41ad41396be3540828ae3c05fee5bba..a4afaa343e9052561204a60cadf731907c863c73 100644
--- a/substrate/client/consensus/manual-seal/src/seal_block.rs
+++ b/substrate/client/consensus/manual-seal/src/seal_block.rs
@@ -87,10 +87,10 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
 			+ Send + Sync + 'static,
 		C: HeaderBackend<B> + ProvideRuntimeApi<B>,
 		E: Environment<B>,
-		<E as Environment<B>>::Error: std::fmt::Display,
-		<E::Proposer as Proposer<B>>::Error: std::fmt::Display,
+		E::Proposer: Proposer<B, Transaction = TransactionFor<C, B>>,
 		P: txpool::ChainApi<Block=B>,
 		SC: SelectChain<B>,
+		TransactionFor<C, B>: 'static,
 {
 	let future = async {
 		if pool.validated_pool().status().ready == 0 && !create_empty {
@@ -111,7 +111,7 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
 		};
 
 		let proposer = env.init(&parent)
-			.map_err(|err| Error::StringError(format!("{}", err))).await?;
+			.map_err(|err| Error::StringError(format!("{:?}", err))).await?;
 		let id = inherent_data_provider.create_inherent_data()?;
 		let inherents_len = id.len();
 
@@ -122,7 +122,7 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
 		};
 
 		let proposal = proposer.propose(id.clone(), digest, Duration::from_secs(MAX_PROPOSAL_DURATION), false.into())
-			.map_err(|err| Error::StringError(format!("{}", err))).await?;
+			.map_err(|err| Error::StringError(format!("{:?}", err))).await?;
 
 		if proposal.block.extrinsics().len() == inherents_len && !create_empty {
 			return Err(Error::EmptyTransactionPool)
@@ -133,6 +133,7 @@ pub async fn seal_block<B, BI, SC, C, E, P>(
 		params.body = Some(body);
 		params.finalized = finalize;
 		params.fork_choice = Some(ForkChoiceStrategy::LongestChain);
+		params.storage_changes = Some(proposal.storage_changes);
 
 		if let Some(digest_provider) = digest_provider {
 			digest_provider.append_block_import(&parent, &mut params, &id)?;