diff --git a/substrate/core/cli/src/informant.rs b/substrate/core/cli/src/informant.rs
index dd0237b7f840bb0e64a419a00cddf3f5ec0ede02..5c60229fab1bfd6cd19a477d700f3a2580983da3 100644
--- a/substrate/core/cli/src/informant.rs
+++ b/substrate/core/cli/src/informant.rs
@@ -32,9 +32,16 @@ use runtime_primitives::generic::BlockId;
 use runtime_primitives::traits::{Header, SaturatedConversion};
 
 /// Spawn informant on the event loop
+#[deprecated(note = "Please use informant::build instead, and then create the task manually")]
 pub fn start<C>(service: &Service<C>, exit: ::exit_future::Exit, handle: TaskExecutor) where
 	C: Components,
 {
+	handle.spawn(exit.until(build(service)).map(|_| ()));
+}
+
+/// Creates an informant in the form of a `Future` that must be polled regularly.
+pub fn build<C>(service: &Service<C>) -> impl Future<Item = (), Error = ()>
+where C: Components {
 	let network = service.network();
 	let client = service.client();
 	let txpool = service.transaction_pool();
@@ -156,8 +163,8 @@ pub fn start<C>(service: &Service<C>, exit: ::exit_future::Exit, handle: TaskExe
 		Ok(())
 	});
 
-	let informant_work = display_notifications.join3(display_block_import, display_txpool_import);
-	handle.spawn(exit.until(informant_work).map(|_| ()));
+	display_notifications.join3(display_block_import, display_txpool_import)
+		.map(|((), (), ())| ())
 }
 
 fn speed(best_number: u64, last_number: Option<u64>, last_update: time::Instant) -> String {
diff --git a/substrate/node-template/src/cli.rs b/substrate/node-template/src/cli.rs
index f41674631e8a43f78104dede2d4fe30e0b8d9462..cd148f3462dce8cac7ffa981d37439967954ba3c 100644
--- a/substrate/node-template/src/cli.rs
+++ b/substrate/node-template/src/cli.rs
@@ -61,8 +61,8 @@ fn run_until_exit<T, C, E>(
 {
 	let (exit_send, exit) = exit_future::signal();
 
-	let executor = runtime.executor();
-	informant::start(&service, exit.clone(), executor.clone());
+	let informant = informant::build(&service);
+	runtime.executor().spawn(exit.until(informant).map(|_| ()));
 
 	let _ = runtime.block_on(e.into_exit());
 	exit_send.fire();
diff --git a/substrate/node/cli/src/lib.rs b/substrate/node/cli/src/lib.rs
index cbb0628a91258d7f773689eaca314a873fe54133..886c6eef772a00b4ba0d0118164c73b20ac7ca79 100644
--- a/substrate/node/cli/src/lib.rs
+++ b/substrate/node/cli/src/lib.rs
@@ -118,8 +118,8 @@ fn run_until_exit<T, C, E>(
 {
 	let (exit_send, exit) = exit_future::signal();
 
-	let executor = runtime.executor();
-	cli::informant::start(&service, exit.clone(), executor.clone());
+	let informant = cli::informant::build(&service);
+	runtime.executor().spawn(exit.until(informant).map(|_| ()));
 
 	let _ = runtime.block_on(e.into_exit());
 	exit_send.fire();