From 0e0760d56caa7a3e34c61747a28ec0a4ce72cbec Mon Sep 17 00:00:00 2001
From: Seun Lanlege <seunlanlege@gmail.com>
Date: Tue, 28 Apr 2020 15:20:47 +0100
Subject: [PATCH] Drop sc-client (#1037)

* WIP

* collator

* fix missing reference

* Make collator builder more generic

* all clear

* revert start colator fn

* fix return type of start_collator

* sc-consensus

* bump back to master

* Update collator/src/lib.rs

Co-Authored-By: Benjamin Kampmann <ben@gnunicorn.org>

* Update collator/src/lib.rs

Co-Authored-By: Pierre Krieger <pierre.krieger1708@gmail.com>

* uncomment type MaxIterations

* reactivate append storage feature

Co-authored-by: Benjamin Kampmann <ben@gnunicorn.org>
Co-authored-by: Pierre Krieger <pierre.krieger1708@gmail.com>
---
 polkadot/Cargo.lock                           | 351 ++++---
 polkadot/availability-store/Cargo.toml        |   1 -
 polkadot/cli/Cargo.toml                       |   1 -
 polkadot/cli/src/command.rs                   | 120 +--
 polkadot/collator/Cargo.toml                  |   3 +-
 polkadot/collator/src/lib.rs                  | 127 +--
 polkadot/network/Cargo.toml                   |   1 -
 polkadot/network/test/Cargo.toml              |   3 +-
 polkadot/network/test/src/lib.rs              |  19 +-
 .../test-parachains/adder/collator/Cargo.toml |   1 -
 .../adder/collator/src/main.rs                |   4 +-
 polkadot/rpc/Cargo.toml                       |   3 +-
 polkadot/rpc/src/lib.rs                       |  10 +-
 .../runtime/test-runtime/client/Cargo.toml    |   3 +-
 .../runtime/test-runtime/client/src/lib.rs    |  49 +-
 polkadot/service/Cargo.toml                   |   3 +-
 polkadot/service/src/chain_spec.rs            |   4 +-
 polkadot/service/src/lib.rs                   | 862 +++++++++---------
 18 files changed, 759 insertions(+), 806 deletions(-)

diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock
index 043d46bdffa..a530c6e83f3 100644
--- a/polkadot/Cargo.lock
+++ b/polkadot/Cargo.lock
@@ -1227,7 +1227,7 @@ checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
 [[package]]
 name = "fork-tree"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
 ]
