diff --git a/substrate/core/consensus/aura/src/lib.rs b/substrate/core/consensus/aura/src/lib.rs
index 7355119074eba88b7f51fc8cf24fb5ee90a026a7..cb4a24de3e5894df378f89073a07bfc6c41817ea 100644
--- a/substrate/core/consensus/aura/src/lib.rs
+++ b/substrate/core/consensus/aura/src/lib.rs
@@ -464,6 +464,7 @@ mod tests {
 
 	impl TestNetFactory for AuraTestNet {
 		type Verifier = AuraVerifier<PeersClient>;
+		type PeerData = ();
 
 		/// Create new test network with peers and given config.
 		fn from_config(_config: &ProtocolConfig) -> Self {
@@ -480,15 +481,15 @@ mod tests {
 			Arc::new(AuraVerifier { client, config })
 		}
 
-		fn peer(&self, i: usize) -> &Peer<Self::Verifier> {
+		fn peer(&self, i: usize) -> &Peer<Self::Verifier, ()> {
 			&self.peers[i]
 		}
 
-		fn peers(&self) -> &Vec<Arc<Peer<Self::Verifier>>> {
+		fn peers(&self) -> &Vec<Arc<Peer<Self::Verifier, ()>>> {
 			&self.peers
 		}
 
-		fn mut_peers<F: Fn(&mut Vec<Arc<Peer<Self::Verifier>>>)>(&mut self, closure: F ) {
+		fn mut_peers<F: Fn(&mut Vec<Arc<Peer<Self::Verifier, ()>>>)>(&mut self, closure: F) {
 			closure(&mut self.peers);
 		}
 
diff --git a/substrate/core/network/src/test/mod.rs b/substrate/core/network/src/test/mod.rs
index b852ceab80e69be5f67c83efc175ca33129396ba..735f6c0c134558a9eec3c652f3847f93a6988ec9 100644
--- a/substrate/core/network/src/test/mod.rs
+++ b/substrate/core/network/src/test/mod.rs
@@ -140,23 +140,26 @@ pub struct TestPacket {
 
 pub type PeersClient = client::Client<test_client::Backend, test_client::Executor, Block>;
 
-pub struct Peer<V: Verifier<Block>> {
+pub struct Peer<V: Verifier<Block>, D> {
 	client: Arc<PeersClient>,
 	pub sync: Arc<Protocol<Block, DummySpecialization, Hash>>,
 	pub queue: Arc<RwLock<VecDeque<TestPacket>>>,
 	import_queue: Arc<SyncImportQueue<Block, V>>,
 	executor: Arc<DummyContextExecutor>,
+	/// Some custom data set up at initialization time.
+	pub data: D,
 }
 
-impl<V: 'static + Verifier<Block>> Peer<V> {
+impl<V: 'static + Verifier<Block>, D> Peer<V, D> {
 	fn new(
 		client: Arc<PeersClient>,
 		sync: Arc<Protocol<Block, DummySpecialization, Hash>>,
 		queue: Arc<RwLock<VecDeque<TestPacket>>>,
 		import_queue: Arc<SyncImportQueue<Block, V>>,
+		data: D,
 	) -> Self {
 		let executor = Arc::new(DummyContextExecutor(sync.clone(), queue.clone()));
-		Peer { client, sync, queue, import_queue, executor}
+		Peer { client, sync, queue, import_queue, executor, data }
 	}
 	/// Called after blockchain has been populated to updated current state.
 	fn start(&self) {
@@ -311,6 +314,7 @@ impl TransactionPool<Hash, Block> for EmptyTransactionPool {
 
 pub trait TestNetFactory: Sized {
 	type Verifier: 'static + Verifier<Block>;
+	type PeerData: Default;
 
 	/// These two need to be implemented!
 	fn from_config(config: &ProtocolConfig) -> Self;
@@ -318,16 +322,18 @@ pub trait TestNetFactory: Sized {
 
 
 	/// Get reference to peer.
-	fn peer(&self, i: usize) -> &Peer<Self::Verifier>;
-	fn peers(&self) -> &Vec<Arc<Peer<Self::Verifier>>>;
-	fn mut_peers<F: Fn(&mut Vec<Arc<Peer<Self::Verifier>>>)>(&mut self, closure: F );
+	fn peer(&self, i: usize) -> &Peer<Self::Verifier, Self::PeerData>;
+	fn peers(&self) -> &Vec<Arc<Peer<Self::Verifier, Self::PeerData>>>;
+	fn mut_peers<F: Fn(&mut Vec<Arc<Peer<Self::Verifier, Self::PeerData>>>)>(&mut self, closure: F );
 
 	fn started(&self) -> bool;
 	fn set_started(&mut self, now: bool);
 
-	/// Get custom block import handle for fresh client.
-	fn make_block_import(&self, client: Arc<PeersClient>) -> Arc<BlockImport<Block,Error=ClientError> + Send + Sync> {
-		client
+	/// Get custom block import handle for fresh client, along with peer data.
+	fn make_block_import(&self, client: Arc<PeersClient>)
+		-> (Arc<BlockImport<Block,Error=ClientError> + Send + Sync>, Self::PeerData)
+	{
+		(client, Default::default())
 	}
 
 	fn default_config() -> ProtocolConfig {
@@ -350,7 +356,7 @@ pub trait TestNetFactory: Sized {
 		let client = Arc::new(test_client::new());
 		let tx_pool = Arc::new(EmptyTransactionPool);
 		let verifier = self.make_verifier(client.clone(), config);
-		let block_import = self.make_block_import(client.clone());
+		let (block_import, data) = self.make_block_import(client.clone());
 
 		let import_queue = Arc::new(SyncImportQueue::new(verifier, block_import));
 		let specialization = DummySpecialization {
@@ -369,7 +375,8 @@ pub trait TestNetFactory: Sized {
 			client,
 			Arc::new(sync),
 			Arc::new(RwLock::new(VecDeque::new())),
-			import_queue
+			import_queue,
+			data,
 		));
 
 		self.mut_peers(|peers| {
@@ -479,12 +486,13 @@ pub trait TestNetFactory: Sized {
 }
 
 pub struct TestNet {
-	peers: Vec<Arc<Peer<PassThroughVerifier>>>,
+	peers: Vec<Arc<Peer<PassThroughVerifier, ()>>>,
 	started: bool
 }
 
 impl TestNetFactory for TestNet {
 	type Verifier = PassThroughVerifier;
+	type PeerData = ();
 
 	/// Create new test network with peers and given config.
 	fn from_config(_config: &ProtocolConfig) -> Self {
@@ -500,15 +508,15 @@ impl TestNetFactory for TestNet {
 		Arc::new(PassThroughVerifier(false))
 	}
 
-	fn peer(&self, i: usize) -> &Peer<Self::Verifier> {
+	fn peer(&self, i: usize) -> &Peer<Self::Verifier, ()> {
 		&self.peers[i]
 	}
 
-	fn peers(&self) -> &Vec<Arc<Peer<Self::Verifier>>> {
+	fn peers(&self) -> &Vec<Arc<Peer<Self::Verifier, ()>>> {
 		&self.peers
 	}
 
-	fn mut_peers<F: Fn(&mut Vec<Arc<Peer<Self::Verifier>>>)>(&mut self, closure: F ) {
+	fn mut_peers<F: Fn(&mut Vec<Arc<Peer<Self::Verifier, ()>>>)>(&mut self, closure: F ) {
 		closure(&mut self.peers);
 	}
 
diff --git a/substrate/core/service/src/lib.rs b/substrate/core/service/src/lib.rs
index 9e7c201e8f05724c7fdb2f22007e2e96ac5a5e6c..126548644936d7b385822d73240677b732d54889 100644
--- a/substrate/core/service/src/lib.rs
+++ b/substrate/core/service/src/lib.rs
@@ -528,8 +528,8 @@ macro_rules! construct_simple_service {
 ///         // The first one is for the initializing the full import queue and the second for the
 ///         // light import queue.
 /// 		ImportQueue = BasicQueue<Block, NoneVerifier>
-/// 			{ |_, _| Ok(BasicQueue::new(Arc::new(NoneVerifier {}))) }
-/// 			{ |_, _| Ok(BasicQueue::new(Arc::new(NoneVerifier {}))) },
+/// 			{ |_, client| Ok(BasicQueue::new(Arc::new(NoneVerifier {}, client))) }
+/// 			{ |_, client| Ok(BasicQueue::new(Arc::new(NoneVerifier {}, client))) },
 /// 	}
 /// }
 /// ```