diff --git a/cumulus/consensus/src/lib.rs b/cumulus/consensus/src/lib.rs
index 45e68ab661..bc5c2b117f 100644
--- a/cumulus/consensus/src/lib.rs
+++ b/cumulus/consensus/src/lib.rs
@@ -14,19 +14,26 @@
// You should have received a copy of the GNU General Public License
// along with Cumulus. If not, see .
-use substrate_client::{backend::{Backend, Finalizer}, CallExecutor, Client, BlockchainEvents};
-use substrate_client::error::{Error as ClientError, Result as ClientResult};
+use substrate_client::{
+ backend::{Backend, Finalizer}, CallExecutor, Client, BlockchainEvents,
+ error::{Error as ClientError, Result as ClientResult},
+};
use substrate_primitives::{Blake2Hasher, H256};
-use sr_primitives::generic::BlockId;
-use sr_primitives::traits::{Block as BlockT, Header as HeaderT, ProvideRuntimeApi};
-use polkadot_primitives::{Hash as PHash, Block as PBlock};
-use polkadot_primitives::parachain::{Id as ParaId, ParachainHost};
+use sr_primitives::{
+ generic::BlockId,
+ traits::{Block as BlockT, Header as HeaderT, ProvideRuntimeApi},
+};
+use substrate_consensus_common::{Error as ConsensusError, SelectChain as SelectChainT};
+
+use polkadot_primitives::{
+ Hash as PHash, Block as PBlock, parachain::{Id as ParaId, ParachainHost},
+};
use futures::{Stream, StreamExt, TryStreamExt, future, Future, TryFutureExt, FutureExt};
-use codec::{Encode, Decode};
+use codec::Decode;
use log::warn;
-use std::sync::Arc;
+use std::{sync::Arc, marker::PhantomData};
/// Helper for the local client.
pub trait LocalClient {
@@ -66,6 +73,13 @@ pub trait PolkadotClient: Clone {
/// Get a stream of finalized heads.
fn finalized_heads(&self, para_id: ParaId) -> ClientResult;
+
+ /// Returns the parachain head for the given `para_id` at the given block id.
+ fn parachain_head_at(
+ &self,
+ at: &BlockId,
+ para_id: ParaId,
+ ) -> ClientResult