diff --git a/Cargo.lock b/Cargo.lock
index 23dd19d0037748c1928cbb07de65fa251f158987..97e06d32dfa02d532d81aed109503df82c070247 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -101,6 +101,17 @@ dependencies = [
  "tokio",
 ]
 
+[[package]]
+name = "async-trait"
+version = "0.1.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36ea56748e10732c49404c153638a15ec3d6211ec5ff35d9bb20e13b93576adf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "atty"
 version = "0.2.14"
@@ -339,12 +350,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4bb454f0228b18c7f4c3b0ebbee346ed9c52e7443b0999cd543ff3571205701d"
 
 [[package]]
-name = "dubp-client"
-version = "0.1.0"
-source = "git+https://git.duniter.org/libs/dubp-rs-client-lib?branch=master#d1fc66c39c6109ef1291aa18ff34fa9002305a30"
+name = "dubp"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3e3fe6a250aaa17de9d86c77028ae2b22f4f7d3b9716659d89d82fb72b2db68"
 dependencies = [
+ "dubp-common",
+ "dubp-documents",
  "dubp-documents-parser",
+ "dubp-wallet",
  "dup-crypto",
+]
+
+[[package]]
+name = "dubp-client"
+version = "0.1.0"
+source = "git+https://git.duniter.org/libs/dubp-rs-client-lib?branch=master#787229ae4a94fdb4278e86f8f47af15388345f90"
+dependencies = [
+ "async-trait",
+ "dubp",
  "graphql_client",
  "maybe-async",
  "mockall 0.9.1",
@@ -355,9 +379,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-common"
-version = "0.47.0"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6129b6390317f4d82e04c7154e4d33566d30369871d867ad7fd1f10136ac601"
+checksum = "c83386c1914b8f3d4a1fb2895b6e31899019b05de3fb6c7ec45d0f13238e6c64"
 dependencies = [
  "dup-crypto",
  "serde",
@@ -368,9 +392,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-documents"
-version = "0.47.0"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ab8de546678145b64b521094f5f4901d93d9270ff8d68ecd71db5f68ccbe9ee"
+checksum = "eeabf1395e31c3e2a1dfabc1f97a933c361312e65f65ca843092b94a32e4ce19"
 dependencies = [
  "beef",
  "dubp-wallet",
@@ -382,9 +406,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-documents-parser"
-version = "0.47.0"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bdc20246a391211616d949cfd2219e74eab95effe2cf9c90a3d0f31b5269640"
+checksum = "f441e42514531d4b04001ff95e20d9b681198bc8f13872af24281c350d2e96f2"
 dependencies = [
  "dubp-documents",
  "json-pest-parser",
@@ -396,9 +420,9 @@ dependencies = [
 
 [[package]]
 name = "dubp-wallet"
-version = "0.47.0"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd0c8044481a682172e4ee7ec9f9e16bf144063b606282e5df0ecb1920b41891"
+checksum = "b89b1d3262a26156de5edcd97e20c2cd747a24ee1244e929b5ac3aada5519b94"
 dependencies = [
  "byteorder",
  "dubp-common",
@@ -410,9 +434,9 @@ dependencies = [
 
 [[package]]
 name = "dup-crypto"
-version = "0.47.0"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0ff835eaa4f2af01e612d12c2c711b75a1fa060d31ec0eae9b5df13d78a57c6"
+checksum = "093aa174cc3792e029e5deabf83986842595279840e5eab58e845efe33d75b48"
 dependencies = [
  "aes",
  "arrayvec",
diff --git a/Cargo.toml b/Cargo.toml
index f64e030185643066c497e52d34c1857b5ed61386..a2bd143070da25cad46eda6c3ee686fc2863e2fe 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,13 +10,13 @@ description = "A command line client written in Rust that use Duniter GVA API."
 [dependencies]
 anyhow = "1.0.32"
 dubp-client = { git = "https://git.duniter.org/libs/dubp-rs-client-lib", branch = "master", features = ["blocking"] }
-#dubp-client= { path = "../dubp-rs-client-lib", features = ["blocking"] }
+#dubp-client= { path = "../dubp-rs-client-lib", features = ["blocking"], default-features = false }
 rpassword = "5.0.1"
 serde = { version = "1.0.105", features = ["derive"] }
 structopt = "0.3.18"
 
 [dev-dependencies]
 dubp-client = { git = "https://git.duniter.org/libs/dubp-rs-client-lib", branch = "master", features = ["blocking", "mock"] }
-#dubp-client= { path = "../dubp-rs-client-lib", features = ["blocking", "mock"] }
+#dubp-client= { path = "../dubp-rs-client-lib", features = ["blocking", "mock"], default-features = false }
 mockall = "0.8.0"
 
diff --git a/src/commands/balance.rs b/src/commands/balance.rs
index b19366361e443e7bd907c1fb1ea79ef065e71f60..a6076d7fd09fb5a68722246c1e744d4de9afc20a 100644
--- a/src/commands/balance.rs
+++ b/src/commands/balance.rs
@@ -15,11 +15,10 @@
 
 use crate::*;
 
-pub(crate) fn balance<W: Write>(
-    gva_endpoint: &str,
+pub(crate) fn balance<C: GvaClient, W: Write>(
+    gva_client: &C,
     out: &mut W,
     pubkey_or_script: &str,
-    requestor: &GvaRequestor,
     ud_unit: bool,
 ) -> anyhow::Result<()> {
     let pubkey_or_script = PubkeyOrScript::from_str(pubkey_or_script)?;
@@ -28,7 +27,7 @@ pub(crate) fn balance<W: Write>(
     if let Some(AccountBalance {
         amount,
         ud_amount_opt,
-    }) = requestor.account_balance(gva_endpoint, &pubkey_or_script, ud_unit)?
+    }) = gva_client.account_balance(&pubkey_or_script, ud_unit)?
     {
         println!(
             "The server responded in {} ms.",
@@ -68,15 +67,15 @@ mod tests {
 
     #[test]
     fn test_balance() -> anyhow::Result<()> {
-        let mut client = GvaRequestor::default();
-        client.expect_account_balance().returning(|_, _, _| {
+        let mut client = MockGvaClient::default();
+        client.expect_account_balance().returning(|_, _| {
             Ok(Some(AccountBalance {
                 amount: SourceAmount::new(2046, 0),
                 ud_amount_opt: None,
             }))
         });
         let mut out = Vec::new();
-        balance("", &mut out, "toto", &client, false)?;
+        balance(&client, &mut out, "toto", false)?;
         let output = std::str::from_utf8(&out)?;
 
         assert_eq!(output, "The balance of account 'SIG(toto)' is 20.46 Ğ1 !\n");
@@ -86,15 +85,15 @@ mod tests {
 
     #[test]
     fn test_balance_with_ud_unit() -> anyhow::Result<()> {
-        let mut client = GvaRequestor::default();
-        client.expect_account_balance().returning(|_, _, _| {
+        let mut client = MockGvaClient::default();
+        client.expect_account_balance().returning(|_, _| {
             Ok(Some(AccountBalance {
                 amount: SourceAmount::new(2_046, 0),
                 ud_amount_opt: Some(SourceAmount::new(1_023, 0)),
             }))
         });
         let mut out = Vec::new();
-        balance("", &mut out, "toto", &client, true)?;
+        balance(&client, &mut out, "toto", true)?;
         let output = std::str::from_utf8(&out)?;
 
         assert_eq!(
diff --git a/src/commands/current_ud.rs b/src/commands/current_ud.rs
index 72bab5368ae5552a0b98b5ce95c10bf85a5aaa00..9f736d2f08ab201197aebd668f8c5f0592e39cf2 100644
--- a/src/commands/current_ud.rs
+++ b/src/commands/current_ud.rs
@@ -15,13 +15,12 @@
 
 use crate::*;
 
-pub(crate) fn current_ud<W: Write>(
-    gva_endpoint: &str,
+pub(crate) fn current_ud<C: GvaClient, W: Write>(
+    gva_client: &C,
     out: &mut W,
-    requestor: &GvaRequestor,
 ) -> anyhow::Result<()> {
     let req_time = Instant::now();
-    if let Some(current_ud) = requestor.current_ud(gva_endpoint)? {
+    if let Some(current_ud) = gva_client.current_ud()? {
         println!(
             "The server responded in {} ms.",
             req_time.elapsed().as_millis()
@@ -47,10 +46,10 @@ mod tests {
 
     #[test]
     fn test_current_ud() -> anyhow::Result<()> {
-        let mut client = GvaRequestor::default();
-        client.expect_current_ud().returning(|_| Ok(Some(1_023)));
+        let mut client = MockGvaClient::default();
+        client.expect_current_ud().returning(|| Ok(Some(1_023)));
         let mut out = Vec::new();
-        current_ud("", &mut out, &client)?;
+        current_ud(&client, &mut out)?;
         let output = std::str::from_utf8(&out)?;
 
         assert_eq!(output, "The current UD value is 10.23 Ğ1 !\n");
diff --git a/src/commands/idty.rs b/src/commands/idty.rs
index 10414eccdcad3013f2716304cea7ce4dad6ca880..b852afedd31829b8f7ed17cae9a5624aa16036b3 100644
--- a/src/commands/idty.rs
+++ b/src/commands/idty.rs
@@ -15,11 +15,10 @@
 
 use crate::*;
 
-pub(crate) fn idty<W: Write>(
-    gva_endpoint: &str,
+pub(crate) fn idty<C: GvaClient, W: Write>(
+    gva_client: &C,
     out: &mut W,
     pubkey: &str,
-    requestor: &GvaRequestor,
 ) -> anyhow::Result<()> {
     let pubkey = PublicKey::from_base58(pubkey)?;
 
@@ -28,7 +27,7 @@ pub(crate) fn idty<W: Write>(
         is_member,
         username,
         ..
-    }) = requestor.idty_by_pubkey(gva_endpoint, pubkey)?
+    }) = gva_client.idty_by_pubkey(pubkey)?
     {
         println!(
             "The server responded in {} ms.",
diff --git a/src/commands/members_count.rs b/src/commands/members_count.rs
index c4f5620e1a05bb18fac913c9db06a376a6a85e25..4c004ed696844a123771c5a3ca421a0c6259915c 100644
--- a/src/commands/members_count.rs
+++ b/src/commands/members_count.rs
@@ -15,13 +15,12 @@
 
 use crate::*;
 
-pub(crate) fn members_count<W: Write>(
-    gva_endpoint: &str,
+pub(crate) fn members_count<C: GvaClient, W: Write>(
+    gva_client: &C,
     out: &mut W,
-    requestor: &GvaRequestor,
 ) -> anyhow::Result<()> {
     let req_time = Instant::now();
-    let members_count = requestor.members_count(gva_endpoint)?;
+    let members_count = gva_client.members_count()?;
     println!(
         "The server responded in {} ms.",
         req_time.elapsed().as_millis()
@@ -44,10 +43,10 @@ mod tests {
 
     #[test]
     fn test_member_count() -> anyhow::Result<()> {
-        let mut client = GvaRequestor::default();
-        client.expect_members_count().returning(|_| Ok(10_000));
+        let mut client = MockGvaClient::default();
+        client.expect_members_count().returning(|| Ok(10_000));
         let mut out = Vec::new();
-        members_count("", &mut out, &client)?;
+        members_count(&client, &mut out)?;
         let output = std::str::from_utf8(&out)?;
 
         assert_eq!(output, "There is currently 10000 members in Ğ1 WoT!\n");
diff --git a/src/main.rs b/src/main.rs
index 2aa77ca4f7bd9ced0835476859cd1dbf0215e858..f192aa485aef5648db33b4bc51ab018fafa73ab8 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -31,15 +31,12 @@ use commands::{
     balance::balance, current_ud::current_ud, idty::idty, members_count::members_count,
     wallet::wallet,
 };
+#[cfg(test)]
+use dubp_client::MockGvaClient;
 use dubp_client::{
     crypto::keys::{ed25519::PublicKey, PublicKey as _},
-    AccountBalance, Idty, PubkeyOrScript,
+    AccountBalance, GvaClient, Idty, NaiveGvaClient, PubkeyOrScript,
 };
-
-#[cfg(not(test))]
-use dubp_client::GvaRequestor;
-#[cfg(test)]
-use dubp_client::MockGvaRequestor as GvaRequestor;
 use std::{
     env::var_os,
     fs::File,
@@ -65,23 +62,17 @@ struct CliArgs {
 fn main() -> anyhow::Result<()> {
     let cli_args = CliArgs::from_args();
 
-    let gva_requestor = GvaRequestor::new();
+    let gva_client = NaiveGvaClient::new(&cli_args.server)?;
     let mut out = std::io::stdout();
 
     match cli_args.command {
         Command::Balance {
             pubkey_or_script,
             ud_unit,
-        } => balance(
-            &cli_args.server,
-            &mut out,
-            &pubkey_or_script,
-            &gva_requestor,
-            ud_unit,
-        )?,
-        Command::CurrentUd => current_ud(&cli_args.server, &mut out, &gva_requestor)?,
-        Command::Idty { pubkey } => idty(&cli_args.server, &mut out, &pubkey, &gva_requestor)?,
-        Command::MembersCount => members_count(&cli_args.server, &mut out, &gva_requestor)?,
+        } => balance(&gva_client, &mut out, &pubkey_or_script, ud_unit)?,
+        Command::CurrentUd => current_ud(&gva_client, &mut out)?,
+        Command::Idty { pubkey } => idty(&gva_client, &mut out, &pubkey)?,
+        Command::MembersCount => members_count(&gva_client, &mut out)?,
         Command::Wallet { command } => wallet(&mut out, command)?,
     }
     Ok(())