@@ -1235,7 +1235,7 @@ dependencies = [
 [[package]]
 name = "frame-benchmarking"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -1252,12 +1252,11 @@ dependencies = [
 [[package]]
 name = "frame-benchmarking-cli"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "parity-scale-codec",
  "sc-cli",
- "sc-client",
  "sc-client-db",
  "sc-executor",
  "sc-service",
@@ -1271,7 +1270,7 @@ dependencies = [
 [[package]]
 name = "frame-executive"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -1286,7 +1285,7 @@ dependencies = [
 [[package]]
 name = "frame-metadata"
 version = "11.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "serde",
@@ -1297,7 +1296,7 @@ dependencies = [
 [[package]]
 name = "frame-support"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "bitmask",
  "frame-metadata",
@@ -1321,7 +1320,7 @@ dependencies = [
 [[package]]
 name = "frame-support-procedural"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support-procedural-tools",
  "proc-macro2 1.0.10",
@@ -1332,7 +1331,7 @@ dependencies = [
 [[package]]
 name = "frame-support-procedural-tools"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support-procedural-tools-derive",
  "proc-macro-crate",
@@ -1344,7 +1343,7 @@ dependencies = [
 [[package]]
 name = "frame-support-procedural-tools-derive"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "proc-macro2 1.0.10",
  "quote 1.0.3",
@@ -1354,7 +1353,7 @@ dependencies = [
 [[package]]
 name = "frame-system"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "impl-trait-for-tuples",
@@ -1370,7 +1369,7 @@ dependencies = [
 [[package]]
 name = "frame-system-rpc-runtime-api"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "sp-api",
@@ -3260,7 +3259,7 @@ dependencies = [
 [[package]]
 name = "pallet-authority-discovery"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3278,7 +3277,7 @@ dependencies = [
 [[package]]
 name = "pallet-authorship"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3295,7 +3294,7 @@ dependencies = [
 [[package]]
 name = "pallet-babe"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3316,7 +3315,7 @@ dependencies = [
 [[package]]
 name = "pallet-balances"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3331,7 +3330,7 @@ dependencies = [
 [[package]]
 name = "pallet-collective"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3347,7 +3346,7 @@ dependencies = [
 [[package]]
 name = "pallet-democracy"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3362,7 +3361,7 @@ dependencies = [
 [[package]]
 name = "pallet-elections-phragmen"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3376,7 +3375,7 @@ dependencies = [
 [[package]]
 name = "pallet-finality-tracker"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3392,7 +3391,7 @@ dependencies = [
 [[package]]
 name = "pallet-grandpa"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3410,7 +3409,7 @@ dependencies = [
 [[package]]
 name = "pallet-identity"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "enumflags2",
  "frame-benchmarking",
@@ -3426,7 +3425,7 @@ dependencies = [
 [[package]]
 name = "pallet-im-online"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3446,7 +3445,7 @@ dependencies = [
 [[package]]
 name = "pallet-indices"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3462,7 +3461,7 @@ dependencies = [
 [[package]]
 name = "pallet-membership"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3476,7 +3475,7 @@ dependencies = [
 [[package]]
 name = "pallet-nicks"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3490,7 +3489,7 @@ dependencies = [
 [[package]]
 name = "pallet-offences"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3505,7 +3504,7 @@ dependencies = [
 [[package]]
 name = "pallet-offences-benchmarking"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3524,7 +3523,7 @@ dependencies = [
 [[package]]
 name = "pallet-randomness-collective-flip"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3537,7 +3536,7 @@ dependencies = [
 [[package]]
 name = "pallet-recovery"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "enumflags2",
  "frame-support",
@@ -3552,7 +3551,7 @@ dependencies = [
 [[package]]
 name = "pallet-scheduler"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3567,7 +3566,7 @@ dependencies = [
 [[package]]
 name = "pallet-session"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3585,7 +3584,7 @@ dependencies = [
 [[package]]
 name = "pallet-session-benchmarking"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3599,7 +3598,7 @@ dependencies = [
 [[package]]
 name = "pallet-society"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3614,7 +3613,7 @@ dependencies = [
 [[package]]
 name = "pallet-staking"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3637,7 +3636,7 @@ dependencies = [
 [[package]]
 name = "pallet-staking-reward-curve"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2 1.0.10",
@@ -3648,7 +3647,7 @@ dependencies = [
 [[package]]
 name = "pallet-sudo"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3662,7 +3661,7 @@ dependencies = [
 [[package]]
 name = "pallet-timestamp"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3680,7 +3679,7 @@ dependencies = [
 [[package]]
 name = "pallet-transaction-payment"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "frame-system",
@@ -3693,7 +3692,7 @@ dependencies = [
 [[package]]
 name = "pallet-transaction-payment-rpc"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "jsonrpc-core",
  "jsonrpc-core-client",
@@ -3711,7 +3710,7 @@ dependencies = [
 [[package]]
 name = "pallet-transaction-payment-rpc-runtime-api"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-support",
  "parity-scale-codec",
@@ -3724,7 +3723,7 @@ dependencies = [
 [[package]]
 name = "pallet-treasury"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3739,7 +3738,7 @@ dependencies = [
 [[package]]
 name = "pallet-utility"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-benchmarking",
  "frame-support",
@@ -3755,7 +3754,7 @@ dependencies = [
 [[package]]
 name = "pallet-vesting"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "enumflags2",
  "frame-benchmarking",
@@ -4091,7 +4090,6 @@ dependencies = [
  "parking_lot 0.9.0",
  "polkadot-erasure-coding",
  "polkadot-primitives",
- "sc-client",
  "sc-client-api",
  "sc-keystore",
  "sc-network",
@@ -4112,7 +4110,6 @@ dependencies = [
  "log 0.4.8",
  "polkadot-service",
  "sc-cli",
- "sc-client",
  "sc-client-api",
  "sc-client-db",
  "sc-executor",
@@ -4142,9 +4139,10 @@ dependencies = [
  "polkadot-service",
  "polkadot-validation",
  "sc-cli",
- "sc-client",
  "sc-client-api",
+ "sc-executor",
  "sc-network",
+ "sc-service",
  "sp-api",
  "sp-blockchain",
  "sp-consensus",
@@ -4183,7 +4181,6 @@ dependencies = [
  "polkadot-erasure-coding",
  "polkadot-primitives",
  "polkadot-validation",
- "sc-client",
  "sc-network",
  "sc-network-gossip",
  "sp-api",
@@ -4205,10 +4202,11 @@ dependencies = [
  "polkadot-test-runtime-client",
  "rand 0.7.3",
  "sc-block-builder",
- "sc-client",
  "sc-client-api",
+ "sc-consensus",
  "sc-network",
  "sc-network-test",
+ "sc-service",
  "sp-blockchain",
  "sp-consensus",
  "sp-core",
@@ -4263,9 +4261,10 @@ dependencies = [
  "pallet-transaction-payment-rpc",
  "parity-scale-codec",
  "polkadot-primitives",
- "sc-client",
+ "sc-client-api",
  "sc-rpc",
  "sp-api",
+ "sp-blockchain",
  "sp-runtime",
  "sp-transaction-pool",
  "substrate-frame-rpc-system",
@@ -4408,9 +4407,9 @@ dependencies = [
  "sc-authority-discovery",
  "sc-block-builder",
  "sc-chain-spec",
- "sc-client",
  "sc-client-api",
  "sc-client-db",
+ "sc-consensus",
  "sc-consensus-babe",
  "sc-executor",
  "sc-finality-grandpa",
@@ -4514,8 +4513,9 @@ dependencies = [
  "polkadot-runtime-common",
  "polkadot-test-runtime",
  "sc-block-builder",
- "sc-client",
  "sc-client-api",
+ "sc-consensus",
+ "sc-service",
  "sp-api",
  "sp-blockchain",
  "sp-core",
@@ -5280,7 +5280,7 @@ dependencies = [
 [[package]]
 name = "sc-authority-discovery"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "bytes 0.5.4",
  "derive_more 0.99.5",
@@ -5307,7 +5307,7 @@ dependencies = [
 [[package]]
 name = "sc-block-builder"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "sc-client-api",
@@ -5323,7 +5323,7 @@ dependencies = [
 [[package]]
 name = "sc-chain-spec"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "impl-trait-for-tuples",
  "sc-chain-spec-derive",
@@ -5339,7 +5339,7 @@ dependencies = [
 [[package]]
 name = "sc-chain-spec-derive"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2 1.0.10",
@@ -5350,7 +5350,7 @@ dependencies = [
 [[package]]
 name = "sc-cli"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "ansi_term 0.12.1",
  "app_dirs",
@@ -5389,47 +5389,10 @@ dependencies = [
  "tokio 0.2.19",
 ]
 
-[[package]]
-name = "sc-client"
-version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
-dependencies = [
- "derive_more 0.99.5",
- "fnv",
- "futures 0.3.4",
- "hash-db",
- "hex-literal",
- "kvdb",
- "log 0.4.8",
- "parity-scale-codec",
- "parking_lot 0.10.2",
- "rand 0.7.3",
- "sc-block-builder",
- "sc-client-api",
- "sc-executor",
- "sc-telemetry",
- "sp-api",
- "sp-blockchain",
- "sp-consensus",
- "sp-core",
- "sp-database",
- "sp-externalities",
- "sp-inherents",
- "sp-keyring",
- "sp-runtime",
- "sp-state-machine",
- "sp-std",
- "sp-trie",
- "sp-utils",
- "sp-version",
- "substrate-prometheus-endpoint",
- "tracing",
-]
-
 [[package]]
 name = "sc-client-api"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "fnv",
@@ -5447,6 +5410,7 @@ dependencies = [
  "sp-blockchain",
  "sp-consensus",
  "sp-core",
+ "sp-database",
  "sp-externalities",
  "sp-inherents",
  "sp-keyring",
@@ -5464,7 +5428,7 @@ dependencies = [
 [[package]]
 name = "sc-client-db"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "blake2-rfc",
  "hash-db",
@@ -5477,7 +5441,6 @@ dependencies = [
  "parity-scale-codec",
  "parity-util-mem",
  "parking_lot 0.10.2",
- "sc-client",
  "sc-client-api",
  "sc-executor",
  "sc-state-db",
@@ -5491,10 +5454,21 @@ dependencies = [
  "substrate-prometheus-endpoint",
 ]
 
+[[package]]
+name = "sc-consensus"
+version = "0.8.0-dev"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
+dependencies = [
+ "sc-client-api",
+ "sp-blockchain",
+ "sp-consensus",
+ "sp-runtime",
+]
+
 [[package]]
 name = "sc-consensus-babe"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "fork-tree",
@@ -5509,7 +5483,6 @@ dependencies = [
  "parking_lot 0.10.2",
  "pdqselect",
  "rand 0.7.3",
- "sc-client",
  "sc-client-api",
  "sc-consensus-epochs",
  "sc-consensus-slots",
@@ -5536,7 +5509,7 @@ dependencies = [
 [[package]]
 name = "sc-consensus-epochs"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "fork-tree",
  "parity-scale-codec",
@@ -5549,7 +5522,7 @@ dependencies = [
 [[package]]
 name = "sc-consensus-slots"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "futures 0.3.4",
  "futures-timer 3.0.2",
@@ -5570,7 +5543,7 @@ dependencies = [
 [[package]]
 name = "sc-consensus-uncles"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "log 0.4.8",
  "sc-client-api",
@@ -5584,7 +5557,7 @@ dependencies = [
 [[package]]
 name = "sc-executor"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "lazy_static",
@@ -5612,7 +5585,7 @@ dependencies = [
 [[package]]
 name = "sc-executor-common"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "log 0.4.8",
@@ -5629,7 +5602,7 @@ dependencies = [
 [[package]]
 name = "sc-executor-wasmi"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "log 0.4.8",
  "parity-scale-codec",
@@ -5644,7 +5617,7 @@ dependencies = [
 [[package]]
 name = "sc-executor-wasmtime"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "cranelift-codegen",
  "cranelift-wasm",
@@ -5665,7 +5638,7 @@ dependencies = [
 [[package]]
 name = "sc-finality-grandpa"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "assert_matches",
  "finality-grandpa",
@@ -5678,8 +5651,8 @@ dependencies = [
  "pin-project",
  "rand 0.7.3",
  "sc-block-builder",
- "sc-client",
  "sc-client-api",
+ "sc-consensus",
  "sc-keystore",
  "sc-network",
  "sc-network-gossip",
@@ -5701,7 +5674,7 @@ dependencies = [
 [[package]]
 name = "sc-informant"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "ansi_term 0.12.1",
  "futures 0.3.4",
@@ -5718,7 +5691,7 @@ dependencies = [
 [[package]]
 name = "sc-keystore"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "hex",
@@ -5733,7 +5706,7 @@ dependencies = [
 [[package]]
 name = "sc-network"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "bitflags",
  "bytes 0.5.4",
@@ -5760,7 +5733,6 @@ dependencies = [
  "prost-build",
  "rand 0.7.3",
  "sc-block-builder",
- "sc-client",
  "sc-client-api",
  "sc-peerset",
  "serde",
@@ -5786,7 +5758,7 @@ dependencies = [
 [[package]]
 name = "sc-network-gossip"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "futures 0.3.4",
  "futures-timer 3.0.2",
@@ -5802,7 +5774,7 @@ dependencies = [
 [[package]]
 name = "sc-network-test"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "env_logger 0.7.1",
  "futures 0.3.4",
@@ -5812,9 +5784,10 @@ dependencies = [
  "parking_lot 0.10.2",
  "rand 0.7.3",
  "sc-block-builder",
- "sc-client",
  "sc-client-api",
+ "sc-consensus",
  "sc-network",
+ "sc-service",
  "sp-blockchain",
  "sp-consensus",
  "sp-consensus-babe",
@@ -5828,7 +5801,7 @@ dependencies = [
 [[package]]
 name = "sc-offchain"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "bytes 0.5.4",
  "fnv",
@@ -5855,7 +5828,7 @@ dependencies = [
 [[package]]
 name = "sc-peerset"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "futures 0.3.4",
  "libp2p",
@@ -5868,7 +5841,7 @@ dependencies = [
 [[package]]
 name = "sc-rpc"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "futures 0.3.4",
  "hash-db",
@@ -5878,7 +5851,6 @@ dependencies = [
  "parity-scale-codec",
  "parking_lot 0.10.2",
  "sc-block-builder",
- "sc-client",
  "sc-client-api",
  "sc-executor",
  "sc-keystore",
@@ -5901,7 +5873,7 @@ dependencies = [
 [[package]]
 name = "sc-rpc-api"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "futures 0.3.4",
@@ -5925,7 +5897,7 @@ dependencies = [
 [[package]]
 name = "sc-rpc-server"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "jsonrpc-core",
  "jsonrpc-http-server",
@@ -5940,13 +5912,14 @@ dependencies = [
 [[package]]
 name = "sc-service"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "exit-future",
  "futures 0.1.29",
  "futures 0.3.4",
  "futures-timer 3.0.2",
+ "hash-db",
  "lazy_static",
  "log 0.4.8",
  "netstat2",
@@ -5956,8 +5929,9 @@ dependencies = [
  "parking_lot 0.10.2",
  "pin-project",
  "procfs",
+ "rand 0.7.3",
+ "sc-block-builder",
  "sc-chain-spec",
- "sc-client",
  "sc-client-api",
  "sc-client-db",
  "sc-executor",
@@ -5974,14 +5948,19 @@ dependencies = [
  "slog",
  "sp-api",
  "sp-application-crypto",
+ "sp-block-builder",
  "sp-blockchain",
  "sp-consensus",
  "sp-core",
+ "sp-externalities",
  "sp-io",
  "sp-runtime",
  "sp-session",
+ "sp-state-machine",
  "sp-transaction-pool",
+ "sp-trie",
  "sp-utils",
+ "sp-version",
  "substrate-prometheus-endpoint",
  "sysinfo",
  "tracing",
@@ -5991,7 +5970,7 @@ dependencies = [
 [[package]]
 name = "sc-state-db"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "log 0.4.8",
  "parity-scale-codec",
@@ -6005,7 +5984,7 @@ dependencies = [
 [[package]]
 name = "sc-telemetry"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "bytes 0.5.4",
  "futures 0.3.4",
@@ -6027,7 +6006,7 @@ dependencies = [
 [[package]]
 name = "sc-tracing"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "erased-serde",
  "log 0.4.8",
@@ -6042,7 +6021,7 @@ dependencies = [
 [[package]]
 name = "sc-transaction-graph"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "futures 0.3.4",
@@ -6062,7 +6041,7 @@ dependencies = [
 [[package]]
 name = "sc-transaction-pool"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "futures 0.3.4",
@@ -6447,7 +6426,7 @@ dependencies = [
 [[package]]
 name = "sp-allocator"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "log 0.4.8",
@@ -6459,7 +6438,7 @@ dependencies = [
 [[package]]
 name = "sp-api"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "hash-db",
  "parity-scale-codec",
@@ -6474,7 +6453,7 @@ dependencies = [
 [[package]]
 name = "sp-api-proc-macro"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "blake2-rfc",
  "proc-macro-crate",
@@ -6486,7 +6465,7 @@ dependencies = [
 [[package]]
 name = "sp-application-crypto"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "serde",
@@ -6498,7 +6477,7 @@ dependencies = [
 [[package]]
 name = "sp-arithmetic"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "integer-sqrt",
  "num-traits 0.2.11",
@@ -6512,7 +6491,7 @@ dependencies = [
 [[package]]
 name = "sp-authority-discovery"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "sp-api",
@@ -6524,7 +6503,7 @@ dependencies = [
 [[package]]
 name = "sp-authorship"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "sp-inherents",
@@ -6535,7 +6514,7 @@ dependencies = [
 [[package]]
 name = "sp-block-builder"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "sp-api",
@@ -6547,7 +6526,7 @@ dependencies = [
 [[package]]
 name = "sp-blockchain"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "log 0.4.8",
@@ -6563,7 +6542,7 @@ dependencies = [
 [[package]]
 name = "sp-chain-spec"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "serde",
  "serde_json",
@@ -6572,7 +6551,7 @@ dependencies = [
 [[package]]
 name = "sp-consensus"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "futures 0.3.4",
@@ -6595,7 +6574,7 @@ dependencies = [
 [[package]]
 name = "sp-consensus-aura"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "sp-api",
@@ -6609,7 +6588,7 @@ dependencies = [
 [[package]]
 name = "sp-consensus-babe"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "sp-api",
@@ -6625,7 +6604,7 @@ dependencies = [
 [[package]]
 name = "sp-consensus-vrf"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "schnorrkel",
@@ -6637,7 +6616,7 @@ dependencies = [
 [[package]]
 name = "sp-core"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "base58",
  "blake2-rfc",
@@ -6678,7 +6657,7 @@ dependencies = [
 [[package]]
 name = "sp-database"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "kvdb",
  "parking_lot 0.10.2",
@@ -6687,7 +6666,7 @@ dependencies = [
 [[package]]
 name = "sp-debug-derive"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "proc-macro2 1.0.10",
  "quote 1.0.3",
@@ -6697,7 +6676,7 @@ dependencies = [
 [[package]]
 name = "sp-externalities"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "environmental",
  "parity-scale-codec",
@@ -6708,7 +6687,7 @@ dependencies = [
 [[package]]
 name = "sp-finality-grandpa"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "serde",
@@ -6721,7 +6700,7 @@ dependencies = [
 [[package]]
 name = "sp-finality-tracker"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "sp-inherents",
@@ -6731,7 +6710,7 @@ dependencies = [
 [[package]]
 name = "sp-inherents"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "parity-scale-codec",
@@ -6743,7 +6722,7 @@ dependencies = [
 [[package]]
 name = "sp-io"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "futures 0.3.4",
  "hash-db",
@@ -6763,7 +6742,7 @@ dependencies = [
 [[package]]
 name = "sp-keyring"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "lazy_static",
  "sp-core",
@@ -6774,7 +6753,7 @@ dependencies = [
 [[package]]
 name = "sp-offchain"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "sp-api",
  "sp-core",
@@ -6784,7 +6763,7 @@ dependencies = [
 [[package]]
 name = "sp-panic-handler"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "backtrace",
  "log 0.4.8",
@@ -6793,7 +6772,7 @@ dependencies = [
 [[package]]
 name = "sp-phragmen"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "serde",
@@ -6805,7 +6784,7 @@ dependencies = [
 [[package]]
 name = "sp-phragmen-compact"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2 1.0.10",
@@ -6816,7 +6795,7 @@ dependencies = [
 [[package]]
 name = "sp-rpc"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "serde",
  "sp-core",
@@ -6825,7 +6804,7 @@ dependencies = [
 [[package]]
 name = "sp-runtime"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "hash256-std-hasher",
  "impl-trait-for-tuples",
@@ -6846,7 +6825,7 @@ dependencies = [
 [[package]]
 name = "sp-runtime-interface"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "primitive-types",
@@ -6861,7 +6840,7 @@ dependencies = [
 [[package]]
 name = "sp-runtime-interface-proc-macro"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "Inflector",
  "proc-macro-crate",
@@ -6873,7 +6852,7 @@ dependencies = [
 [[package]]
 name = "sp-serializer"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "serde",
  "serde_json",
@@ -6882,7 +6861,7 @@ dependencies = [
 [[package]]
 name = "sp-session"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "sp-api",
  "sp-core",
@@ -6893,7 +6872,7 @@ dependencies = [
 [[package]]
 name = "sp-staking"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "parity-scale-codec",
  "sp-runtime",
@@ -6903,7 +6882,7 @@ dependencies = [
 [[package]]
 name = "sp-state-machine"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "hash-db",
  "log 0.4.8",
@@ -6922,12 +6901,12 @@ dependencies = [
 [[package]]
 name = "sp-std"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 
 [[package]]
 name = "sp-storage"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "impl-serde 0.2.3",
  "ref-cast",
@@ -6939,7 +6918,7 @@ dependencies = [
 [[package]]
 name = "sp-timestamp"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "impl-trait-for-tuples",
  "parity-scale-codec",
@@ -6953,7 +6932,7 @@ dependencies = [
 [[package]]
 name = "sp-tracing"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "tracing",
 ]
@@ -6961,7 +6940,7 @@ dependencies = [
 [[package]]
 name = "sp-transaction-pool"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "derive_more 0.99.5",
  "futures 0.3.4",
@@ -6976,7 +6955,7 @@ dependencies = [
 [[package]]
 name = "sp-trie"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "hash-db",
  "memory-db",
@@ -6990,7 +6969,7 @@ dependencies = [
 [[package]]
 name = "sp-utils"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "futures 0.3.4",
  "futures-core",
@@ -7001,7 +6980,7 @@ dependencies = [
 [[package]]
 name = "sp-version"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "impl-serde 0.2.3",
  "parity-scale-codec",
@@ -7013,7 +6992,7 @@ dependencies = [
 [[package]]
 name = "sp-wasm-interface"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "impl-trait-for-tuples",
  "parity-scale-codec",
@@ -7141,7 +7120,7 @@ dependencies = [
 [[package]]
 name = "substrate-browser-utils"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "chrono",
  "clear_on_drop",
@@ -7168,7 +7147,7 @@ dependencies = [
 [[package]]
 name = "substrate-build-script-utils"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "platforms",
 ]
@@ -7176,7 +7155,7 @@ dependencies = [
 [[package]]
 name = "substrate-frame-rpc-system"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "frame-system-rpc-runtime-api",
  "futures 0.3.4",
@@ -7185,7 +7164,7 @@ dependencies = [
  "jsonrpc-derive",
  "log 0.4.8",
  "parity-scale-codec",
- "sc-client",
+ "sc-client-api",
  "serde",
  "sp-api",
  "sp-blockchain",
@@ -7197,7 +7176,7 @@ dependencies = [
 [[package]]
 name = "substrate-prometheus-endpoint"
 version = "0.8.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "async-std",
  "derive_more 0.99.5",
@@ -7211,15 +7190,16 @@ dependencies = [
 [[package]]
 name = "substrate-test-client"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "futures 0.3.4",
  "hash-db",
  "parity-scale-codec",
- "sc-client",
  "sc-client-api",
  "sc-client-db",
+ "sc-consensus",
  "sc-executor",
+ "sc-service",
  "sp-blockchain",
  "sp-consensus",
  "sp-core",
@@ -7231,7 +7211,7 @@ dependencies = [
 [[package]]
 name = "substrate-test-runtime"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "cfg-if",
  "frame-executive",
@@ -7244,7 +7224,7 @@ dependencies = [
  "pallet-timestamp",
  "parity-scale-codec",
  "parity-util-mem",
- "sc-client",
+ "sc-service",
  "serde",
  "sp-api",
  "sp-application-crypto",
@@ -7270,15 +7250,17 @@ dependencies = [
 [[package]]
 name = "substrate-test-runtime-client"
 version = "2.0.0-dev"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 dependencies = [
  "futures 0.3.4",
  "parity-scale-codec",
  "sc-block-builder",
- "sc-client",
  "sc-client-api",
+ "sc-consensus",
+ "sc-service",
  "sp-api",
  "sp-blockchain",
+ "sp-consensus",
  "sp-core",
  "sp-runtime",
  "substrate-test-client",
@@ -7288,7 +7270,7 @@ dependencies = [
 [[package]]
 name = "substrate-wasm-builder-runner"
 version = "1.0.5"
-source = "git+https://github.com/paritytech/substrate#c13ad41634d0bd7cf07897c2aa062b917d520520"
+source = "git+https://github.com/paritytech/substrate#fc6d55c9c9cfe50ec7d8d8671cd39b669cebc1ab"
 
 [[package]]
 name = "substrate-wasm-builder-runner"
@@ -7514,7 +7496,6 @@ dependencies = [
  "polkadot-collator",
  "polkadot-parachain",
  "polkadot-primitives",
- "sc-client",
  "sc-client-api",
  "sp-core",
  "test-parachain-adder",
diff --git a/polkadot/availability-store/Cargo.toml b/polkadot/availability-store/Cargo.toml
index 2f075e11abe..556b4c6d031 100644
--- a/polkadot/availability-store/Cargo.toml
+++ b/polkadot/availability-store/Cargo.toml
@@ -18,7 +18,6 @@ codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive
 sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" }
 consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" }
 client = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" }
-sc-client = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml
index 351348ee300..d54d161458c 100644
--- a/polkadot/cli/Cargo.toml
+++ b/polkadot/cli/Cargo.toml
@@ -20,7 +20,6 @@ structopt = "0.3.8"
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" }
-sc-client = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-client-db = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" }
diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs
index a63954fe3d5..5101a3c9aaa 100644
--- a/polkadot/cli/src/command.rs
+++ b/polkadot/cli/src/command.rs
@@ -15,9 +15,8 @@
 // along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
 
 use log::info;
-use sp_runtime::traits::BlakeTwo256;
-use service::{IdentifyVariant, Block, self, RuntimeApiCollection, TFullClient};
-use sp_api::ConstructRuntimeApi;
+use service::{IdentifyVariant, self};
+use sc_executor::NativeExecutionDispatch;
 use sc_cli::{SubstrateCli, Result};
 use crate::cli::{Cli, Subcommand};
 
@@ -82,23 +81,56 @@ pub fn run() -> Result<()> {
 				info!("     KUSAMA FOUNDATION      ");
 				info!("----------------------------");
 
-				run_node::<
-					service::kusama_runtime::RuntimeApi,
-					service::KusamaExecutor,
-					service::kusama_runtime::UncheckedExtrinsic,
-				>(runtime, authority_discovery_enabled, grandpa_pause)
+				runtime.run_node(
+					|config| {
+						service::kusama_new_light(config)
+					},
+					|config| {
+						service::kusama_new_full(
+							config,
+							None,
+							None,
+							authority_discovery_enabled,
+							6000,
+							grandpa_pause
+						).map(|(s, _, _)| s)
+					},
+					service::KusamaExecutor::native_version().runtime_version
+				)
 			} else if config.chain_spec.is_westend() {
-				run_node::<
-					service::westend_runtime::RuntimeApi,
-					service::WestendExecutor,
-					service::westend_runtime::UncheckedExtrinsic,
-				>(runtime, authority_discovery_enabled, grandpa_pause)
+				runtime.run_node(
+					|config| {
+						service::westend_new_light(config)
+					},
+					|config| {
+						service::westend_new_full(
+							config,
+							None,
+							None,
+							authority_discovery_enabled,
+							6000,
+							grandpa_pause
+						).map(|(s, _, _)| s)
+					},
+					service::WestendExecutor::native_version().runtime_version
+				)
 			} else {
-				run_node::<
-					service::polkadot_runtime::RuntimeApi,
-					service::PolkadotExecutor,
-					service::polkadot_runtime::UncheckedExtrinsic,
-				>(runtime, authority_discovery_enabled, grandpa_pause)
+				runtime.run_node(
+					|config| {
+						service::polkadot_new_light(config)
+					},
+					|config| {
+						service::polkadot_new_full(
+							config,
+							None,
+							None,
+							authority_discovery_enabled,
+							6000,
+							grandpa_pause
+						).map(|(s, _, _)| s)
+					},
+					service::PolkadotExecutor::native_version().runtime_version
+				)
 			}
 		},
 		Some(Subcommand::Base(subcommand)) => {
@@ -160,55 +192,3 @@ pub fn run() -> Result<()> {
 		},
 	}
 }
-
-fn run_node<R, D, E>(
-	runtime: sc_cli::Runner<Cli>,
-	authority_discovery_enabled: bool,
-	grandpa_pause: Option<(u32, u32)>,
-) -> sc_cli::Result<()>
-where
-	R: ConstructRuntimeApi<Block, service::TFullClient<Block, R, D>>
-		+ Send + Sync + 'static,
-	<R as ConstructRuntimeApi<Block, service::TFullClient<Block, R, D>>>::RuntimeApi:
-		RuntimeApiCollection<E, StateBackend = sc_client_api::StateBackendFor<service::TFullBackend<Block>, Block>>,
-	<R as ConstructRuntimeApi<Block, service::TLightClient<Block, R, D>>>::RuntimeApi:
-		RuntimeApiCollection<E, StateBackend = sc_client_api::StateBackendFor<service::TLightBackend<Block>, Block>>,
-	E: service::Codec + Send + Sync + 'static,
-	D: service::NativeExecutionDispatch + 'static,
-	// Rust bug: https://github.com/rust-lang/rust/issues/24159
-	<<R as ConstructRuntimeApi<Block, TFullClient<Block, R, D>>>::RuntimeApi as sp_api::ApiExt<Block>>::StateBackend:
-		sp_api::StateBackend<BlakeTwo256>,
-	// Rust bug: https://github.com/rust-lang/rust/issues/43580
-	R: ConstructRuntimeApi<
-		Block,
-		TLightClient<R, D>
-	>,
-{
-	runtime.run_node(
-		|config| service::new_light::<R, D, E>(config),
-		|config| service::new_full::<R, D, E>(
-			config,
-			None,
-			None,
-			authority_discovery_enabled,
-			6000,
-			grandpa_pause,
-		).map(|(s, _)| s),
-		D::native_version().runtime_version,
-	)
-}
-
-// We can't simply use `service::TLightClient` due to a
-// Rust bug: https://github.com/rust-lang/rust/issues/43580
-type TLightClient<Runtime, Dispatch> = sc_client::Client<
-	sc_client::light::backend::Backend<sc_client_db::light::LightStorage<Block>, BlakeTwo256>,
-	sc_client::light::call_executor::GenesisCallExecutor<
-		sc_client::light::backend::Backend<sc_client_db::light::LightStorage<Block>, BlakeTwo256>,
-		sc_client::LocalCallExecutor<
-			sc_client::light::backend::Backend<sc_client_db::light::LightStorage<Block>, BlakeTwo256>,
-			sc_executor::NativeExecutor<Dispatch>
-		>
-	>,
-	Block,
-	Runtime
->;
diff --git a/polkadot/collator/Cargo.toml b/polkadot/collator/Cargo.toml
index e382f554876..ad38cc7f321 100644
--- a/polkadot/collator/Cargo.toml
+++ b/polkadot/collator/Cargo.toml
@@ -7,7 +7,8 @@ edition = "2018"
 
 [dependencies]
 futures = "0.3.4"
-sc-client = { git = "https://github.com/paritytech/substrate", branch = "master" }
+sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" }
+sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" }
diff --git a/polkadot/collator/src/lib.rs b/polkadot/collator/src/lib.rs
index d2fcf0b861a..3e01e4cbb72 100644
--- a/polkadot/collator/src/lib.rs
+++ b/polkadot/collator/src/lib.rs
@@ -52,9 +52,8 @@ use std::pin::Pin;
 
 use futures::{future, Future, Stream, FutureExt, TryFutureExt, StreamExt, task::Spawn};
 use log::warn;
-use sc_client::BlockchainEvents;
+use sc_client_api::StateBackend;
 use sp_core::Pair;
-use sp_runtime::traits::BlakeTwo256;
 use polkadot_primitives::{
 	BlockId, Hash, Block,
 	parachain::{
@@ -72,7 +71,9 @@ pub use polkadot_validation::SignedStatement;
 pub use polkadot_primitives::parachain::CollatorId;
 pub use sc_network::PeerId;
 pub use service::RuntimeApiCollection;
+use sc_service::ClientProvider;
 pub use sc_cli::SubstrateCli;
+use sp_api::{ConstructRuntimeApi, ApiExt, HashFor};
 
 const COLLATION_TIMEOUT: Duration = Duration::from_secs(30);
 
@@ -114,34 +115,24 @@ impl fmt::Display for Error {
 	}
 }
 
-/// The Polkadot client type.
-pub type PolkadotClient<B, E, R> = sc_client::Client<B, E, Block, R>;
-
 /// Something that can build a `ParachainContext`.
 pub trait BuildParachainContext {
 	/// The parachain context produced by the `build` function.
 	type ParachainContext: self::ParachainContext;
 
 	/// Build the `ParachainContext`.
-	fn build<B, E, R, SP, Extrinsic>(
+	fn build<Client, SP, Extrinsic>(
 		self,
-		client: Arc<PolkadotClient<B, E, R>>,
+		client: Arc<Client>,
 		spawner: SP,
 		network: impl Network + Clone + 'static,
 	) -> Result<Self::ParachainContext, ()>
 		where
-			PolkadotClient<B, E, R>: ProvideRuntimeApi<Block>,
-			<PolkadotClient<B, E, R> as ProvideRuntimeApi<Block>>::Api: RuntimeApiCollection<Extrinsic>,
-			// Rust bug: https://github.com/rust-lang/rust/issues/24159
-			<<PolkadotClient<B, E, R> as ProvideRuntimeApi<Block>>::Api as sp_api::ApiExt<Block>>::StateBackend:
-				sp_api::StateBackend<BlakeTwo256>,
+			Client: ProvideRuntimeApi<Block>,
+			Client::Api: RuntimeApiCollection<Extrinsic>,
+			<Client::Api as ApiExt<Block>>::StateBackend: StateBackend<HashFor<Block>>,
 			Extrinsic: codec::Codec + Send + Sync + 'static,
-			E: sc_client::CallExecutor<Block> + Clone + Send + Sync + 'static,
-			SP: Spawn + Clone + Send + Sync + 'static,
-			R: Send + Sync + 'static,
-			B: sc_client_api::Backend<Block> + 'static,
-			// Rust bug: https://github.com/rust-lang/rust/issues/24159
-			B::State: sp_api::StateBackend<BlakeTwo256>;
+			SP: Spawn + Clone + Send + Sync + 'static;
 }
 
 /// Parachain context needed for collation.
@@ -209,38 +200,40 @@ pub async fn collate<P>(
 	Ok(collation)
 }
 
-fn build_collator_service<S, P, Extrinsic>(
-	service: (S, polkadot_service::FullNodeHandles),
+
+fn build_collator_service<SP, P, C, E, R, Extrinsic>(
+	spawner: SP,
+	handles: polkadot_service::FullNodeHandles,
+	client: Arc<C>,
 	para_id: ParaId,
 	key: Arc<CollatorPair>,
 	build_parachain_context: P,
-) -> Result<S, polkadot_service::Error>
+) -> Result<impl Future<Output = ()> + Send + 'static, polkadot_service::Error>
 	where
-		S: AbstractService<Block = service::Block>,
-		sc_client::Client<S::Backend, S::CallExecutor, service::Block, S::RuntimeApi>: ProvideRuntimeApi<Block>,
-		<sc_client::Client<S::Backend, S::CallExecutor, service::Block, S::RuntimeApi> as ProvideRuntimeApi<Block>>::Api:
-			RuntimeApiCollection<
+		C: ClientProvider<
+			service::Block,
+			service::TFullBackend<service::Block>,
+			service::TFullCallExecutor<service::Block, E>,
+			R
+		> + 'static,
+		R: ConstructRuntimeApi<service::Block, C> + Sync + Send,
+		<R as ConstructRuntimeApi<service::Block, C>>::RuntimeApi:
+			sp_api::ApiExt<
+				service::Block,
+				StateBackend = <service::TFullBackend<service::Block> as service::Backend<service::Block>>::State,
+			>
+			+ RuntimeApiCollection<
 				Extrinsic,
-				Error = sp_blockchain::Error,
-				StateBackend = sc_client_api::StateBackendFor<S::Backend, Block>
-			>,
-		// Rust bug: https://github.com/rust-lang/rust/issues/24159
-		S::Backend: service::Backend<service::Block>,
-		// Rust bug: https://github.com/rust-lang/rust/issues/24159
-		<S::Backend as service::Backend<service::Block>>::State:
-			sp_api::StateBackend<sp_runtime::traits::HashFor<Block>>,
-		// Rust bug: https://github.com/rust-lang/rust/issues/24159
-		S::CallExecutor: service::CallExecutor<service::Block>,
-		// Rust bug: https://github.com/rust-lang/rust/issues/24159
-		S::SelectChain: service::SelectChain<service::Block>,
+				StateBackend = <service::TFullBackend<service::Block> as service::Backend<service::Block>>::State,
+			>
+			+ Sync + Send,
+		E: sc_executor::NativeExecutionDispatch + 'static,
 		P: BuildParachainContext,
 		P::ParachainContext: Send + 'static,
 		<P::ParachainContext as ParachainContext>::ProduceCandidate: Send,
 		Extrinsic: service::Codec + Send + Sync + 'static,
+		SP: Spawn + Clone + Send + Sync + 'static,
 {
-	let (service, handles) = service;
-	let spawner = service.spawn_task_handle();
-
 	let polkadot_network = handles.polkadot_network
 		.ok_or_else(|| "Collator cannot run when Polkadot-specific networking has not been started")?;
 
@@ -250,8 +243,6 @@ fn build_collator_service<S, P, Extrinsic>(
 	handles.validation_service_handle
 		.ok_or_else(|| "Collator cannot run when validation networking has not been started")?;
 
-	let client = service.client();
-
 	let parachain_context = match build_parachain_context.build(
 		client.clone(),
 		spawner,
@@ -334,9 +325,7 @@ fn build_collator_service<S, P, Extrinsic>(
 		}
 	}.boxed();
 
-	service.spawn_essential_task("collation", work);
-
-	Ok(service)
+	Ok(work)
 }
 
 /// Async function that will run the collator node with the given `RelayChainContext` and `ParachainContext`
@@ -348,29 +337,55 @@ pub async fn start_collator<P>(
 	config: Configuration,
 ) -> Result<(), polkadot_service::Error>
 where
-	P: BuildParachainContext,
+	P: 'static + BuildParachainContext,
 	P::ParachainContext: Send + 'static,
 	<P::ParachainContext as ParachainContext>::ProduceCandidate: Send,
 {
 	let is_kusama = config.chain_spec.is_kusama();
 	match (is_kusama, &config.role) {
-		(_, Role::Light) => return Err(
+		(_, Role::Light) => Err(
 			polkadot_service::Error::Other("light nodes are unsupported as collator".into())
 		).into(),
-		(true, _) =>
+		(true, _) => {
+			let (service, client, handlers) = service::kusama_new_full(
+				config,
+				Some((key.public(), para_id)),
+				None,
+				false,
+				6000,
+				None
+			)?;
+			let spawn_handle = service.spawn_task_handle();
 			build_collator_service(
-				service::kusama_new_full(config, Some((key.public(), para_id)), None, false, 6000, None)?,
+				spawn_handle,
+				handlers,
+				client,
 				para_id,
 				key,
-				build_parachain_context,
-			)?.await,
-		(false, _) =>
+				build_parachain_context
+			)?.await;
+			Ok(())
+		},
+		(false, _) => {
+			let (service, client, handles) = service::polkadot_new_full(
+				config,
+				Some((key.public(), para_id)),
+				None,
+				false,
+				6000,
+				None
+			)?;
+			let spawn_handle = service.spawn_task_handle();
 			build_collator_service(
-				service::polkadot_new_full(config, Some((key.public(), para_id)), None, false, 6000, None)?,
+				spawn_handle,
+				handles,
+				client,
 				para_id,
 				key,
 				build_parachain_context,
-			)?.await,
+			)?.await;
+			Ok(())
+		}
 	}
 }
 
@@ -413,9 +428,9 @@ mod tests {
 	impl BuildParachainContext for BuildDummyParachainContext {
 		type ParachainContext = DummyParachainContext;
 
-		fn build<B, E, R, SP, Extrinsic>(
+		fn build<C, SP, Extrinsic>(
 			self,
-			_: Arc<PolkadotClient<B, E, R>>,
+			_: Arc<C>,
 			_: SP,
 			_: impl Network + Clone + 'static,
 		) -> Result<Self::ParachainContext, ()> {
diff --git a/polkadot/network/Cargo.toml b/polkadot/network/Cargo.toml
index 01406bae8b0..d60f941c452 100644
--- a/polkadot/network/Cargo.toml
+++ b/polkadot/network/Cargo.toml
@@ -23,7 +23,6 @@ futures = "0.3.4"
 log = "0.4.8"
 exit-future = "0.2.0"
 futures-timer = "2.0"
-sc-client = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
 wasm-timer = "0.2.4"
diff --git a/polkadot/network/test/Cargo.toml b/polkadot/network/test/Cargo.toml
index c1a6fc9663d..3761527a7a4 100644
--- a/polkadot/network/test/Cargo.toml
+++ b/polkadot/network/test/Cargo.toml
@@ -10,10 +10,11 @@ log = "0.4.8"
 parking_lot = "0.10.0"
 futures = "0.3.1"
 rand = "0.7.2"
+sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" }
+sc-service = { git = "https://github.com/paritytech/substrate", features = ["test-helpers"], branch = "master" }
 sc-network-test = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" }
-sc-client = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" }
diff --git a/polkadot/network/test/src/lib.rs b/polkadot/network/test/src/lib.rs
index 36bdda0ba4d..bd824f1441b 100644
--- a/polkadot/network/test/src/lib.rs
+++ b/polkadot/network/test/src/lib.rs
@@ -34,8 +34,8 @@ use sc_client_api::{
 	client::BlockBackend,
 	backend::{TransactionFor, AuxStore, Backend, Finalizer},
 };
+use sc_consensus::LongestChain;
 use sc_block_builder::{BlockBuilder, BlockBuilderProvider};
-use sc_client::LongestChain;
 use sp_consensus::block_validation::DefaultBlockAnnounceValidator;
 use sp_consensus::import_queue::{
 	BasicQueue, BoxJustificationImport, Verifier, BoxFinalityProofImport,
@@ -53,14 +53,23 @@ use sp_runtime::generic::BlockId;
 use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor};
 use sp_runtime::Justification;
 pub use sc_network_test::PassThroughVerifier;
+use sc_service::client::Client;
 
 pub use polkadot_test_runtime_client::runtime::{Block, Extrinsic, Hash};
 pub use polkadot_test_runtime_client::{TestClient, TestClientBuilder, TestClientBuilderExt};
 
-pub type PeersFullClient =
-	sc_client::Client<polkadot_test_runtime_client::Backend, polkadot_test_runtime_client::Executor, Block, polkadot_test_runtime_client::runtime::RuntimeApi>;
-pub type PeersLightClient =
-	sc_client::Client<polkadot_test_runtime_client::LightBackend, polkadot_test_runtime_client::LightExecutor, Block, polkadot_test_runtime_client::runtime::RuntimeApi>;
+pub type PeersFullClient = Client<
+	polkadot_test_runtime_client::Backend,
+	polkadot_test_runtime_client::Executor,
+	Block,
+	polkadot_test_runtime_client::runtime::RuntimeApi
+>;
+pub type PeersLightClient = Client<
+	polkadot_test_runtime_client::LightBackend,
+	polkadot_test_runtime_client::LightExecutor,
+	Block,
+	polkadot_test_runtime_client::runtime::RuntimeApi
+>;
 
 #[derive(Clone)]
 pub enum PeersClient {
diff --git a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml
index 1d56b692412..3363a908a94 100644
--- a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml
+++ b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml
@@ -10,7 +10,6 @@ parachain = { package = "polkadot-parachain", path = "../../.." }
 collator = { package = "polkadot-collator", path = "../../../../collator" }
 primitives = { package = "polkadot-primitives", path = "../../../../primitives" }
 sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" }
-client = { package = "sc-client", git = "https://github.com/paritytech/substrate", branch = "master" }
 client-api = { package = "sc-client-api", git = "https://github.com/paritytech/substrate", branch = "master" }
 parking_lot = "0.10.0"
 codec = { package = "parity-scale-codec", version = "1.2.0" }
diff --git a/polkadot/parachain/test-parachains/adder/collator/src/main.rs b/polkadot/parachain/test-parachains/adder/collator/src/main.rs
index cc61dc2695e..5ecf063dda8 100644
--- a/polkadot/parachain/test-parachains/adder/collator/src/main.rs
+++ b/polkadot/parachain/test-parachains/adder/collator/src/main.rs
@@ -101,9 +101,9 @@ impl ParachainContext for AdderContext {
 impl BuildParachainContext for AdderContext {
 	type ParachainContext = Self;
 
-	fn build<B, E, R, SP, Extrinsic>(
+	fn build<Client, SP, Extrinsic>(
 		self,
-		_: Arc<collator::PolkadotClient<B, E, R>>,
+		_: Arc<Client>,
 		_: SP,
 		network: impl Network + Clone + 'static,
 	) -> Result<Self::ParachainContext, ()> {
diff --git a/polkadot/rpc/Cargo.toml b/polkadot/rpc/Cargo.toml
index ab0f302a48b..9660ce3ec96 100644
--- a/polkadot/rpc/Cargo.toml
+++ b/polkadot/rpc/Cargo.toml
@@ -5,9 +5,10 @@ authors = ["Parity Technologies <admin@parity.io>"]
 edition = "2018"
 
 [dependencies]
-client = { package = "sc-client", git = "https://github.com/paritytech/substrate", branch = "master" }
 jsonrpc-core = "14.0.3"
 polkadot-primitives = { path = "../primitives" }
+sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master"  }
+sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master"  }
 sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master"  }
 sp-api = { git = "https://github.com/paritytech/substrate", branch = "master"  }
 sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" }
diff --git a/polkadot/rpc/src/lib.rs b/polkadot/rpc/src/lib.rs
index 3b27b254343..cc54917ffaf 100644
--- a/polkadot/rpc/src/lib.rs
+++ b/polkadot/rpc/src/lib.rs
@@ -23,6 +23,8 @@ use std::sync::Arc;
 use polkadot_primitives::{Block, AccountId, Nonce, Balance};
 use sp_api::ProvideRuntimeApi;
 use txpool_api::TransactionPool;
+use sp_blockchain::HeaderBackend;
+use sc_client_api::light::{Fetcher, RemoteBlockchain};
 
 /// A type representing all RPC extensions.
 pub type RpcExtension = jsonrpc_core::IoHandler<sc_rpc::Metadata>;
@@ -30,7 +32,7 @@ pub type RpcExtension = jsonrpc_core::IoHandler<sc_rpc::Metadata>;
 /// Instantiate all RPC extensions.
 pub fn create_full<C, P, UE>(client: Arc<C>, pool: Arc<P>) -> RpcExtension where
 	C: ProvideRuntimeApi<Block>,
-	C: client::blockchain::HeaderBackend<Block>,
+	C: HeaderBackend<Block>,
 	C: Send + Sync + 'static,
 	C::Api: frame_rpc_system::AccountNonceApi<Block, AccountId, Nonce>,
 	C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance, UE>,
@@ -53,18 +55,18 @@ pub fn create_full<C, P, UE>(client: Arc<C>, pool: Arc<P>) -> RpcExtension where
 /// Instantiate all RPC extensions for light node.
 pub fn create_light<C, P, F, UE>(
 	client: Arc<C>,
-	remote_blockchain: Arc<dyn client::light::blockchain::RemoteBlockchain<Block>>,
+	remote_blockchain: Arc<dyn RemoteBlockchain<Block>>,
 	fetcher: Arc<F>,
 	pool: Arc<P>,
 ) -> RpcExtension
 	where
 		C: ProvideRuntimeApi<Block>,
-		C: client::blockchain::HeaderBackend<Block>,
+		C: HeaderBackend<Block>,
 		C: Send + Sync + 'static,
 		C::Api: frame_rpc_system::AccountNonceApi<Block, AccountId, Nonce>,
 		C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance, UE>,
 		P: TransactionPool + Sync + Send + 'static,
-		F: client::light::fetcher::Fetcher<Block> + 'static,
+		F: Fetcher<Block> + 'static,
 		UE: codec::Codec + Send + Sync + 'static,
 {
 	use frame_rpc_system::{LightSystem, SystemApi};
diff --git a/polkadot/runtime/test-runtime/client/Cargo.toml b/polkadot/runtime/test-runtime/client/Cargo.toml
index b540adfb9b4..ff94572b5f8 100644
--- a/polkadot/runtime/test-runtime/client/Cargo.toml
+++ b/polkadot/runtime/test-runtime/client/Cargo.toml
@@ -7,6 +7,8 @@ license = "GPL-3.0"
 
 [dependencies]
 sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" }
+sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" }
+sc-service = { git = "https://github.com/paritytech/substrate", branch = "master", features = ["test-helpers"],  default-features = false }
 substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" }
 polkadot-test-runtime = { path = ".." }
@@ -17,6 +19,5 @@ sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" }
 codec = { package = "parity-scale-codec", version = "1.0.0" }
 sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
-sc-client = { git = "https://github.com/paritytech/substrate", branch = "master" }
 pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" }
 futures = "0.3.1"
diff --git a/polkadot/runtime/test-runtime/client/src/lib.rs b/polkadot/runtime/test-runtime/client/src/lib.rs
index 2d7797557e7..ad767f7ffde 100644
--- a/polkadot/runtime/test-runtime/client/src/lib.rs
+++ b/polkadot/runtime/test-runtime/client/src/lib.rs
@@ -22,16 +22,19 @@ use std::sync::Arc;
 use std::collections::BTreeMap;
 pub use substrate_test_client::*;
 pub use polkadot_test_runtime as runtime;
-pub use sc_client::LongestChain;
 
 use sp_core::{sr25519, ChangesTrieConfiguration, map, twox_128};
 use sp_core::storage::{ChildInfo, Storage, StorageChild};
 use polkadot_test_runtime::genesismap::GenesisConfig;
 use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, HashFor};
-use sc_client::{
-	light::fetcher::{
-		RemoteCallRequest, RemoteBodyRequest,
+use sc_consensus::LongestChain;
+use sc_client_api::light::{RemoteCallRequest, RemoteBodyRequest};
+use sc_service::client::{
+	light::{
+		call_executor::GenesisCallExecutor, backend as light_backend,
+		new_light_blockchain, new_light_backend,
 	},
+	genesis, Client as SubstrateClient, LocalCallExecutor
 };
 
 /// A prelude to import in tests.
@@ -57,7 +60,7 @@ sc_executor::native_executor_instance! {
 pub type Backend = substrate_test_client::Backend<polkadot_test_runtime::Block>;
 
 /// Test client executor.
-pub type Executor = sc_client::LocalCallExecutor<
+pub type Executor = LocalCallExecutor<
 	Backend,
 	NativeExecutor<LocalExecutor>,
 >;
@@ -66,10 +69,10 @@ pub type Executor = sc_client::LocalCallExecutor<
 pub type LightBackend = substrate_test_client::LightBackend<polkadot_test_runtime::Block>;
 
 /// Test client light executor.
-pub type LightExecutor = sc_client::light::call_executor::GenesisCallExecutor<
+pub type LightExecutor = GenesisCallExecutor<
 	LightBackend,
-	sc_client::LocalCallExecutor<
-		sc_client::light::backend::Backend<
+	LocalCallExecutor<
+		light_backend::Backend<
 			sc_client_db::light::LightStorage<polkadot_test_runtime::Block>,
 			HashFor<polkadot_test_runtime::Block>
 		>,
@@ -120,7 +123,7 @@ impl substrate_test_client::GenesisInit for GenesisParameters {
 		let state_root = <<<runtime::Block as BlockT>::Header as HeaderT>::Hashing as HashT>::trie_root(
 			storage.top.clone().into_iter().chain(child_roots).collect()
 		);
-		let block: runtime::Block = sc_client::genesis::construct_genesis_block(state_root);
+		let block: runtime::Block = genesis::construct_genesis_block(state_root);
 		storage.top.extend(additional_storage_with_genesis(&block));
 
 		storage
@@ -136,9 +139,9 @@ pub type TestClientBuilder<E, B> = substrate_test_client::TestClientBuilder<
 >;
 
 /// Test client type with `LocalExecutor` and generic Backend.
-pub type Client<B> = sc_client::Client<
+pub type Client<B> = SubstrateClient<
 	B,
-	sc_client::LocalCallExecutor<B, sc_executor::NativeExecutor<LocalExecutor>>,
+	LocalCallExecutor<B, sc_executor::NativeExecutor<LocalExecutor>>,
 	polkadot_test_runtime::Block,
 	polkadot_test_runtime::RuntimeApi,
 >;
@@ -212,21 +215,21 @@ pub trait TestClientBuilderExt<B>: Sized {
 	}
 
 	/// Build the test client and longest chain selector.
-	fn build_with_longest_chain(self) -> (Client<B>, sc_client::LongestChain<B, polkadot_test_runtime::Block>);
+	fn build_with_longest_chain(self) -> (Client<B>, LongestChain<B, polkadot_test_runtime::Block>);
 
 	/// Build the test client and the backend.
 	fn build_with_backend(self) -> (Client<B>, Arc<B>);
 }
 
 impl TestClientBuilderExt<Backend> for TestClientBuilder<
-	sc_client::LocalCallExecutor<Backend, sc_executor::NativeExecutor<LocalExecutor>>,
+	LocalCallExecutor<Backend, sc_executor::NativeExecutor<LocalExecutor>>,
 	Backend
 > {
 	fn genesis_init_mut(&mut self) -> &mut GenesisParameters {
 		Self::genesis_init_mut(self)
 	}
 
-	fn build_with_longest_chain(self) -> (Client<Backend>, sc_client::LongestChain<Backend, polkadot_test_runtime::Block>) {
+	fn build_with_longest_chain(self) -> (Client<Backend>, LongestChain<Backend, polkadot_test_runtime::Block>) {
 		self.build_with_native_executor(None)
 	}
 
@@ -277,15 +280,25 @@ pub fn new() -> Client<Backend> {
 
 /// Creates new light client instance used for tests.
 pub fn new_light() -> (
-	sc_client::Client<LightBackend, LightExecutor, polkadot_test_runtime::Block, polkadot_test_runtime::RuntimeApi>,
+	SubstrateClient<
+		LightBackend,
+		LightExecutor,
+		polkadot_test_runtime::Block,
+		polkadot_test_runtime::RuntimeApi
+	>,
 	Arc<LightBackend>,
 ) {
 
 	let storage = sc_client_db::light::LightStorage::new_test();
-	let blockchain = Arc::new(sc_client::light::blockchain::Blockchain::new(storage));
-	let backend = Arc::new(LightBackend::new(blockchain.clone()));
+	let blockchain =new_light_blockchain(storage);
+	let backend = new_light_backend(blockchain.clone());
 	let executor = new_native_executor();
-	let local_call_executor = sc_client::LocalCallExecutor::new(backend.clone(), executor, sp_core::tasks::executor(), Default::default(),);
+	let local_call_executor = LocalCallExecutor::new(
+		backend.clone(),
+		executor,
+		sp_core::tasks::executor(),
+		Default::default()
+	);
 	let call_executor = LightExecutor::new(
 		backend.clone(),
 		local_call_executor,
diff --git a/polkadot/service/Cargo.toml b/polkadot/service/Cargo.toml
index fbad3afd043..7a0094b6ee9 100644
--- a/polkadot/service/Cargo.toml
+++ b/polkadot/service/Cargo.toml
@@ -25,11 +25,11 @@ sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" }
-sc-client = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-client-db = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" }
+sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" }
 consensus_common = { package = "sp-consensus", git = "https://github.com/paritytech/substrate", branch = "master" }
 grandpa = { package = "sc-finality-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" }
@@ -37,6 +37,7 @@ grandpa_primitives = { package = "sp-finality-grandpa", git = "https://github.co
 inherents = { package = "sp-inherents", git = "https://github.com/paritytech/substrate", branch = "master" }
 service = { package = "sc-service", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
 telemetry = { package = "sc-telemetry", git = "https://github.com/paritytech/substrate", branch = "master" }
+sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" }
 sc-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" }
diff --git a/polkadot/service/src/chain_spec.rs b/polkadot/service/src/chain_spec.rs
index 8d8572e7e7e..4daf3826c94 100644
--- a/polkadot/service/src/chain_spec.rs
+++ b/polkadot/service/src/chain_spec.rs
@@ -48,9 +48,9 @@ const DEFAULT_PROTOCOL_ID: &str = "dot";
 #[serde(rename_all = "camelCase")]
 pub struct Extensions {
 	/// Block numbers with known hashes.
-	pub fork_blocks: sc_client::ForkBlocks<polkadot_primitives::Block>,
+	pub fork_blocks: sc_client_api::ForkBlocks<polkadot_primitives::Block>,
 	/// Known bad block hashes.
-	pub bad_blocks: sc_client::BadBlocks<polkadot_primitives::Block>,
+	pub bad_blocks: sc_client_api::BadBlocks<polkadot_primitives::Block>,
 }
 
 /// The `ChainSpec parametrised for polkadot runtime`.
diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs
index f27f19e1c72..5a684fae6a6 100644
--- a/polkadot/service/src/lib.rs
+++ b/polkadot/service/src/lib.rs
@@ -19,7 +19,6 @@
 pub mod chain_spec;
 mod grandpa_support;
 
-use sc_client::LongestChain;
 use std::sync::Arc;
 use std::time::Duration;
 use polkadot_primitives::{parachain, Hash, BlockId, AccountId, Nonce, Balance};
@@ -27,21 +26,20 @@ use polkadot_primitives::{parachain, Hash, BlockId, AccountId, Nonce, Balance};
 use polkadot_network::{legacy::gossip::Known, protocol as network_protocol};
 use service::{error::Error as ServiceError, ServiceBuilder};
 use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider};
-use inherents::InherentDataProviders;
 use sc_executor::native_executor_instance;
 use log::info;
 pub use service::{
 	AbstractService, Role, PruningMode, TransactionPoolOptions, Error, RuntimeGenesis,
 	TFullClient, TLightClient, TFullBackend, TLightBackend, TFullCallExecutor, TLightCallExecutor,
-	Configuration, ChainSpec, ServiceBuilderCommand,
+	Configuration, ChainSpec, ServiceBuilderCommand, ClientProvider,
 };
 pub use service::config::{DatabaseConfig, PrometheusConfig};
 pub use sc_executor::NativeExecutionDispatch;
-pub use sc_client::{ExecutionStrategy, CallExecutor, Client};
-pub use sc_client_api::backend::Backend;
+pub use sc_client_api::{Backend, ExecutionStrategy, CallExecutor};
+pub use sc_consensus::LongestChain;
 pub use sp_api::{Core as CoreApi, ConstructRuntimeApi, ProvideRuntimeApi, StateBackend};
 pub use sp_runtime::traits::{HashFor, NumberFor};
-pub use consensus_common::SelectChain;
+pub use consensus_common::{SelectChain, BlockImport, block_validation::Chain};
 pub use polkadot_primitives::parachain::{CollatorId, ParachainHost};
 pub use polkadot_primitives::Block;
 pub use sp_runtime::traits::{Block as BlockT, self as runtime_traits, BlakeTwo256};
@@ -76,7 +74,7 @@ native_executor_instance!(
 );
 
 /// A set of APIs that polkadot-like runtimes must implement.
-pub trait RuntimeApiCollection<Extrinsic: codec::Codec + Send + Sync + 'static> :
+pub trait RuntimeApiCollection<Extrinsic: codec::Codec + Send + Sync + 'static>:
 	sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block>
 	+ sp_api::ApiExt<Block, Error = sp_blockchain::Error>
 	+ babe_primitives::BabeApi<Block>
@@ -156,7 +154,7 @@ macro_rules! new_full_start {
 			Block, $runtime, $executor
 		>($config)?
 			.with_select_chain(|_, backend| {
-				Ok(sc_client::LongestChain::new(backend.clone()))
+				Ok(sc_consensus::LongestChain::new(backend.clone()))
 			})?
 			.with_transaction_pool(|config, client, _fetcher, prometheus_registry| {
 				let pool_api = sc_transaction_pool::FullChainApi::new(client.clone());
@@ -209,6 +207,352 @@ macro_rules! new_full_start {
 	}}
 }
 
+/// Builds a new service for a full client.
+#[macro_export]
+macro_rules! new_full {
+	(
+		$config:expr,
+		$collating_for:expr,
+		$max_block_data_size:expr,
+		$authority_discovery_enabled:expr,
+		$slot_duration:expr,
+		$grandpa_pause:expr,
+		$runtime:ty,
+		$dispatch:ty
+	) => {{
+		use sc_network::Event;
+		use sc_client_api::ExecutorProvider;
+		use futures::stream::StreamExt;
+
+		let is_collator = $collating_for.is_some();
+		let role = $config.role.clone();
+		let is_authority = role.is_authority() && !is_collator;
+		let force_authoring = $config.force_authoring;
+		let max_block_data_size = $max_block_data_size;
+		let db_path = match $config.database.path() {
+			Some(path) => std::path::PathBuf::from(path),
+			None => return Err("Starting a Polkadot service with a custom database isn't supported".to_string().into()),
+		};
+		let disable_grandpa = $config.disable_grandpa;
+		let name = $config.network.node_name.clone();
+		let authority_discovery_enabled = $authority_discovery_enabled;
+		let slot_duration = $slot_duration;
+
+		let (builder, mut import_setup, inherent_data_providers) = new_full_start!($config, $runtime, $dispatch);
+
+		let backend = builder.backend().clone();
+
+		let service = builder
+			.with_finality_proof_provider(|client, backend| {
+				let provider = client as Arc<dyn grandpa::StorageAndProofProvider<_, _>>;
+				Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _)
+			})?
+			.build()?;
+
+		let (block_import, link_half, babe_link) = import_setup.take()
+			.expect("Link Half and Block Import are present for Full Services or setup failed before. qed");
+
+		let client = service.client();
+		let known_oracle = client.clone();
+
+		let mut handles = FullNodeHandles::default();
+		let select_chain = if let Some(select_chain) = service.select_chain() {
+			select_chain
+		} else {
+			info!("The node cannot start as an authority because it can't select chain.");
+			return Ok((service, client, handles));
+		};
+		let gossip_validator_select_chain = select_chain.clone();
+
+		let is_known = move |block_hash: &Hash| {
+			use consensus_common::BlockStatus;
+
+			match known_oracle.block_status(&BlockId::hash(*block_hash)) {
+				Err(_) | Ok(BlockStatus::Unknown) | Ok(BlockStatus::Queued) => None,
+				Ok(BlockStatus::KnownBad) => Some(Known::Bad),
+				Ok(BlockStatus::InChainWithState) | Ok(BlockStatus::InChainPruned) => {
+					match gossip_validator_select_chain.leaves() {
+						Err(_) => None,
+						Ok(leaves) => if leaves.contains(block_hash) {
+							Some(Known::Leaf)
+						} else {
+							Some(Known::Old)
+						},
+					}
+				}
+			}
+		};
+
+		let polkadot_network_service = network_protocol::start(
+			service.network(),
+			network_protocol::Config {
+				collating_for: $collating_for,
+			},
+			(is_known, client.clone()),
+			client.clone(),
+			service.spawn_task_handle(),
+		).map_err(|e| format!("Could not spawn network worker: {:?}", e))?;
+
+		let authority_handles = if is_collator || role.is_authority() {
+			let availability_store = {
+				use std::path::PathBuf;
+
+				let mut path = PathBuf::from(db_path);
+				path.push("availability");
+
+				#[cfg(not(target_os = "unknown"))]
+				{
+					av_store::Store::new(
+						::av_store::Config {
+							cache_size: None,
+							path,
+						},
+						polkadot_network_service.clone(),
+					)?
+				}
+
+				#[cfg(target_os = "unknown")]
+				av_store::Store::new_in_memory(gossip)
+			};
+
+			polkadot_network_service.register_availability_store(availability_store.clone());
+
+			let (validation_service_handle, validation_service) = consensus::ServiceBuilder {
+				client: client.clone(),
+				network: polkadot_network_service.clone(),
+				collators: polkadot_network_service.clone(),
+				spawner: service.spawn_task_handle(),
+				availability_store: availability_store.clone(),
+				select_chain: select_chain.clone(),
+				keystore: service.keystore(),
+				max_block_data_size,
+			}.build();
+
+			service.spawn_essential_task("validation-service", Box::pin(validation_service));
+
+			handles.validation_service_handle = Some(validation_service_handle.clone());
+
+			Some((validation_service_handle, availability_store))
+		} else {
+			None
+		};
+
+		if role.is_authority() {
+			let (validation_service_handle, availability_store) = authority_handles
+				.clone()
+				.expect("Authority handles are set for authority nodes; qed");
+
+			let proposer = consensus::ProposerFactory::new(
+				client.clone(),
+				service.transaction_pool(),
+				validation_service_handle,
+				slot_duration,
+				backend,
+			);
+
+			let select_chain = service.select_chain().ok_or(ServiceError::SelectChainRequired)?;
+			let can_author_with =
+				consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone());
+
+			let block_import = availability_store.block_import(
+				block_import,
+				client.clone(),
+				service.spawn_task_handle(),
+				service.keystore(),
+			)?;
+
+			let babe_config = babe::BabeParams {
+				keystore: service.keystore(),
+				client: client.clone(),
+				select_chain,
+				block_import,
+				env: proposer,
+				sync_oracle: service.network(),
+				inherent_data_providers: inherent_data_providers.clone(),
+				force_authoring,
+				babe_link,
+				can_author_with,
+			};
+
+			let babe = babe::start_babe(babe_config)?;
+			service.spawn_essential_task("babe", babe);
+		}
+
+		if matches!(role, Role::Authority{..} | Role::Sentry{..}) {
+			if authority_discovery_enabled {
+				let (sentries, authority_discovery_role) = match role {
+					Role::Authority { ref sentry_nodes } => (
+						sentry_nodes.clone(),
+						authority_discovery::Role::Authority (
+							service.keystore(),
+						),
+					),
+					Role::Sentry {..} => (
+						vec![],
+						authority_discovery::Role::Sentry,
+					),
+					_ => unreachable!("Due to outer matches! constraint; qed."),
+				};
+
+				let network = service.network();
+				let network_event_stream = network.event_stream("authority-discovery");
+				let dht_event_stream = network_event_stream.filter_map(|e| async move { match e {
+					Event::Dht(e) => Some(e),
+					_ => None,
+				}}).boxed();
+				let authority_discovery = authority_discovery::AuthorityDiscovery::new(
+					service.client(),
+					network,
+					sentries,
+					dht_event_stream,
+					authority_discovery_role,
+					service.prometheus_registry(),
+				);
+
+				service.spawn_task("authority-discovery", authority_discovery);
+			}
+		}
+
+		// if the node isn't actively participating in consensus then it doesn't
+		// need a keystore, regardless of which protocol we use below.
+		let keystore = if is_authority {
+			Some(service.keystore())
+		} else {
+			None
+		};
+
+		let config = grandpa::Config {
+			// FIXME substrate#1578 make this available through chainspec
+			gossip_duration: Duration::from_millis(1000),
+			justification_period: 512,
+			name: Some(name),
+			observer_enabled: false,
+			keystore,
+			is_authority: role.is_network_authority(),
+		};
+
+		let enable_grandpa = !disable_grandpa;
+		if enable_grandpa {
+			// start the full GRANDPA voter
+			// NOTE: unlike in substrate we are currently running the full
+			// GRANDPA voter protocol for all full nodes (regardless of whether
+			// they're validators or not). at this point the full voter should
+			// provide better guarantees of block and vote data availability than
+			// the observer.
+
+			// add a custom voting rule to temporarily stop voting for new blocks
+			// after the given pause block is finalized and restarting after the
+			// given delay.
+			let voting_rule = match $grandpa_pause {
+				Some((block, delay)) => {
+					info!("GRANDPA scheduled voting pause set for block #{} with a duration of {} blocks.",
+						block,
+						delay,
+					);
+
+					grandpa::VotingRulesBuilder::default()
+						.add(grandpa_support::PauseAfterBlockFor(block, delay))
+						.build()
+				},
+				None =>
+					grandpa::VotingRulesBuilder::default()
+						.build(),
+			};
+
+			let grandpa_config = grandpa::GrandpaParams {
+				config,
+				link: link_half,
+				network: service.network(),
+				inherent_data_providers: inherent_data_providers.clone(),
+				telemetry_on_connect: Some(service.telemetry_on_connect_stream()),
+				voting_rule,
+				prometheus_registry: service.prometheus_registry(),
+			};
+
+			service.spawn_essential_task(
+				"grandpa-voter",
+				grandpa::run_grandpa_voter(grandpa_config)?
+			);
+		} else {
+			grandpa::setup_disabled_grandpa(
+				client.clone(),
+				&inherent_data_providers,
+				service.network(),
+			)?;
+		}
+
+		handles.polkadot_network = Some(polkadot_network_service);
+		(service, client, handles)
+	}}
+}
+
+/// Builds a new service for a light client.
+#[macro_export]
+macro_rules! new_light {
+	($config:expr, $runtime:ty, $dispatch:ty) => {{
+		crate::set_prometheus_registry(&mut $config)?;
+		let inherent_data_providers = inherents::InherentDataProviders::new();
+
+		ServiceBuilder::new_light::<Block, $runtime, $dispatch>($config)?
+			.with_select_chain(|_, backend| {
+				Ok(sc_consensus::LongestChain::new(backend.clone()))
+			})?
+			.with_transaction_pool(|config, client, fetcher, prometheus_registry| {
+				let fetcher = fetcher
+					.ok_or_else(|| "Trying to start light transaction pool without active fetcher")?;
+				let pool_api = sc_transaction_pool::LightChainApi::new(client.clone(), fetcher.clone());
+				let pool = sc_transaction_pool::BasicPool::with_revalidation_type(
+					config, Arc::new(pool_api), prometheus_registry, sc_transaction_pool::RevalidationType::Light,
+				);
+				Ok(pool)
+			})?
+			.with_import_queue_and_fprb(|_config, client, backend, fetcher, _select_chain, _| {
+				let fetch_checker = fetcher
+					.map(|fetcher| fetcher.checker().clone())
+					.ok_or_else(|| "Trying to start light import queue without active fetch checker")?;
+				let grandpa_block_import = grandpa::light_block_import(
+					client.clone(), backend, &(client.clone() as Arc<_>), Arc::new(fetch_checker)
+				)?;
+
+				let finality_proof_import = grandpa_block_import.clone();
+				let finality_proof_request_builder =
+					finality_proof_import.create_finality_proof_request_builder();
+
+				let (babe_block_import, babe_link) = babe::block_import(
+					babe::Config::get_or_compute(&*client)?,
+					grandpa_block_import,
+					client.clone(),
+				)?;
+
+				// FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`.
+				let import_queue = babe::import_queue(
+					babe_link,
+					babe_block_import,
+					None,
+					Some(Box::new(finality_proof_import)),
+					client,
+					inherent_data_providers.clone(),
+				)?;
+
+				Ok((import_queue, finality_proof_request_builder))
+			})?
+			.with_finality_proof_provider(|client, backend| {
+				let provider = client as Arc<dyn grandpa::StorageAndProofProvider<_, _>>;
+				Ok(Arc::new(grandpa::FinalityProofProvider::new(backend, provider)) as _)
+			})?
+			.with_rpc_extensions(|builder|
+				-> Result<polkadot_rpc::RpcExtension, _> {
+				let fetcher = builder.fetcher()
+					.ok_or_else(|| "Trying to start node RPC without active fetcher")?;
+				let remote_blockchain = builder.remote_backend()
+					.ok_or_else(|| "Trying to start node RPC without active remote blockchain")?;
+
+				Ok(polkadot_rpc::create_light(builder.client().clone(), remote_blockchain, fetcher, builder.pool()))
+			})?
+			.build()
+	}}
+}
+
 /// Builds a new object suitable for chain operations.
 pub fn new_chain_ops<Runtime, Dispatch, Extrinsic>(mut config: Configuration)
 	-> Result<impl ServiceBuilderCommand<Block=Block>, ServiceError>
@@ -227,7 +571,7 @@ where
 /// Create a new Polkadot service for a full node.
 #[cfg(feature = "full-node")]
 pub fn polkadot_new_full(
-	config: Configuration,
+	mut config: Configuration,
 	collating_for: Option<(CollatorId, parachain::Id)>,
 	max_block_data_size: Option<u64>,
 	authority_discovery_enabled: bool,
@@ -235,61 +579,69 @@ pub fn polkadot_new_full(
 	grandpa_pause: Option<(u32, u32)>,
 )
 	-> Result<(
-		impl AbstractService<
-			Block = Block,
-			RuntimeApi = polkadot_runtime::RuntimeApi,
-			Backend = TFullBackend<Block>,
-			SelectChain = LongestChain<TFullBackend<Block>, Block>,
-			CallExecutor = TFullCallExecutor<Block, PolkadotExecutor>,
-		>,
+		impl AbstractService,
+		Arc<impl ClientProvider<
+			Block,
+			TFullBackend<Block>,
+			TFullCallExecutor<Block, PolkadotExecutor>,
+			polkadot_runtime::RuntimeApi
+		>>,
 		FullNodeHandles,
 	), ServiceError>
 {
-	new_full(
+	let (service, client, handles) = new_full!(
 		config,
 		collating_for,
 		max_block_data_size,
 		authority_discovery_enabled,
 		slot_duration,
 		grandpa_pause,
-	)
+		polkadot_runtime::RuntimeApi,
+		PolkadotExecutor
+	);
+
+	Ok((service, client, handles))
 }
 
 /// Create a new Kusama service for a full node.
 #[cfg(feature = "full-node")]
 pub fn kusama_new_full(
-	config: Configuration,
+	mut config: Configuration,
 	collating_for: Option<(CollatorId, parachain::Id)>,
 	max_block_data_size: Option<u64>,
 	authority_discovery_enabled: bool,
 	slot_duration: u64,
 	grandpa_pause: Option<(u32, u32)>,
-)
-	-> Result<(
-		impl AbstractService<
-			Block = Block,
-			RuntimeApi = kusama_runtime::RuntimeApi,
-			Backend = TFullBackend<Block>,
-			SelectChain = LongestChain<TFullBackend<Block>, Block>,
-			CallExecutor = TFullCallExecutor<Block, KusamaExecutor>,
+) -> Result<(
+		impl AbstractService,
+		Arc<impl ClientProvider<
+			Block,
+			TFullBackend<Block>,
+			TFullCallExecutor<Block, KusamaExecutor>,
+			kusama_runtime::RuntimeApi
+			>
 		>,
-		FullNodeHandles,
+		FullNodeHandles
 	), ServiceError>
 {
-	new_full(
+	let (service, client, handles) = new_full!(
 		config,
 		collating_for,
 		max_block_data_size,
 		authority_discovery_enabled,
 		slot_duration,
 		grandpa_pause,
-	)
+		kusama_runtime::RuntimeApi,
+		KusamaExecutor
+	);
+
+	Ok((service, client, handles))
 }
 
 /// Create a new Kusama service for a full node.
 #[cfg(feature = "full-node")]
 pub fn westend_new_full(
-	config: Configuration,
+	mut config: Configuration,
 	collating_for: Option<(CollatorId, parachain::Id)>,
 	max_block_data_size: Option<u64>,
 	authority_discovery_enabled: bool,
@@ -297,24 +649,28 @@ pub fn westend_new_full(
 	grandpa_pause: Option<(u32, u32)>,
 )
 	-> Result<(
-		impl AbstractService<
-			Block = Block,
-			RuntimeApi = westend_runtime::RuntimeApi,
-			Backend = TFullBackend<Block>,
-			SelectChain = LongestChain<TFullBackend<Block>, Block>,
-			CallExecutor = TFullCallExecutor<Block, KusamaExecutor>,
-		>,
+		impl AbstractService,
+		Arc<impl ClientProvider<
+			Block,
+			TFullBackend<Block>,
+			TFullCallExecutor<Block, KusamaExecutor>,
+			westend_runtime::RuntimeApi
+		>>,
 		FullNodeHandles,
 	), ServiceError>
 {
-	new_full(
+	let (service, client, handles) = new_full!(
 		config,
 		collating_for,
 		max_block_data_size,
 		authority_discovery_enabled,
 		slot_duration,
 		grandpa_pause,
-	)
+		westend_runtime::RuntimeApi,
+		KusamaExecutor
+	);
+
+	Ok((service, client, handles))
 }
 
 /// Handles to other sub-services that full nodes instantiate, which consumers
@@ -328,305 +684,9 @@ pub struct FullNodeHandles {
 	pub validation_service_handle: Option<consensus::ServiceHandle>,
 }
 
-/// Builds a new service for a full client.
-#[cfg(feature = "full-node")]
-pub fn new_full<Runtime, Dispatch, Extrinsic>(
-	mut config: Configuration,
-	collating_for: Option<(CollatorId, parachain::Id)>,
-	max_block_data_size: Option<u64>,
-	authority_discovery_enabled: bool,
-	slot_duration: u64,
-	grandpa_pause: Option<(u32, u32)>,
-)
-	-> Result<(
-		impl AbstractService<
-			Block = Block,
-			RuntimeApi = Runtime,
-			Backend = TFullBackend<Block>,
-			SelectChain = LongestChain<TFullBackend<Block>, Block>,
-			CallExecutor = TFullCallExecutor<Block, Dispatch>,
-		>,
-		FullNodeHandles,
-	), ServiceError>
-	where
-		Runtime: ConstructRuntimeApi<Block, service::TFullClient<Block, Runtime, Dispatch>> + Send + Sync + 'static,
-		Runtime::RuntimeApi:
-			RuntimeApiCollection<Extrinsic, StateBackend = sc_client_api::StateBackendFor<TFullBackend<Block>, Block>>,
-		Dispatch: NativeExecutionDispatch + 'static,
-		Extrinsic: RuntimeExtrinsic,
-		// Rust bug: https://github.com/rust-lang/rust/issues/24159
-		<Runtime::RuntimeApi as sp_api::ApiExt<Block>>::StateBackend: sp_api::StateBackend<BlakeTwo256>,
-{
-	use sc_network::Event;
-	use sc_client_api::ExecutorProvider;
-	use futures::stream::StreamExt;
-
-	let is_collator = collating_for.is_some();
-	let role = config.role.clone();
-	let is_authority = role.is_authority() && !is_collator;
-	let force_authoring = config.force_authoring;
-	let max_block_data_size = max_block_data_size;
-	let db_path = match config.database.path() {
-		Some(path) => std::path::PathBuf::from(path),
-		None => return Err("Starting a Polkadot service with a custom database isn't supported".to_string().into()),
-	};
-	let disable_grandpa = config.disable_grandpa;
-	let name = config.network.node_name.clone();
-	let authority_discovery_enabled = authority_discovery_enabled;
-	let slot_duration = slot_duration;
-
-	let (builder, mut import_setup, inherent_data_providers) = new_full_start!(config, Runtime, Dispatch);
-
-	let backend = builder.backend().clone();
-
-	let service = builder
-		.with_finality_proof_provider(|client, backend| {
-			let provider = client as Arc<dyn grandpa::StorageAndProofProvider<_, _>>;
-			Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _)
-		})?
-		.build()?;
-
-	let (block_import, link_half, babe_link) = import_setup.take()
-		.expect("Link Half and Block Import are present for Full Services or setup failed before. qed");
-
-	let client = service.client();
-	let known_oracle = client.clone();
-
-	let mut handles = FullNodeHandles::default();
-	let select_chain = if let Some(select_chain) = service.select_chain() {
-		select_chain
-	} else {
-		info!("The node cannot start as an authority because it can't select chain.");
-		return Ok((service, handles));
-	};
-	let gossip_validator_select_chain = select_chain.clone();
-
-	let is_known = move |block_hash: &Hash| {
-		use consensus_common::BlockStatus;
-
-		match known_oracle.block_status(&BlockId::hash(*block_hash)) {
-			Err(_) | Ok(BlockStatus::Unknown) | Ok(BlockStatus::Queued) => None,
-			Ok(BlockStatus::KnownBad) => Some(Known::Bad),
-			Ok(BlockStatus::InChainWithState) | Ok(BlockStatus::InChainPruned) => {
-				match gossip_validator_select_chain.leaves() {
-					Err(_) => None,
-					Ok(leaves) => if leaves.contains(block_hash) {
-						Some(Known::Leaf)
-					} else {
-						Some(Known::Old)
-					},
-				}
-			}
-		}
-	};
-
-	let polkadot_network_service = network_protocol::start(
-		service.network(),
-		network_protocol::Config {
-			collating_for,
-		},
-		(is_known, client.clone()),
-		client.clone(),
-		service.spawn_task_handle(),
-	).map_err(|e| format!("Could not spawn network worker: {:?}", e))?;
-
-	let authority_handles = if is_collator || role.is_authority() {
-		let availability_store = {
-			use std::path::PathBuf;
-
-			let mut path = PathBuf::from(db_path);
-			path.push("availability");
-
-			#[cfg(not(target_os = "unknown"))]
-			{
-				av_store::Store::new(
-					::av_store::Config {
-						cache_size: None,
-						path,
-					},
-					polkadot_network_service.clone(),
-				)?
-			}
-
-			#[cfg(target_os = "unknown")]
-			av_store::Store::new_in_memory(gossip)
-		};
-
-		polkadot_network_service.register_availability_store(availability_store.clone());
-
-		let (validation_service_handle, validation_service) = consensus::ServiceBuilder {
-			client: client.clone(),
-			network: polkadot_network_service.clone(),
-			collators: polkadot_network_service.clone(),
-			spawner: service.spawn_task_handle(),
-			availability_store: availability_store.clone(),
-			select_chain: select_chain.clone(),
-			keystore: service.keystore(),
-			max_block_data_size,
-		}.build();
-
-		service.spawn_essential_task("validation-service", Box::pin(validation_service));
-
-		handles.validation_service_handle = Some(validation_service_handle.clone());
-
-		Some((validation_service_handle, availability_store))
-	} else {
-		None
-	};
-
-	if role.is_authority() {
-		let (validation_service_handle, availability_store) = authority_handles
-			.clone()
-			.expect("Authority handles are set for authority nodes; qed");
-
-		let proposer = consensus::ProposerFactory::new(
-			client.clone(),
-			service.transaction_pool(),
-			validation_service_handle,
-			slot_duration,
-			backend,
-		);
-
-		let select_chain = service.select_chain().ok_or(ServiceError::SelectChainRequired)?;
-		let can_author_with =
-			consensus_common::CanAuthorWithNativeVersion::new(client.executor().clone());
-
-		let block_import = availability_store.block_import(
-			block_import,
-			client.clone(),
-			service.spawn_task_handle(),
-			service.keystore(),
-		)?;
-
-		let babe_config = babe::BabeParams {
-			keystore: service.keystore(),
-			client,
-			select_chain,
-			block_import,
-			env: proposer,
-			sync_oracle: service.network(),
-			inherent_data_providers: inherent_data_providers.clone(),
-			force_authoring,
-			babe_link,
-			can_author_with,
-		};
-
-		let babe = babe::start_babe(babe_config)?;
-		service.spawn_essential_task("babe", babe);
-	}
-
-	if matches!(role, Role::Authority{..} | Role::Sentry{..}) {
-		if authority_discovery_enabled {
-			let (sentries, authority_discovery_role) = match role {
-				Role::Authority { ref sentry_nodes } => (
-					sentry_nodes.clone(),
-					authority_discovery::Role::Authority (
-						service.keystore(),
-					),
-				),
-				Role::Sentry {..} => (
-					vec![],
-					authority_discovery::Role::Sentry,
-				),
-				_ => unreachable!("Due to outer matches! constraint; qed."),
-			};
-
-			let network = service.network();
-			let network_event_stream = network.event_stream("authority-discovery");
-			let dht_event_stream = network_event_stream.filter_map(|e| async move { match e {
-				Event::Dht(e) => Some(e),
-				_ => None,
-			}}).boxed();
-			let authority_discovery = authority_discovery::AuthorityDiscovery::new(
-				service.client(),
-				network,
-				sentries,
-				dht_event_stream,
-				authority_discovery_role,
-				service.prometheus_registry(),
-			);
-
-			service.spawn_task("authority-discovery", authority_discovery);
-		}
-	}
-
-	// if the node isn't actively participating in consensus then it doesn't
-	// need a keystore, regardless of which protocol we use below.
-	let keystore = if is_authority {
-		Some(service.keystore())
-	} else {
-		None
-	};
-
-	let config = grandpa::Config {
-		// FIXME substrate#1578 make this available through chainspec
-		gossip_duration: Duration::from_millis(1000),
-		justification_period: 512,
-		name: Some(name),
-		observer_enabled: false,
-		keystore,
-		is_authority: role.is_network_authority(),
-	};
-
-	let enable_grandpa = !disable_grandpa;
-	if enable_grandpa {
-		// start the full GRANDPA voter
-		// NOTE: unlike in substrate we are currently running the full
-		// GRANDPA voter protocol for all full nodes (regardless of whether
-		// they're validators or not). at this point the full voter should
-		// provide better guarantees of block and vote data availability than
-		// the observer.
-
-		// add a custom voting rule to temporarily stop voting for new blocks
-		// after the given pause block is finalized and restarting after the
-		// given delay.
-		let voting_rule = match grandpa_pause {
-			Some((block, delay)) => {
-				info!("GRANDPA scheduled voting pause set for block #{} with a duration of {} blocks.",
-					block,
-					delay,
-				);
-
-				grandpa::VotingRulesBuilder::default()
-					.add(grandpa_support::PauseAfterBlockFor(block, delay))
-					.build()
-			},
-			None =>
-				grandpa::VotingRulesBuilder::default()
-					.build(),
-		};
-
-		let grandpa_config = grandpa::GrandpaParams {
-			config,
-			link: link_half,
-			network: service.network(),
-			inherent_data_providers: inherent_data_providers.clone(),
-			telemetry_on_connect: Some(service.telemetry_on_connect_stream()),
-			voting_rule,
-			prometheus_registry: service.prometheus_registry(),
-		};
-
-		service.spawn_essential_task(
-			"grandpa-voter",
-			grandpa::run_grandpa_voter(grandpa_config)?
-		);
-	} else {
-		grandpa::setup_disabled_grandpa(
-			service.client(),
-			&inherent_data_providers,
-			service.network(),
-		)?;
-	}
-
-	handles.polkadot_network = Some(polkadot_network_service);
-	Ok((service, handles))
-}
-
 /// Create a new Polkadot service for a light client.
-pub fn polkadot_new_light(
-	config: Configuration,
-)
-	-> Result<impl AbstractService<
+pub fn polkadot_new_light(mut config: Configuration) -> Result<
+	impl AbstractService<
 		Block = Block,
 		RuntimeApi = polkadot_runtime::RuntimeApi,
 		Backend = TLightBackend<Block>,
@@ -634,14 +694,12 @@ pub fn polkadot_new_light(
 		CallExecutor = TLightCallExecutor<Block, PolkadotExecutor>,
 	>, ServiceError>
 {
-	new_light(config)
+	new_light!(config, polkadot_runtime::RuntimeApi, PolkadotExecutor)
 }
 
 /// Create a new Kusama service for a light client.
-pub fn kusama_new_light(
-	config: Configuration,
-)
-	-> Result<impl AbstractService<
+pub fn kusama_new_light(mut config: Configuration) -> Result<
+	impl AbstractService<
 		Block = Block,
 		RuntimeApi = kusama_runtime::RuntimeApi,
 		Backend = TLightBackend<Block>,
@@ -649,125 +707,19 @@ pub fn kusama_new_light(
 		CallExecutor = TLightCallExecutor<Block, KusamaExecutor>,
 	>, ServiceError>
 {
-	new_light(config)
+	new_light!(config, kusama_runtime::RuntimeApi, KusamaExecutor)
 }
 
 /// Create a new Westend service for a light client.
-pub fn westend_new_light(
-	config: Configuration,
-)
-	-> Result<impl AbstractService<
+pub fn westend_new_light(mut config: Configuration, ) -> Result<
+	impl AbstractService<
 		Block = Block,
 		RuntimeApi = westend_runtime::RuntimeApi,
 		Backend = TLightBackend<Block>,
 		SelectChain = LongestChain<TLightBackend<Block>, Block>,
-		CallExecutor = TLightCallExecutor<Block, KusamaExecutor>,
-	>, ServiceError>
-{
-	new_light(config)
-}
-
-// We can't use service::TLightClient due to
-// Rust bug: https://github.com/rust-lang/rust/issues/43580
-type TLocalLightClient<Runtime, Dispatch> =  Client<
-	sc_client::light::backend::Backend<sc_client_db::light::LightStorage<Block>, BlakeTwo256>,
-	sc_client::light::call_executor::GenesisCallExecutor<
-		sc_client::light::backend::Backend<sc_client_db::light::LightStorage<Block>, BlakeTwo256>,
-		sc_client::LocalCallExecutor<
-			sc_client::light::backend::Backend<
-				sc_client_db::light::LightStorage<Block>,
-				BlakeTwo256
-			>,
-			sc_executor::NativeExecutor<Dispatch>
-		>
-	>,
-	Block,
-	Runtime
->;
-
-/// Builds a new service for a light client.
-pub fn new_light<Runtime, Dispatch, Extrinsic>(
-	mut config: Configuration,
-)
-	-> Result<impl AbstractService<
-		Block = Block,
-		RuntimeApi = Runtime,
-		Backend = TLightBackend<Block>,
-		SelectChain = LongestChain<TLightBackend<Block>, Block>,
-		CallExecutor = TLightCallExecutor<Block, Dispatch>,
-	>, ServiceError>
-where
-	Runtime: Send + Sync + 'static,
-	Runtime::RuntimeApi: RuntimeApiCollection<
-		Extrinsic,
-		StateBackend = sc_client_api::StateBackendFor<TLightBackend<Block>, Block>
-	>,
-	Dispatch: NativeExecutionDispatch + 'static,
-	Extrinsic: RuntimeExtrinsic,
-	Runtime: sp_api::ConstructRuntimeApi<
-		Block,
-		TLocalLightClient<Runtime, Dispatch>,
+		CallExecutor = TLightCallExecutor<Block, KusamaExecutor>
 	>,
+	ServiceError>
 {
-	set_prometheus_registry(&mut config)?;
-
-	let inherent_data_providers = InherentDataProviders::new();
-
-	ServiceBuilder::new_light::<Block, Runtime, Dispatch>(config)?
-		.with_select_chain(|_, backend| {
-			Ok(LongestChain::new(backend.clone()))
-		})?
-		.with_transaction_pool(|config, client, fetcher, prometheus_registry| {
-			let fetcher = fetcher
-				.ok_or_else(|| "Trying to start light transaction pool without active fetcher")?;
-			let pool_api = sc_transaction_pool::LightChainApi::new(client.clone(), fetcher.clone());
-			let pool = sc_transaction_pool::BasicPool::with_revalidation_type(
-				config, Arc::new(pool_api), prometheus_registry, sc_transaction_pool::RevalidationType::Light,
-			);
-			Ok(pool)
-		})?
-		.with_import_queue_and_fprb(|_config, client, backend, fetcher, _select_chain, _| {
-			let fetch_checker = fetcher
-				.map(|fetcher| fetcher.checker().clone())
-				.ok_or_else(|| "Trying to start light import queue without active fetch checker")?;
-			let grandpa_block_import = grandpa::light_block_import(
-				client.clone(), backend, &(client.clone() as Arc<_>), Arc::new(fetch_checker)
-			)?;
-
-			let finality_proof_import = grandpa_block_import.clone();
-			let finality_proof_request_builder =
-				finality_proof_import.create_finality_proof_request_builder();
-
-			let (babe_block_import, babe_link) = babe::block_import(
-				babe::Config::get_or_compute(&*client)?,
-				grandpa_block_import,
-				client.clone(),
-			)?;
-
-			// FIXME: pruning task isn't started since light client doesn't do `AuthoritySetup`.
-			let import_queue = babe::import_queue(
-				babe_link,
-				babe_block_import,
-				None,
-				Some(Box::new(finality_proof_import)),
-				client,
-				inherent_data_providers.clone(),
-			)?;
-
-			Ok((import_queue, finality_proof_request_builder))
-		})?
-		.with_finality_proof_provider(|client, backend| {
-			let provider = client as Arc<dyn grandpa::StorageAndProofProvider<_, _>>;
-			Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _)
-		})?
-		.with_rpc_extensions(|builder|
-			-> Result<polkadot_rpc::RpcExtension, _> {
-			let fetcher = builder.fetcher()
-				.ok_or_else(|| "Trying to start node RPC without active fetcher")?;
-			let remote_blockchain = builder.remote_backend()
-				.ok_or_else(|| "Trying to start node RPC without active remote blockchain")?;
-
-			Ok(polkadot_rpc::create_light(builder.client().clone(), remote_blockchain, fetcher, builder.pool()))
-		})?
-		.build()
+	new_light!(config, westend_runtime::RuntimeApi, KusamaExecutor)
 }
-- 
GitLab